Forum: FPGA, VHDL & Co. Wie initialisiert man "nested records"?


von Steffen Hausinger (Gast)


Lesenswert?

Hallo zusammen,

ich möchte folgende Datenstruktur in meinem VHDL-Code einsetzen:

Ebene_A
    - Ebene_B1()
        - Ebene_C1
        - Ebene_C2
    - Ebene_B2

Ebene_B1() soll ein Array sein. Später möchte ich dann beispielsweise 
auf Elemente zugreifen wie:
1
Ebene_A => Ebene_B1(5) => Ebene_C2  <=  '1';


Ich habe mir deshalb folgende Deklaration überlegt:
1
-- Ebene C
2
type Ebene_B1_Type is record
3
  Ebene_C1 : STD_LOGIC;
4
  Ebene_C2 : STD_LOGIC;
5
end record;
6
7
-- Ebene B
8
type Ebene_B1_Array_Type is array (5 downto 0) of Ebene_B1_Type;
9
10
type Ebene_A_Type is record
11
  Ebene_B1 : Ebene_B1_Array_Type;
12
  Ebene_B2 : STD_LOGIC;
13
end record;


Funktioniert das so? Wie kann ich das Signal, wenn ich es später 
definiere, initialisieren?

Grüße
Steffen

von Achim (Gast)


Lesenswert?

Auf die Elemente kannst du z.B. so zugreifen:
1
Ebene_A.Ebene_B1(5).Ebene_C2 <= '1';

Zur Initialisierung kannst du geschachtelte Aggregates nutzen:
1
signal Ebene_A : Ebene_A_Type := ((('0','1'),('0','1'),('0','1'),('0','1'),('0','1'),('0','1')),'1');
oder ausführlicher geschrieben
1
signal Ebene_A : Ebene_A_Type :=
2
        (
3
            Ebene_B1 => (
4
                (
5
                    Ebene_C1 => '0',
6
                    Ebene_C2 => '1'
7
                ),
8
                (
9
                    Ebene_C1 => '0',
10
                    Ebene_C2 => '1'
11
                ),
12
                (
13
                    Ebene_C1 => '0',
14
                    Ebene_C2 => '1'
15
                ),
16
                (
17
                    Ebene_C1 => '0',
18
                    Ebene_C2 => '1'
19
                ),
20
                (
21
                    Ebene_C1 => '0',
22
                    Ebene_C2 => '1'
23
                ),
24
                (
25
                    Ebene_C1 => '0',
26
                    Ebene_C2 => '1'
27
                )
28
            ),
29
            Ebene_B2 => '1'
30
        );

von Steffen Hausinger (Gast)


Lesenswert?

Stark, so funktioniert es! Zum Thema hatte ich vorher nicht viel 
gefunden, auch bei Google nicht (viel Sucherei und trotzdem nicht das 
Passende).

Vielen Dank für Deine Lösung!

Grüße
Steffen

von user (Gast)


Lesenswert?

es geht auch sowas

signal Ebene_A : Ebene_A_Type := (Ebene_B2 => '1', others => ('0','1'));

das setzt alle elemente des arrays auf '0' '1' und erspart viel 
schreibarbeit ;)

von Achim (Gast)


Lesenswert?

Ne, so gehts nicht. Aber das man mit sich mit others Schreibarbeit 
sparen kann stimmt natürlich. Kommt aber immer drauf an ob man alle 
Elemente des Array mit dem gleichen Wert initialisieren will oder nicht.
Eine korrekte Version von users Vorschlag wäre:
1
signal Ebene_A : Ebene_A_Type := (Ebene_B2 => '1', others => (others => ('0','1')));
oder
1
signal Ebene_A : Ebene_A_Type := (Ebene_B2 => '1', Ebene_B1 => (others => ('0','1')));
oder
1
signal Ebene_A : Ebene_A_Type := ((others => ('0','1')), '1');
Es gibt also genug Varianten.

von Weltbester FPGA Pongo (Gast)


Lesenswert?

hm, guter Tipp.

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.