Servus,
wie beschreibt man einen RAM mit variabler Breite / Tiefe und belegt
diesen mit Daten vor?
Bei fixer Groesse (z.B. 8x16) ist es einfach:
1 | ram_t : is array(0 to 7) of std_logic_vector
|
2 | ...
|
3 | generic(content : ram_t := XYZ);
|
4 | ...
|
5 | signal ram : ram_t := content;
|
Variable Groesse ohne Vorbelegung ebenso:
1 | generic(width : integer = 16, depth = 8)
|
2 | ...
|
3 | ram_t is array(0 to depth-1) of std_logic_vector(width-1 downto 0);
|
4 | signal ram : ram_t;
|
(Die Beschreibung des eigentlichen RAM-Verhaltens ist natuerlich auch
kein Problem, deswegen habe ich sie hier weggelassen.)
Ich habe zwar einige Beschreibungen probiert, aber keine davon
entspricht dem VHDL-Standard oder wird von den Tools richtig umgesetzt:
1 | generic(width : integer = 8; depth: integer = 8; content : array(0 to depth-1) of std_logic_vector(width-1 downto 0) := XYZ);
|
ist kein gueltiges VHDL (klar). Aendere ich das in
1 | content : std_logic_vector := XYZ
|
funktioniert natuerlich die Zuweisung
1 | signal ram : ram_t := content;
|
nicht mehr. (Kann man hier irgendeinen Cast machen?) Und mit
1 | signal ram : std_logic_vector(depth*width-1 downto 0);
|
erkennt xst das nicht mehr als RAM und packt es in Flipflops...
Die Benutzung von templates aus IP-Cores entfaellt, bei sehr
unterschiedlichen RAM-Groessen und mindestens vier Zielplattformen ist
das zu zeitaufwendig.