2017-01-03 13 views
0

Я делаю систему, которая берет из txt-файла, данные, состоящие из 57 600 двоичных чисел, обрабатывает его в некотором арифметическом модуле сохраняются результирующие данные по 3 наборам выходных ячеек памяти, составляющих каждый из них на 57 600 двоичных чисел. ModelSim работает отлично, результаты ожидаются, но при компиляции в Quartus II он застревает на уровне 10% и ничего не делает в течение нескольких часов, пока я не остановлю процесс. Хотя, когда я уменьшаю размер реализованной выходной памяти на одну цифру, она успешно компилируется в течение нескольких секунд. Размер выходной памяти - 3 набора из 57.600 двоичных чисел 32 бита.Quartus II застрял на 10% при выполнении анализа и синтеза (что-то не так с моим модулем памяти verilog)?

Я подозреваю, что я неправильно использую память, или что-то не так с использованием памяти, как я это делаю, но я не уверен, пожалуйста, любой совет? Я ищу самый простой простой метод для реализации этого.

Это модуль для овна

module RAM_OUT (clk, pix_val, w_mem_out, set_ram); 

input clk; 

input [2:0] w_mem_out; 
input [31:0] pix_val; 
input set_ram; 



reg [15:0] addr_out; // tamano de 57600 datos 


reg [31:0] mem_out1 [0:57599]; 
reg [31:0] mem_out2 [0:57599]; 
reg [31:0] mem_out3 [0:57599]; 

/////////// ram out /////////////// 

always @ (posedge clk) 

begin 
if (set_ram) 
addr_out = 0; 

else 
    begin 

     if (w_mem_out == 1) 

       begin 
       mem_out1 [addr_out] = pix_val; 
       mem_out2 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out3 [addr_out] = 32'b00000000_000000000000000000000000; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 2)   

       begin 
       mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out2 [addr_out] = pix_val; 
       mem_out3 [addr_out] = 32'b00000000_000000000000000000000000; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 3)   

       begin 
       mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out2 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out3 [addr_out] = pix_val; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else  

       addr_out = addr_out; 


    end 

end 

////////////////////////////////// 

/* 


module RAM_OUT (pix_val, w_mem_out, set_ram); 


input [2:0] w_mem_out; 
input [31:0] pix_val; 
input set_ram; 



reg [15:0] addr_out; // tamano de 57600 datos 


reg [31:0] mem_out1 [0:57599]; 
reg [31:0] mem_out2 [0:57599]; 
reg [31:0] mem_out3 [0:57599]; 

/////////// ram out /////////////// 

always @ (w_mem_out or set_ram) 
begin 

if (set_ram) 
addr_out = 0; 

else 
    begin 

     if (w_mem_out == 1) 

       begin 
       mem_out1 [addr_out] = pix_val; 
       mem_out2 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out3 [addr_out] = 32'b00000000_000000000000000000000000; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 2)   

       begin 
       mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out2 [addr_out] = pix_val; 
       mem_out3 [addr_out] = 32'b00000000_000000000000000000000000; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 3)   

       begin 
       mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out2 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out3 [addr_out] = pix_val; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 4) 

       begin 
       mem_out1 [addr_out] = pix_val; 
       mem_out2 [addr_out] = pix_val; 
       mem_out3 [addr_out] = 32'b00000000_000000000000000000000000; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 


     else if (w_mem_out == 5)   

       begin 
       mem_out1 [addr_out] = 32'b11111111_000000000000000000000000; 
       mem_out2 [addr_out] = pix_val; 
       mem_out3 [addr_out] = pix_val; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 

     else if (w_mem_out == 6)   

       begin 
       mem_out1 [addr_out] = pix_val; 
       mem_out2 [addr_out] = pix_val; 
       mem_out3 [addr_out] = pix_val; 

       addr_out = addr_out + 16'b0000000000000001; 
       end 


     else  

       addr_out = addr_out; 


    end 

end 

////////////////////////////////// 

*/ 

endmodule 
+1

Мое предположение, что у вас закончились доступные флопы для вашей целевой FPGA. Документация Quartus должна содержать макромодуль для ОЗУ. Директивы/атрибуты синтеза - это еще один вариант (симуляции рассматривают их как комментарии). С другой стороны, «RAM_OUT» не имеет выхода, поэтому я удивлен, что Quartus оптимизировал его ни к чему. – Greg

+0

Большое спасибо, я заменил код как «reg [31: 0] mem_out1 [0: 57599];» и используя библиотеку памяти megawizard, напрямую подключающую порты в верхних модулях, и кажется, что ее компиляция теперь хороша. Причина, по которой я покинул этот модуль без выходных портов, заключается в том, что я все еще пытаюсь понять, как сделать содержимое памяти как-то доступным для чтения (мне нужно проверить правильность результата обработки). Есть ли у вас какие-либо предложения? – sujeto1

ответ

3

Я вижу следующие проблемы с вашим кодом:

  1. Данные только писались в mem_out1, mem_out2 и mem_out3. Технически, если вы вообще не используете данные, которые записываются в память, Quartus может просто оптимизировать ее, а не синтезировать ее вообще.
  2. Стиль кодирования не совсем прав. Вы можете попробовать заменить '=' (блокирующие операторы) внутри всегда блока на '< =' (не блокируя).

  3. Подробную информацию о том, как писать HDL для вывода ОЗУ, можно найти в разделе Quartus Prime Handbook (раздел 11.4.1). Обратите внимание, что ссылка на Quartus Pro 16.0 и некоторые моменты могут быть неприменимы для вашей версии программного обеспечения Quartus. Для получения более подробной информации обратитесь к руководству, соответствующему вашей версии Quartus.