He creado una instancia de un módulo de RAM de bloque usando el segmento del Generador de Memoria de Bloque del Xilinx IP Core. Alternativamente, he codificado mi propio módulo de RAM de un solo puerto, como en la página 33 de estas diapositivas ( enlace ).
Con cada marca de reloj, actualizo la dirección constantemente y escribo simultáneamente en ese bloque de mi módulo de RAM. Así:
reg [5:0] address;
initial address = 6'b0;
always @(posedge clk)
begin
address <= address + 1'b1;
end
block_ram uut (
.clk(clk),
.write_en(write_en),
.address(address),
.datain(datain),
.dataout(dataout)
);
Después de rellenar las direcciones RAM adecuadas, lo que me gustaría hacer es leer las direcciones específicas y concatenarlas para formar un cable más grande, como por ejemplo:
wire [624:0] concatenated_ram;
assign concatenated_ram = {ram[0], ram[1], ram[2], ram[3], ...}
La única forma en que puedo conceptualizar esto es asignando el puerto de 'dataout' singular de mi RAM a un cable diferente dependiendo de la dirección:
always @(*)
begin
case (address)
0: dataout1 <= dataout_from_RAM;
1: dataout2 <= dataout_from_RAM;
2: dataout3 <= dataout_from_RAM;
...
endcase
end
¿Alguien puede pensar en otras opciones? El uso de una declaración de caso para capturar los datos no me parece tan eficiente.
¡Gracias por cualquier ayuda por adelantado!