Forum: FPGA, VHDL & Co. VHDL Vektorlänge ermitteln


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ich will in meinem Code mit Hilfe einer Constanten die Größe es interen 
Puffers festlegen. Der Zugriff auf die Werte im Puffer erfolgt über die 
Adressen. In C würde man es Pointerzugriff nennen.
VHDL ist sehr streng in der Typüberprüfung. Durch eine Veränderung der 
RAM-Größe verändert sich auch die Typlänge vom Pointer.
für die Adressen 0-511 benötige ich 9 Datenleitungen und wenn ich die 
Adressen auf 0-1023 erhöhe benötige ich 10 Datenleitungen. Mathematisch 
ist das einen Berechnung mit log. Das wolle ich nicht in meine Code. 
Gibt es nicht eine Funktion oder attribute in VHDL, um die Datenbreite 
für einen Wertebereich zu ermitteln?



constant RAM_size: integer := 511;
type RAM is array (0 to RAM_size) of unsigned (7 downto 0);


signal c_ram: RAM;
signal pointer_ram:unsigned( Ausdruck downto 0);
-----------------------------^wie kann ich das hier ausdrücken?


pointer_ram<=5;
wert<=RAM( to_integer(pointer_ram));

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
 signal pointer_ram:unsigned( Ausdruck downto 0);
Mach den Pointer doch gleich als integer, dann sparst du dir die spätere 
Umwandlung:
1
 signal pointer_ram: integer range 0 to RAM_size;
2
 :
3
 pointer_ram <= 5;
4
 wert <= RAM(pointer_ram);

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Geht nicht, weil ich den Pointer mit Werten berechne, die aus unsigned 
Werten bestehen. Das ist etwas schwierig zu erklären. Ich brauche z.B. 
den Operator & für das Zusammensetzen der Adresse, der ist für integer 
nicht definiert.  Und noch einige Kniffe.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dann mach die Typkonvertierung doch dort, wo du zusammensetzt...
Im harten VHDL-Leben ist es nun mal so, dass ein Index nur ein Integer 
sein darf. Warum also nicht gleich den integer als Adresse verwalten?

Oder machs so:
1
constant RAM_addrwidth: integer := 8;
2
type RAM is array (0 to (RAM_addrwidth**2-1)) of unsigned (7 downto 0);
3
4
signal c_ram: RAM;
5
signal pointer_ram: unsigned(RAM_addrwidth-1 downto 0);
Es führen tausend Wege nach RAM  ;-)

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Das ist gut. Warum bin ich darauf eigentlich nicht selbst gekommen?
Sicher den Kopf nicht frei. Ich hänge gerade oder besser gesagt, ich 
ecke an in einer State Maschine für einen Huffman-decoder.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

René D. schrieb:
> Das ist gut.
Ähhmm, hust, räusper... noch nicht ganz.

Machs besser so:
1
type RAM is array (0 to (2**RAM_addrwidth-1)) of unsigned (7 downto 0);

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

ROM wurde auch nicht an einem Tag erbaut. Da darf RAM auch etwas längern 
dauern. kleiner joke

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.