Einzelne Zustände werden als Kreise dargestellt.
Im Kreis ist die Zustandsinformation
Zustandsübergänge werden mit Pfeilen gekennzeichnet.
Am Pfeil stehen die auslösenden Signale
Nr
UD
Sn
Sn+1
0
0
0 0
1 0
1
0
0 1
0 0
2
0
1 0
0 1
3
0
1 1
1 0
4
1
0 0
0 1
5
1
0 1
1 0
6
1
1 0
0 0
7
1
1 1
0 0
Ein Zustandsdiagramm benötigt immer eine Legende, damit man weiss was dargestellt wird.
Modulo 5 Zähler: Aufgabenstellung
Bauen Sie einen Modulo 5 Zähler.
Modulo 5 Zähler:
0,1,2,3,4,0,1,2,3,4,0..
CLK
Mit jeder steigenden Flanke wird Eins hochgezählt
Taktteiler:
Drei FF werden benötigt.
Dies ist eine offen Aufgabenstellung. Die Spezifikation ist unvollständig.
Impliziert wird eine Taktsteuerung.
Steuert das Taktsignal das Zählen oder ein enable Eingang (CE)?
Modulo 5 Zähler: Zustandsdiagramm
3 Speicherzellen
8 Zustände
5 Zustände werden benutzt.
Kein Signal an den Pfeilen, da die Zustandsänderung auf jeden Fall durchgeführt wird.
Modulo 5 Zähler: Zustandstabelle
Eine Zustandstabelle wird erzeugt und mit Karnaugh Veitch minimiert.
Clk Nr
Bn
Bn+1
0
0 0 0
0 0 1
1
0 0 1
0 1 0
2
0 1 0
0 1 1
3
0 1 1
1 0 0
4
1 0 0
0 0 0
5
1 0 1
D/0 D/1 D/0
6
1 1 0
D/0 D/1 D/0
7
1 1 1
D/1 D/0 D/0
B0n+1=/B0n·/B2n
B1n+1=(B0n·/B1n)
+ (/B0n·B1n)
B2n+1= B0n·B1n
Modulo 5 Zähler: Schaltungsrealisierung
LTSPICE code
Man sieht eine typische Medwedew-Zustandsmaschine.
Die Ausgänge werden für die Erzeugung des nächsten Zustands invertiert und nichtinvertiert
links bereitgestellt.
Die disjunktive Normalform wird durch NAND Gatter in der Mitte dargestellt.
Je nach logischer Verknüpfung werden mehrere NAND Gatter zusammengeschaltet und
mit den entsprechenden Signalen verbunden.
Modulo 5 Zähler: Schaltungssimulation
LTSPICE code
In der Simulation sieht man das CLK-Signal, clr, und die Zählerausgänge b0, b1, b2.
Am Anfang kann man sehen wie b2 durch das clr-Signal "1" auf "0" gesetzt wird.
Dann sieht man das Hochzählen von b2,b1,b0 bei steigender CLK-Flanke.
000, 001, 010, 011, 100, 000,...
Das clr-Signal bei 0.8us setzt b0 und b1 auf "0" zurück.
Modulo5: VHDL code
Als Basis dient der Code des D-Flip-Flops und der Code für eine Wahrheitstabelle.
entity MODULO5 is
port (
RESET,CLK : in STD_LOGIC;
B: out STD_LOGIC_VECTOR(2 downto 0));
end MODULO5;
architecture VERHALTEN of MODULO5 is
signal BINT: STD_LOGIC_VECTOR(2 downto 0);
Modulo 5 VHDL code (2)
begin
SYN_COUNT:process (CLK, RESET)
begin
if RESET = '1' then
BINT <= "000";
elsif CLK='1' and CLK'event then
case BINT is
when "000" => BINT <= "001";
when "001" => BINT <= "010";
when "010" => BINT <= "011";
when "011" => BINT <= "100";
when "100" => BINT <= "000";
when others => BINT <= "000";
end case;
end if;
end process SYN_COUNT;
B <= BINT;
end VERHALTEN;
RESET Signal wurde eingeführt.
Sicherer Zustand "000" für den Fall others.
Ein Test benötigt nur die CLK. Diese wird meist automatisch erzeugt.
Kommentare zum VHDL Code
Synchron versus Asynchron
Busse: BINT: std_logic_vector(2 downto 0)
Busse und einzelne Leitungen:
A <= BINT(3);
Q (1 downto 0) <= BINT(2 downto 1);
Ziel Quelle
Signalfluss: Quelle zum Ziel
Process
Sequentielle Abarbeitung
Vorteil: Lesbarkeit
Nachteil: Implizite Register, Speicherzellen
If, case Anweisung
Test Modulo5: VHDL code
entity Modulo5Test is
-- Port ( );
end Modulo5Test;
architecture Behavioral of Modulo5Test is
COMPONENT MODULO5
port (
RESET,CLK : in STD_LOGIC;
B: out STD_LOGIC_VECTOR(2 downto 0)
);
end COMPONENT;
-- Inputs
signal RESET,CLK : STD_LOGIC;
-- Ouputs
signal B: STD_LOGIC_VECTOR(2 downto 0);
Test Modulo5: VHDL code (2)
begin
uut: MODULO5 PORT MAP( RESET => RESET, CLK => CLK,
B => B );
clk_proc: process -- Clock process
begin
CLK <= '0'; wait for 5 ns;
CLK <= '1'; wait for 5 ns;
end process;
stim_proc: process -- Stimulus process
begin
reset <= '1'; wait for 10 ns;
reset <= '0'; wait for 10 ns;
wait;
end process;
end Behavioral;
Modulo 5 simulation output
Rezept für Digitaltechnik
Lege eine Dokumentation an und erfasse jeden Schritt
Identifiziere Eingänge, Zustände und Ausgänge im Text
Identifiziere unvollständige oder fehlende Informationen
Vergebe Namen und Zuordnungen: Button B, '1' An, '0' Aus
Evtl: Zerlege das Problem in Teilprobleme und starte zur Bearbeitung von Teilproblemen neu
Erstelle eine Zustandstabelle:
Zustandsgleichungen, Zustandsdiagramm
Erstelle einen Schaltplan und Eingangssignale und simuliere.
Alle Zustandskombinationen und Eingangskombinationen müssen getestet werden.
Erstelle VHDL code für die Zustandstabelle und Eingangssignale und simuliere
Überprüfe die korrekte Funktion
Reflektiere 'lessons learned' in einer Zusammenfassung
Gratulation zum Ergebnis
Fragen und Diskussion
Woran erkennt man eine Zustandsmaschine im VHDL code?
Wie kommt man von einer Zustandstabelle zu einem Zustandsdiagramm?