---------------------------------------------------------------------------------- -- Company: -- Engineer: -- -- Create Date: -- Design Name: -- Module Name: -- Project Name: -- Target Devices: -- Tool versions: -- Description: -- -- Dependencies: -- -- Revision: -- Revision 0.01 - File Created -- Additional Comments: -- ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity Blinker is Port ( clock: in std_logic; reset: in std_logic; Links: in std_logic; Rechts: in std_logic; LED_Rechts: out std_logic; LED_Links: out std_logic; ------------------------------------------------------------- -- Hier die Externen Variablen zur beobachtung ----- ------------------------------------------------------------- Sim_BCD_int_Links: out std_logic_vector (1 downto 0); Sim_BCD_int_Rechts: out std_logic_vector (1 downto 0); Sim_Flanke_Links: out std_logic; Sim_Flanke_Rechts: out std_logic; Sim_Takt_1_HZ: out std_logic; Sim_Flanke_Takt_1HZ: out std_logic; Sim_Start_Links: out std_logic; Sim_Start_Rechts: out std_logic; Sim_Counter_Takt: out std_logic_vector (25 downto 0)--; --Takt-Counter ); end Blinker; architecture Behavioral of Blinker is -- Deklaration der Automatenzustände und internen Signale type Zustaende is (a,b,c); signal Links_Zustand, Links_Folgezustand: Zustaende; signal Rechts_Zustand, Rechts_Folgezustand: Zustaende; signal Takt_1HZ_Zustand, Takt_1HZ_Folgezustand: Zustaende; signal BCD_int_Links: std_logic_vector (1 downto 0):="00"; --interne Zähler Links signal BCD_int_Rechts: std_logic_vector (1 downto 0):="00"; --interne Zähler Rechts signal Start_Links:std_logic;--Der Countdown wurde gestartet signal Start_Rechts:std_logic;--Der Countdown wurde gestartet signal Takt_1_HZ:std_logic; signal Counter_Takt: std_logic_vector (25 downto 0):="00000000000000000000000000"; --Takt-Counter signal Flanke_Links: std_logic; signal Flanke_Rechts: std_logic; signal Flanke_Takt_1HZ: std_logic; begin Zustandsmaschine: Process (clock, reset) begin if reset = '1' then Rechts_Zustand <= a; Links_Zustand <= a; Takt_1HZ_Zustand <=a; elsif clock = '1' and clock'event then Links_Zustand <= Links_Folgezustand; Rechts_Zustand <= Rechts_Folgezustand; Takt_1HZ_Zustand <= Takt_1HZ_Folgezustand; end if; end process Zustandsmaschine; Flankenerkennung_Rechts: Process (Rechts, Rechts_Zustand) begin case Rechts_Zustand is when a => if Rechts='1' then Rechts_Folgezustand <=a; else Rechts_Folgezustand <=b; end if; Flanke_Rechts <= '0'; when b => if Rechts='0' then Rechts_Folgezustand <=b; else Rechts_Folgezustand <=c; end if; Flanke_Rechts <= '0'; when c => if Rechts='1' then Rechts_Folgezustand <=a; else Rechts_Folgezustand <=b; end if; Flanke_Rechts <= '1'; end case; end process Flankenerkennung_Rechts; Flankenerkennung_Links: Process (Links, Links_Zustand) begin case Links_Zustand is when a => if Links='1' then Links_Folgezustand <=a; else Links_Folgezustand <=b; end if; Flanke_Links <= '0'; when b => if Links='0' then Links_Folgezustand <=b; else Links_Folgezustand <=c; end if; Flanke_Links <= '0'; when c => if Links='1' then Links_Folgezustand <=a; else Links_Folgezustand <=b; end if; Flanke_Links <= '1'; end case; end process Flankenerkennung_Links; Flankenerkennung_Takt_1HZ: Process (Takt_1_HZ, Takt_1HZ_Zustand) begin case Takt_1HZ_Zustand is when a => if Takt_1_HZ='1' then Takt_1HZ_Folgezustand <=a; else Takt_1HZ_Folgezustand <=b; end if; Flanke_Takt_1HZ <= '0'; when b => if Takt_1_HZ='0' then Takt_1HZ_Folgezustand <=b; else Takt_1HZ_Folgezustand <=c; end if; Flanke_Takt_1HZ <= '0'; when c => if Takt_1_HZ='1' then Takt_1HZ_Folgezustand <=a; else Takt_1HZ_Folgezustand <=b; end if; Flanke_Takt_1HZ <= '1'; end case; end process Flankenerkennung_Takt_1HZ; Counter_Start_Rechts : process (reset, clock, Flanke_Rechts, Start_Links) begin if reset ='1' then Start_Rechts <= '0'; elsif clock='1' and clock'event then if Flanke_Rechts ='1' and Start_Links = '0' then Start_Rechts <='1'; elsif BCD_int_Rechts = 0 then Start_Rechts <='0'; end if; end if; end process Counter_Start_Rechts; Counter_Start_Links : process (reset, clock, Flanke_Links, Start_Rechts) begin if reset ='1' then Start_Links <= '0'; elsif clock='1' and clock'event then if Flanke_Links ='1' and Start_Rechts = '0' then Start_Links <='1'; elsif BCD_int_Links = 0 then Start_Links <='0'; end if; end if; end process Counter_Start_Links; BCD_Counter_Links : process (reset, clock, Start_Links, Flanke_Links, BCD_int_Links, Flanke_Takt_1HZ) begin if reset ='1' then BCD_int_Links <= "11"; elsif clock='1' and clock'event then if (Start_Links ='1' and Flanke_Takt_1HZ='1') then if BCD_int_Links = 0 then BCD_int_Links <= BCD_int_Links;--Dann sind wir wohl bei Null else BCD_int_Links <= BCD_int_Links - 1; end if; else BCD_int_Links <= BCD_int_Links; end if; end if; end process BCD_Counter_Links; BCD_Counter_Rechts : process (reset, clock, Start_Rechts, Flanke_Rechts, BCD_int_Rechts, Flanke_Takt_1HZ) begin if reset ='1' then BCD_int_Rechts <= "11"; elsif clock='1' and clock'event then if (Start_Rechts ='1' and Flanke_Takt_1HZ='1') then if BCD_int_Rechts = 0 then BCD_int_Rechts <= BCD_int_Rechts;--Dann sind wir wohl bei Null else BCD_int_Rechts <= BCD_int_Rechts - 1; end if; else BCD_int_Rechts <= BCD_int_Rechts; end if; end if; end process BCD_Counter_Rechts; --------------------------Taktteiler------------------------------------- -- damit wir auf 1 Sekunden kommen müssen wir den Takt durch 50.000.000 teilen -- wir brauchen log2 (50.000.000) = 26 Stellen (aufgerundet) --------------------------------------------------------------------------- Takt_Teiler : process (reset, clock, Takt_1_HZ) begin if reset ='1' then Counter_Takt <="00000000000000000000000000"; elsif clock='1' and clock'event then if Counter_Takt = 10 then Counter_Takt <= "00000000000000000000000000";--Counter hat 50.000.000 erreicht wir beginnen bei 0 wieder else Counter_Takt <= Counter_Takt + 1;--einfach weiterzählen end if; end if; end process Takt_Teiler; --------------------------Ende Taktteiler-------------------------------- -- Hier jetzt die Asyncronen Anweisungen die den Übertrag und die Ausgänge aktualisieren... Takt_1_HZ <= '0' when Counter_Takt = 0 else '1' when Counter_Takt >= 5 else '0'; --Takt_1_HZ <= '0' when Counter_Takt = 5000000 else -- '1' when Counter_Takt = 0 else -- Takt_1_HZ; LED_Links <= '1' when (Takt_1_HZ ='1' and Start_Links = '1') else '0'; LED_Rechts <= '1' when (Takt_1_HZ ='1' and Start_Rechts = '1') else '0'; ----------------------------------------------------------------------- --- Ausgabe der internen Signale auf Ausgängen --- ----------------------------------------------------------------------- Sim_BCD_int_Links <= BCD_int_Links; Sim_BCD_int_Rechts <= BCD_int_Rechts; Sim_Flanke_Rechts <= Flanke_Rechts; Sim_Flanke_Links <= Flanke_Links; Sim_Counter_Takt <= Counter_Takt; --Takt-Counter Sim_Flanke_Takt_1HZ <= Flanke_Takt_1HZ; sim_takt_1_hz <= takt_1_hz; Sim_Start_Links <= Start_Links; Sim_Start_Rechts <= Start_Rechts; end Behavioral;