Я делаю систему, которая берет из 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
Мое предположение, что у вас закончились доступные флопы для вашей целевой FPGA. Документация Quartus должна содержать макромодуль для ОЗУ. Директивы/атрибуты синтеза - это еще один вариант (симуляции рассматривают их как комментарии). С другой стороны, «RAM_OUT» не имеет выхода, поэтому я удивлен, что Quartus оптимизировал его ни к чему. – Greg
Большое спасибо, я заменил код как «reg [31: 0] mem_out1 [0: 57599];» и используя библиотеку памяти megawizard, напрямую подключающую порты в верхних модулях, и кажется, что ее компиляция теперь хороша. Причина, по которой я покинул этот модуль без выходных портов, заключается в том, что я все еще пытаюсь понять, как сделать содержимое памяти как-то доступным для чтения (мне нужно проверить правильность результата обработки). Есть ли у вас какие-либо предложения? – sujeto1