原創聲明:
本原創教程由芯驛電子科技(上海)有限公司(ALINX)創作,版權歸本公司所有,如需轉載,需授權并注明出處(http://www.alinx.com)。
適用于板卡型號:
PGL22G/PGL12G
1. 文檔簡介
本文主要講解按鍵消抖原理及程序編寫,程序實現按鍵按下后數字加1,并在led出來,通過PDS軟件編譯調試。
2. 實驗環境
-
Windows 10 64位
-
Pango Design Suite 2020.3
-
開發板
3. 實驗原理
按鍵做為基本的人機輸入接口,在很多電子設計中都能見到,由于機械特性,在按鍵按下或松開的時候,按鍵輸入值是有抖動的,無論按下去是多平穩,都難以消除抖動,按鍵消抖方式有很多,本實驗主要是通過FPGA計時來消抖。實驗中設計了一個計數器,當按鍵輸入有變化時,計時器清零,否則就累加,直到加到一個預定值(例如10ms),就認為按鍵穩定,輸出按鍵值,這樣就得到以后沒有抖動的按鍵值。由于在很多地方需要用到按鍵下降沿或上升沿的檢測,按鍵消抖模塊直接集成了上升沿和下降沿檢測的功能。
4. 程序設計
如下圖所示,通過按鍵消抖后,在按鍵按下時,十進制計數器加1,通過數碼管譯碼掃描后顯示出來。
按鍵消抖部分的原理在上節已經講過,按鍵消抖部分代碼寫的非常精煉,閱讀起來稍顯費解,建議結合仿真波形去讀代碼。在提供的例程文件下的src文件夾中同時提供了仿真文件key_debounce_tb.v,可以通過添加仿真文件來進行仿真觀察代碼中信號的變化
信號名稱 | 方向 | 說明 |
clk | in | 時鐘輸入 |
rst_n | in | 異步復位輸入,低復位 |
button_in | in | 按鍵輸入 |
button_posedge | out | 消抖后按鍵上升沿,高有效,1個時鐘周期 |
button_negedge | out | 消抖后按鍵下升沿,高有效,1個時鐘周期 |
button_out | out | 消抖后按鍵輸出 |
按鍵消抖模塊(ax_debounce)端口
LED顯示部分在本章不做說明,就例程中按鍵消抖模塊“ax_debounce”模塊做一些講解,模塊中通過了兩級D觸發器來寄存鍵值,只有當鍵值穩定時才將鍵值輸出。我們可以看到在assign賦值語句中有一條“assign a_reset=(DFF1 ^ DFF2)”,學過數字電路的應該都知道“ ^ ”是異或運算符,運算符兩邊相同運算結果為0, 不同運算結果為1。在程序中DFF1和DFF2比較運算后的值通過“assign”賦給“a_reset”表示比較鎖存鍵值的前后兩級寄存器的值是否一致,只有前后兩級寄存器的值一致,也就是a_reset的值為0時才表示當前鎖存的鍵值沒有變化。當計數器累加到“TIMER_MAX_VAL”,表示鎖存的鍵值已經穩定可以輸出。另外在模塊中我們可以看到“{.......}”符號,要注意這可不是大括號,這表示位拼接運算符,其作用是將運算符內的兩位,或是多位信號拼接在一起,具體用法請參考例程。
最后,程序中需要說明的是“button_posedge”和“button_negedge”兩個輸出信號,這是一種常用的上升沿和下降沿的采集方法,其描述的RTL視圖如下:
當然還有其他的邊沿檢測電路的描述方法,但是其基本原理都是在邏輯時序電路里先將需要檢測的信號作為輸入非阻塞賦值給一個自定義寄存器,通過判斷前后兩級寄存器的值來判斷是上升沿或是下降沿,由0 ->1 變化是上升沿,由1 -> 0變化是下降沿;
5. Modelsim仿真
$random生成隨機數模擬按鍵抖動,按下按鍵對應輸出二進制數據加一。按鍵的按下和釋放經消抖后會得到一個穩定的下降沿和上升沿。仿真結果和部分仿真文件如下圖所示:
button_negedge為按鍵經過消抖后按鍵的下降沿,button_posedge為按鍵經過消抖后按鍵的上升沿。
6. 實驗現象
開發板上電后下載程序,按下“KEY2”按鍵,可以看到4個LED會變化,對應二進制數據,按一次加一,如果不經過消抖,是無法實現按一次加一的。
開發板操作
-
FPGA
+關注
關注
1630文章
21796瀏覽量
605996 -
RTL
+關注
關注
1文章
385瀏覽量
59948 -
按鍵
+關注
關注
4文章
223瀏覽量
57660 -
PDS
+關注
關注
2文章
32瀏覽量
15349 -
紫光同創
+關注
關注
5文章
88瀏覽量
27560
發布評論請先 登錄
相關推薦
評論