Inicializando la memoria RAM interna FPGA del archivo

1

Tengo un diseño que se basa en gran medida en la memoria RAM interna de doble puerto que se encuentra en el FPGA y quiero aprovechar el hecho de que el blockram puede tener valores iniciales de encendido para poblar toda esta memoria con datos aleatorios. Cómo planeo hacer esto es hacer una tubería con nombre a través de un script TCL de pre-síntesis, introducir datos aleatorios en él y hacer que se lea mediante una función VHDL. He visto cosas similares, solo con archivos de texto.

Mi pregunta es, haciéndolo de esta manera, ¿se llenarán todas las instancias del módulo de blockram con los mismos datos pseudoaleatorios, o cada uno se sintetizará "por separado" de alguna manera, terminando con datos pseudoaleatorios diferentes, que es ¿Qué estoy buscando?

Las herramientas son Vivado 2015.4 y la pieza es Zynq-7000 (7 series Xillinx FPGA), por cierto

EDITAR / aclaración:

He visto personas leyendo contenido inicial de block ram desde un archivo de texto en VHDL y el resultado es sintetizable. Quiero hacer algo similar, pero en lugar de un archivo de texto sin formato, estoy pensando en usar un conducto con el extremo de escritura conectado a un script de bash para generar contenido aleatorio de blockram inicial en el flujo de bits. Sin embargo, no estoy seguro de lo que hace exactamente la herramienta de síntesis con el módulo de bloque de memoria RAM: cada instancia del mismo archivo de diseño VHDL se sintetiza en una sola pasada, lo que hace que el contenido de RAM de todas las instancias repetidas sea idéntico, o se tratan por separado. ¿Poblando con diferentes datos aleatorios?

    
pregunta user3109672

1 respuesta

1

Todavía no entiendo completamente tu pregunta, así que estoy respondiendo lo que creo que quieres. Lo que puedes hacer es leer un archivo diferente para cada ram. Para ello, construye el nombre del archivo dinámicamente.

Ejemplo: en 0.txt

0101
1010

en 1.txt

0110
1001

la VHDL (-2008):

library ieee;
package array_types is
    use ieee.std_logic_1164.all;
    type slv_array is array (natural range <>) of std_logic_vector;
end package;

use work.array_types.slv_array;

entity ram is
    generic(ram_init : slv_array);
end entity;

architecture rtl of ram is
    subtype ram_data_type is slv_array(0 to ram_init'length-1)(ram_init(0)'length-1 downto 0);
    signal ram_data : ram_data_type := ram_init;
begin
end architecture;

entity init_ram is end entity;

library ieee;
architecture rtl of init_ram is
    constant ram_width : positive := 4;
    constant ram_depth : positive := 2;
    use work.array_types.slv_array;
    subtype ram_data_type is slv_array(0 to ram_depth-1)(ram_width-1 downto 0);

    use std.textio.all;
    use ieee.std_logic_1164.all;
    impure function load_file(index:natural) return ram_data_type is
        constant file_name : string := integer'image(index)&".txt";
        file file_pointer : text;
        variable line_data : line;
        variable line_value : bit_vector(ram_width-1 downto 0);
        variable ram_data : ram_data_type;
    begin
        file_open(file_pointer, file_name, read_mode);
        for line_index in 0 to ram_depth-1 loop
            readline(file_pointer, line_data);
            read(line_data, line_value);
            ram_data(line_index) := to_stdlogicvector(line_value);
        end loop;
        file_close(file_pointer);
        return ram_data;
    end function;
begin
    gen_rams: for i in 0 to 1 generate
        inst_ram: entity work.ram
            generic map(
                ram_init => load_file(i));
    end generate;
end architecture;

Resultado:

editar

por supuesto, también puede crear el valor aleatorio dentro vhdl.

    
respondido por el JHBonarius

Lea otras preguntas en las etiquetas