Allgemeines
Die architecture
beschreibt den inneren Aufbau der Schaltung einer Komponente. Für diese Beschreibung stehen mehrere Anweisungen zur Verfügung, die eine Nebenläufigkeit ermöglichen. Betrachtet man die Komponeten eine digitale Schaltung laufen diese jede für sich gesehen unabhängig von der anderen. Die unabhängigkeit lässt sich auch mittels Nebenläufigkeit (engl. concurrent) beschreiben, deswegen heißen diese Anweisungen auch engl. concurrent statements.
Es gibt folgende concurrent statements:
process
Anweisungen - Beschreiben einen nebenläufigen Prozess (sieheprocess
Anweisung)- Einfache Signalzuweisung - Weist einen Ausdruck einem Signal zu
- Bedingte Signalzuweisung - Je nach Bedingung wird der Wahr-Ausdruck oder der Falsch-Ausdruck zugewiesen
- Selektive Signalzuweisung - Entspricht einem Multiplexer, der abhängig von einem select-Ausdruck den entsprechenden Ausdruck auswählt.
Einfache Signalzuweisung
library ieee ; use ieee.std_logic_1164.all; entity half_adder is port( a_i: in std_ulogic; b_i: in std_ulogic; sum_o: out std_ulogic; carry_o: out std_ulogic ); end entity; architecture behave of half_adder is begin sum_o <= a_i xor b_i; carry_o <= a_i and b_i; end architecture;
In diesem Beispiel wird ein Halbaddierer beschrieben. Bei den Signalzuweisungen von sum_o
und carry_o
handelt es sich um einfache Signalzuweisungen. Auf der rechten Seite der Zuweisung steht ein Ausdruck, der durch Kombinatorik ausgewertet werden kann.
Bedingte Signalzuweisung mittels when
Für eine bedingte Signalzuweisung wird folgender Syntax verwendet:
signal <= expr_true when cond else expr_false;
Als konkretes Beispiel können wir wieder den Halbaddierer verwenden. Das Exklusiv-Oder lässt sich auch mittels Bedingung realisieren. Ist der Eingang b_i
gleich 0
enstpricht der Ausgang a_i
, ansonsten entspricht der Ausgang not a_i
:
Beispiel
sum_o <= a_i when b_i='0' else not a_i;
Bei einer bedingten Signalzuweisung wird immer ein Multiplexer mit zwei Eingängen beschrieben.
Verschachtelung
Der Ausdruck im else
Zweig kann auch wieder eine bedingte Signalzuweisung sein:
result <= (others => '0') when clear='1' else input when load='1' else counter + 1;
Selektive Signalzuweisung mittels with
/select
Die selektive Signalzuweisung erlaubt den Aufbau eines Multiplexers mit mehreren Eingängen. Dazu wird folgender Syntax verwendet:
with select_expr select signal <= expr1 when choice, expr2 when choice2, expr3 when choice3, -- ... exprN when others;
Beispiel
Dazu ein ausführlicheres Beispiel, das die Umwandlung einer 4 Bit BCD Zahl in eine Sieben Segment Anzeige erlaubt (siehe auch Übung1):
library ieee; use ieee.std_logic_1164.all; entity seven_seg_decoder is port ( digit_i : in std_ulogic_vector(3 downto 0); segments_o : out std_ulogic_vector(6 downto 0) ); end entity; architecture behave of seven_seg_decoder is begin with digit_i select segments_o <= "0000001" when "0000", -- display 0 "1001111" when "0001", -- display 1 "0010010" when "0010", -- display 2 "0000110" when "0011", -- display 3 -- ... "1111111" when others; end architecture;