【文章內(nèi)容簡(jiǎn)介】
,以及穩(wěn)壓電源模塊為電路提供電源。硬件電路的框圖如圖 所示。 圖 數(shù)字鐘的硬件電路框架 本電路的外接晶振采用 24MHz 的石英晶體振蕩器,經(jīng)分頻后輸出時(shí)鐘基準(zhǔn)和掃描時(shí)鐘基準(zhǔn);穩(wěn)壓模塊采用 AMS1117/ 三端穩(wěn)壓器,通過(guò) USB 接口輸入 5V 電壓,經(jīng)穩(wěn)壓器輸出 為 CPLD 芯片和數(shù)碼管顯示提供電壓;五位按鍵分別控制系統(tǒng)復(fù)位、計(jì)時(shí)與設(shè)鬧的顯示切換、秒 調(diào)節(jié)、分鐘調(diào) 節(jié)和小時(shí)調(diào)節(jié);六位數(shù)碼管用于顯示時(shí)鐘 。 穩(wěn)壓電路 CPLD EPM570T100C5N 五位 按鍵 晶振 六位數(shù)碼管 8 3 單元電路設(shè)計(jì) 分頻模塊電路設(shè)計(jì)與實(shí)現(xiàn) 晶體振蕩器是構(gòu)成數(shù)字式時(shí)鐘的核心,振蕩器的穩(wěn)定度及頻率的精度決定了數(shù)字鐘計(jì)時(shí)的準(zhǔn)確程度,它保證了時(shí)鐘的走時(shí)準(zhǔn)確及穩(wěn)定。 石英晶體的選頻特性非常好,只有某頻率點(diǎn)的信號(hào)可以通過(guò)它,其它頻率段的信號(hào)均會(huì)被它所衰減,而且,振蕩信號(hào)的頻率與振蕩電路中的 R、 C 元件的數(shù)值無(wú)關(guān)。因此,這種振蕩電路輸出的是準(zhǔn)確度極高的信號(hào)。然后再利用分頻電路,將其輸出信號(hào)轉(zhuǎn)變?yōu)槊胄盘?hào)和掃描信號(hào),其組成框圖如圖 所示 。 圖 秒信號(hào)產(chǎn)生電路框圖 本 系統(tǒng)使用的晶體振蕩器電路給數(shù)字鐘提供 了 一個(gè)頻率穩(wěn)定準(zhǔn)確的 24MHz 的方波信號(hào),其輸出至分頻電路。分頻電路的邏輯框圖如圖 所示。 圖 分 頻電路模塊 分頻 電路的程序如下: 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。 此分頻電路輸出兩種不同頻率的信號(hào),一個(gè)是 頻率為 1KHz 的信號(hào), 接至去抖模塊和動(dòng)態(tài)掃描模塊作為掃描信號(hào);另一個(gè)是頻率為 1Hz 的信號(hào),輸出至秒計(jì)數(shù)模塊作為時(shí)鐘計(jì)時(shí)的秒基準(zhǔn)信號(hào)。當(dāng)然秒信號(hào)必須非常精確,否則時(shí)鐘 會(huì)出現(xiàn)較大的誤差,所以必須對(duì)秒信號(hào)進(jìn)行測(cè)試,直至符合要求。 10 獨(dú)立按鍵消抖模塊 按鍵的閉合和釋放的瞬間,輸入的信號(hào)會(huì)有毛刺。如果不進(jìn)行消抖處理,系統(tǒng)會(huì)將這些毛刺誤以為是用戶的另一次輸入,導(dǎo)致系統(tǒng)的誤操作。本模塊的 消 抖電路采用的是計(jì)數(shù)法 , 實(shí)現(xiàn)方法是先判斷是否有按鍵按下,如 果 有按鍵按下則延時(shí)一段時(shí)間,待抖動(dòng)過(guò)去之后再讀鍵值,如 果 仍為高電平,則確定有按鍵按下,然后產(chǎn)生一個(gè)有按鍵按下的信號(hào)。該模塊有一個(gè)時(shí)鐘輸入端口,輸入 的 時(shí)鐘信號(hào)是分頻 模塊 出來(lái)的 1KHz 的 掃描信號(hào) ;一個(gè)按鍵輸入端口,用于存儲(chǔ)當(dāng)前鍵值;一個(gè)輸出 端口,用于輸出有按鍵按下的信號(hào)。該模塊的邏輯框圖如圖 所示。 圖 去抖邏輯 模塊 該電路的 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。 這段程序 的作用 是實(shí)現(xiàn)按鍵消抖,原理是當(dāng)有按鍵按下的時(shí)候, tempnum 記錄當(dāng)前的鍵值, counte 開始計(jì)數(shù), 當(dāng) counter 不為 31 時(shí),內(nèi)部計(jì)數(shù)器 計(jì)數(shù) ,從 0 計(jì)數(shù)至 31,當(dāng)鍵值保持 31 個(gè) 掃描 周期不變時(shí), 由 numout 讀出此鍵值。如果 在計(jì)數(shù)不滿 31 時(shí) 鍵值發(fā)生跳變,則說(shuō)明 此鍵值只 是抖動(dòng),不讀此鍵值。一旦計(jì)數(shù)完成,抖動(dòng)已經(jīng)過(guò)去, 就 不會(huì) 再 發(fā)生重鍵現(xiàn)象了,這樣就去除了抖動(dòng)。 按鍵消抖是電路的一個(gè)必要模 塊,在軟件仿真時(shí)其作用可能不太明顯,但在下載后運(yùn)行調(diào)試時(shí)卻是必不可少的,由于因?yàn)槿藗冞M(jìn)行按鍵的時(shí)間不是固定的,因此消抖的時(shí)間也要視實(shí)際情況而進(jìn)行改動(dòng),這樣才能更加符合人們的使用習(xí)慣。 12 計(jì)數(shù)模塊設(shè)計(jì)與實(shí)現(xiàn) 1. 秒、分計(jì)數(shù)模塊 秒、分計(jì)數(shù)均為六十進(jìn)制 , 所以只用設(shè)計(jì)一個(gè)六十進(jìn)制計(jì)數(shù)器模塊即可, 其邏輯框圖如圖 所示。 圖 秒(分)計(jì) 數(shù)模塊框圖 輸入端口 rst 是異步清零信號(hào); clk 是 輸入脈沖信號(hào)。 dout[7..0]是秒(分)時(shí)鐘的輸出,高四位是十位數(shù),低四位是個(gè)位數(shù); co 是進(jìn)位輸出端口, 當(dāng)秒(分)計(jì)數(shù)到 “01011001”時(shí)輸出高電平,其他時(shí)候輸出低電平。秒(分)計(jì)數(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í)計(jì)數(shù)模塊 小 時(shí)計(jì)數(shù)模塊為二十四進(jìn)制計(jì)數(shù)器,其邏輯框圖如圖 所示。 圖 時(shí)計(jì) 數(shù)模塊框圖 輸入端口 rst 是異步清零信號(hào); clk 是 分 脈沖輸入端口; dout[7..0]是 小 時(shí)的輸出,高四位是十位數(shù),低四位是個(gè)位數(shù); co 是進(jìn)位輸出端口,當(dāng)時(shí)計(jì)數(shù)到 “00100011”時(shí)輸出高電平,其他時(shí)候輸出低電平。時(shí)計(jì)數(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