www.mikrocontroller.net

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


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

Bewertung
0 lesenswert
nicht 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));

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
constant RAM_addrwidth: integer := 8;
type RAM is array (0 to (RAM_addrwidth**2-1)) of unsigned (7 downto 0);

signal c_ram: RAM;
signal pointer_ram: unsigned(RAM_addrwidth-1 downto 0);
Es führen tausend Wege nach RAM  ;-)

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

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.