【文章內容簡介】
,以及穩(wěn)壓電源模塊為電路提供電源。硬件電路的框圖如圖 所示。 圖 數(shù)字鐘的硬件電路框架 本電路的外接晶振采用 24MHz 的石英晶體振蕩器,經分頻后輸出時鐘基準和掃描時鐘基準;穩(wěn)壓模塊采用 AMS1117/ 三端穩(wěn)壓器,通過 USB 接口輸入 5V 電壓,經穩(wěn)壓器輸出 為 CPLD 芯片和數(shù)碼管顯示提供電壓;五位按鍵分別控制系統(tǒng)復位、計時與設鬧的顯示切換、秒 調節(jié)、分鐘調 節(jié)和小時調節(jié);六位數(shù)碼管用于顯示時鐘 。 穩(wěn)壓電路 CPLD EPM570T100C5N 五位 按鍵 晶振 六位數(shù)碼管 8 3 單元電路設計 分頻模塊電路設計與實現(xiàn) 晶體振蕩器是構成數(shù)字式時鐘的核心,振蕩器的穩(wěn)定度及頻率的精度決定了數(shù)字鐘計時的準確程度,它保證了時鐘的走時準確及穩(wěn)定。 石英晶體的選頻特性非常好,只有某頻率點的信號可以通過它,其它頻率段的信號均會被它所衰減,而且,振蕩信號的頻率與振蕩電路中的 R、 C 元件的數(shù)值無關。因此,這種振蕩電路輸出的是準確度極高的信號。然后再利用分頻電路,將其輸出信號轉變?yōu)槊胄盘柡蛼呙栊盘?,其組成框圖如圖 所示 。 圖 秒信號產生電路框圖 本 系統(tǒng)使用的晶體振蕩器電路給數(shù)字鐘提供 了 一個頻率穩(wěn)定準確的 24MHz 的方波信號,其輸出至分頻電路。分頻電路的邏輯框圖如圖 所示。 圖 分 頻電路模塊 分頻 電路的程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY fenpin IS PORT(clkin:IN STD_LOGIC。 clkout1:OUT STD_LOGIC。 clkout1k:OUT STD_LOGIC)。 END。 晶振 分頻 電路 9 ARCHITECTURE BEHAVE OF fenpin IS signal clk1khz:std_LOGIC。 signal clk1hz:std_LOGIC。 BEGIN PROCESS(clkin) VARIABLE count:integer range 0 to 1199。 begin if clkin39。event and clkin=39。139。 then if count=1199 then clk1khz=not clk1khz。 count:=0。 else count:=count+1。 end if。 end if。 end process。 process(clk1khz) VARIABLE count:integer range 0 to 499。 begin if clkin39。event and clkin=39。139。 then if count=499 then clk1hz=not clk1hz。 count:=0。 else count:=count+1。 end if。 end if。 end process。 clkout1=clk1hz。 clkout1k=clk1khz。 end behave。 此分頻電路輸出兩種不同頻率的信號,一個是 頻率為 1KHz 的信號, 接至去抖模塊和動態(tài)掃描模塊作為掃描信號;另一個是頻率為 1Hz 的信號,輸出至秒計數(shù)模塊作為時鐘計時的秒基準信號。當然秒信號必須非常精確,否則時鐘 會出現(xiàn)較大的誤差,所以必須對秒信號進行測試,直至符合要求。 10 獨立按鍵消抖模塊 按鍵的閉合和釋放的瞬間,輸入的信號會有毛刺。如果不進行消抖處理,系統(tǒng)會將這些毛刺誤以為是用戶的另一次輸入,導致系統(tǒng)的誤操作。本模塊的 消 抖電路采用的是計數(shù)法 , 實現(xiàn)方法是先判斷是否有按鍵按下,如 果 有按鍵按下則延時一段時間,待抖動過去之后再讀鍵值,如 果 仍為高電平,則確定有按鍵按下,然后產生一個有按鍵按下的信號。該模塊有一個時鐘輸入端口,輸入 的 時鐘信號是分頻 模塊 出來的 1KHz 的 掃描信號 ;一個按鍵輸入端口,用于存儲當前鍵值;一個輸出 端口,用于輸出有按鍵按下的信號。該模塊的邏輯框圖如圖 所示。 圖 去抖邏輯 模塊 該電路的 VHDL 程序如下: LIBRARY IEEE。 USE 。 USE 。 entity qudou is port(clk1k:in std_logic。 numin:in std_logic。 numout:out std_logic )。 end。 architecture behave of qudou is signal tempnum:std_logic。 signal counter:integer range 0 to 31。 signal start:std_logic。 begin process(clk1k) begin 11 if rising_edge(clk1k) then if start=39。039。 then tempnum=39。039。 numout=39。039。 start=39。139。 else if numin/=tempnum then tempnum=numin。 counter=0。 else if counter=31 then numout=numin。 counter=0。 else counter=counter+1。 end if。 end if。 end if。 end if。 end process。 end。 這段程序 的作用 是實現(xiàn)按鍵消抖,原理是當有按鍵按下的時候, tempnum 記錄當前的鍵值, counte 開始計數(shù), 當 counter 不為 31 時,內部計數(shù)器 計數(shù) ,從 0 計數(shù)至 31,當鍵值保持 31 個 掃描 周期不變時, 由 numout 讀出此鍵值。如果 在計數(shù)不滿 31 時 鍵值發(fā)生跳變,則說明 此鍵值只 是抖動,不讀此鍵值。一旦計數(shù)完成,抖動已經過去, 就 不會 再 發(fā)生重鍵現(xiàn)象了,這樣就去除了抖動。 按鍵消抖是電路的一個必要模 塊,在軟件仿真時其作用可能不太明顯,但在下載后運行調試時卻是必不可少的,由于因為人們進行按鍵的時間不是固定的,因此消抖的時間也要視實際情況而進行改動,這樣才能更加符合人們的使用習慣。 12 計數(shù)模塊設計與實現(xiàn) 1. 秒、分計數(shù)模塊 秒、分計數(shù)均為六十進制 , 所以只用設計一個六十進制計數(shù)器模塊即可, 其邏輯框圖如圖 所示。 圖 秒(分)計 數(shù)模塊框圖 輸入端口 rst 是異步清零信號; clk 是 輸入脈沖信號。 dout[7..0]是秒(分)時鐘的輸出,高四位是十位數(shù),低四位是個位數(shù); co 是進位輸出端口, 當秒(分)計數(shù)到 “01011001”時輸出高電平,其他時候輸出低電平。秒(分)計數(shù)模塊的程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY counter_60_bcd IS PORT(rst,clk:IN STD_LOGIC。 dout:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0)。 co:OUT STD_LOGIC)。 END。 ARCHITECTURE behave OF counter_60_bcd IS BEGIN PROCESS(clk,rst) BEGIN IF rst=39。139。THEN dout=00000000。 co=39。039。 ELSE IF clk39。EVENT AND clk=39。139。THEN 13 IF dout(7 DOWNTO 0)=01011001THEN dout=00000000。 co=39。139。 ELSIF dout(3 DOWNTO 0)=1001THEN dout=dout+0111。 co=39。039。 ELSE dout=dout+39。139。 co=39。039。 END IF。 END IF。 END IF。 END PROCESS。 END behave。 2. 小時計數(shù)模塊 小 時計數(shù)模塊為二十四進制計數(shù)器,其邏輯框圖如圖 所示。 圖 時計 數(shù)模塊框圖 輸入端口 rst 是異步清零信號; clk 是 分 脈沖輸入端口; dout[7..0]是 小 時的輸出,高四位是十位數(shù),低四位是個位數(shù); co 是進位輸出端口,當時計數(shù)到 “00100011”時輸出高電平,其他時候輸出低電平。時計數(shù)模塊的程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY counter_24_bcd IS PORT(rst,clk:IN STD_LOGIC。 dout:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0)。 co:OUT STD_LOGIC)。 14END。 ARCHITECTURE behave OF counter_24_bcd IS BEGIN PROCESS(clk,rst) BEGIN IF rst=39。139。THEN dout=00000000。 co=39。039。 ELSE IF clk39。EVENT AND clk=39。139。THEN I