Advertisement
Guest User

Stoper

a guest
Jun 23rd, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 3.11 KB | None | 0 0
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6. use funkcje.ALL;
  7.  
  8.  
  9. --sterownik do zegarka implementujacy logikę
  10. entity zegar is
  11. port
  12. (
  13.     --sygnał‚ zegarowy
  14.     clk             :   in      std_logic;
  15.     ---wejscie numberu button_numbera przekazany od sterownika klawiatury
  16.     button_number           :   in      integer range 0 to 4;
  17.        
  18.     --wartosc godzin
  19.     min1_out        :   out integer range 0 to 10;
  20.     min0_out        :   out integer range 0 to 10;
  21.    
  22.     --wartosc minut
  23.     sec1_out        :   out integer range 0 to 10;
  24.     sec0_out        :   out integer range 0 to 10;
  25.    
  26.    
  27.     --stan kropki, typ buforowany
  28.     dot :   buffer std_logic := '0'
  29. );
  30. end zegar;
  31.  
  32. architecture Behavioral of zegar is
  33. type MachineState is (STOP, RUNNING, RESET, BLINK, START);
  34.  
  35. --zmienna współdzielona między różnymi modułami
  36. shared variable min1        :   integer range 0 to 10;
  37. shared variable min0        :   integer range 0 to 10;
  38. shared variable sec1        :   integer range 0 to 10;
  39. shared variable sec0        :   integer range 0 to 10;
  40. shared variable m1 : integer range 0 to 10 := 0;
  41. shared variable m0 : integer range 0 to 10 := 0;
  42. shared variable s1 : integer range 0 to 10 := 0;
  43. shared variable s0 : integer range 0 to 10 := 0;
  44. begin
  45.  
  46.     process (clk)
  47.         variable rtc_diver : integer range 0 to 8000000 := 0;
  48.         variable blink_diver : integer range 0 to 8000000 := 0;
  49.         variable sekundy : integer range 0 to 60 := 0;
  50.         variable CurrentState : MachineState := RESET;
  51.     begin
  52.    
  53.         if rising_edge(clk) then
  54.        
  55.             case button_number is
  56.        
  57.                 when 1 => CurrentState := START;
  58.                 when 2 => CurrentState := STOP;
  59.                 when 3 => CurrentState := RESET;
  60.                
  61.             when others => null;
  62.                
  63.             end case;
  64.            
  65.             case CurrentState is
  66.                 when START =>
  67.                     min1 := m1;
  68.                     min0 := m0;
  69.                     sec1 := s1;
  70.                     sec0 := s0;
  71.                     CurrentState := RUNNING;
  72.                     dot <= '1';
  73.                 when RUNNING =>                                
  74.                     rtc_diver := rtc_diver + 1;
  75.                    
  76.                     if rtc_diver = 8000000 then                
  77.                         dot <= not dot;                    
  78.                         rtc_diver := 0;
  79.                         sekundy := sekundy + 1;
  80.                        
  81.                         inc_sec(min1, min0, sec1, sec0, true);
  82.                        
  83.                         if sekundy = 60 then                       
  84.                             sekundy := 0;      
  85.                         end if;                    
  86.                     end if;
  87.                    
  88.                 when RESET =>
  89.                     rtc_diver := 0;
  90.                     sekundy := 0;
  91.                     min1 := 0;
  92.                     min0 := 0;
  93.                     sec1 := 0;
  94.                     sec0 := 0;
  95.                     m1 := 0;
  96.                     m0 := 0;
  97.                     s0 := 0;
  98.                     s1 := 0;
  99.                     CurrentState := STOP;
  100.                     dot <= '0';
  101.                     blink_diver := 0;
  102.                    
  103.                 when STOP =>
  104.                         m1 := min1;
  105.                         m0 := min0;
  106.                         s1 := sec1;
  107.                         s0 := sec0;
  108.                         CurrentState := BLINK; 
  109.                        
  110.                 when BLINK =>
  111.                     blink_diver := blink_diver + 1;
  112.                     if blink_diver = 4000000 then
  113.                         min1 := 10;
  114.                         min0 := 10;
  115.                         sec1 := 10;
  116.                         sec0 := 10;
  117.                         dot <= '1';
  118.                     else
  119.                         if blink_diver = 8000000 then
  120.                             min1 := m1;
  121.                             min0 := m0;
  122.                             sec0 := s0;
  123.                             sec1 := s1;
  124.                             blink_diver := 0;
  125.                             dot <= '0';
  126.                         end if;
  127.                     end if;            
  128.                 end case;
  129.         end if;
  130.        
  131.     end process;
  132.    
  133.     min1_out <= min1;
  134.     min0_out <= min0;
  135.    
  136.     sec1_out <= sec1;
  137.     sec0_out <= sec0;
  138.  
  139. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement