深入而全面:FPGA學(xué)習(xí)之獨(dú)立按鍵檢測(cè)
幾乎沒(méi)有哪一個(gè)系統(tǒng)沒(méi)有輸入輸出設(shè)備,大到顯示器,小到led燈,輕觸按鍵。作為一個(gè)系統(tǒng),要想穩(wěn)定的工作,輸入輸出設(shè)備的性能占了很重要的角色。本實(shí)驗(yàn),小梅哥就通過(guò)一個(gè)獨(dú)立按鍵的檢測(cè)實(shí)驗(yàn),來(lái)正式步入基本外設(shè)驅(qū)動(dòng)開(kāi)發(fā)的大門。
本文引用地址:http://butianyuan.cn/article/201710/366956.htm一、 實(shí)驗(yàn)?zāi)康?/strong>
實(shí)現(xiàn)4個(gè)獨(dú)立按鍵的抖動(dòng)檢測(cè)實(shí)驗(yàn),并通過(guò)4個(gè)獨(dú)立按鍵控制4個(gè)led燈亮滅狀態(tài)的翻轉(zhuǎn)。
二、 實(shí)驗(yàn)原理
實(shí)際系統(tǒng)中常用的按鍵大部分都是輕觸式按鍵,如圖2-1所示。該按鍵內(nèi)部由一個(gè)彈簧片和兩個(gè)固定觸點(diǎn)組成,當(dāng)彈簧片被按下,則兩個(gè)固定觸點(diǎn)接通,按鍵閉合。彈簧片松開(kāi),兩個(gè)觸點(diǎn)斷開(kāi),按鍵也就斷開(kāi)了。根據(jù)這種按鍵的機(jī)械特性,在按鍵按下時(shí),會(huì)先有一段時(shí)間的不穩(wěn)定期,在這期間,兩個(gè)觸點(diǎn)時(shí)而接通,時(shí)而斷開(kāi),我們稱之為抖動(dòng),當(dāng)按鍵大約按下20ms后,兩個(gè)觸點(diǎn)才能處于穩(wěn)定的閉合狀態(tài),按鍵松開(kāi)時(shí)和閉合時(shí)情況類似。而我們的FPGA工作在很高的頻率,按鍵接通或斷開(kāi)時(shí)任何一點(diǎn)小的抖動(dòng)都能輕易的捕捉到,如果不加區(qū)分的將每一次閉合或斷開(kāi)都當(dāng)做一次按鍵事件,那么勢(shì)必一次按鍵動(dòng)作會(huì)被FPGA識(shí)別為很多次按鍵操作,從而導(dǎo)致系統(tǒng)工作穩(wěn)定性下降。
圖2-1 輕觸按鍵實(shí)物圖
一次按鍵動(dòng)作的大致波形如下圖所示:
因此,我們所需要做的工作,就是濾除按鍵按下和釋放時(shí)各存在的20ms的不穩(wěn)定波形
三、 硬件設(shè)計(jì)
獨(dú)立按鍵屬于一種輸入設(shè)備,其與FPGA連接的IO口被接上了10K的上拉電阻,在按鍵沒(méi)有按下時(shí),F(xiàn)PGA會(huì)檢測(cè)到高電平;當(dāng)按鍵按下后,F(xiàn)PGA的IO口上則將呈現(xiàn)低電平。因此,按鍵檢測(cè)的實(shí)質(zhì)就是讀取FPGA的IO上的電平。
圖3-1 獨(dú)立按鍵典型電路
四、 架構(gòu)設(shè)計(jì)
本實(shí)驗(yàn)由總共四個(gè)模塊組成,分別為L(zhǎng)ED驅(qū)動(dòng)模塊、獨(dú)立按鍵檢測(cè)模塊、控制模塊和頂層模塊,其架構(gòu)如下:
圖4-1 led實(shí)驗(yàn)?zāi)K組織結(jié)構(gòu)圖
由圖可知本實(shí)驗(yàn)有n個(gè)輸出端口,對(duì)應(yīng)驅(qū)動(dòng)了n個(gè)led燈。n+2個(gè)輸入端口,對(duì)應(yīng)了n個(gè)按鍵輸入和一個(gè)時(shí)鐘輸入以及一個(gè)復(fù)位輸入。詳細(xì)端口名及其意義如下
表4-1 獨(dú)立按鍵檢測(cè)實(shí)驗(yàn)端口說(shuō)明
因?yàn)榇嬖谀K間的連接,因此有部分內(nèi)部信號(hào),下表為內(nèi)部信號(hào)的名稱和功能說(shuō)明
表4-2 獨(dú)立按鍵檢測(cè)實(shí)驗(yàn)內(nèi)部信號(hào)說(shuō)明
五、 代碼組織方式
本實(shí)驗(yàn)中,按鍵檢測(cè)部分用到了狀態(tài)機(jī),該狀態(tài)機(jī)包括兩個(gè)狀態(tài):按下消抖狀態(tài)和釋放消抖狀態(tài),詳細(xì)內(nèi)容將在關(guān)鍵代碼中進(jìn)行講解,此處不做細(xì)致討論。
實(shí)驗(yàn)中還設(shè)計(jì)了一個(gè)控制器,該控制器主要進(jìn)行按鍵事件與LED燈狀態(tài)的控制,通過(guò)讀取按鍵值,并根據(jù)按鍵信息翻轉(zhuǎn)對(duì)應(yīng)的LED的亮滅狀態(tài)。這部分內(nèi)容由于篇幅原因,不在文檔中寫出,請(qǐng)直接參看附件源代碼即可。
LED的驅(qū)動(dòng)采用實(shí)驗(yàn)一的模塊,因此這里不進(jìn)行過(guò)多的分析介紹。
六、 關(guān)鍵代碼解讀
以下為按鍵電平變化的檢測(cè)代碼,通過(guò)存儲(chǔ)前一次時(shí)鐘上升沿時(shí)的按鍵狀態(tài)和當(dāng)前時(shí)鐘上升沿時(shí)的按鍵狀態(tài),并比較兩次狀態(tài)是否相同,即可獲知是否有按鍵按下。
以下為按鍵抖動(dòng)檢測(cè)的代碼,采用狀態(tài)機(jī)的方式編寫,總共有兩個(gè)狀態(tài),按下消抖為狀態(tài)0,釋放消抖為狀態(tài)1。具體的消抖流程代碼中的注釋已經(jīng)寫的比較清楚,但如果全部用文字解釋出來(lái)還是有一定的復(fù)雜性。這也是實(shí)地講解和網(wǎng)上文檔的一點(diǎn)點(diǎn)差距吧,希望我后期的視頻里面能講清楚。其實(shí)抖動(dòng)消除的核心思路就是對(duì)按鍵狀態(tài)的變化進(jìn)行計(jì)時(shí),若兩次電平變化之間時(shí)間小于20ms,則視為抖動(dòng),若低電平穩(wěn)定時(shí)間超過(guò)20ms,則表明檢測(cè)到了穩(wěn)定的按鍵狀態(tài)。釋放時(shí)的消抖過(guò)程與按下時(shí)的消抖過(guò)程類似。
七、測(cè)試平臺(tái)設(shè)計(jì)
本實(shí)驗(yàn)主要對(duì)按鍵檢測(cè)的結(jié)果進(jìn)行觀察和分析,通過(guò)仿真,驗(yàn)證設(shè)計(jì)的正確性和合理性。按鍵消抖模塊的testbench的代碼如下:
testben中使用了一個(gè)任務(wù)(task),該任務(wù)模擬按鍵抖動(dòng)的過(guò)程,給按鍵按下和釋放時(shí)增加抖動(dòng),調(diào)用時(shí)只需要輸入需要按下的按鍵編號(hào),該任務(wù)便可自動(dòng)完成按下抖動(dòng)、穩(wěn)定、松開(kāi)抖動(dòng)的過(guò)程。
整個(gè)工程的testbench與消抖模塊的testbench一樣,只需要在例化部分將消抖模塊替換為頂層模塊,同時(shí)將每個(gè)按鍵的任務(wù)由一次調(diào)用該為兩次調(diào)用即可,詳細(xì)請(qǐng)參考附件代碼。
八、 仿真分析
由上圖仿真結(jié)果可知,當(dāng)有按鍵按下時(shí),需要較長(zhǎng)一段時(shí)間后,Key_Flag會(huì)有一個(gè)高電平脈沖,同時(shí)Key_Value更新為輸入按鍵的反碼。
為了確定消抖是成功的,這里再附上按鍵松開(kāi)時(shí)的抖動(dòng)細(xì)節(jié)圖:
由圖可知,松開(kāi)按鍵時(shí),該按鍵IO不斷的檢測(cè)到高電平和低電平,直到一段時(shí)間和,抖動(dòng)方停止,穩(wěn)定為按鍵沒(méi)有按下時(shí)的狀態(tài)
下圖為整個(gè)工程的仿真結(jié)果,由圖可知,每按下一次按鍵0(key_in[0]),led[0]的狀態(tài)便翻轉(zhuǎn)一次。
九、 下板驗(yàn)證
手頭暫無(wú)開(kāi)發(fā)板,板級(jí)驗(yàn)證略。
十、 總結(jié)
本文檔對(duì)按鍵消抖的原理進(jìn)行了分析,并對(duì)消抖核心模塊的設(shè)計(jì)進(jìn)行了仿真,通過(guò)modelsim仿真驗(yàn)證了消抖模塊設(shè)計(jì)的正確性。
具體的控制模塊這里因?yàn)槠蜁r(shí)間關(guān)系暫不介紹,也因?yàn)闆](méi)有開(kāi)發(fā)板,暫時(shí)無(wú)法錄制演示視頻,等錄制視頻時(shí),我會(huì)對(duì)整個(gè)系統(tǒng)的架構(gòu)設(shè)計(jì),代碼設(shè)計(jì)進(jìn)行詳細(xì)的分析和講解。以前沒(méi)有做過(guò)不知道,寫了兩三次后才發(fā)現(xiàn),原來(lái)文檔的編寫和整理比編寫代碼要的時(shí)間要多的多。不過(guò),我總還是會(huì)堅(jiān)持做下去的,希望我能有足夠的時(shí)間來(lái)做這些事。
評(píng)論