【文章內(nèi)容簡(jiǎn)介】
clk是同步時(shí)鐘信號(hào),選擇20MHZ;dly_out是消抖動(dòng)輸出;diff_out是消抖動(dòng)微分輸出。LIBRARY IEEE。 消除USE 。USE 。ENTITY debouncing ISPORT(clk,key:IN STD_LOGIC。 clr:IN STD_LOGIC。 dly_out,dif_out:OUT STD_LOGIC)。END debouncing。ARCHITECTURE a OF debouncing IS SIGNAL sample,dly,diff:STD_LOGIC。 BEGINfree_counter:block 計(jì)數(shù)器模塊 SIGNAL :STD_LOGIC_VECTOR(4 DOWNTO 0)。 SIGNAL d0:STD_LOGIC。 BEGIN PROCESS(clr,clk) BEGIN if clr=39。039。then d0=39。039。 =(OTHERS=39。039。)。 elsif clk39。event and clk=39。139。then d0=(4)。 =+1。 end if。 end process。 sample=not((4) and (not d0))。end block free_counter。debunce:block 消抖動(dòng)模塊 signal d0,d1,s,r:std_logic。begin process(clk,clr) begin if clr=39。039。 then dly=39。039。 elsif rising_edge(clk) then if sample=39。139。 then d1=d0。 d0=key。 s=d0 and d1。 r=not d0 and not d1。 if s=39。039。 and r=39。039。 then dly=dly。 elsif s=39。039。 and r=39。139。 then dly=39。039。 elsif s=39。139。 and r=39。039。 then dly=39。139。 else dly=39。039。 end if。 end if。 end if。 end process。 dly_out=dly。end block debunce。differential:block 微分模塊 signal d1,d0:std_logic。 begin process(clk,clr) begin if clr=39。039。then d0=39。039。d1=39。039。 elsif rising_edge(clk)then d1=d0。d0=dly。 end if。 diff=d0 and not d1。 end process。 dif_out=diff。end block differential。END a。彈跳消除電路生成元件:圖35 彈跳消除電路生成元件 頂層實(shí)體電路 時(shí)鐘產(chǎn)生電路當(dāng)一個(gè)系統(tǒng)中使用不同操作頻率的脈沖波形時(shí),最方便的方法就是利用一個(gè)自由計(jì)數(shù)器來(lái)產(chǎn)生各種頻率。本電路中就使用三種不同頻率的工作脈沖波形。它們分別是:系統(tǒng)時(shí)鐘(它是系統(tǒng)內(nèi)部所有時(shí)鐘的提供者,頻率最高)、彈跳消除取樣信號(hào)、鍵盤(pán)掃描信號(hào)和七段顯示器掃描信號(hào)。在很多的電路設(shè)計(jì)中,鍵盤(pán)掃描信號(hào)和七段顯示器掃描信號(hào)可以使用相同的時(shí)鐘信號(hào),本設(shè)計(jì)也采用此方法。該模塊中的掃描信號(hào)就是取了計(jì)數(shù)器中的3個(gè)值,使用語(yǔ)句: SELTMP=Q(7 DOWNTO 5)。此處SELTMP要預(yù)先定義為3bit的寬度。 鍵盤(pán)掃描電路掃描電路的作用是用來(lái)提供鍵盤(pán)掃描信號(hào)的電路,掃描信號(hào)的變化的順序依次為000001010011100101110111……依次的周而復(fù)始。掃描時(shí)依序分別掃描八列按鍵,當(dāng)掃描信號(hào)為000時(shí),掃描0這一列按鍵……每掃描一列按鍵,就檢查一次是否有按鍵按下,如果這排有按鍵按下,就馬上停止掃描,立即進(jìn)行按鍵編碼動(dòng)作,存儲(chǔ)鍵碼,如果沒(méi)有按鍵按下,則繼續(xù)掃描下一列。用語(yǔ)句SELTMP=Q(7 DOWNTO 5)。 SELOUT=SELTMP。即可實(shí)現(xiàn)鍵盤(pán)掃描。 鍵盤(pán)譯碼電路上述鍵盤(pán)中的按鍵可分為數(shù)字鍵和功能鍵。數(shù)字鍵主要用來(lái)輸入數(shù)字,但鍵盤(pán)所產(chǎn)生的輸出KIN3~KIN0無(wú)法拿來(lái)直接使用;另外不同的數(shù)字按鍵也擔(dān)負(fù)不同的功能,因此必須由鍵盤(pán)譯碼電路來(lái)規(guī)劃第個(gè)按鍵的輸出形式,以便執(zhí)行相應(yīng)的動(dòng)作。譯碼電路負(fù)責(zé)的工作有:a)判別是否有鍵按下。b)將被按下鍵編碼成對(duì)應(yīng)的ZOUT[7..0]8位二進(jìn)制編碼,即用十進(jìn)制數(shù)來(lái)顯示按鍵值:KEY_CODE=ZOUT。c)把KEY_CODE送到內(nèi)部下一級(jí)電路,即按鍵碼的寄存器_選擇器模塊。 按鍵碼存儲(chǔ)電路因?yàn)槊看螔呙钑?huì)產(chǎn)生新的按鍵數(shù)據(jù),可能會(huì)覆蓋前面的數(shù)據(jù),所以需要一個(gè)按鍵存儲(chǔ)電路,將整個(gè)鍵盤(pán)掃描完畢后記錄下來(lái)。 顯示電路該模塊把DB[3..0]的值譯成8位的數(shù)碼管所對(duì)應(yīng)的0、9,使數(shù)碼管正常顯示按鍵值。library ieee。 use 。 use 。 use 。entity keys_test isport(clk20,clr:in std_logic。 selout:out std_logic_vector(2 downto 0)。 notselout_0:out std_logic。