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));
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); |
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.
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 ;-)
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.
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); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.