【正文】
atch status signal stop_index,alarm_index: std_logic。 signal alarm_disp,stop_disp : std_logic。 begin 正常計數(shù)時間功能模塊 系統(tǒng)必須維持一個持續(xù)不斷計數(shù)的時鐘,從時間00:00:00到23:59:59循環(huán)不斷。首先將1024Hz的系統(tǒng)輸入脈沖除以1024得到1Hz的基本秒輸入,然后除以60得分數(shù),再除以60得小時數(shù),再除以24得一個滿日指針,節(jié)。 block模塊的程序代碼。 normal_counting block的VHDL碼 normal counting from 00:00:00 to 23:59:59 normal_counting:block input : rst,clk output: hz1, n_sec,n_min,n_hour signal full_sec:std_logic。 index of 60 seconds fully counted signal full_min:std_logic。 index of 60 minutes fully counted signal full_hour:std_logic。 index of 24 hours fully counted begin to get 1hz clock u0:div1024 port map(clk=clk,f1hz=hz1)。 to count from 0 to 60 seconds and get full_sec u1:count60 port map(rst=rst,carry=hz1,times=n_sec,full=full_sec)。 to count from 0 to 60 minutes and get full_min u2:count60 port map(rst=rst,carry=full_sec,times=n_min,full=full_min)。 to count from 0 to 24 hours and get full_hour u3:count24 port map(rst=rst,carry=full_min,times=n_hour,full=full_hour)。 end block normal_counting。 定時器設定與計時功能模塊 在此模塊中,并執(zhí)行計時動作,取得計時終止指針,然后由計時終止指針標示出計時終止狀態(tài)led_stop =’1’。 block模塊的程序代碼。 stop_watch block的VHDL碼 stop watch setting and down_counting stop_w: block input:rst,hz1,stop,ok,sec_tune,min_tune,hour_tune output:s_sec,s_min,s_hour,stop_index begin u4:stop_watch port map(rst=rst,hz1=hz1,stop=stop,ok=ok,sec_tune= sec_tune,min_tune=min_tune,hour_tune=hour_tune,stop_sec= s_sec,stop_min=s_min,stop_hour=s_hour,index= stop_index,disp=stop_disp)。 p1:process(rst,stop_index) begin if rst=’1’ then led_stop=’0’。 elsif rising_edge(stop_index) then led_stop=’1’。 end if。 end process p1。 end block stop_w。 鬧鐘設定與時間對比功能模塊 在此模塊中,然后確認指針開關ok處于on(’1’)時,開始進行目前正常時間與鬧鐘設定時間的對比動作,對比完成即設定alarm_index為1,然后再進一步標示出鬧鐘設定狀態(tài)led_alarm = ’1’。 block模塊的程序代碼。 alarm_setting block的VHDL碼 alarm_setting:block input : rst,sec_tune,min_tune,hour_tune,alarm,ok output: a_sec,a_min,a_hour,alarm_index,led_alarm begin u5:alarm_set port map(rst=rst,hz1=hz1,alarm=alarm,ok=ok,sec_tune= sec_tune,min_tune=min_tune,hour_tune= hour_tune,sec=a_sec,min=a_min,hour=a_hour)。 p1:process(alarm,ok) begin if rst=’1’ then alarm_index=’0’。 elsif alarm=’1’ and ok=’1’ then if (a_sec=n_sec and a_min=n_min and a_hour=n_hour) then alarm_index=’1’。 else alarm_index=’0’。 end if。 end if。 alarm_disp=(alarm and not ok) and not alarm_index。 end process p1。 p2:process(rst,alarm_index) begin if rst=’1’ then led_alarm=’0’。 elsif rising_edge(alarm_index) then led_alarm=’1’。 end if。 end process p2。 end block alarm_setting。 輸出選擇與數(shù)碼轉(zhuǎn)換功能模塊 通常6個時分秒數(shù)字所顯示的是正常的計數(shù)時鐘,但在鬧鐘與定時器時間設定過程中,必須顯示正在設定的鬧鈴時間或定時器計時時間。另外,在定時器計時過程中,為了觀察進行時間,必須顯示正在計時的剩余時間。與定時器時間的顯示條件。轉(zhuǎn)換成BCD形式。 block模塊的程序代碼。 輸出時間的顯示條件 output block的VHDL碼 to decide which time displayed and transformed to bcd format output:block input:clk,stop_disp,alarm_disp input:s_sec,s_min,s_hour,a_sec,a_min,a_hour,n_sec, n_min, n_hour output:second,minute,hour begin process(clk,stop_disp,alarm_disp) begin if rising_edge(clk) then if stop_disp=’1’ then second=s_sec。 minute=s_min。 hour=s_hour。 elsif alarm_disp=’1’ then second=a_sec。 minute=a_min。 hour=a_hour。 else second=n_sec。 minute=n_min。 hour=n_hour。 end if。 end if。 end process。tranformed to bcd format u6:i60bcd port map(interg=second,ten=sec_ten,one=sec_one)。 u7:i60bcd port map(interg=minute,ten=min_ten,one=min_one)。 u8:i24bcd port map(interg=hour,ten=hour_ten,one=hour_one)。 end block output。 掃描多路輸出功能模塊 為了節(jié)省IC的輸出引腳及耗電量,可以將4組數(shù)字輸出或2組數(shù)字輸出作為多路輸出,故所需引腳數(shù)由28降至7個,14降至7個;另外使用四合一型七段顯示器與視覺暫留效應可降低顯示耗電量3/4。組件由BCD碼轉(zhuǎn)換成七段顯示器碼,然后分別將分秒的4個數(shù)字通過scan4組件掃描輸出,而將小時數(shù)的2個數(shù)字通過scan2組件掃描輸出,最后完成整個電子鐘的功能。 block模塊的程序代碼。 scan_display block的VHDL碼 transform bcd format to 7_segment led display format and scan out scan_display:block begin u11:bin2led port map(bin=sec_one,led=sec7_one)。 u12:bin2led port map(bin=sec_ten,led=sec7_ten)。 u13:bin2led port map(bin=min_one,led=min7_one)。 u14:bin2led port map(bin=min_ten,led=min7_ten)。 u15:bin2led port map(bin=hour_one,led=hour7_one)。 u16:bin2led port map(bin=hour_ten,led=hour7_ten)。 u17:scan4 port map(rst=rst,clk=clk,a=sec7_one, b=sec7_ten,c=min7_one,d=min7_ten, mux_out=seg4,pa=p1,pb=p2,pc=p3,pd=p4)。 u18: scan2 port map(rst=rst,clk=clk,a=hour7_one, b=hour7_ten,mux_out=seg2,pa=p5,pb=p6)。 end block scan_display。 當時間進行到7s時,設定stop=’1’,sec_tune=’1’,因此輸出時間second變成定時器設定時間s_sec,直到5s時ok=’1’,仍然顯示定時器時間,直到s_sec為0,此時led_stop=’1’,而時間顯示則還原為n_sec=18s。在這段時間內(nèi)正常計數(shù)時鐘n_sec, n_min, n_hour一直沒停過。信號仿真結(jié)果如圖412所示。 圖4-12鬧鈴設定1min后令ok=’1’,則時間對比開始,此時顯示正常計數(shù)時鐘。直到鬧鈴設定時間到達,則警示燈led_alarm亮,此信號可用來觸發(fā)鬧鈴。信號仿真結(jié)果如圖413所示。 圖4-13