Надо было сделать параметризуемую память, собираемую из банков М9К циклона. Сделали через altsyncram
CODE
altsyncram #(
.operation_mode ("BIDIR_DUAL_PORT"),
.width_a (DATA_WIDTH_A),
.width_byteena_a (DATA_WIDTH_A / BYTE_SIZE),
.width_b (DATA_WIDTH_B),
.widthad_a (ADDR_WIDTH_A),
.widthad_b (ADDR_WIDTH_B),
.numwords_a (2**ADDR_WIDTH_A),
.numwords_b (2**ADDR_WIDTH_B),
.outdata_reg_a ("UNREGISTERED"),
.outdata_reg_b ("UNREGISTERED"),
.ram_block_type ("M9K"),
.intended_device_family ("Cyclone IV E"),
.lpm_type ("altsyncram"),
.read_during_write_mode_mixed_ports ("DONT_CARE")
)
altsyncram_inst (
.address_a (addra),
.clock0 (clka),
.clocken0 (1'b1),
.data_a (dina),
.wren_a (wea),
.byteena_a (true_bea),
.q_a (douta) ,
.address_b (addrb),
.clock1 (clkb),
.clocken1 (1'b1),
.data_b (dinb),
.wren_b (true_web),
.q_b (doutb)
);
.operation_mode ("BIDIR_DUAL_PORT"),
.width_a (DATA_WIDTH_A),
.width_byteena_a (DATA_WIDTH_A / BYTE_SIZE),
.width_b (DATA_WIDTH_B),
.widthad_a (ADDR_WIDTH_A),
.widthad_b (ADDR_WIDTH_B),
.numwords_a (2**ADDR_WIDTH_A),
.numwords_b (2**ADDR_WIDTH_B),
.outdata_reg_a ("UNREGISTERED"),
.outdata_reg_b ("UNREGISTERED"),
.ram_block_type ("M9K"),
.intended_device_family ("Cyclone IV E"),
.lpm_type ("altsyncram"),
.read_during_write_mode_mixed_ports ("DONT_CARE")
)
altsyncram_inst (
.address_a (addra),
.clock0 (clka),
.clocken0 (1'b1),
.data_a (dina),
.wren_a (wea),
.byteena_a (true_bea),
.q_a (douta) ,
.address_b (addrb),
.clock1 (clkb),
.clocken1 (1'b1),
.data_b (dinb),
.wren_b (true_web),
.q_b (doutb)
);
На тестах вот какая штука вылезла, если писать по порту А и читать по порту В все ОК, как это не делай.
Если писать по порту В удерживая врайт енайбл и каждый такт выдавая новые данные, а читать это по порту А, то же все хорошо.
Если писать по порту В, выдавая сигнал данные и адрес на 1 такт, а потом 2 такта пауза, то каждые вторые данные не записываются в память.
То есть в 0, 2, 4, 6, ... ячейки данные сохраняются а в 1, 3, 5, остаются старыми...
И в чем прикол я так и не понял... есть у кого какие мысли?
Повторили опыт с памятью генерированной мегавизордом, таже фигня,
Если до 1 клокового врайтенайбла за такт выставить данные и адрес, запись пройдет, и это только по порту В