Guest User

Untitled

a guest
Apr 19th, 2012
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 6.94 KB | None | 0 0
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.NUMERIC_STD.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6. entity Digital_Clock is
  7.     Port (
  8.               clock_1s  : in   STD_LOGIC;
  9.               clock_ns  : in     STD_LOGIC;
  10.               clock     : in     STD_LOGIC;
  11.            buttons  : in     STD_LOGIC_VECTOR (3 downto 0);
  12.            disp_1   : out  STD_LOGIC_VECTOR (3 downto 0);
  13.            disp_2       : out  STD_LOGIC_VECTOR (3 downto 0);
  14.            disp_3   : out  STD_LOGIC_VECTOR (3 downto 0);
  15.            disp_4       : out  STD_LOGIC_VECTOR (3 downto 0);
  16.            LEDs         : out  STD_LOGIC_VECTOR (7 downto 0)
  17.               );
  18. end Digital_Clock;
  19.  
  20. architecture Behavioral of Digital_Clock is
  21.  
  22. type statetype is
  23.     (S_Digital_Clock, S_Stop_Watch, S_Alarm_Set);
  24.     signal Current_State, Next_State : statetype;
  25.    
  26. signal seconds              : integer range 0 to 60;
  27. signal minutes_one          : std_logic_vector(3 downto 0) := "0000";
  28. signal minutes_ten          : std_logic_vector(3 downto 0) := "0000";  
  29. signal hours_one                : std_logic_vector(3 downto 0) := "0000";
  30. signal hours_ten                : std_logic_vector(3 downto 0) := "0000";
  31. signal alarm_minutes_one    : std_logic_vector(3 downto 0) := "0000";
  32. signal alarm_minutes_ten    : std_logic_vector(3 downto 0) := "0000";  
  33. signal alarm_hours_one      : std_logic_vector(3 downto 0) := "0010";
  34. signal alarm_hours_ten      : std_logic_vector(3 downto 0) := "0001";
  35. signal sw_seconds_one       : std_logic_vector(3 downto 0) := "0000";
  36. signal sw_seconds_ten       : std_logic_vector(3 downto 0) := "0000";  
  37. signal sw_nanos_one         : std_logic_vector(3 downto 0) := "0000";
  38. signal sw_nanos_ten         : std_logic_vector(3 downto 0) := "0000";
  39. signal stop                     : std_logic := '0';
  40. signal addOne                   : std_logic := '1';
  41. signal addHour                  : std_logic := '0';
  42. signal reset                    : std_logic := '0';
  43.  
  44. begin
  45.  
  46. process(clock_1s,addOne,addHour)
  47. begin
  48. if (addOne = '1') then
  49.     seconds <= 0;
  50.     minutes_one <= minutes_one + 1;
  51. elsif(addHour = '1') then
  52.     seconds <= 0;
  53.     hours_one <= hours_one + 1;
  54. elsif rising_edge(clock_1s) then
  55.     seconds <= seconds + 1;
  56.     if(seconds = 60) then
  57.         seconds <= 0;
  58.         minutes_one <= minutes_one + 1;
  59.         if(minutes_one = "1010") then
  60.             minutes_ten <= minutes_ten + 1;
  61.             minutes_one <= "0000";
  62.             if(minutes_ten = "0110") then
  63.                 hours_one <= hours_one + 1;
  64.                 minutes_ten <= "0000";
  65.                 if(hours_one = "1010") then
  66.                     hours_ten <= hours_ten + 1;
  67.                     hours_one <= "0000";
  68.                     if(hours_ten = "0010" and hours_one = "0100") then
  69.                         hours_ten <= "0000";
  70.                         hours_one <= "0000";
  71.     end if;end if;end if;end if;end if;
  72. end if;
  73. end process;
  74.  
  75. process(clock_ns,reset,stop)
  76. begin
  77.     if(reset = '1') then
  78.         sw_nanos_one <= "0000";
  79.         sw_nanos_ten <= "0000";
  80.         sw_seconds_one <= "0000";
  81.         sw_seconds_ten <= "0000";
  82.     else
  83.         if(stop = '0') then
  84.             if rising_edge(clock_ns) then
  85.                 sw_nanos_one <= sw_nanos_one + 1;
  86.                 if(sw_nanos_one = "1010") then
  87.                     sw_nanos_one <= "0000";
  88.                     sw_nanos_ten <= sw_nanos_ten + 1;
  89.                     if(sw_nanos_ten = "1010") then
  90.                         sw_nanos_ten <= "0000";
  91.                         sw_seconds_one <= sw_seconds_one + 1;
  92.                         if(sw_seconds_one = "1010") then
  93.                             sw_seconds_one <= "0000";
  94.                             sw_seconds_ten <= sw_seconds_ten + 1;
  95.                             if(sw_seconds_ten = "0110") then
  96.                                 sw_seconds_ten <= "0000";
  97.             end if;end if;end if;end if;end if;
  98.         else
  99.             sw_nanos_one <= sw_nanos_one;
  100.             sw_nanos_ten <= sw_nanos_ten;
  101.             sw_seconds_one <= sw_seconds_one;
  102.             sw_seconds_ten <= sw_seconds_ten;
  103.         end if;
  104.     end if;
  105. end process;   
  106.  
  107. process(Current_State,buttons,hours_ten,hours_one,minutes_ten,minutes_one,alarm_hours_ten,alarm_hours_one,alarm_minutes_one,alarm_minutes_ten,sw_seconds_ten,sw_seconds_one,sw_nanos_ten,sw_nanos_one)
  108. begin
  109.     case Current_State is
  110.         when S_Digital_Clock        =>
  111.             disp_1 <= hours_ten;
  112.             disp_2 <= hours_one;
  113.             disp_3 <= minutes_ten;
  114.             disp_4 <= minutes_one;
  115.             if (buttons(3) = '1') then
  116.                 disp_1 <= alarm_hours_ten;
  117.                 disp_2 <= alarm_hours_one;
  118.                 disp_3 <= alarm_minutes_ten;
  119.                 disp_4 <= alarm_minutes_one;
  120.             else
  121.                 disp_1 <= hours_ten;
  122.                 disp_2 <= hours_one;
  123.                 disp_3 <= minutes_ten;
  124.                 disp_4 <= minutes_one;
  125.             end if;
  126.            
  127.             if(buttons(1) = '1') then
  128.                 addOne <= '1';
  129.             else
  130.                 addOne <= '0';
  131.             end if;
  132.            
  133.             if(buttons(2) = '1') then
  134.                 addHour <= '1';
  135.             else
  136.                 addHour <= '0';
  137.             end if;        
  138.            
  139.             if(buttons(0) = '1') then
  140.                 Next_State <= S_Stop_Watch;
  141.             else
  142.                 Next_State <= S_Digital_Clock;
  143.             end if;
  144.            
  145.             when S_Stop_Watch =>               
  146.                 disp_1 <= sw_seconds_ten;
  147.                 disp_2 <= sw_seconds_one;
  148.                 disp_3 <= sw_nanos_ten;
  149.                 disp_4 <= sw_nanos_one;
  150.                
  151.                 if(buttons(3) = '1') then
  152.                     reset <= '1';
  153.                 else
  154.                     reset <= '0';
  155.                 end if;
  156.                
  157.                 if(buttons(2) = '1') then
  158.                     stop <= NOT stop;
  159.                 else
  160.                     stop <= stop;
  161.                 end if;
  162.                
  163.                 if(buttons(1) = '1') then
  164.                     Next_State <= S_Digital_Clock;
  165.                 else
  166.                     Next_State <= S_Stop_Watch;
  167.                 end if;
  168.                
  169.                 if(buttons(0) = '1') then
  170.                     Next_State <= S_Alarm_Set;
  171.                 else
  172.                     Next_State <= S_Stop_Watch;
  173.                 end if;
  174.                
  175.             when S_Alarm_Set  =>
  176.                 disp_1 <= alarm_hours_ten;
  177.                 disp_2 <= alarm_hours_one;
  178.                 disp_3 <= alarm_minutes_ten;
  179.                 disp_4 <= alarm_minutes_one;
  180.                
  181.                 if(buttons(3) = '1') then
  182.                     Next_State <= S_Stop_Watch;
  183.                 else
  184.                     Next_State <= S_Alarm_Set;
  185.                 end if;
  186.                
  187.                 if(buttons(2) = '1') then
  188.                     alarm_hours_one <= alarm_hours_one + 1;
  189.                     alarm_minutes_ten <= "0000";
  190.                     if(alarm_hours_one = "1010") then
  191.                         alarm_hours_one <= "0000";
  192.                         alarm_hours_ten <= alarm_hours_ten + 1;
  193.                         if(alarm_hours_ten = "0010" and hours_one = "0100") then
  194.                             alarm_hours_ten <= "0000";
  195.                             alarm_hours_one <= "0000";
  196.                     end if;end if;
  197.                 else
  198.                     alarm_minutes_one <= alarm_minutes_one;
  199.                     alarm_minutes_ten <= alarm_minutes_ten;
  200.                     alarm_hours_one <= alarm_hours_one;
  201.                     alarm_hours_ten <= alarm_hours_ten;
  202.                 end if;
  203.                
  204.                 if(buttons(1) = '1') then
  205.                 alarm_minutes_one <= alarm_minutes_one + 1;
  206.                     if(alarm_minutes_one = "1010") then
  207.                         alarm_minutes_ten <= alarm_minutes_ten + 1;
  208.                         alarm_minutes_one <= "0000";
  209.                         if(alarm_minutes_ten = "1010") then
  210.                         alarm_hours_one <= alarm_hours_one + 1;
  211.                         alarm_minutes_ten <= "0000";
  212.                         if(alarm_hours_one = "1010") then
  213.                             alarm_hours_one <= "0000";
  214.                             alarm_hours_ten <= alarm_hours_ten + 1;
  215.                             if(alarm_hours_ten = "0010" and hours_one = "0100") then
  216.                                 alarm_hours_ten <= "0000";
  217.                                 alarm_hours_one <= "0000";
  218.                         end if;end if;end if;end if;
  219.                 else
  220.                     alarm_minutes_one <= alarm_minutes_one;
  221.                     alarm_minutes_ten <= alarm_minutes_ten;
  222.                     alarm_hours_one <= alarm_hours_one;
  223.                     alarm_hours_ten <= alarm_hours_ten;
  224.                 end if;
  225.                 if(buttons(0) = '1') then
  226.                     Next_State <= S_Digital_Clock;
  227.                 else
  228.                     Next_State <= S_Alarm_Set;
  229.                 end if;
  230.             end case;
  231. end process;
  232.  
  233. StateReg    :   process(clock)
  234. begin
  235.     if rising_edge(clock)then
  236.         Current_State <= Next_State;
  237.     end if;
  238. end process StateReg;
  239.  
  240. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment