CAL.VHD
上传用户:dgjihui88
上传日期:2013-07-23
资源大小:43k
文件大小:6k
源码类别:

VHDL/FPGA/Verilog

开发平台:

MultiPlatform

  1. ----libray and package declaraction
  2. library IEEE;
  3. use IEEE.std_logic_1164.all;
  4. use IEEE.std_logic_arith.all;
  5. use IEEE.std_logic_unsigned.all;
  6. use work.my_pkg.all;
  7. Entity clock is
  8.   Port(rst: in std_logic;--power reset to initialize 
  9.        clk: in std_logic;--system clock 1024Hz
  10.      alarm: in std_logic;--dip switch for alarm setting
  11.       stop: in std_logic;--dip switch for stop watch setting
  12.         Ok: in std_logic;--push button to confirrn any setting operation       
  13.   Sec_tune: in std_logic;--pushing button to tune seconds
  14.   Min_tune: in std_logic;--pushing button to tune minutes
  15.  Hour_tune: in std_logic;--pushing button to tune hourss
  16.  led_alarm: out std_logic;--led to show alarm time reached
  17.   led_stop: out std_logic;--led to show count_down over 
  18.       seg4: out std_logic_vector(6 downto 0);--display seconds and minutes      
  19.      p1,p2,p3,p4: out std_logic;--power for sec_one,sec_ten,min_one and min_ten
  20.       seg2: out std_logic_vector(6 downto 0);--display hours      
  21.       p5,p6: out std_logic);--power for hour_one,hour_ten
  22. End clock;
  23. architecture arch of clock is
  24. --global signals flowing among different circuit blocks
  25.   signal Hz1:std_logic;--1 Hz clock
  26. --normal dispay time
  27.   signal n_sec,n_min: integer range 0 to 59;
  28.   signal n_hour: integer range 0 to 23;
  29. --alarm display time
  30.   signal a_sec,a_min: integer range 0 to 59;
  31.   signal a_hour: integer range 0 to 23;
  32. --stop display time
  33.   signal s_sec,s_min: integer range 0 to 59;
  34.   signal s_hour: integer range 0 to 23;
  35. --chosen display time
  36.   signal second,minute :integer range 0 to 59;
  37.   signal hour :integer range 0 to 23;  
  38.   signal sec_one,sec_ten,min_one,min_ten: std_logic_vector(3 downto 0);
  39.   signal hour_one,hour_ten: std_logic_vector(3 downto 0);
  40. --chosen display time in 7-segments led format
  41.   signal sec7_one,sec7_ten,min7_one,min7_ten: std_logic_vector(6 downto 0);
  42.   signal hour7_one,hour7_ten: std_logic_vector(6 downto 0);
  43. --index for alarm or stop_watch status
  44.   signal stop_index,alarm_index: std_logic;  
  45.   signal alarm_disp,stop_disp : std_logic;
  46. begin
  47. ----normal counting from 00:00:00 to 23:59:59
  48. normal_counting:Block
  49. --input : rst,clk
  50. --output: Hz1, n_sec,n_min,n_hour    
  51.   signal full_sec:std_logic;--index of 60 seconds fully counted
  52.   signal full_min:std_logic;--index of 60 minutes fully counted
  53.   signal full_hour:std_logic;--index of 24 hours fully counted
  54. begin
  55. --to get 1Hz clock
  56.   u0:div1024   port map(clk=>clk,f1hz=>Hz1);
  57. --to count from 0 to 60 seconds and get full_sec
  58.   u1:count60 port map(rst=>rst,carry=>hz1,times=>n_sec,full=>full_sec);
  59. --to count from 0 to 60 minutes and get full_min
  60.   u2:count60 port map(rst=>rst,carry=>full_sec,times=>n_min,full=>full_min);
  61. --to count from 0 to 24 hours and get full_hour
  62.   u3:count24 port map(rst=>rst,carry=>full_min,times=>n_hour,full=>full_hour);
  63. end block normal_counting;
  64. ----stop watch setting and down_counting
  65. stop_w: block
  66. --input:rst,hz1,stop,ok,sec_tune,min_tune,hour_tune
  67. --output:s_sec,s_min,s_hour,stop_index
  68. begin
  69. u4:stop_watch port MAP(rst=>rst,hz1=>hz1,stop=>stop,ok=>ok,sec_tune=>sec_tune,
  70.                       min_tune=>min_tune,hour_tune=>hour_tune,stop_sec=>s_sec,
  71.                  stop_min=>s_min,stop_hour=>s_hour,index=>stop_index,disp=>stop_disp);     
  72.   p1:process(rst,stop_index)
  73.   begin
  74.     if rst='1' then led_stop<='0';
  75.     elsif rising_edge(stop_index) then
  76.           led_stop<='1';  
  77.     end if;
  78.   end process p1;
  79.   
  80. end block stop_w;
  81. alarm_setting:Block
  82. --input : rst,sec_tune,min_tune,hour_tune,alarm,ok
  83. --output: a_sec,a_min,a_hour,alarm_index,led_alarm    
  84. begin
  85.   u5:alarm_set port map(rst=>rst,hz1=>hz1,alarm=>alarm,ok=>ok,sec_tune=>sec_tune,
  86.                        min_tune=>min_tune,hour_tune=>hour_tune,
  87.                        sec=>a_sec,min=>a_min,hour=>a_hour);
  88.   p1:process(alarm,ok)
  89.   begin
  90.     if rst='1' then alarm_index<='0';
  91.     elsif alarm='1' and ok='1' then
  92.           if (a_sec=n_sec and a_min=n_min and a_hour=n_hour)
  93.                       then alarm_index<='1';
  94.                       else alarm_index<='0';
  95.           end if;
  96.     end if;
  97.   alarm_disp<=(alarm and not ok) and not alarm_index; 
  98.   end process p1;
  99.   p2:process(rst,alarm_index)
  100.   begin
  101.     if rst='1' then led_alarm<='0';
  102.     elsif rising_edge(alarm_index) then
  103.           led_alarm<='1';  
  104.     end if;
  105.   end process p2;
  106.    
  107. end block alarm_setting;
  108. ----to decide which time displayed and transform to BCD format
  109. output:block
  110. --input:clk,stop_disp,alarm_disp
  111. --input:s_sec,s_min,s_hour,a_sec,a_min,a_hour,n_sec,n_min,n_hour
  112. --output:second,minute,hour
  113. begin
  114.   process(clk,stop_disp,alarm_disp)
  115.   begin
  116.   if rising_edge(clk) then
  117.     if stop_disp='1' then second<=s_sec;
  118.                           minute<=s_min;
  119.                             hour<=s_hour;
  120.     elsif alarm_disp='1' then second<=a_sec;
  121.                               minute<=a_min;
  122.                                 hour<=a_hour;                  
  123.                          else second<=n_sec;
  124.                               minute<=n_min;
  125.                                 hour<=n_hour;   
  126.     end if;
  127.   end if;  
  128.   end process;           
  129. ----tranformed to BCD format
  130.   u6:i60bcd port MAP(interg=>second,ten=>sec_ten,one=>sec_one);
  131.   u7:i60bcd port MAP(interg=>minute,ten=>min_ten,one=>min_one);  
  132.   u8:i24bcd port MAP(interg=>hour,ten=>hour_ten,one=>hour_one);  
  133. end block output;
  134. ---transform BCD format to 7_segment LED display format and scan out
  135. scan_display:block
  136. begin
  137.   u11:bin2led port map(bin=>sec_one,led=>sec7_one);   
  138.   u12:bin2led port map(bin=>sec_ten,led=>sec7_ten);   
  139.   u13:bin2led port map(bin=>min_one,led=>min7_one);   
  140.   u14:bin2led port map(bin=>min_ten,led=>min7_ten);   
  141.   u15:bin2led port map(bin=>hour_one,led=>hour7_one);   
  142.   u16:bin2led port map(bin=>hour_ten,led=>hour7_ten);
  143.   u17:scan4  port map(rst=>rst,clk=>clk,
  144.                        a=>sec7_one,b=>sec7_ten,c=>min7_one,d=>min7_ten,    
  145.                        mux_out=>seg4,pa=>p1,pb=>p2,pc=>p3,pd=>p4);
  146.   u18: scan2  port map(rst=>rst,clk=>clk,
  147.                        a=>hour7_one,b=>hour7_ten,mux_out=>seg2,pa=>p5,pb=>p6);
  148. end block scan_display;
  149.   
  150. end arch;