Forum: FPGA, VHDL & Co. VHDL - type records, einfacher gestalten


von Layornos (Gast)


Lesenswert?

Hallo liebe VHDL-Gemeinde,

ich bin recht neu in der FPGA-Entwicklung und bin mittlerweile auf ein 
Problem gestoßen, dass sich mit meinem aktuellen Wissensstand nicht 
lösen lässt. Entsprechendes in der Suche habe ich nicht gefunden, ggf. 
weil mir die Schlüsselwörter nicht geläufig sein, sollte dies der Fall 
sein, bitte ich um nachsicht.

Über eine SPI-Schnittstelle möchte ich gewisse Daten übertragen, der 
Header besteht aus 32-Bit und ist immer gleich aufgebaut, hierfür habe 
ich einen
1
 type record
 definiert, dieser sieht wie folgt aus:
1
    type T_HEADER is record
2
        MSG                 : STD_LOGIC_VECTOR(5 downto 0);
3
        DONT_CARE_MSG       : STD_LOGIC_VECTOR(1 downto 0);
4
        ID                  : STD_LOGIC_VECTOR(10 downto 0);
5
        RTR                 : STD_LOGIC;    
6
        IDE                 : STD_LOGIC;
7
        DONT_CARE_IDE       : STD_LOGIC_VECTOR(2 downto 0);
8
        R0_BIT              : STD_LOGIC;
9
        DONT_CARE_R0        : STD_LOGIC_VECTOR(2 downto 0);
10
        LEN                 : STD_LOGIC_VECTOR(3 downto 0);
11
    end record;

Ich hatte mir eigentlich gedacht, dass der Header einfach als eine 
Bitreihenfolge dargestellt wird und man über T_HEADER(index) darauf 
zugreifen könnte. Leider ist dem nicht so und ein unschönes IF-Konstrukt 
ist nötig um auf die jeweiligen Elemente zugreifen zu können.

Mappen auf einen 32 Bit Vector ist unschön, da die Informationen so 
doppelt vorhanden wären.

Gibt es in VHDL eine Art Union wie in C?

Oder wäre etwas in der Art möglich (pseudocode):
1
MSG := 31 downto 26;
2
DONT_CARE_MSG := 25 downto 24;
3
HEADER(MSG) <= STD_LOGIC_VECTOR(to_unsigned(51, 6);
4
HEADER(DONT_CARE_MSG) <= (others => '0');

Vielen Dank schon mal.

Gruß
Layornos

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Soweit ich weiß ist die Abbildung eines records auf einen Vektor nicht 
definiert. Man muss sich daher immer Konvertierungsfunktionen bauen.

In SystemVerilog gibt es packed structs und packed unions, deren 
Abbildung auf Vektoren im LRM definiert ist.

Missverständnis... Natürlich kannst Du auf einzelne Elemente des record 
zugreifen und diesen auch Werte zuweisen.
1
HEADER.MSG <= STD_LOGIC_VECTOR(to_unsigned(51, 6);

--
Marcus

: Bearbeitet durch User
von Layornos (Gast)


Lesenswert?

Der Zugriff über
1
HEADER.MSG <= STD_LOGIC_VECTOR(to_unsigned(51, 6);
würde zu einem großen IF-Konstrukt führen und das ganze, je nach Anzahl 
der Elemente sehr unübersichtlich werden.

Aber dem Hinweis mit der Konvertierungsfunktion werde ich nachgehen. 
Vielen Dank.

von user (Gast)


Lesenswert?


von berndl (Gast)


Lesenswert?

Layornos schrieb:
> Gibt es in VHDL eine Art Union wie in C?

Nein, meines Wissens nicht

Oder wäre etwas in der Art möglich (pseudocode):
1
MSG := 31 downto 26;
2
DONT_CARE_MSG := 25 downto 24;
3
HEADER(MSG) <= STD_LOGIC_VECTOR(to_unsigned(51, 6);
4
HEADER(DONT_CARE_MSG) <= (others => '0');
Wie Marcus oben schon schrieb (schrob, schrub?):
1
HEADER.MSG <= STD_LOGIC_VECTOR(to_unsigned(51, 6);
Und ansonsten halt 'ne 'function' schreiben die dir das erledigt...

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


Lesenswert?

Man könnte sich da auch etwas mit ein par Alias vorstellen, die auf 
den 32 Bit Vektor angewendet werden. Etwas unschön ist es, dass man so 
keinen eigenen Typ definieren kann...  :-(

Aber wenn es nur genau einen solchen Record im Design gibt, dann sind 
Alias der richtige Weg. So wie dort mit der Adresse, dem Quadranten und 
dem Vorzeichen:
http://www.lothar-miller.de/s9y/archives/38-DDFS-mit-Distributed-ROM.html

: Bearbeitet durch Moderator
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.