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