在FPGA系統設計中,按鍵是最常見(jiàn)的人機交互接口部件。在沒(méi)有微控制器參與的情況下,FPGA系統中按鍵的功能相對較弱,通?梢詫存I抖動(dòng)和按鍵處理結合起來(lái)統一考慮。關(guān)于按鍵的機械抖動(dòng)問(wèn)題,在以文獻[1]和文獻[2]為代表的一類(lèi)文章中均有討論;關(guān)于矩陣形式的鍵盤(pán)掃描問(wèn)題,在以文獻[3]和文獻[4]為代表的一類(lèi)文章中有論述。值得關(guān)注的是,在文獻[3]中提到過(guò)對按鍵處理“能表示長(cháng)時(shí)間按鍵的操作”的要求;在文獻[4]中也涉及到“單擊和連擊”兩種擊鍵情況。不論是文獻[3]的按鍵操作,還是文獻[4]的擊鍵操作,都可歸結為按鍵模式問(wèn)題。目前針對FPGA按鍵模式討論的文章很少,因此本文專(zhuān)門(mén)探討FPGA的按鍵模式。 1 FPGA按鍵模式的分類(lèi) 常見(jiàn)的按鍵模式分為單鍵模式和復鍵模式兩類(lèi)。所謂單鍵類(lèi),就是一次按鍵最多只能輸出一個(gè)有效鍵;而復鍵類(lèi),則指一次按鍵可以輸出多個(gè)有效鍵,通常通過(guò)按鍵時(shí)間的長(cháng)短來(lái)區別多個(gè)有效鍵。 單鍵類(lèi)一般有三種按鍵模式:琴鍵模式、脈沖模式、乒乓模式。在琴鍵模式下,按下鍵時(shí)輸出有效電平,釋放鍵時(shí)輸出無(wú)效電平。在脈沖模式下,每按下一次鍵只輸出一個(gè)特定寬度的有效脈沖,其寬度常與時(shí)鐘寬度相同,可以直接用做計數脈沖。在乒乓模式下,每按下一次鍵,鍵輸出電平翻轉一次。 復鍵類(lèi)按鍵一般有連發(fā)模式和長(cháng)鍵模式。復鍵類(lèi)按鍵在按鍵持續時(shí)間未達到長(cháng)按閾值時(shí),輸出效果與單鍵類(lèi)按鍵模式相同。與單鍵類(lèi)按鍵模式的不同之處在于對持續按鍵的不同處理方式。連發(fā)模式是指持續按鍵一定時(shí)間以上,以一定頻率重復輸出有效鍵值。長(cháng)鍵模式則是指持續按鍵達到一定時(shí)間以上,輸出另外一種不同的有效鍵值。為方便對比,將幾種按鍵模式的分類(lèi)情況列在表1中。 2 單鍵類(lèi)按鍵模式的設計 2.1 琴鍵模式的設計 琴鍵模式是所有按鍵模式中相對最簡(jiǎn)單的一種,只要考慮到按鍵的去抖問(wèn)題就可以了。機械按鍵的抖動(dòng)是由于觸點(diǎn)的彈性作用在開(kāi)關(guān)切換的瞬間出現來(lái)回彈跳的不穩定現象,通常抖動(dòng)的時(shí)間為10ms~20ms。在FPGA設計中,比較簡(jiǎn)單的去抖方法就是用50Hz的頻率采樣按鍵,將20ms以?xún)鹊陌存I抖動(dòng)濾掉。在這種消抖方式下,去抖電路非常簡(jiǎn)單,用D觸發(fā)器即可方便實(shí)現。其寄存器傳輸級(RTL)原理圖如圖1所示。 不失一般性,假設按鍵輸出高電平有效(下同),經(jīng)QuartusⅡ7.2功能仿真,得到其仿真波形如圖2所示。從波形圖可以看出,當鍵KeyIn按下時(shí),在時(shí)鐘信號Clock_50Hz的上升沿到達后,輸出信號KeyOut持續為高電平,直到釋鍵后輸出才變?yōu)榈碗娖。KeyIn比較密集的脈沖代表按鍵或釋鍵的抖動(dòng),從輸出信號KeyOut的波形可以看出按鍵與釋鍵過(guò)程的抖動(dòng)均已去掉,處理后鍵值輸出的電平變化均與時(shí)鐘信號的上升沿同步。 2.2 脈沖模式的設計 與琴鍵模式相比,脈沖模式的不同之處就是對其按鍵輸出有效電平限定了一個(gè)寬度,通常取時(shí)鐘寬度,即為一個(gè)時(shí)鐘寬度的脈沖。在琴鍵模式輸出的基礎上,再增加一個(gè)數字的微分環(huán)節,就可以獲得較窄寬度的脈沖。假設以正脈沖表示有效脈沖輸出(下同),其RTL原理圖如圖3所示。圖3左邊的D觸發(fā)器KeyTemp起到延遲的作用,它與KeyOut~0一并實(shí)現微分效果,檢測出上跳沿。圖3右邊的觸發(fā)器KeyOut~reg0則完成去抖功能。 仿真后的輸出波形如圖4所示。從脈沖模式的仿真波形圖中可以看出,完成一次按鍵動(dòng)作(包括按鍵和釋鍵),獲得一個(gè)時(shí)鐘寬度的正脈沖。為體現按鍵的靈敏性,正脈沖的輸出盡量靠近按鍵動(dòng)作,通常在檢測到跳沿時(shí)即輸出正脈沖,正如圖4中KeyOut所示信號。 2.3 乒乓模式的設計 在單鍵類(lèi)按鍵模式中,乒乓模式與其他兩種模式的區別在于它的輸出并非是一次特定的有效脈沖,而是帶有輸出電平記憶功能,結果與原輸出電平相關(guān),將原來(lái)的電平翻轉,即高電平變?yōu)榈碗娖,或者低電平變(yōu)楦唠娖,每次按鍵輸出電平翻轉一次。乒乓模式的電路只需在有效跳沿檢測的基礎上,再跟上一個(gè)T’觸發(fā)器做一個(gè)電平翻轉即可,其RTL原理圖如圖5所示。圖5右邊的D觸發(fā)器KeyOut~reg0構成T′觸發(fā)器的翻轉功能,同時(shí)兼去抖作用。 乒乓模式電路仿真后的輸出波形如圖6所示。從乒乓模式的仿真波形圖中可以看出,完成一次按鍵動(dòng)作(包括按鍵和釋鍵),輸出信號KeyOut的電平翻轉一次。 3 復鍵類(lèi)按鍵模式的設計 3.1 連發(fā)模式的設計 連發(fā)模式的按鍵過(guò)程分為兩個(gè)階段。兩個(gè)階段的劃分以預先設定的按鍵時(shí)間tTH為閾值,當按鍵持續時(shí)間小于tTH時(shí),輸出處于單鍵值階段,可以為琴鍵模式的有效電平,也可以為脈沖模式的有效脈沖。當按鍵持續時(shí)間大于tTH時(shí),通常輸出一個(gè)一定頻率的脈沖序列,直到釋放按鍵為止。連發(fā)模式的設計較單鍵類(lèi)模式復雜,通常用硬件描述語(yǔ)言完成。其設計的控制核心可以用一個(gè)有限狀態(tài)機(FSM)表述,如圖7所示。該FSM包括“空閑”、“單鍵”和“連發(fā)”三個(gè)狀態(tài)?臻e態(tài)是初始狀態(tài),沒(méi)有鍵按下時(shí)總是處于空閑態(tài)。單鍵態(tài)表示有鍵按下,但是按鍵持續時(shí)間不到tTH。當鍵持續按下時(shí)間超過(guò)tTH時(shí),系統處于連發(fā)態(tài)。在空閑態(tài),系統輸出低電平;在單鍵態(tài),系統輸出一個(gè)正脈沖(也可以根據要求輸出有效電平);在連發(fā)態(tài),系統輸出一個(gè)特定頻率的脈沖序列。 連發(fā)態(tài)下序列的輸出頻率是依據自己的應用要求設定的。閾值tTH的大小表征人按鍵時(shí)間的長(cháng)短界限,通常選1~3s,比較符合人的按鍵習慣。為方便仿真,假設閾值tTH=1s,1s內輸出一個(gè)時(shí)鐘周期寬度的正脈沖,1s后以10Hz的頻率輸出寬度為時(shí)鐘周期的正脈沖序列。按照有限狀態(tài)機采用Verilog硬件描述語(yǔ)言進(jìn)行設計(設計代碼略去),設計綜合后的仿真輸出波形如圖8所示。圖8中的信號KeyIn模擬出兩次按鍵過(guò)程,前兩個(gè)“黑塊”分別代表一次按鍵及釋鍵過(guò)程,由于按鍵持續時(shí)間短,系統只輸出一個(gè)正脈沖信號。第二次按鍵動(dòng)作從第3個(gè)“黑塊”處開(kāi)始,并一直持續按下不放,可以從KeyOut信號波形上看出,先輸出一個(gè)正脈沖,等待1s后,開(kāi)始輸出頻率為10Hz的脈沖序列。 3.2 長(cháng)鍵模式的設計 長(cháng)鍵模式的按鍵過(guò)程與連發(fā)模式基本相同,其狀態(tài)轉換示意圖如圖9所示。比較圖9與圖7,差別僅在于圖7的連發(fā)態(tài)換成了圖9的長(cháng)鍵態(tài),用以區別兩者在此時(shí)不同的狀態(tài)輸出。 長(cháng)鍵模式的仿真波形如圖10所示。為有效表示長(cháng)鍵模式在長(cháng)鍵態(tài)時(shí)的輸出,引入第二個(gè)輸出信號KeyOutL。當按鍵處于單鍵態(tài)時(shí),KeyOut輸出為高電平(也可以是有效脈沖),否則為低電平。當按鍵處于長(cháng)鍵態(tài)時(shí),KeyOutL輸出為高電平(也可以是有效脈沖),否則為低電平。 按鍵是最不可缺少的人機交互設備之一。按鍵的去抖與模式處理是最基本的兩個(gè)按鍵處理問(wèn)題。在FPGA系統的設計背景下,按鍵的兩個(gè)基本問(wèn)題常放在一起考慮,但是目前國內的文獻資料對這種情況的論述很少。 本文針對FPGA設計中使用按鍵的常見(jiàn)方式進(jìn)行歸納概括,提出單鍵復鍵兩類(lèi)共5種典型的按鍵模式,并對每種按鍵模式進(jìn)行了分析與設計,同時(shí)給出了QuartusII7.2下的功能仿真結果。這幾種典型的按鍵模式在一般的嵌入式系統設計中也是值得借鑒與參考的。 |