<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Verilog按鍵消抖的理解

Verilog按鍵消抖的理解

作者: 時(shí)間:2012-09-14 來(lái)源:網(wǎng)絡(luò ) 收藏

按鍵在按下時(shí)會(huì )產(chǎn)生抖動(dòng),釋放時(shí)也會(huì )產(chǎn)生抖動(dòng),所以在設計鍵盤(pán)掃描程序時(shí)必須考慮按鍵的消抖,我們一般只考慮按下時(shí)的抖動(dòng),而放棄對釋放時(shí)抖動(dòng)的消抖。抖動(dòng)時(shí)間一般為20ms左右。按下的最終結果是低電平。

在單片機設計的的按鍵去抖思路是:檢測到按下時(shí)20ms,再檢測,如果狀態(tài)仍為按下,則確認是按下的;如果狀態(tài)為彈起的,則確認是干擾,無(wú)按鍵按下。

點(diǎn)擊瀏覽下一頁(yè)
圖1 按鍵抖動(dòng)特性

有一個(gè)概念要理一下,按鍵按下時(shí)會(huì )有抖動(dòng),也就是說(shuō)我們其實(shí)只按一次,但是實(shí)際產(chǎn)生的“按下”卻是許多次的,這些許多次集中在這20ms里。我們按的只是一次,而實(shí)際卻產(chǎn)生了許多次,那么就必須濾除其他的次數。單片機為了得到真正的“按下”,通過(guò)20ms,把其他的“按下”(也就是抖動(dòng))給濾除了。然后再次判斷是否有按下,因為有的時(shí)候干擾很大。

而在FPGA中,基于下面的程序,理解如下:在這個(gè)程序里檢測按鍵是否按下的方法是脈沖邊沿檢法。而在單片機里是判斷是否為低電平的方法(那么在FPGA中可不可以也用這個(gè)方法呢?)第一次檢測到后,啟動(dòng)20ms計數器,時(shí)間到后再檢測。這里的檢測方法跟脈沖邊沿檢測法有異曲同工之處,FPGA過(guò)20ms檢測按鍵是否按下,存儲檢測到的值,并且按位取反與前一個(gè)20ms檢測的值相與,得到一個(gè)值,如果為1,則判斷按鍵按下,否則則無(wú)按下。所以跟單片機按鍵掃描的原理是一樣的,不同的是檢測方法不一樣。
點(diǎn)擊瀏覽下一頁(yè)圖2 FPGA按鍵的理解示意圖

其中key_an寄存器的功能是檢測第一次的“按下”,是cnt的啟動(dòng)標志位。通過(guò)也能濾除干擾信號。

led_ctrl是確實(shí)有按鍵按下的信號,維持一個(gè)時(shí)鐘周期。

特權同學(xué)的鍵盤(pán)掃描程序

//說(shuō)明:當三個(gè)獨立按鍵的某一個(gè)被按下后,相應的LED被點(diǎn)亮;

// 再次按下后,LED熄滅,按鍵控制LED亮滅

module sw_debounce(clk,rst_n,sw1_n,sw2_n,sw3_n,led_d1,led_d2,led_d3);input   clk; //主時(shí)鐘信號,50MHzinput   rst_n;     //復位信號,低有效input   sw1_n,sw2_n,sw3_n;      //三個(gè)獨立按鍵,低表示按下output  led_d1,led_d2,led_d3;     //發(fā)光二極管,分別由按鍵控制//----------------------------------reg[2:0] key_rst;  always @(posedge clk  or negedge rst_n)if (!rst_n) key_rst = 3'b111;else key_rst = {sw3_n,sw2_n,sw1_n};reg[2:0] key_rst_r;       //每個(gè)時(shí)鐘周期的上升沿將low_sw信號鎖存到low_sw_r中always @ ( posedge clk  or negedge rst_n )if (!rst_n) key_rst_r = 3'b111;else key_rst_r = key_rst;//當寄存器key_rst由1變?yōu)?時(shí),led_an的值變?yōu)楦?,維持一個(gè)時(shí)鐘周期 wire[2:0] key_an = key_rst_r  ( ~key_rst); //檢測到按下的第一次(cnt的啟動(dòng)信號)//-------------------------------------------reg[19:0]  cnt;    //計數寄存器always @ (posedge clk  or negedge rst_n)if (!rst_n) cnt = 20'd0;      //異步復位else if(key_an) cnt =20'd0;else cnt = cnt + 1'b1;reg[2:0] low_sw;always @(posedge clk  or negedge rst_n)if (!rst_n) low_sw = 3'b111;else if (cnt == 20'hfffff)   
 //滿(mǎn)20ms,將按鍵值鎖存到寄存器low_sw中      cnt == 20'hffffflow_sw = {sw3_n,sw2_n,sw1_n};//-----------------------------------------------reg  [2:0] low_sw_r;       //每個(gè)時(shí)鐘周期的上升沿將low_sw信號鎖存到low_sw_r中always @ ( posedge clk  or negedge rst_n )if (!rst_n) low_sw_r = 3'b111;else low_sw_r = low_sw;//當寄存器low_sw由1變?yōu)?時(shí),led_ctrl的值變?yōu)楦?,維持一個(gè)時(shí)鐘周期 wire[2:0] led_ctrl = low_sw_r[2:0]  ( ~low_sw[2:0]);reg d1;reg d2;reg d3;always @ (posedge clk or negedge rst_n)if (!rst_n) begind1 = 1'b0;d2 = 1'b0;d3 = 1'b0;endelse begin          //某個(gè)按鍵值變化時(shí),LED將做亮滅翻轉if ( led_ctrl[0] ) d1 = ~d1;    if ( led_ctrl[1] ) d2 = ~d2;if ( led_ctrl[2] ) d3 = ~d3;endassign led_d3 = d1 ? 1'b1 : 1'b0;           //LED翻轉輸出assign led_d2 = d2 ? 1'b1 : 1'b0;assign led_d1 = d3 ? 1'b1 : 1'b0;endmodule


關(guān)鍵詞: Verilog 按鍵消抖 延時(shí)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>