370 likes | 626 Views
VHDL 8: Automaten 2. Übung 7: Aufgabe 3. Getränkeausgabe nach Einwurf von 2 x 1 Fr. Jederzeit Geldrückgabe durch Betätigen der Taste „Geldrückgabe“. Bisher kennen wir den Moore Automat. Gegenwärtiger(Aktueller) Zustand. Z t. A t = m (Z t ). Z t+1 = d (Z t , E t ). Q.
E N D
Übung 7: Aufgabe 3 • Getränkeausgabe nach Einwurf von 2 x 1 Fr. • Jederzeit Geldrückgabe durch Betätigen der Taste „Geldrückgabe“
Bisher kennen wir den Moore Automat Gegenwärtiger(Aktueller) Zustand Zt At = m (Zt) Zt+1 = d (Zt, Et) Q Ausgangs-Logik n n AnsteuerLogik n = Anzahlder FFs m m !Q Et d Folge Zustand Takt Et = Eingangsvektor Zt = Zustandssvektor zum gegenwärtigen Zeitpunkt t Zt+1 = Zustandssvektor nach dem Taktimpuls
Knightrider als Moore Automat Ausgangslogik n Led_out(1) aktueller_zustand folge_zustand Led_out(2) bl_links D Q Led_out(3) Steuer-logik bl_rechts bremse !Q Led_out(4) reset clk
Blinker links = 1 led2 led3 led1 led4 Blinker rechts=1 Blinker rechts=1 Blinker rechts=1 Blinker rechts=1 Blinker links = 1 Blinker links = 1 Blinker links = 1 Bremsen=1 Reset idle brms Bremsen=1 Blinker links=0blinker rechts=0bremesen=0 Ausgangslogik Reset Q0 Blinker links = 1 D Q L1 Blinker links Blinker rechts !Q Bremshebel L2 Bremsen=1 Q1 D Q L3 Blinker links=0blinker rechts=0bremesen=0 !Q L4 Steuerlogik 00 Q2 D Q !Q Takt Mealy Automat
Mealy Automat allgemein Zt At = w (Zt,, Et) Zt+1 = d (Zt, Et) Q Ausgangs-Logik n n AnsteuerLogik n = Anzahlder FFs w m !Q Et d Takt Et = Eingangsvektor Zt = Zustandssvektor zum gegenwärtigen Zeitpunkt t Zt+1 = Zustandssvektor nach dem Taktimpuls
led1 led2 led3 led4 idle brms Zustandscodierung 100 110 011 001 00 01 10 11 000 111 • Zustände können „wegrationalisiert“ werden • Weniger Zustände brauchen weniger Flip Flops
Blinker links = 1 Blinker rechts=1 Blinker links = 1 Blinker links = 1 Blinker links = 1 led1 led2 led3 led4 Blinker rechts=1 Blinker rechts=1 Blinker rechts=1 Zustandsübergänge müssen neu definiert werden 00 01 10 11 Reset Blinker rechts=0 AND Blinker links = 0
Knightrider als Mealyautomat mit 2 FF Ausgangslogik n Led_out(1) aktueller_zustand folge_zustand Led_out(2) bl_links D Q Led_out(3) Steuer-logik bl_rechts bremse !Q Led_out(4) reset clk
Ausgangslogik beim Knightrider als Mealy Idle Bremsen
Prozesse beim Mealy Automaten ZustandsSpeicher Ausgangslogik Next State Logik moore_gegenwart 4 moore_folge Kombinatori-scher Prozess Kombinatori-scher Prozess 4 GetakteterProzess clk reset Eingänge Drei Prozess FSM
Ausgangslogik des Knightriders nach Mealy Ausgang: PROCESS (aktueller_zustand) BEGIN IF BREMSEN = ‚1‘THENled_out <= "1111"; ELSIF (LINKS = ‚0‘) AND (RECHTS = ‚0‘)) THENled_out <= “0000"; ELSE CASE aktueller_zustand is when state_led1 => led_out <= "1000"; when state_led2 => led_out <= "0100"; when state_led3 => led_out <= "0010"; when state_led4 => led_out <= "0001"; when OTHERS => led_out <= "0000"; ENDCASE; ENDIF; ENDPROCESS ausgang;
D D D D D D Q Q Q Q Q Q Tpfad1 = 3 nS + 3 nS + 4 nS + 1 nS + 2 nS = 13 nS Tpfad2 = 3 nS + 6 nS + 2 nS + 1 nS + 2 nS = 14 nS Tpfad3 = 3 nS + 3 nS + 5 nS + 2 nS + 1 nS + 2 nS = 16 nS Fmax = 62.5 MHz Verzögerungszeiten beim Mealy Automaten Baugruppe A Mealy Automat Baugruppe C 3nS tPDCLKQ-FF = 3 nS 4nS 2nS 3nS 6nS D Q tSU-FF= 2 nS 2nS 5nS Tperiod-max = tPDCLKQ-FF+ tPD-Logic +tPD-Leitung+ tSU-FF
MAB 5V 5V 5V VRE RUFE TKE KK VRK RUFK TKK M MAUF Übung 7, Aufgabe 2 • Aufzug hat zwei Endpunkte oben und unten • Drücken der Ruf Taste Speichert Funktion • (Aufzug hat nur zwei Geschosse, desh. Nur eine Taste) • Aufzug fährt erst los wenn Tür geschlossen
Blinker links = 1 Blinker rechts=1 Blinker links = 1 Blinker links = 1 Blinker links = 1 led1 led2 led3 led4 Blinker rechts=1 Blinker rechts=1 Blinker rechts=1 Bremsen=1 Bremsen=1 Blinker links=0blinker rechts=0bremesen=0 Blinker links = 1 Reset idle brms Bremsen=1 Blinker links=0blinker rechts=0bremesen=0 Zustandscodierung des Knightriders als Medvedev Automat 1000 0100 0010 0001 0000 1111
Knightrider als Moore Automat Ausgangslogik n Led_out(1) aktueller_zustand folge_zustand Led_out(2) bl_links D Q Led_out(3) Steuer-logik bl_rechts bremse !Q Led_out(4) reset clk
Glitches N 5 6 7 CLK Q0 1 Q1 Q2 Q3 ~ 0.5 nS seven „Glitch“ Glitch = kurzzeitiger Signaleinbruch
D Q Knightrider als Medvedev Automat n aktueller_zustand folge_zustand Led_out(1) D Q Led_out(2) Steuer-logik Led_out(3) bl_links bl_rechts Led_out(4) bremse !Q reset clk
Medvedev Automat Zt Zt+1 = d (Zt, Et) At = Zt, Q n n AnsteuerLogik m !Q Et d n = Anzahl FFs = Anzahl der Ausgänge Takt Et = Eingangsvektor Zt = Zustandssvektor zum gegenwärtigen Zeitpunkt t Zt+1 = Zustandssvektor nach dem Taktimpuls
Blinker links = 1 Blinker rechts=1 Blinker links = 1 Blinker links = 1 Blinker links = 1 led1 led2 led3 led4 Blinker rechts=1 Blinker rechts=1 Blinker rechts=1 Bremsen=1 Bremsen=1 Blinker links=0blinker rechts=0bremesen=0 Blinker links = 1 Reset idle brms Bremsen=1 Blinker links=0blinker rechts=0bremesen=0 One Hot Kodierung(Option im Synthesizer) 001000 100000 010000 000100 0000010 000001
D Q !Q Einfachere Ansteuerlogik bei One Hot Kodierung Q0 D Q Q1 E !Q D Q Q2 !Q Takt
100 110 011 001 led1 led2 led3 led4 000 111 idle brms Zustandskodierung des Knightriders
1. Zustandskodierung mit Konstanten ENTITY knightrider IS PORT(clk,reset, bl_links, bl_rechts, bremse: IN std_logic; led_out : OUT std_logic_vector(4 downto 1)); END knightrider; ARCHITECTURE rtl OF knightrider IS signal folge_zustand : std_logic_vector(2 downto 0);signal aktueller_zustand : std_logic_vector(2 downto 0); --Zustands Kodierungconstant state_idle : std_logic_vector(2 downto 0) := "000";constant state_led1 : std_logic_vector(2 downto 0) := "100";constant state_led2 : std_logic_vector(2 downto 0) := "110";constant state_led3 : std_logic_vector(2 downto 0) := "011";constant state_led4 : std_logic_vector(2 downto 0) := "001";constant state_bremsen : std_logic_vector(2 downto 0) := "111"; BEGIN
Name des neuen Type TYPE knight_state IS (state_idle, state_led1, state_led2, state_led3, state_led4,state_bremsen); --Zustands Kodierungconstant state_idle : std_logic_vector(2 downto 0) := "000";constant state_led1 : std_logic_vector(2 downto 0) := "100";constant state_led2 : std_logic_vector(2 downto 0) := "110";constant state_led3 : std_logic_vector(2 downto 0) := "011";constant state_led4 : std_logic_vector(2 downto 0) := "001";constant state_bremsen : std_logic_vector(2 downto 0) := "111"; Type ersetzt Definierung von Konstanten signal folge_zustand : knight_state;signal aktueller_zustand : knight_state; Signale müssen jetzt vom Type sein, der die Zustände definiert 2. Zustandskodierung durch Typendefinierung
Vorteile der Typendefinierung • Die Zustandskodierung muss nicht selbst bestimmt werden, es wird vom VHDL Synthesizer übernommen. (Nachteil – kein Einfluss auf Kodierung) • Der Synthesizer bestimmt die minimale Anzahl nötiger Flip Flops selbst. • In der Simulation werden die Zustände mit Namen angezeigt leichteres „debugging“. • Für Medvedev 3. Möglichkeit: Enumerieret Kodierung anwenden
3. Enumerierte Zustandskodierung typemc_state_type is(idle ,write ,read1 ,read2 ,read3 ,read4 ); attributeenum_encoding : string; attributeenum_encoding ofmc_state_type: typeis"0000 0100 1000 1001 1010 1011"; Wird durch die meiste Synthesesoftware unterstützt
Eingänge sind nicht synchronisiert Reset Ausgangslogik Q0 L1 D Q Blinker links Blinker rechts L2 Bremshebel !Q L3 Q1 D Q L4 !Q Q2 D Q Steuerlogik !Q Takt
Verhältnis von Steuersignalen und Takt • Wenn sich die Eingänge von Automaten zu jeder beliebigen Zeit ändern können, so können sie Setup Zeit Verletzungen bei den Flip Flops der Automaten verursachen. • Dies hat zur Folge, dass der Automat nicht in gewollte Zustände springt oder Parasitäre Zustände annimmt. • Eingangssignale von Automaten müssen deshalb immer synchron zum Takt geändert werden.
D D Q Q !Q !Q Abhilfe: Synchronisierschaltung Automat A Eingang CLK B(z.B. 1 MHz)