Aggregat von 2 Vektoren in VHDL

Ich überprüfe, was ich beim Aggregieren und Verketten in VHDL tun kann und was nicht.

Während ich zwei Vektoren kombinieren kann, indem ich sie verkette, erhalte ich immer wieder Fehler, wenn ich Aggregate verwende.

Ich habe hier eine Antwort gesehen, die zeigt, dass es möglich ist.

Kann jemand erklären, warum sie Fehler geben, oder ist es vielleicht die Sprache, die dies nicht zulässt?

Ich schätze jeden Vorschlag.

Hier ist mein Code. Ich habe die richtigen und die falschen Zeilen markiert. Ich benutze ModelSim. Ich kommentiere/kommentiere beim Überprüfen, um mehrere Treiber zu vermeiden.

architecture RTL of example_array is
--signal Z_BUS                                  : std_logic_vector(7 downto 0);
--signal R_BUS                                  : std_logic_vector(3 downto 0);
--signal A_BIT, B_BIT, C_BIT, D_BIT     : std_logic;

signal T_BUS                                    :  std_logic_vector(7 downto 0);
signal Y_BUS                                    :  std_logic_vector(7 downto 0);
signal U_BUS                                    :  std_logic_vector(3 downto 0);
signal P_BUS                                    :   std_logic_vector(3 downto 0);
signal E_BIT, F_BIT, G_BIT, H_BIT       :  std_logic;

BEGIN
Z_BUS <= A_BIT & R_BUS & B_BIT & C_BIT & D_BIT;                 -- correct
--Z_BUS <= W_BUS & R_BUS;                                       -- correct

P_BUS <= (E_BIT, F_BIT, G_BIT, H_BIT);                          -- correct
U_BUS <= (E_BIT, F_BIT, G_BIT, H_BIT);                          -- correct


(E_BIT, F_BIT, G_BIT, H_BIT)    <= std_logic_vector'("1011");       -- correct
(E_BIT, F_BIT, G_BIT, H_BIT)    <= P_BUS(3 downto 0);               -- correct
(E_BIT, F_BIT, G_BIT, H_BIT)    <= P_BUS;                           -- correct
Y_BUS <= (2 => '1', 3 => F_BIT, 1 downto 0 => '0', others => '0');  -- correct

--T_BUS(7 downto 0) <= (U_BUS(3 downto 0), P_BUS(3 downto 0));  -- WRONG!!
--T_BUS <= (U_BUS, P_BUS);                                      -- WRONG!!
--(U_BUS(3 downto 0), P_BUS(3 downto 0)) <= T_BUS(7 downto 0);  -- WRONG!!

END architecture RTL;
(U_BUS(3 downto 0), P_BUS(3 downto 0));ist eine Aggregation, keine Verkettung (z. B. T_BUS <= U_BUS & P_BUS;). Für die aggregierte Zuordnung haben Sie die VHDL-Version nicht vor oder -2008 angegeben type nybble_array is array (0 to 1) of std_logic_vector(3 downto 0);und (U_BUS, P_BUS) <= nybble_array'(T_BUS (7 downto 4), T_BUS (3 downto 0));Sie benötigen für jedes Element auf der linken Seite ein Element auf der rechten Seite. Der Typ muss aus dem Kontext erkennbar sein. Der Elementtyp muss gleich sein.
Sie fragen nach Zerlegung, nicht nach Aggregation ... Ich weiß, dass der LRM es in der BNF von target "aggregate" nennt . Das liegt daran, dass der LRM bei der Wiederverwendung bestehender BNF-Regeln irgendwie faul ist. Aber der technisch korrekte Begriff ist Dekomposition, wenn ein Aggregat auf der linken Seite einer Zuweisung erscheint.
@Paebbels - IEEE Std 1076-2008 beschreibt die strukturelle Zerlegung des Designmodells , VHDL ist eine Hardwarebeschreibungssprache. Der Begriff findet sich nicht im Glossary of Software Engineering Terms (IEEE Std 610.12-1990) aus der Zeit, als der VHDL-Standard erstellt wurde, während 610.12-2012 ihn als 2. die Partitionierung einer modellierten Funktion in ihre Komponentenfunktionen definiert . Das passt nicht gut zur Zuweisung als undurchdringlicher Grundoperation (5.1). Die VHDL Extended BNF beschreibt eine Syntax , die für ein Aggregat gleich bleibt, egal ob es als Ausdruck oder Zuweisungsziel verwendet wird.
@ user8352 Ich weiß, was der Text in VHDL LRM sagt. Ich bin der stellvertretende Vorsitzende der IEEE P1076-Arbeitsgruppe ... Der Begriff Aggregat bedeutet "Sammlung". Das gilt für die rechte Seite einer Zuweisung, aber nicht für die linke Seite (LHS). Die LHS ist die umgekehrte Operation - eine geteilte Operation. Man nennt es Zerlegung oder Auspacken. Der richtige Weg im VHDL-LRM wäre, zB eine Dekompositions-BNF-Regel zu haben, das ist ein Alias ​​für die Aggregatregel. Andere Teile des LRM machen starken Gebrauch von diesen BNF-"Weiterleitungen".
Das Problem ist die grundlegende Bedienung . Zuweisung ist keine Funktion. Das heißt "Laster". Anhang I - Aggregat: ( B ) Eine Art Ziel einer Variablenzuweisungsanweisung oder Signalzuweisungsanweisung, die einen zusammengesetzten Wert zuweist. Das Ziel soll dann in Form eines Aggregats vorliegen. Der Standard ist in sich konsistent.

Antworten (1)

Verwenden Sie die VHDL-2008-Bibliothek in ModelSim und Ihr Fehler ist behoben. VHDL-93/2002-Pakete unterstützen keine Aggregationsvektoren, wie Sie es ausgedrückt haben.

Es gibt keinen Kommaoperator. Ein Aggregat ist ein Ausdruck, erfordert Klammern und enthält eine oder mehrere durch Kommas getrennte Positions- oder benannte Assoziationen. Die neue Funktion von -2008 besteht darin, dass Zuordnungselemente für Array-Aggregate zusätzlich zum Typ des Aggregatelements auch der Typ des Aggregats selbst sein können. Frühere Revisionen unterstützen nur Assoziationselemente des Aggregatelementtyps. Der Typ des Aggregats, sein Elementtyp und Indextyp (für benannte Assoziationen) werden aus dem Kontext abgeleitet. Aggregation statt Verkettung. Ihre Lösung funktioniert, Ihre Erklärung braucht Arbeit.