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 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;
Natürlich könnten Sie den Zufallswert auch in vhdl erstellen.
JH Bonarius