leastbad的笔记 https://passport2.21ic.com/?244348 [收藏] [复制] [RSS]

日志

按键消抖

已有 709 次阅读2010-10-29 12:26 |系统分类:EDA/PLD

最经典的那段代码似懂非懂,所以按自己的想法重新写。区别是按下按键 LED灯亮,松开后立刻熄灭。这样做比较实用,一般使用按键都是松开后才相应(有的情况下需要检测长按,有的情况下长按按键将视为误操作,不相应该按键)。


module example2(clk_50MHz,rst_n,Key,Led);


 input     clk_50MHz;
 input     rst_n;
 input  [3:0]  Key;
 reg  [3:0]  KeyLast;
 
 output [3:0]  Led;
 reg  [3:0]  Led;
 
 reg  [20:0] count1;
 
 always@(count1 or rst_n)
 begin
  if(rst_n == 'b0)
   begin
    KeyLast <= Key;
   end
  else if(count1 == 'd1000000)
   KeyLast <= Key;
 end
 
 always@(posedge clk_50MHz or negedge rst_n)
 begin
  if(rst_n == 'b0)
   count1 <= 'd0;
  else
   if((KeyLast != Key) && (count1 <= 'd1000000))
    count1 <= count1 + 'd1;
   else
    count1 <= 'd0;
 end


 always@(count1 or rst_n)
 begin
  if(rst_n == 'b0)
   Led <= 'b0000;
  else
   if(count1 == 'd1000000)
    Led <= KeyLast; 
 end
 
endmodule


测试的时候出了点小问题,只有key2是正常的,其余3个按键按下立刻相应,但是弹起需要1~2s后才相应(觉的应该是按键问题,没有深究)。另外这种写法相应速度有些,可以连续按下某个按键,查看LED的闪烁速度,一般情况下应该够用,但是特殊情况下(有些)可能不够,需要再优化。


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

发表评论 评论 (1 个评论)

回复 leastbad 2010-10-29 15:27
更改按键的顺序,发现只有原始KEY[1]对应的按键弹起后LED立刻相应,其他的3个按键都是弹起后大约需要1~2s的时间LED才改变。如果找不到其他板子测试,到时候找个示波器试验