Verhaltensmodellierung
Bei der Verhaltensmodellierung wird ein System durch einen Algorithmus in VHDL Notation veschrieben. Es werden keine Gatter oder komplexere Komponenten direkt verwendet. Ein Verhaltensmodell ist im Prinzip eine Black Box Sicht des zu beschreibenden Systems.
Ein Volladdierer lässt sich mittels Verhaltensmodellierung wie folgt beschreiben:
entity fulladder is port( x, y, cin: in std_ulogic; s, cout:out std_ulogic ); end entity; architecture behave of fulladder is begin s <= '0' when (x = '0' and y = '0' and cin = '0') else '1' when (x = '0' and y = '0' and cin = '1') else '1' when (x = '0' and y = '1' and cin = '0') else '0' when (x = '0' and y = '1' and cin = '1') else '1' when (x = '1' and y = '0' and cin = '0') else '0' when (x = '1' and y = '0' and cin = '1') else '0' when (x = '1' and y = '1' and cin = '0') else '1' when (x = '1' and y = '1' and cin = '1'); cout <= '0' when (x = '0' and y = '0' and cin = '0') else '0' when (x = '0' and y = '0' and cin = '1') else '0' when (x = '0' and y = '1' and cin = '0') else '1' when (x = '0' and y = '1' and cin = '1') else '0' when (x = '1' and y = '0' and cin = '0') else '1' when (x = '1' and y = '0' and cin = '1') else '1' when (x = '1' and y = '1' and cin = '0') else '1' when (x = '1' and y = '1' and cin = '1'); end architecture;
In der Beschreibung wird das Verhalten dargestellt, in diesem Beispiel mittels Umsetzung der Wahrheitstabelle.
Strukturmodellierung
Die Basis für den strukturellen VHDL Entwurf ist ein synchrones Design. Prinzipiell besteht jedes synchrone Design aus Kombinatorik und Flip-Flops (meist Register genannt), die alle auf einen gemeinsamen Takt synchronisiert sind.
Um das Design zu strukturieren wird meist das Design meist als Datenpfades aufgebaut. Elemente eines Datenpfades sind dabei:
- Multiplexer
- Arithmetische Operatoren (Addierer, Subtrahierer, usw.)
- Logische Operatoren
- Komperatoren
- Register
- Diverse andere Elemente wie Vorzeichenerweiterung usw.
Die Elemente und die Pfade zwischen den Elementen können entweder einzelne Signale sein oder mehrere zusammengefasste Signale (Busse).
Beispiel
Im folgenden Beispiel soll ein Zähler aufgebaut werden mit drei Eingangssignale value
(Bus mit 8 Bit), load
und clear
. Wie in allen synchronen Designs wird ein gemeinsamer Takt für alle Register genutzt (hier clock
). Das Register hat eine Bitbreite von 8.
Textuelle Beschreibung
Die Funktion soll wie folgt sein:
- Wenn
clear
gleich1
ist, soll der Zählerstand auf0
gesetzt werden, - ansonsten wenn
load
gleich1
ist, soll der Zählerstand aufvalue
gesetzt werden - ansonsten soll der Zählerstand um
value
erhöht werden.
Schaltung
VHDL Entity
entity sum is port ( clk: in std_ulogic; value: in unsigned(7 downto 0); load: in std_ulogic; clear: in std_ulogic; result: out unsigned(7 downto 0) ); end entity;
VHDL Architecture
architecture behave of sum is begin process(clk) begin if rising_edge(clk) then if clear='1' then result<=(others=>'0'); elsif load='1' then result<=value; else result<=result+value; end if; end if; end process; end architecture;
Timingdiagramm
Test des Designs
Umsetzung des Volladdierers
entity fulladder is port( x, y, cin: in std_ulogic; s, cout:out std_ulogic ); end entity; architecture structural of fulladder is signal halfadder1_s : std_ulogic ; signal halfadder1_cout : std_ulogic ; signal halfadder2_cout : std_ulogic ; begin halfadder1: entity work.halfadder port map ( x => x, y => y, cout => halfadder1_cout, s => halfadder1_s ); halfadder2: entity work.halfadder port map ( x => halfadder1_s, y => cin, cout => halfadder2_cout, s => s ); cout <= halfadder1_cout or halfadder2_cout; end architecture;
An diesem Beispiel für die strukturelle Modellierung sieht man den Aufbau mittels Komponenten. Dadurch ergibt sich eine Hierarchie der Komponenten.
Datenflussmodellierung
Bei der Datenfluss wird der Fluss der Daten modelliert. Dabei werden auf die Eingänge Transformationen angewendet, um die Ausgänge zu berechnen.
entity fulladder is port( x, y, cin: in std_ulogic; s, cout:out std_ulogic ); end entity; architecture dataflow of fulladder is begin s <= x xor y xor cin; cout <= (x and y) or ( (x xor y) and cin); end architecture;