Wie initialisiert man "nested records"?

Gast #1859230
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
Gast #1859269
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
        );
Gast #1859366
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
Gast #1859432
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren