原創(chuàng)聲明:
本原創(chuàng)教程由芯驛電子科技(上海)有限公司(ALINX)創(chuàng)作,版權(quán)歸本公司所有,如需轉(zhuǎn)載,需授權(quán)并注明出處(http://www.alinx.com)。
適用于板卡型號(hào):
PGL22G/PGL12G
1. 文檔簡(jiǎn)介
本文主要講解按鍵消抖原理及程序編寫(xiě),程序?qū)崿F(xiàn)按鍵按下后數(shù)字加1,并在led出來(lái),通過(guò)PDS軟件編譯調(diào)試。
2. 實(shí)驗(yàn)環(huán)境
-
Windows 10 64位
-
Pango Design Suite 2020.3
-
開(kāi)發(fā)板
3. 實(shí)驗(yàn)原理
按鍵做為基本的人機(jī)輸入接口,在很多電子設(shè)計(jì)中都能見(jiàn)到,由于機(jī)械特性,在按鍵按下或松開(kāi)的時(shí)候,按鍵輸入值是有抖動(dòng)的,無(wú)論按下去是多平穩(wěn),都難以消除抖動(dòng),按鍵消抖方式有很多,本實(shí)驗(yàn)主要是通過(guò)FPGA計(jì)時(shí)來(lái)消抖。實(shí)驗(yàn)中設(shè)計(jì)了一個(gè)計(jì)數(shù)器,當(dāng)按鍵輸入有變化時(shí),計(jì)時(shí)器清零,否則就累加,直到加到一個(gè)預(yù)定值(例如10ms),就認(rèn)為按鍵穩(wěn)定,輸出按鍵值,這樣就得到以后沒(méi)有抖動(dòng)的按鍵值。由于在很多地方需要用到按鍵下降沿或上升沿的檢測(cè),按鍵消抖模塊直接集成了上升沿和下降沿檢測(cè)的功能。

4. 程序設(shè)計(jì)
如下圖所示,通過(guò)按鍵消抖后,在按鍵按下時(shí),十進(jìn)制計(jì)數(shù)器加1,通過(guò)數(shù)碼管譯碼掃描后顯示出來(lái)。

按鍵消抖部分的原理在上節(jié)已經(jīng)講過(guò),按鍵消抖部分代碼寫(xiě)的非常精煉,閱讀起來(lái)稍顯費(fèi)解,建議結(jié)合仿真波形去讀代碼。在提供的例程文件下的src文件夾中同時(shí)提供了仿真文件key_debounce_tb.v,可以通過(guò)添加仿真文件來(lái)進(jìn)行仿真觀察代碼中信號(hào)的變化
信號(hào)名稱(chēng) | 方向 | 說(shuō)明 |
clk | in | 時(shí)鐘輸入 |
rst_n | in | 異步復(fù)位輸入,低復(fù)位 |
button_in | in | 按鍵輸入 |
button_posedge | out | 消抖后按鍵上升沿,高有效,1個(gè)時(shí)鐘周期 |
button_negedge | out | 消抖后按鍵下升沿,高有效,1個(gè)時(shí)鐘周期 |
button_out | out | 消抖后按鍵輸出 |
按鍵消抖模塊(ax_debounce)端口
LED顯示部分在本章不做說(shuō)明,就例程中按鍵消抖模塊“ax_debounce”模塊做一些講解,模塊中通過(guò)了兩級(jí)D觸發(fā)器來(lái)寄存鍵值,只有當(dāng)鍵值穩(wěn)定時(shí)才將鍵值輸出。我們可以看到在assign賦值語(yǔ)句中有一條“assign a_reset=(DFF1 ^ DFF2)”,學(xué)過(guò)數(shù)字電路的應(yīng)該都知道“ ^ ”是異或運(yùn)算符,運(yùn)算符兩邊相同運(yùn)算結(jié)果為0, 不同運(yùn)算結(jié)果為1。在程序中DFF1和DFF2比較運(yùn)算后的值通過(guò)“assign”賦給“a_reset”表示比較鎖存鍵值的前后兩級(jí)寄存器的值是否一致,只有前后兩級(jí)寄存器的值一致,也就是a_reset的值為0時(shí)才表示當(dāng)前鎖存的鍵值沒(méi)有變化。當(dāng)計(jì)數(shù)器累加到“TIMER_MAX_VAL”,表示鎖存的鍵值已經(jīng)穩(wěn)定可以輸出。另外在模塊中我們可以看到“{.......}”符號(hào),要注意這可不是大括號(hào),這表示位拼接運(yùn)算符,其作用是將運(yùn)算符內(nèi)的兩位,或是多位信號(hào)拼接在一起,具體用法請(qǐng)參考例程。
最后,程序中需要說(shuō)明的是“button_posedge”和“button_negedge”兩個(gè)輸出信號(hào),這是一種常用的上升沿和下降沿的采集方法,其描述的RTL視圖如下:

當(dāng)然還有其他的邊沿檢測(cè)電路的描述方法,但是其基本原理都是在邏輯時(shí)序電路里先將需要檢測(cè)的信號(hào)作為輸入非阻塞賦值給一個(gè)自定義寄存器,通過(guò)判斷前后兩級(jí)寄存器的值來(lái)判斷是上升沿或是下降沿,由0 ->1 變化是上升沿,由1 -> 0變化是下降沿;
5. Modelsim仿真
$random生成隨機(jī)數(shù)模擬按鍵抖動(dòng),按下按鍵對(duì)應(yīng)輸出二進(jìn)制數(shù)據(jù)加一。按鍵的按下和釋放經(jīng)消抖后會(huì)得到一個(gè)穩(wěn)定的下降沿和上升沿。仿真結(jié)果和部分仿真文件如下圖所示:


button_negedge為按鍵經(jīng)過(guò)消抖后按鍵的下降沿,button_posedge為按鍵經(jīng)過(guò)消抖后按鍵的上升沿。
6. 實(shí)驗(yàn)現(xiàn)象
開(kāi)發(fā)板上電后下載程序,按下“KEY2”按鍵,可以看到4個(gè)LED會(huì)變化,對(duì)應(yīng)二進(jìn)制數(shù)據(jù),按一次加一,如果不經(jīng)過(guò)消抖,是無(wú)法實(shí)現(xiàn)按一次加一的。
開(kāi)發(fā)板操作
-
FPGA
+關(guān)注
關(guān)注
1645文章
22049瀏覽量
618394 -
RTL
+關(guān)注
關(guān)注
1文章
389瀏覽量
61109 -
按鍵
+關(guān)注
關(guān)注
4文章
227瀏覽量
58072 -
PDS
+關(guān)注
關(guān)注
2文章
32瀏覽量
15517 -
紫光同創(chuàng)
+關(guān)注
關(guān)注
5文章
101瀏覽量
27978
發(fā)布評(píng)論請(qǐng)先 登錄
【紫光同創(chuàng)盤(pán)古PGX-Nano教程】——(盤(pán)古PGX-Nano開(kāi)發(fā)板/PG2L50H_MBG324第二章)按鍵消抖實(shí)驗(yàn)例程
【ALIENTEK 戰(zhàn)艦STM32開(kāi)發(fā)板】STM32開(kāi)發(fā)指南--第六章 跑馬燈實(shí)驗(yàn)
求王慶利《單片機(jī)設(shè)計(jì)標(biāo)準(zhǔn)教程》第六章的一個(gè)函數(shù)!!
三相電路(第六章)
PCB布線(xiàn)設(shè)計(jì)經(jīng)驗(yàn)談附原理圖(第六章)

評(píng)論