按鍵是數(shù)字系統(tǒng)最基本的輸入接口設(shè)備,本文主要介紹機(jī)械彈性按鍵的原理和編程方法。
0****1
按鍵原理
以EGO1開(kāi)放板按鍵為例,用戶可用的板載按鍵主要包括S6(低有效按鍵),S0~S4(高有效按鍵)。
由原理圖可以看到,按鍵S6在未按下時(shí),FPGA引腳通過(guò)電阻連接3.3V高電平;當(dāng)按鍵按下,與地連通,引腳電平被拉低。S0~S4則相反,按鍵未按下時(shí),引腳為低電平;按鍵按下時(shí),接通3.3V電源,引腳電平由低變高。
因此,我們通過(guò)檢測(cè)高低電平的變化,就可以檢測(cè)按鍵是否被按下。
但是實(shí)際情況是,我們使用的是機(jī)械彈性按鍵,在按鍵按下和彈起過(guò)程中會(huì)存在抖動(dòng),如圖(a)。
一般抖動(dòng)會(huì)在5~10ms左右,按鍵持續(xù)時(shí)間在幾百ms,而FPGA時(shí)鐘是ns級(jí)的,檢測(cè)頻率很高,如果僅僅通過(guò)高低電平的變化去判斷按鍵是否被按下,則在一次按鍵按下時(shí),就會(huì)被檢測(cè)為多次有效按鍵,如圖(b),從而造成誤觸發(fā)。
我們需要對(duì)按鍵信號(hào)進(jìn)行消抖處理,得出圖(c)的穩(wěn)定的按鍵信號(hào)。
0****2
按鍵消抖方法
由于抖動(dòng)大約5-10ms,可以使用一個(gè)15ms的計(jì)數(shù)器。
每當(dāng)檢測(cè)到輸入有變化就復(fù)位計(jì)數(shù)器,然后進(jìn)行15ms的延時(shí),如果在15ms之內(nèi)有抖動(dòng),計(jì)數(shù)器就會(huì)復(fù)位重新計(jì)數(shù),直到能夠連續(xù)計(jì)數(shù)15ms,說(shuō)明按鍵鍵值在15ms內(nèi)沒(méi)有發(fā)生改變,按鍵進(jìn)入穩(wěn)定狀態(tài),此時(shí),可以輸出穩(wěn)定的鍵值。
同樣,當(dāng)按鍵彈起時(shí)出現(xiàn)鍵值的改變,就復(fù)位計(jì)數(shù)器,只有當(dāng)按鍵穩(wěn)定,計(jì)數(shù)器能夠連續(xù)計(jì)數(shù)15ms時(shí),才輸出穩(wěn)定的鍵值。這樣我們就得到一個(gè)穩(wěn)定的沒(méi)有抖動(dòng)的采樣鍵值。
03
按鍵消抖的Verilog描述
遵循一個(gè)always描述一個(gè)信號(hào)的原則,下面分別對(duì)各個(gè)信號(hào)進(jìn)行描述。
按鍵寄存器key_reg描述:
延時(shí)計(jì)數(shù)器delay_cnt描述:
鍵值key_value描述:
按鍵的標(biāo)志信號(hào)key_p_flag和key_n_flag描述:
按鍵標(biāo)志信號(hào)是一個(gè)指示按鍵有效的只持續(xù)1個(gè)時(shí)鐘周期的標(biāo)志信號(hào),一般作為后級(jí)模塊的控制信號(hào)。
當(dāng)計(jì)數(shù)值為1并且鍵值為一是則為上升沿標(biāo)志,當(dāng)計(jì)數(shù)值為1,且鍵值為0,就輸出下降沿標(biāo)志信號(hào)。
仿真波形如下圖。
-
控制器
+關(guān)注
關(guān)注
112文章
16101瀏覽量
177064 -
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119814 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2253瀏覽量
94278 -
FPGA芯片
+關(guān)注
關(guān)注
3文章
246瀏覽量
39746 -
按鍵電路
+關(guān)注
關(guān)注
1文章
35瀏覽量
21742
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論