VHDL 7: Automaten 1
Blockdiagramm: Vorwärts/Rückwärtszähler Q D !Q Q0 Q1 Q2 Takt E
d Moore Automat Zt Gegenwärtiger(Aktueller) Zustand At = m (Zt) Zt+1 = d (Zt, Et) Q Ausgangs- Logik n AnsteuerLogik n n = Anzahl der FFs Et m !Q d Folge Zustand Takt Et = Eingangsvektor Zt = Zustandssvektor zum gegenwärtigen Zeitpunkt t Zt+1 = Zustandssvektor nach dem Taktimpuls
Beispiel: Knightrider FSM Blinker links Blinker rechts Bremse
Beispiel: Knightrider FSM Blinker links Blinker rechts Bremse
Beispiel: Knightrider FSM Blinker links Blinker rechts Bremse
Beispiel: Knightrider FSM Blinker links Blinker rechts Bremse
Knightrider Moore n Led_out(1) aktueller_zustand folge_zustand bl_links D Q Led_out(3) Steuer- logik bl_rechts bremse !Q Led_out(4) reset Ausgangslogik clk
Eingänge und Ausgänge Knightrider Automat bl_links Led_out(1) bl_rechts Led_out(2) Knightrider Automat bremse Led_out(3) reset Led_out(4) clk
Definition der unterscheidbaren Zustände led1 led2 led3 led4 idle brms
Ermitteln der Zustandsübergänge led1 led2 led3 led4 bl_rechts = ‚1‘ bremsen = ‚1‘ idle brms bl_links = ‚0‘ bl_rechts = ‚0‘ bl_links = ‚1‘ bremsen = ‚0‘
Ermitteln der Zustandsübergänge bl_links = ‚1‘ led1 led2 led3 led4 bl_rechts = ‚1‘ bl_links = ‚0‘ bremsen = ‚1‘ bl_rechts = ‚0‘ bremsen = ‚0‘ idle brms
Ermitteln der Zustandsübergänge bl_links = ‚1‘ led1 led2 led4 bl_rechts = ‚1‘ bl_links = ‚0‘ bl_rechts = ‚0‘ bremsen = ‚0‘ bremsen = ‚1‘ idle brms
Ermitteln der Zustandsübergänge bl_links = ‚1‘ bl_rechts = ‚1‘ led1 led2 led3 led4 bl_links = ‚0‘ bl_rechts = ‚0‘ bremsen = ‚0‘ bremsen = ‚1‘ idle brms
Ermitteln der Zustandsübergänge bl_rechts = ‚1‘ bl_links = ‚1‘ led1 led2 led3 led4 bl_links = ‚0‘ bl_rechts = ‚0‘ bremsen = ‚0‘ bremsen = ‚1‘ idle brms
Ermitteln der Zustandsübergänge led1 led2 led3 led4 bl_links = ‚0‘ bl_rechts = ‚1‘ bl_rechts = ‚0‘ bremsen = ‚0‘ bl_links = ‚1‘ idle brms bremsen = ‚1‘
Zustandsübergangsdiagramm des Knightriders Blinker rechts=1 Blinker links = 1 led1 led2 led3 led4 Blinker rechts=1 Blinker rechts=1 Blinker rechts=1 Bremsen=1 Blinker links=0 blinker rechts=0 bremesen=0 idle brms Reset Bremsen=1
Zustandscodierung Zustand Q2 Q1 Q0 idle led1 1 led2 led3 led4 brms led1 1 led2 led3 led4 brms undef1 undef2
Zustandsübergangsdiagramm des Knightriders Blinker rechts=1 Blinker links = 1 led1 led2 led3 led4 100 110 011 001 Blinker rechts=1 Blinker rechts=1 Blinker rechts=1 Blinker links=0 blinker rechts=0 bremesen=0 Bremsen=1 idle brms Reset 000 111 Bremsen=1
Zustandsübergangsdiagramm des Knightriders 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 Kodierung CONSTANT 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
Prozesse des Automaten Aktueller Zustand n Folge Zustand Led_out(1) bl_links Steuer- logik D Q Led_out(2) bl_rechts bremse Led_out(3) !Q Led_out(4) reset clk Ausgangslogik moore_folge Eingänge 4 Steuer Logik Prozess Getakter Prozess clk Ausgangs Prozess reset 4 moore_gegenwart
Getakteter Process des Knightrider clocked: PROCESS (clk, reset) BEGIN IF reset = '1' THEN aktueller_zustand <= "000"; ELSIF clk'EVENT AND clk = '1' THEN aktueller_zustand <= folge_zustand; END IF; END PROCESS clocked;
Steuer Logik des Knightrider Automaten knight_logic: PROCESS (aktueller_zustand, bl_links, bl_rechts, bremse) BEGIN CASE aktueller_zustand IS WHEN state_idle => IF bremse = '1' THEN folge_zustand <= state_bremsen; ELSIF bl_links = '1' THEN folge_zustand <= state_led4; ELSIF bl_rechts = '1‘ THEN folge_zustand <= state_led1; ELSE folge_zustand <= state_idle; END IF; WHEN state_led1 => IF bremse = '1‚ THEN folge_zustand <= state_bremsen; ELSIF bl_links = '1' THEN folge_zustand <= state_led4; ELSIF bl_rechts = '1‚ THEN folge_zustand <= state_led2; ELSE folge_zustand <= state_idle; END IF; . . WHEN OTHERS => folge_zustand <= state_idle; END CASE; END PROCESS knight_logic;
Ausgangslogik des Knightrider Automaten 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 des Knightriders knight_ausg: PROCESS (aktueller_zustand) BEGIN 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 state_bremsen => led_out <= "1111"; WHEN OTHERS => led_out <= "0000"; END CASE; END PROCESS knight_ausg;