Upload
hoangdan
View
215
Download
0
Embed Size (px)
Citation preview
1
Gliederung dieser Einführung in VHDL
1) Formaler Aufbau von VHDL-Modellen
2) Testumgebungen
VHDL-Modelle, die Eingangssignale zum Testen eines
Modells bereitstellen
3) Zeitmodelle in VHDL
Nachbildung des Zeitverhaltens der modellierten Hardware
4) Modellierung von Zustandsautomaten in VHDL
Systematische Beschreibung digitaler Systeme
2
Zeitmodelle in VHDL
Zeitmodelle in VHDL
3
Signal-Zuweisungen stellen neue Werte für Signale bereit:
SUM <= A + B;
Diese Zuweisung beschreibt die Funktion eines Addierers.
Der Ausdruck auf der rechten Seite wird ausgewertet,sein Datentyp muss dem des Signals SUM entsprechen.
Der Output eines Hardware-Bausteins ändert sich nicht unmittelbar,
wenn sich ein Einganssignal ändert, sein Modell muss also eine
Verzögerung (ein Delay) enthalten:
CARRY <= A and B after 7 ns;
Kapazitäten und Induktivitäten bewirken in einer Analog-Schaltung
Einschwingvorgänge, die im digitalen Modell abstrahierend in einem
konzentrierten Delay zusammengefasst werden.
Signal-Zuweisungen
4
Eine Waveform beschreibt eine zeitlich aufsteigende Folge von
Werten (alle Zeiten beziehen sich auf die aktuelle Simulationszeit):
CLK <= '1' after PulsWeite, '0' after 2*PulsWeite;
Zusätzlich kann ein Delay-Mechanismus angegeben werden; voreingestellt ist der inertial-Mechanismus.
SUM <= transport A + B after 12 ns;
Waveforms & Delay-Mechanismen
5
Es gibt formal zwei (gleichwertige) Arten Prozesse zu beschreiben:
Prozesse ohne sensitivity list (mit wait-Anweisungen):
• Anweisungen im process body werden sequentiell ausgeführt. Nach der letzten Anweisung wird wieder mit der ersten fortgefahren ohne Fortschaltung der Simulationszeit.
• Eine wait-Anweisung deaktiviert einen process.
• Damit keine Endlosschleifen entstehen, muß mindestens eine wait-Anweisung vorhanden sein.
Prozesse mit sensitivity list (ohne wait-Anweisungen):
• Die sensitivity list ist eine Liste von Signalnamen. Der processwird aktiviert, wenn sich eines dieser Signale ändert.
• Der process verhält sich so, als ob vor der end-process-Anweisung eine wait-on-signal-Anweisung stünde.
• Der process darf keine wait-Anweisungen enthalten.
Aktivierung und Deaktivierung von Prozessen
6
Wait-Anweisungen
Durch wait-Anweisungen werden Prozesse suspendiert.
Es gibt vier Varianten:
wait on CLK_SIGNAL, ENABLE; sensitivity clause
Der Prozess wird wieder aufgenommen, wenn bei einem der genannten Signale eine Wertänderung (ein Event) auftritt.
wait until CLOCK='1'; condition clause
Der Prozess wird wieder aufgenommen, sobald der Boolesche Ausdruck wahr wird.
wait for 1 ms; time-out clause
wait for 2*TaktPeriode;
Der Prozess wird nach Ablauf der angegebenen Simulationszeit wieder aufgenommen.
wait;
Der Prozess wird genau einmal während der Initialisierung durchgeführt und bleibt dann deaktiviert.
7
signal CLK: bit:='0';
constant PulsWeite: time:=20 ns; -- physical type
ClockGen1: process(CLK)
begin
if CLK='0' then
CLK <= '1' after PulsWeite,
'0' after 2*PulsWeite; -- waveform
end if;
end process ClockGen1;
Beispiel: Clock-Generator (1)
0
1
20 40 60 80 1000 ns
1 2 4 5 63Aktivierung
8
signal CLK: bit:='0';
constant PulsWeite:time:=20 ns; -- physical type
ClockGen2a: process
begin
CLK <= '1' after PulsWeite,
'0' after 2*PulsWeite;
wait until CLK='0'; -- d.h. warten bis sich
-- CLK auf '0' ändert
end process ClockGen2a;
ClockGen2b: process
begin
CLK <= '1' after PulsWeite,
'0' after 2*PulsWeite;
wait for 2*PulsWeite; -- d.h. warten für
-- diese Zeitspanne
end process ClockGen2b;
Beispiel: Clock-Generator (2)
9
signal CLK: bit:='0';
constant PulsWeite:time:=20 ns; -- physical type
ClockGen3: process
begin
CLK <= '0';
wait for PulsWeite;
CLK <= '1';
wait for PulsWeite;
end process ClockGen3;
Beispiel: Clock-Generator (3)
0
1
20 40 60 80 1000 ns
10
entity MUX2 is
port(A, B, SEL: in bit;
Z: out bit);
end MUX2;
architecture behavior_1 of MUX2 is
constant prop_delay: time := 2 ns;
begin
MUX2_V1: process(A, B, SEL)
begin -- Änderungen von A, B und SEL können zu
-- Wertänderungen am Ausgang Z führen!
case SEL is
when '0' => Z <= A after prop_delay;
when '1' => Z <= B after prop_delay;
end case;
end process MUX2_V1;
end behavior_1;
Beispiel: 2fach-Multiplexer (1)
1
0A
B
Z
SEL
11
architecture behavior_2 of MUX2 is
constant prop_delay: time := 2 ns;
begin
MUX2_V2: process
begin
case SEL is
when '0' =>
Z <= A after prop_delay;
wait on SEL, A;
-- Der Prozess wartet also nicht auf B,
-- wenn A selektiert ist!
when '1' =>
Z <= B after prop_delay;
wait on SEL, B;
-- Der Prozess wartet also nicht auf A
end case;
end process MUX2_V2;
end behavior_2;
Beispiel: 2fach-Multiplexer (2)
1
0A
B
Z
SEL
12
entity MUX2 is
port(A, B, SEL: in bit;
Z: out bit);
end MUX2;
architecture behavior_3 of MUX2 is
constant prop_delay: time := 2 ns;
begin
Z <= A after prop_delay when SEL='0' else
B after prop_delay;
end behavior_3;
Beispiel: 2-Input-Multiplexer (3)
1
0A
B
Z
SEL
13
Datenfluß-Modell des 2x4-Dekoders
entity DEK2X4 is
port (A, B, EN: in bit;
D: out bit_vector(0 to 3));
end DEK2X4;
architecture DATENFLUSS of DEK2X4 is
signal AQ, BQ: bit;
begin
-- 6 nebenläufige Signal-Zuweisungen
-- Reihenfolge der Anweisungen ist ohne Bedeutung
D(3) <= not(A and B and EN); -- (1)
D(0) <= not(AQ and BQ and EN); -- (2)
BQ <= not B; -- (3)
D(2) <= not(A and BQ and EN); -- (4)
AQ <= not A; -- (5)
D(1) <= not(AQ and B and EN); -- (6)
end DATENFLUSS;
14
Datenfluß-Modell des 2x4-Dekoders
entity DEK2X4 is
port (A, B, EN: in bit;
D: out bit_vector(0 to 3));
end DEK2X4;
architecture DATENFLUSS of DEK2X4 is
signal AQ, BQ: bit;
begin
-- 6 nebenläufige Signal-Zuweisungen
-- Wertänderung (Event) am Eingang B angenommen
D(3) <= not(A and B and EN); -- (1)
D(0) <= not(AQ and BQ and EN); -- (2)
BQ <= not B; -- (3)
D(2) <= not(A and BQ and EN); -- (4)
AQ <= not A; -- (5)
D(1) <= not(AQ and B and EN); -- (6)
end DATENFLUSS;
15
Datenfluß-Modell des 2x4-Dekoders
entity DEK2X4 is
port (A, B, EN: in bit;
D: out bit_vector(0 to 3));
end DEK2X4;
architecture DATENFLUSS of DEK2X4 is
signal AQ, BQ: bit;
begin
-- 6 nebenläufige Signal-Zuweisungen
-- Events an den Signalen D(3), BQ, D(1)
D(3) <= not(A and B and EN); -- (1)
D(0) <= not(AQ and BQ and EN); -- (2)
BQ <= not B; -- (3)
D(2) <= not(A and BQ and EN); -- (4)
AQ <= not A; -- (5)
D(1) <= not(AQ and B and EN); -- (6)
end DATENFLUSS;
16
Simulationsablauf beim 2x4-Dekoder
Zeit-
punkt
Events Aktionen
T Eingang B Triggern der Anweisungen (1), (3) und (6),
Auswerten deren rechter Seiten,
Einplanen der Wertzuweisungen an
die Signale D(3), BQ, D(1)
T1>T D(3),BQ,D(1) Wertzuweisung an
die Signale D(3), BQ, D(1),
Triggern der Anweisungen (2) und (4),
Auswerten deren rechter Seiten,
Einplanen der Wertzuweisungen an
die Signale D(0), D(2)
T2>T1D(0), D(2) Wertzuweisung an D(0), D(2)
17
Schaltungsentwürfe müssen geprüft (validiert) werden,
um möglichst alle Entwurfsfehler zu beseitigen,
bevor mit der teuren Produktion der Schaltung begonnen wird.
Schaltungssimulation bedeutet, daß für einen Satz von Eingangs-
signalen (Stimuli) über ein Zeitintervall bestimmte Schaltungseigen-
schaften bestimmt werden und mit den erwarteten Werten verglichen
werden.
Schaltungsverifikation ist eine formale Methode, um zwei
Schaltungsmodelle auf ihre Konsistenz (Funktionsgleichheit) zu
untersuchen oder sie bezüglich bestimmter Eigenschaften (z.B.
Verklemmungen) zu überprüfen.
Schaltungsanalyse: Simulation & Verifikation
18
Damit auch sehr große Schaltungen simuliert werden können,
müssen Simulatoren sehr effizient arbeiten.
Für digitale Schaltungen wird dies durch ereignisgesteuerte
Simulation (event-driven simulation) erreicht.
Sie beruht darauf, daß (im Gegensatz zur analogen Simulation)
eine Schaltungskomponente nur dann ausgewertet wird,
wenn eine Signalwertänderung an einem (oder auch mehreren)
ihrer Eingänge auftritt.
Wie wird nun ein VHDL-Programm interpretiert,
so daß die Ergebnisse der Simulation möglichst genau mit den
Signalverläufen des Hardware-Bausteins übereinstimmen?
Ereignisgesteuerte Simulation
19
Der Begriff Simulationszeit bezieht sich auf die Zeit, mit welcher der modellierte Hardware-Baustein arbeitet. Bei der Simulation wird diese Zeit in Form von Zeitwerten mitgeführt.
Diese unterscheidet sich von der Ausführungszeit des VHDL-Modells auf dem Simulationsrechner.
Durch eine Signalzuweisung wird eine Transaktion zur späteren Ausführung eingeplant (scheduled transaction). Eine Transaktion ist ein Wertepaar (Neuer_Signalwert, Simulationszeit).
Wenn zur Simulationszeit der Transaktion der neue Signalwert vom bisherigen verschieden ist, spricht man vom Auftreten eines Events (Wertänderung).
Prozesse reagieren auf Events, nicht auf Transaktionen!
Transaktionen & Events
20
Ein Treiber (driver) ist eine Datenquelle für ein Signal, die Werte für zukünftige Zuweisungen bereithält. Ein Prozess definiert einen Treiber für einen Signalnamen genau dann, wenn er mindestens eine Zuweisung für das Signal enthält.
Der Treiber eines Signals ist eine zeitlich aufsteigend geordnete Liste aller für dieses Signal eingeplanten Transaktionen, d.h. von Wertepaaren (Signalwert, Simulationszeit) = (Wi,Ti).
Jeder Treiber enthält zumindest einen Eintrag, den aktuellen Signalwert (W0,T0), anfangs den initialisierten Wert.
(W0,T0), (W1,T1), (W2,T2), (W3,T3), ...
Grundsätzlich ist pro Signal nur ein Treiber erlaubt. Bei mehreren Treibern (z.B. Busse, Wired-OR) muß eine resolution functionangegeben werden, die den resultierenden Signalwert definiert.
Signal-Treiber
W1
T1
W2
T2
W3
T3
21
Ereignisgesteuerte Simulation (event-driven simulation) beruht darauf, daß eine Schaltungskomponente nur dann ausgewertet wird, wenn eine Signalwertänderung an einem (oder auch mehreren) ihrer Eingänge auftritt. Dies wird mit einem Simulationszyklus realisiert:
Initialisierungsphase
Allen Variablen und Signalen wird ihr Initialwert zugewiesen.
Die Simulationszeit wird auf 0 fs gesetzt.
Alle Prozesse werden aktiviert, ihre Anweisungen ausgeführtund bei einer wait-Anweisung wieder suspendiert.
Es folgt
Simulationszyklus (1)
Signal-Update-Phase Prozessausführungsphase
22
Signal-Update-Phase
- Fortschalten der Simulations-
zeit zur nächsten Transaktion
(oder zum nächsten Prozess-
Timeout)
- Ausführen aller für
den aktuellen Zeitpunkt
vorliegenden Transaktionen.
Prozessausführungsphase
- Prozesse, für die
Signalwertänderungen
(Events) vorliegen, werden
wieder aufgenommen.
Mögliche Folge:
Neue Transaktionen
zum gleichen oder einem
späteren Zeitpunkt
Simulationszyklus (2)
Initialisierungsphase
23
Die AnweisungDATA <= X"00" after DELAY;
werde zur Simulationszeit T ausgeführt.
Für das Signal DATA wird eine Transaktion des hexadezimalen
Wertes X"00" zur Simulationszeit T+DELAY eingeplant.
Der Wert des Signals DATA wird jedoch zum Zeitpunkt T noch nicht
geändert. Alle aktiven Prozesse werden fortgeführt.
Erst wenn alle Prozesse suspendiert sind, wird der nächste
Simulationszyklus gestartet und die Simulationszeit fortgeschaltet.
Wenn die Simulationszeit T+DELAY erreicht ist, wird dem Signal
DATA der eingeplante Wert X"00" zugewiesen und alle auf DATA
sensitiven Prozesse gestartet.
Simulation einer Signalzuweisung
24
Signalverzögerungszeiten können in einer Signalzuweisung optional angegeben werden. Falls eine Verzögerungszeit nicht explizit angegeben ist, werden 0 fs angenommen.
Da bei der Ausführung einer Zuweisung zunächst nur eine Transaktion für das Signal eingeplant wird, also auch bei einer Verzögerung von 0 fs keine sofortige Änderung des Signalwerts erfolgt, sieht der Prozess eine Wertänderung erst bei seinernächsten Ausführung (dem nächsten Simulationszyklus).
Auch bei einer Verzögerung von 0 fs wird ein neuer Simulations-zyklus durchlaufen, die Simulationszeit bleibt aber gleich; man spricht von einer Delta-Verzögerung (infinitesimal kleiner Zeitschritt, delta delay).
Das Konzept der Delta-Verzögerungen stellt die Kausalität der Anweisungen sicher, so dass bereits eine Simulation möglich ist, wenn noch keine Verzögerungszeiten bekannt sind.
Delta-Verzögerungen
25
library ieee;
use ieee.std_logic_1164;
entity ANDOR is
port (A,B,C: in std_ulogic;
CLK: in std_ulogic;
Z: out std_ulogic);
end ANDOR;
Beispiel: Erzeugen (flankengesteuerter) FlipFlops
architecture AAO1 of ANDOR is
signal P: std_ulogic;
begin
AOprocess: process (CLK)
begin
if rising_edge(CLK) then
P <= A and B;
Z <= P or C;
end if;
end process;
end AAO1;
A
B
Z
CLK
ANDOR
1
OR
&
AND
C D Q
D Q
P
26
library ieee;
use ieee.std_logic_1164;
entity ANDOR is
port (A,B,C: in std_ulogic;
CLK: in std_ulogic;
Z: out std_ulogic);
end ANDOR;
Beispiel: Erzeugen (flankengesteuerter) FlipFlops
architecture AAO2 of ANDOR is
begin
AOprocess: process (CLK)
variable P: std_ulogic;
begin
if rising_edge(CLK) then
P := A and B;
Z <= P or C;
end if;
end process;
end AAO2;
A
B
Z
CLK
ANDOR
1
OR
&
AND
C D Q
P
27
architecture TestArch of TestEntity is
signal A, B: integer := 0;
begin
A <= 1 after 3 ns, 2 after 7 ns;
TestProcess: process(A)
variable C: integer := -1;
begin
B <= A; -- Signalzuweisung (eingeplant!)
C := B; -- Variablenzuweisung (sofort!)
end process TestProcess;
end TestArch;
Simulationszyklus – Beispiel
0 ns
A
B
C
28
architecture TestArch of TestEntity is
signal A, B: integer := 0;
begin
A <= 1 after 3 ns, 2 after 7 ns;
TestProcess: process(A)
variable C: integer := -1;
begin
B <= A; -- Signalzuweisung (eingeplant!)
C := B; -- Variablenzuweisung (sofort!)
end process TestProcess;
end TestArch;
Simulationszyklus – Beispiel
0 ns
A 0
B 0
C 0
29
architecture TestArch of TestEntity is
signal A, B: integer := 0;
begin
A <= 1 after 3 ns, 2 after 7 ns;
TestProcess: process(A) –- Nicht aktiviert!
variable C: integer := -1;
begin
B <= A; -- Signalzuweisung (eingeplant!)
C := B; -- Variablenzuweisung (sofort!)
end process TestProcess;
end TestArch;
Simulationszyklus – Beispiel
0 ns 0 ns +
A 0 0
B 0 0
C 0 0
30
architecture TestArch of TestEntity is
signal A, B: integer := 0;
begin
A <= 1 after 3 ns, 2 after 7 ns;
TestProcess: process(A)
variable C: integer := -1;
begin
B <= A; -- Signalzuweisung (eingeplant!)
C := B; -- Variablenzuweisung (sofort!)
end process TestProcess;
end TestArch;
Simulationszyklus – Beispiel
0 ns 0 ns + 3 ns
A 0 0 1
B 0 0 0
C 0 0 0
31
architecture TestArch of TestEntity is
signal A, B: integer := 0;
begin
A <= 1 after 3 ns, 2 after 7 ns;
TestProcess: process(A) –- Nicht aktiviert!
variable C: integer := -1;
begin
B <= A; -- Signalzuweisung (eingeplant!)
C := B; -- Variablenzuweisung (sofort!)
end process TestProcess;
end TestArch;
Simulationszyklus – Beispiel
0 ns 0 ns + 3 ns 3 ns +
A 0 0 1 1
B 0 0 0 1
C 0 0 0 0
32
architecture TestArch of TestEntity is
signal A, B: integer := 0;
begin
A <= 1 after 3 ns, 2 after 7 ns;
TestProcess: process(A)
variable C: integer := -1;
begin
B <= A; -- Signalzuweisung (eingeplant!)
C := B; -- Variablenzuweisung (sofort!)
end process TestProcess;
end TestArch;
Simulationszyklus – Beispiel
0 ns 0 ns + 3 ns 3 ns + 7 ns
A 0 0 1 1 2
B 0 0 0 1 1
C 0 0 0 0 1
33
architecture TestArch of TestEntity is
signal A, B: integer := 0;
begin
A <= 1 after 3 ns, 2 after 7 ns;
TestProcess: process(A)
variable C: integer := -1;
begin
B <= A; -- Signalzuweisung (eingeplant!)
C := B; -- Variablenzuweisung (sofort!)
end process TestProcess;
end TestArch;
Simulationszyklus – Beispiel
0 ns 0 ns + 3 ns 3 ns + 7 ns 7 ns +
A 0 0 1 1 2 2
B 0 0 0 1 1 2
C 0 0 0 0 1 1
34
Modellierung der Signallaufzeit eines idealen Bauelements mit
unbegrenzter Bandbreite, kürzeste Impulse werden übertragen.
Signaltreiber: (W0,T0), (W1,T1), (W2,T2), ..., (Wi,Ti), ..., (Wk,Tk)
Regel für das Einfügen einer neuen Transaktion (Wn,Tn):
Alle Transaktionen (Wi,Ti) mit Tn Ti werden gelöscht.
Die neue Transaktion (Wn,Tn) wird am Ende der Liste angefügt.
Einfluß hat nur die Verzögerung, nicht der Signalwert.
Wie wirkt das Transport-Delay auf Treiber?
35
Beispiel: Ideale Leitung
signal LineIn, LineOut: bit := '0';
LineIn <= '1' after 20 ps, '0' after 50 ps;
TransmissionLine: process(LineIn)
begin
LineOut <= transport LineIn after 50 ps;
end process TransmissionLine;
80 1200 ps20 40 10060
1
0LineIn
1
0LineOut
'1'
70
'1'
70
'0'
100
'0'
100
Treiber fürLineOut
'1'
70
'0'
100
36
Beispiel: Unsymmetrische Verzögerung
signal A, Z: bit := '0';
A <= '1' after 20 ps, '0' after 40 ps;
AsymDelay: process(A)
begin
if A='1' then
Z <= transport A after 80 ps;
else –- A='0'
Z <= transport A after 50 ps;
end if;
end process AsymDelay;
1
0Z
80 1200 ps20 40 10060
1
0A
20 ps
'1'
100
'0'
90
'1'
100
Kein
Event!Treiberfür Z
37
Modellierung realer, d.h. speichernder (träger, englisch inertial) Bauelemente mit endlicher Übertragungsbandbreite.
Inertial Delay ist die Voreinstellung.
Signaltreiber: (W0,T0), (W1,T1), (W2,T2), ..., (Wi,Ti), ..., (Wk,Tk)
Regel für das Einfügen einer neuen Transaktion (Wn,Tn):
Alle Transaktionen (Wi,Ti) mit Tn Ti werden gelöscht.
Die neue Transaktion (Wn,Tn) wird am Ende der Liste angefügt.
Im Intervall T0 Ti Tn gilt: Eine ununterbrochene Folge von Transaktionen (Wi,Ti), ..., (Wn,Tn) mit Wi = Wn bleibt erhalten, alle anderen Transaktionen werden gelöscht.
Verzögerung und Signalwert beeinflussen das Verhalten.
Wie wirkt das Inertial Delay auf Treiber?
38
Beispiel: Inverter mit Verzögerung
signal A: bit := '0';
signal Y: bit := '1';
A <= '1' after 1 ns, '0' after 6 ns, '1' after 8 ns;
INV: process(A)
begin
Y <= not A after 3 ns; -- inertial voreingestellt
end process INV;
8 120 ns2 4 106
1
0A
2 ns
39
Beispiel: Inverter mit Verzögerung
signal A: bit := '0';
signal Y: bit := '1';
A <= '1' after 1 ns, '0' after 6 ns, '1' after 8 ns;
INV: process(A)
begin
Y <= not A after 3 ns; -- inertial voreingestellt
end process INV;
8 120 ns2 4 106
1
0Y
1
0A
2 ns
'0'
4
'1'
9
'1'
9
'0'
11
Treiberfür Y
'0'
4
'0'
11
Kein
Event!
40
library IEEE; use IEEE.std_logic_1164.all;entity And2 is
port(A, B: in std_logic; Y: out std_logic);
end And2;
architecture And2_with_delay of And2 issignal AndOut: std_logic;
beginAnd2_gate: process(A, B) –- idealisiertes UND-Gatter
beginAndOut <= A and B;
end process And2_gate;
And2_delay: process(AndOut)begin –- inertial delay ist voreingestellt
if AndOut='1' thenY <= '1' after 1.5 ns;
elseif AndOut='0' thenY <= '0' after 1.2 ns;
elseY <= 'X' after 0.5 ns;
end if;end process And2_delay;
end And2_with_delay;
Beispiel: 2-Input-UND-Gatter
delay
41
Beispiel: 2-Input-UND-Gatter – Signalverläufe
0
4 6 80 ns1 2 5 73
1
0A
1
0B
42
Beispiel: 2-Input-UND-Gatter – Signalverläufe
0
1
0
1
uninit.
uninitialized
4 6 80 ns1 2 5 73
1
0A
1
0B
AndOut
Y
'0'
2,2
'0'
2,2
'1'
3,5
'1'
3,5
'0'
4,2
'0'
4,2
'1'
7,5
Treiberfür Y
'1'
7,5
1 ns
1 ns
43
Zustandsautomaten
Zustandsautomaten
44
(Endliche) Zustandsautomaten
• Englisch "finite state machine" oder abgekürzt FSM
• Systematische Grundlage für die Beschreibung und den Entwurf
digitaler Systeme
• Erleichtern die Realisierung zyklischer Funktionsabläufe
– Steuern von Logikschaltungen
– Synchronisation mehrerer Teilsysteme
• Zustandsautomaten sind synchrone Schaltwerke, d.h. alle
Funktionen sind an ein periodisches Taktsignal gebunden
• Zustandsautomaten sind sequentiell arbeitende
Logikschaltungen, die gesteuert durch ein periodisches
Taktsignal eine Folge von Zuständen durchlaufen.
• Grundstrukturen, Automatentypen, Automatenvarianten
– Moore-Automat
– Mealy-Automat
45
Zustandsautomaten (Moore-Typ)
Die Ausgangssignale des Moore-Automaten sind nur eine Funktion
des aktuellen Automatenzustands, nicht der Eingangssignale.
E Eingangssignale A Ausgangssignale
Z Automatenzustände Z+ Folgezustände
Übergangs-
schaltnetz
Zustands-
speicher
Ausgangs-
schaltnetzE Z+
A
Z
enable reset
clock
46
Zustandsautomaten (Mealy-Typ)
Die Ausgangssignale des Mealy-Automaten sind eine Funktion des
aktuellen Automatenzustands und der Eingangssignale.
E Eingangssignale A Ausgangssignale
Z Automatenzustände Z+ Folgezustände
Übergangs-
schaltnetz
Zustands-
speicher Ausgangs-
schaltnetz
E Z+ AZ
enable reset
clock
47
Zustandsautomaten (Eigenschaften)
Synchrones Schaltwerk mit drei Funktionsblöcken:
• Zustandsspeicher
– N synchron getaktete Flipflops
– 2N Zustände können binär codiert werden
– Jede (positive) Flanke des clock-Signals bewirkt, daß die
Folgezustände Z+ als aktuelle Zustände Z für eine Taktperiode
gespeichert werden
– Das enable-Signal gibt das Fortschalten von einem Zustand zum
nächsten frei
– Das reset-Signal dient der Initialisierung des Zustandsspeichers mit
einem vorgegebenen Bitmuster
• Übergangsschaltnetz
– Kombinatorische Logik
• Ausgangsschaltnetz
– Kombinatorische Logik
48
FSM-Beispiel Impulsfolgeerkennung (1a)
• Erkennen dreier aufeinander folgender 2-Bit-Muster (01, 11, 10)
an den zwei Eingängen
• Erfolgreiche Erkennung mit dem Ausgangssignal 1 anzeigen
• Der 1-Pegel des Ausgangssignals soll eine Taktperiode anliegen
• Zustandsdiagramm (Moore):
Reset Z0
0
Z1
0
Z3
1
Z2
0
X0
X0
11
01
01 11
10
01 1100
01X0 11
49
FSM-Beispiel Impulsfolgeerkennung (1b)
entity FSM_Moore is
port(Clock, Reset, Enable: in bit;
E: in bit_vector(1 downto 0);
A: out bit);
end FSM_Moore;
architecture Sequenz of FSM_Moore is
begin
type Zustaende is (Z0, Z1, Z2, Z3); -- Aufzaehlungstyp
signal Zustand, Fz: Zustaende;
begin
Zsp: process(Clock, Reset)
begin
if Reset='1' then Zustand <= Z0 after 20 ns;
elseif Clock='1' and Clock'event then
if Enable='1' then Zustand <= Fz after 20 ns;
end if;
end if;
end process Zsp;
...
50
FSM-Beispiel Impulsfolgeerkennung (1c)
UeSn: process(E, Zustand)
begin
case Zustand is
when Z0 => if E="01" then Fz <= Z1 after 20 ns;
else Fz <= Z0 after 20 ns;
end if;
when Z1 => if E="11" then Fz <= Z2 after 20 ns;
elseif E="01" then Fz <= Z1 after 20 ns;
else Fz <= Z0 after 20 ns;
end if;
when Z2 => if E="10" then Fz <= Z3 after 20 ns;
elseif E="01" then Fz <= Z1 after 20 ns;
else Fz <= Z0 after 20 ns;
end if;
when Z3 => if E="01" then Fz <= Z1 after 20 ns;
else Fz <= Z0 after 20 ns;
end if;
end case;
end process UeSn;
51
FSM-Beispiel Impulsfolgeerkennung (1d)
...
AusSn: process(Zustand)
begin
case Zustand is
when Z3 => A <= '1' after 20 ns;
when others => A <= '0' after 20 ns;
end case;
end process AusSn;
end Sequenz;
52
FSM-Beispiel Impulsfolgeerkennung (2a)
• Erkennen dreier aufeinander folgender 2-Bit-Muster (01, 11, 10)
an den zwei Eingängen
• Anzeigen mit dem Ausgangssignal 1
• Der 1-Pegel des Ausgangssignals soll eine Taktperiode anliegen
• Zustandsdiagramm (Mealy):
ResetZ0 Z1
Z2
X0/0
01/0
01/0 11/011/0
00/0
01/0X0/0 11/0
10/1
53
FSM-Beispiel Impulsfolgeerkennung (2b)
entity FSM_Mealy is
port(Clock, Reset, Enable: in bit;
E: in bit_vector(1 downto 0);
A: out bit);
end FSM_Mealy;
architecture Sequenz of FSM_Mealy is
begin
type Zustaende is (Z0, Z1, Z2); -- Aufzaehlungstyp
signal Zustand, Fz: Zustaende;
begin
Zsp: process(Clock, Reset)
begin
if Reset='1' then Zustand <= Z0 after 20 ns;
elseif Clock='1' and Clock'event then
if Enable='1' then Zustand <= Fz after 20 ns;
end if;
end if;
end process Zsp;
...
...
54
FSM-Beispiel Impulsfolgeerkennung (2c)
UeSn: process(E, Zustand)
begin
Fz <= Z0 after 20 ns;
case Zustand is
when Z0 => if E="01" then Fz <= Z1 after 20 ns;
end if;
when Z1 => if E="11" then Fz <= Z2 after 20 ns;
elseif E="01" then Fz <= Z1 after 20 ns;
end if;
when Z2 => if E="01" then Fz <= Z1 after 20 ns;
end if;
end case;
end process UeSn;
AusSn: process(E, Zustand)
begin
A <= '0' after 20 ns;
if (Zustand=Z2 and E="10") then A <= '1' after 20 ns;
end if;
end process AusSn;
end Sequenz;