Forum: FPGA, VHDL & Co. Generischen RAM mit Daten vorbelegen


von Jan M. (mueschel)


Lesenswert?

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.

von walther trugget (Gast)


Lesenswert?

steht doch im datasheet. du must nur suchen

von Jan M. (mueschel)


Lesenswert?

Dann kannst du mir sicher auch sagen, in welchem Datasheet ich suchen 
muss. Im xst user guide ist dieser Fall jedenfalls nicht beschrieben.

Dort sind nur Varianten gezeigt, die den RAM innerhalb der selben Entity 
mit Werten vorbelegen. Ich moechte aber einen RAM, der in einer 
component beschrieben wird von ausserhalb mit Daten belegen.

von walther trugget (Gast)


Lesenswert?

im libguide. es gibt auch noch ein weiteres paper das dieses problem 
sehr ausführlich mit versionsunterschieden und dynamischen inhalt 
(files) behandelt. ab ise 7 kannst du auch in den examples nachgucken. 
da steht auch ein bissel was. falls du mit files arbeitest, so lass dir 
gesagt sein, dass der mapper nur textfiles untersützt und keine 
binaries!

von Jan M. (mueschel)


Lesenswert?

Wie ich oben schon schrieb, das muss auf unterschiedlichen Plattformen 
laufen, die primitives von Xilinx nutzen mir nichts.

Da alle RAM-Primitiven ausserdem eine feste Groesse haben, ist es hier 
natuerlich kein Problem, Daten per generics zu uebergeben.

von walther trugget (Gast)


Lesenswert?

gib doch einfach vhdl unter google ein. da steht schon alles.

von Jan M. (mueschel)


Lesenswert?

>da steht schon alles.
Ach? Du kannst sicher sein, dass ich schon länger nach einer Lösung 
gesucht habe und nicht fragen würde, wenn es bei google so einfach zu 
finden wäre.

von Xenu (Gast)


Lesenswert?

Mach Dir ein package, wo Du Deinen ram_t-Typen deklarierst.
Dann kannst Du sowohl Dein ram-Signal, das Du vorbelegen willst, sowie 
Dein generic als diesen Typ deklarieren.

Das eigentliche RAM-Vorbelegungssignal mit den Werten, die Du Deiner 
Komponente als generic übergibst, musst Du dann als constant und 
nicht als signal deklarieren, sonst bekommst Du einen Fehler vom Typ 
"The actual value associated with a generic must be a globally static 
expression", oder so ähnlich. Dämlich aber leider VHDL.

von Jan M. (mueschel)


Lesenswert?

Danke Xenu,
bloed, aber wohl nicht zu aendern, VHDL unterstuetzt ja unconstrained 
Vektoren und Arrays, nur leider nicht in der hierfuer noetigen Form, 
also zweifach unconstrained.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.