本篇按鍵實(shí)驗(yàn),選自ALINX 黑金云課堂 FPGA 免費(fèi)直播課。該課程由 ALINX 資深工程師團(tuán)隊(duì)傾力打造,從 0 到 1 系統(tǒng)化教學(xué),幫助每位工程師跨過 FPGA 開發(fā)門檻。
ALINX:關(guān)注 ALINX,進(jìn)入視頻號(hào)即可查看完整黑金云課堂 FPGA 視頻教程。配合筆記學(xué)習(xí)效果更佳。
按鍵抖動(dòng)現(xiàn)象分析
機(jī)械按鍵的物理結(jié)構(gòu)
機(jī)械按鍵由彈性觸點(diǎn)、彈簧機(jī)構(gòu)和導(dǎo)電材料組成。當(dāng)按下或釋放按鍵時(shí),彈簧的彈性勢(shì)能使觸點(diǎn)產(chǎn)生振動(dòng),導(dǎo)致觸點(diǎn)不能立即穩(wěn)定接觸或斷開。
電平跳變的表現(xiàn)形式
抖動(dòng)表現(xiàn)為短時(shí)間內(nèi)電平的多次跳變。FPGA的高速時(shí)鐘(通常50MHz)會(huì)將這些跳變識(shí)別為多次獨(dú)立的按鍵操作,導(dǎo)致系統(tǒng)行為異常。
抖動(dòng)帶來的問題
計(jì)數(shù)器誤觸發(fā):?jiǎn)未伟存I導(dǎo)致計(jì)數(shù)器多次增加
狀態(tài)機(jī)異常:狀態(tài)跳轉(zhuǎn)不符合預(yù)期
多次識(shí)別:一次操作被識(shí)別為多次


工程結(jié)論:抖動(dòng)是機(jī)械按鍵的固有特性,無法避免,必須通過硬件或軟件方法進(jìn)行消抖處理。
消抖原理
消抖核心思想
等待信號(hào)穩(wěn)定
連續(xù)穩(wěn)定計(jì)數(shù)
輸出有效信號(hào)
消抖不是性能優(yōu)化手段,而是確保系統(tǒng)正確運(yùn)行的必需措施。任何使用機(jī)械按鍵的 FPGA 設(shè)計(jì)都必須包含消抖模塊,否則系統(tǒng)無法穩(wěn)定工作。
消抖工作流程

穩(wěn)定計(jì)數(shù)器的工作原理
信號(hào)相同:計(jì)數(shù)器遞增
當(dāng)key_in == key_last時(shí),說明信號(hào)保持穩(wěn)定,計(jì)數(shù)器 stable_cnt 加1。
信號(hào)不同:計(jì)數(shù)器清零
當(dāng)key_in != key_last時(shí),說明信號(hào)發(fā)生變化,計(jì)數(shù)器 清零,重新開始計(jì)數(shù)。
達(dá)到閾值:輸出更新
當(dāng)stable_cnt == CNT_MAX時(shí),認(rèn)為信號(hào)已穩(wěn)定,更新輸出 key_out。

