mikrocontroller.net

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


Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Ebene_A => Ebene_B1(5) => Ebene_C2  <=  '1';


Ich habe mir deshalb folgende Deklaration überlegt:
-- Ebene C
type Ebene_B1_Type is record
  Ebene_C1 : STD_LOGIC;
  Ebene_C2 : STD_LOGIC;
end record;

-- Ebene B
type Ebene_B1_Array_Type is array (5 downto 0) of Ebene_B1_Type;

type Ebene_A_Type is record
  Ebene_B1 : Ebene_B1_Array_Type;
  Ebene_B2 : STD_LOGIC;
end record;


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

Grüße
Steffen

Autor: Achim (Gast)
Datum:

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

Zur Initialisierung kannst du geschachtelte Aggregates nutzen:
signal Ebene_A : Ebene_A_Type := ((('0','1'),('0','1'),('0','1'),('0','1'),('0','1'),('0','1')),'1');
oder ausführlicher geschrieben
signal Ebene_A : Ebene_A_Type :=
        (
            Ebene_B1 => (
                (
                    Ebene_C1 => '0',
                    Ebene_C2 => '1'
                ),
                (
                    Ebene_C1 => '0',
                    Ebene_C2 => '1'
                ),
                (
                    Ebene_C1 => '0',
                    Ebene_C2 => '1'
                ),
                (
                    Ebene_C1 => '0',
                    Ebene_C2 => '1'
                ),
                (
                    Ebene_C1 => '0',
                    Ebene_C2 => '1'
                ),
                (
                    Ebene_C1 => '0',
                    Ebene_C2 => '1'
                )
            ),
            Ebene_B2 => '1'
        );

Autor: Steffen Hausinger (Gast)
Datum:

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

Autor: user (Gast)
Datum:

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

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
signal Ebene_A : Ebene_A_Type := (Ebene_B2 => '1', others => (others => ('0','1')));
oder
signal Ebene_A : Ebene_A_Type := (Ebene_B2 => '1', Ebene_B1 => (others => ('0','1')));
oder
signal Ebene_A : Ebene_A_Type := ((others => ('0','1')), '1');
Es gibt also genug Varianten.

Autor: Weltbester FPGA Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, guter Tipp.

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.