Concatenando desde el bloque RAM en Verilog

0

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!

    
pregunta Scott T.

1 respuesta

0

Me di cuenta de esto. Realmente no necesitaba bloque RAM en absoluto para mis propósitos.

Para describir el propósito de este ejercicio (para aquellos interesados), estoy tratando de enviar datos de un archivo de texto a través de una comunicación en serie a un FPGA. Cada vez que la conexión en serie señala que hay datos para enviar, la lógica FPGA debe aceptar datos y escribirlos en una ubicación apropiada. Básicamente, esto equivale a un archivo de registro:

reg [15:0] RAM [0:63];  // 64 x 16-bit (128 byte) RAM
reg [5:0] addr;         // 6-bit addressing to 64 elements
always @(posedge clk)
begin
    if (write_data_flag == 1'b1)
    begin
        RAM[addr] <= data_from_USB;
        addr <= addr + 1'b1;
    end
end

Cuando se sintetiza, esto da como resultado una RAM distribuida (implementada como una LUT), que se alimenta de los recursos disponibles que tengo para sintetizar otra lógica. Dado que mi matriz de RAM es bastante pequeña, creo que está bien.

    
respondido por el Scott T.

Lea otras preguntas en las etiquetas