(計(jì)數(shù)器工作時(shí)序圖)
Verilog 核心代碼
按鍵消抖代碼
modulekey_debounce ( inputwire clk, // 系統(tǒng)時(shí)鐘,50MHz inputwire rst_n, // 復(fù)位信號(hào),低有效 inputwire key_in, // 原始按鍵輸入 outputreg key_out // 消抖后按鍵輸出 ); // 參數(shù)定義:穩(wěn)定計(jì)數(shù)器最大值// 50MHz時(shí)鐘,20ms消抖時(shí)間 = 1_000_000個(gè)時(shí)鐘周期 parameter CNT_MAX = 20'd1_000_000; // 內(nèi)部信號(hào)定義reg [19:0] stable_cnt; // 穩(wěn)定計(jì)數(shù)器,最大1_000_000 reg key_last; // 上一次按鍵狀態(tài)//================================================== // 消抖核心邏輯//================================================== always @(posedge clk or negedge rst_n) beginif (!rst_n) begin stable_cnt <= 20'd0; ? ? ? ? key_last ? <= 1'b1; ? // 按鍵默認(rèn)高電平(上拉) ? ? ? ? key_out ? ?<= 1'b1; ? ? endelsebegin// 保存當(dāng)前按鍵狀態(tài) ? ? ? ? key_last <= key_in; ? ? ? ?? ? ? ? ? // 穩(wěn)定計(jì)數(shù)器邏輯if (key_in == key_last) ? ? ? ? ? ? stable_cnt <= stable_cnt + 1'b1; ? ? ? ? else ? ? ? ? ? ? stable_cnt <= 20'd0; ? ? ? ?? ? ? ? ? // 輸出更新邏輯if (stable_cnt == CNT_MAX) ? ? ? ? ? ? key_out <= key_in; ? ? endendendmodule
代碼詳細(xì)解析歡迎關(guān)注 ALINX 視頻號(hào),黑金云課堂課程直播回放
按鍵仿真波形分析

(消抖前后波形對(duì)比)
key_in 分析
多次跳變: 在 T0-T1 期間,信號(hào)在高低電平之間快速跳變約50次
抖動(dòng)時(shí)長(zhǎng): 典型抖動(dòng)持續(xù)時(shí)間約 10ms
key_out 分析
只變化一次: 在 T2 時(shí)刻,信號(hào)穩(wěn)定后才更新輸出
完全消抖: 消除了所有抖動(dòng)帶來的虛假觸發(fā)
驗(yàn)證結(jié)論
消抖正確: 成功消除抖動(dòng)
響應(yīng)及時(shí): 穩(wěn)定后立即輸出
單次觸發(fā): 每次按鍵只觸發(fā)一次
實(shí)驗(yàn)擴(kuò)展建議
調(diào)整CNT_MAX值
嘗試不同的穩(wěn)定閾值(5ms、10ms、20ms、50ms),觀察消抖效果和響應(yīng)速度的平衡
添加邊沿檢測(cè)
在消抖模塊后添加邊沿檢測(cè)邏輯,實(shí)現(xiàn)單次觸發(fā)功能,避免長(zhǎng)按時(shí)的連續(xù)觸發(fā)
實(shí)際項(xiàng)目應(yīng)用
將消抖模塊應(yīng)用于按鍵控制 LED、按鍵計(jì)數(shù)器、按鍵狀態(tài)機(jī)等實(shí)際項(xiàng)目中
更多細(xì)節(jié)歡迎關(guān)注我們黑金云課堂全年免費(fèi)直播課,黑金云課堂五月直播日歷我們將在每周二、三、四,同步推進(jìn)Verilog開發(fā)、Vitis開發(fā)、Linux開發(fā)三大系列,帶你從零開始,穩(wěn)扎穩(wěn)打掌握 FPGA 開發(fā)全流程!
| 系列 | 內(nèi)容定位 |
|---|---|
| Verilog開發(fā) | 硬件描述語言基礎(chǔ)、邏輯設(shè)計(jì)、仿真調(diào)試 |
| Vitis開發(fā) | Zynq軟硬件協(xié)同、外設(shè)驅(qū)動(dòng)、網(wǎng)絡(luò)協(xié)議棧 |
| Linux開發(fā) | 嵌入式Linux系統(tǒng)移植、驅(qū)動(dòng)編寫、應(yīng)用開發(fā) |
-
FPGA
+關(guān)注
關(guān)注
1664文章
22542瀏覽量
640337 -
抖動(dòng)
+關(guān)注
關(guān)注
1文章
73瀏覽量
19434 -
按鍵
+關(guān)注
關(guān)注
4文章
230瀏覽量
58553
原文標(biāo)題:【黑金云課堂】FPGA技術(shù)教程FPGA基礎(chǔ):按鍵實(shí)驗(yàn)
文章出處:【微信號(hào):ALINX,微信公眾號(hào):ALINX】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【ZYNQ Ultrascale+ MPSOC FPGA教程】第九章Vivado下按鍵實(shí)驗(yàn)
【紫光同創(chuàng)國產(chǎn)FPGA教程】【第三章】按鍵檢測(cè)實(shí)驗(yàn)
FPGA 入門系列實(shí)驗(yàn)教程
Xilinx FPGA無痛入門,海量教程免費(fèi)下載
《深入淺出玩轉(zhuǎn)FPGA》基于EPM240的入門實(shí)驗(yàn)-myosct
《深入淺出玩轉(zhuǎn)FPGA》基于EPM240的入門實(shí)驗(yàn)-clkdiv
《深入淺出玩轉(zhuǎn)FPGA》基于EPM240的入門實(shí)驗(yàn)-models
《深入淺出玩轉(zhuǎn)FPGA》基于EPM240的入門實(shí)驗(yàn)-mux16
《深入淺出玩轉(zhuǎn)FPGA》基于EPM240的入門實(shí)驗(yàn)-verilogled7
FPGA教程之FPGA入門閃爍燈實(shí)驗(yàn)的詳細(xì)資料說明
FPGA入門系列實(shí)驗(yàn)教程之如何進(jìn)行按鍵消抖控制LED亮滅
【ZYNQ Ultrascale+ MPSOC FPGA教程】第九章Vivado下按鍵實(shí)驗(yàn)
【正點(diǎn)原子FPGA連載】第九章按鍵控制LED燈實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1
FPGA入門基礎(chǔ)之按鍵實(shí)驗(yàn)
評(píng)論