键盘消抖
??? 今天做了一天的鍵盤消抖,也就是用到了上一篇寫的脈沖邊沿檢測技術(shù),但是在鍵盤延時(shí)方面,時(shí)間老是設(shè)置的不好,太長或者太短都會(huì)使鍵盤消抖不理想!糾結(jié)了一天,參考了特權(quán)同學(xué)的鍵盤消抖程序,現(xiàn)在總算做的讓自己滿意了,接下來看程序吧!
?
//程序功能:鍵盤控制流水燈,key1控制流水燈的停起;key2控制流水燈左移;key3控制流水燈右移; module johnson_cout(sysclk, //系統(tǒng)時(shí)鐘 50MZH;rst_b, //復(fù)位信號(hào),低電平有效;key1, //三個(gè)獨(dú)立鍵盤,低電平表示按下; key2,key3,led_out //LED燈,低電平點(diǎn)亮; ); //------------------------------------// input sysclk; input rst_b; input key1; //key1對應(yīng)硬件電路圖上的SW4 ,控制流水燈的停起; input key2; //key2對應(yīng)硬件電路圖上的SW5 ,流水燈左移; input key3; //key3對應(yīng)硬件電路圖上的SW6 ,流水燈右移; output[3:0] led_out; //------------------------------------// wire sysclk; wire rst_b; wire key1; wire key2; wire key3; wire[3:0] led_out; //-------------------------------------------------------// reg [2:0] key_rst; reg [2:0] key_rst_r; always @ (posedge sysclk or negedge rst_b)beginif(!rst_b)key_rst<=3'b111;elsekey_rst<={key1,key2,key3};end always @ (posedge sysclk or negedge rst_b)beginif(!rst_b)key_rst_r<=3'b111;elsekey_rst_r<=key_rst;end wire[2:0] key_change; assign key_change=key_rst_r&(~key_rst); //-------------------------------------------------------// reg[23:0] time_cnt; // always @ (posedge sysclk or negedge rst_b)beginif(!rst_b)time_cnt<=24'h0;else if (key_change) //當(dāng)檢測到鍵盤按下后,time_cnt馬上清零,重新開始計(jì)數(shù);time_cnt<=24'h0;else time_cnt<=time_cnt+24'h1; end//-------------------------------------------------------// reg[2:0] key; reg[2:0] key_n;always @(posedge sysclk or negedge rst_b)beginif(!rst_b)key<=3'b111;else if(time_cnt==24'hfffff) // 這里的time_cnt不能設(shè)的太大20ms(2 *20ns=20ms)就行了;key<={key1,key2,key3}; //如果使time_cnt= 24'hffffff則鍵盤消抖不理想,手必須在鍵盤上多停留會(huì) ; endalways @(posedge sysclk or negedge rst_b)beginif(!rst_b)key_n<=3'b111;elsekey_n<=key; endwire[2:0] key_edge; assign key_edge=(~key)&key_n; //脈沖下降沿檢測; key 111 111 111 110 111 //---------------------------------------------------------// key_n 111 111 111 110 110 reg stop_start; //控制流水燈停起; ~key 000 000 000 001 000 always @ (posedge sysclk or negedge rst_b) // key_edge 000 000 001 000begin // 當(dāng)有鍵盤按下時(shí),key就會(huì)有高電平變成低電平 key_edge就會(huì)維持一個(gè)時(shí)鐘周期的高脈沖; if(!rst_b) stop_start<=1'h1;else if(key_edge[2])stop_start<=~stop_start; end reg left_right; //控制流水燈:左移/右移; always @(posedge sysclk or negedge rst_b)begin if(!rst_b)left_right<=1'h1;elsebegin if(key_edge[1])left_right<=1'h1;if(key_edge[0])left_right<=1'h0; end end//---------------------------------------------------------// reg[3:0] led_r;always @(posedge sysclk or negedge rst_b) beginif(!rst_b) led_r<=4'b1110;else if((time_cnt==24'hffffff)&&(stop_start)) //這里time_cnt=24’hffffff正好,太小了流水燈掃描的太快了,太大了燈變成靜態(tài)了; beginif(left_right)led_r<={led_r[2:0],led_r[3]}; //left moveelse led_r<={led_r[0],led_r[3:1]}; //right move end end assign led_out=led_r; endmodule?
?
轉(zhuǎn)載于:https://www.cnblogs.com/tphust/archive/2012/06/29/2570464.html
總結(jié)
- 上一篇: sphinx的CJK分词
- 下一篇: 探讨“临时对象”(temporary o