Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.STD_LOGIC_ARITH.ALL;
- use IEEE.STD_LOGIC_UNSIGNED.ALL;
- use funkcje.ALL;
- --sterownik do zegarka implementujacy logikę
- entity zegar is
- port
- (
- --sygnał‚ zegarowy
- clk : in std_logic;
- ---wejscie numberu button_numbera przekazany od sterownika klawiatury
- button_number : in integer range 0 to 4;
- --wartosc godzin
- min1_out : out integer range 0 to 10;
- min0_out : out integer range 0 to 10;
- --wartosc minut
- sec1_out : out integer range 0 to 10;
- sec0_out : out integer range 0 to 10;
- --stan kropki, typ buforowany
- dot : buffer std_logic := '0'
- );
- end zegar;
- architecture Behavioral of zegar is
- type MachineState is (STOP, RUNNING, RESET, BLINK, START);
- --zmienna współdzielona między różnymi modułami
- shared variable min1 : integer range 0 to 10;
- shared variable min0 : integer range 0 to 10;
- shared variable sec1 : integer range 0 to 10;
- shared variable sec0 : integer range 0 to 10;
- shared variable m1 : integer range 0 to 10 := 0;
- shared variable m0 : integer range 0 to 10 := 0;
- shared variable s1 : integer range 0 to 10 := 0;
- shared variable s0 : integer range 0 to 10 := 0;
- begin
- process (clk)
- variable rtc_diver : integer range 0 to 8000000 := 0;
- variable blink_diver : integer range 0 to 8000000 := 0;
- variable sekundy : integer range 0 to 60 := 0;
- variable CurrentState : MachineState := RESET;
- begin
- if rising_edge(clk) then
- case button_number is
- when 1 => CurrentState := START;
- when 2 => CurrentState := STOP;
- when 3 => CurrentState := RESET;
- when others => null;
- end case;
- case CurrentState is
- when START =>
- min1 := m1;
- min0 := m0;
- sec1 := s1;
- sec0 := s0;
- CurrentState := RUNNING;
- dot <= '1';
- when RUNNING =>
- rtc_diver := rtc_diver + 1;
- if rtc_diver = 8000000 then
- dot <= not dot;
- rtc_diver := 0;
- sekundy := sekundy + 1;
- inc_sec(min1, min0, sec1, sec0, true);
- if sekundy = 60 then
- sekundy := 0;
- end if;
- end if;
- when RESET =>
- rtc_diver := 0;
- sekundy := 0;
- min1 := 0;
- min0 := 0;
- sec1 := 0;
- sec0 := 0;
- m1 := 0;
- m0 := 0;
- s0 := 0;
- s1 := 0;
- CurrentState := STOP;
- dot <= '0';
- blink_diver := 0;
- when STOP =>
- m1 := min1;
- m0 := min0;
- s1 := sec1;
- s0 := sec0;
- CurrentState := BLINK;
- when BLINK =>
- blink_diver := blink_diver + 1;
- if blink_diver = 4000000 then
- min1 := 10;
- min0 := 10;
- sec1 := 10;
- sec0 := 10;
- dot <= '1';
- else
- if blink_diver = 8000000 then
- min1 := m1;
- min0 := m0;
- sec0 := s0;
- sec1 := s1;
- blink_diver := 0;
- dot <= '0';
- end if;
- end if;
- end case;
- end if;
- end process;
- min1_out <= min1;
- min0_out <= min0;
- sec1_out <= sec1;
- sec0_out <= sec0;
- end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement