Initialisieren des FPGA-internen RAM aus einer Datei

Ich habe ein Design, das sich stark auf den internen Dual-Port-RAM im FPGA stützt, und ich möchte die Tatsache nutzen, dass Blockram Startwerte beim Einschalten haben kann, um diesen gesamten Speicher mit zufälligen Daten zu füllen. Ich plane, dies zu tun, indem ich eine benannte Pipe durch ein TCL-Skript vor der Synthese mache, zufällige Daten hineinpumpe und sie von einer VHDL-Funktion lesen lasse. Ich habe ähnliche Dinge gesehen, nur mit Textdateien.

Meine Frage ist, ob auf diese Weise alle Instanzen des Blockram-Moduls mit denselben Pseudozufallsdaten gefüllt werden oder jede irgendwie "getrennt" synthetisiert wird, was zu unterschiedlichen Pseudozufallsdaten führt, was ich ' m nach?

Die Tools sind übrigens Vivado 2015.4 und das Teil ist Zynq-7000 (Xillinx FPGA der 7er-Serie).

EDIT/Klarstellung:

Ich habe Leute gesehen, die Block-RAM-Anfangsinhalte aus einer Textdatei in VHDL gelesen haben, und das Ergebnis ist synthetisierbar. Ich möchte etwas Ähnliches tun, aber anstatt einer einfachen Textdatei denke ich daran, eine benannte Pipe zu verwenden, deren Schreibende mit einem Bash-Skript verbunden ist, um zufällige anfängliche Blockram-Inhalte im Bitstream zu generieren. Ich bin mir jedoch nicht sicher, was das Synthesetool genau mit dem Block-RAM-Modul macht: Wird jede Instanz derselben VHDL-Designdatei in einem Durchgang synthetisiert, wodurch der RAM-Inhalt aller wiederholten Instanzen identisch wird, oder werden sie daher separat behandelt sie mit verschiedenen Zufallsdaten füllen?

Ich folge nicht. könntest du das bitte in schritten beschreiben?

Antworten (1)

Ich verstehe Ihre Frage immer noch nicht ganz, also antworte ich, was Sie meiner Meinung nach wollen. Was Sie tun können, ist, für jeden RAM eine andere Datei zu lesen. Dazu bauen Sie den Dateinamen dynamisch auf.

Beispiel: in 0.txt

0101
1010

in 1.txt

0110
1001

die 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;

Ergebnis:Geben Sie hier die Bildbeschreibung ein

bearbeiten

Natürlich könnten Sie den Zufallswert auch in vhdl erstellen.