Verilog设计-按键消抖

一、背景介绍

在FPGA中,经常利用按键开关去复位或者控制小灯等功能。由于通常所使用的开关为机械弹性开关,当按下或松开按键时,由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动,抖动有可能会引起电路的误判,因此需要对按键进行消抖。

按键去抖的思路是检测到按下(弹起)时延时 一段时间(20ms),再检测,如果状态仍为按下(弹起),则确认是按下(弹起)的;如果状态为弹起(按下)的,则确认是干扰,无按键按下(弹起)。

二、Verilog设计

module key_debounce(
input clk,            //FPGA clock : 50M
input key,            
output wire debounced_key 
 );

reg [31:0] delay_cnt; //dealy cnt for 20ms
reg key_reg;
reg key_value;

always @(posedge clk ) begin
    key_reg <= key;
   if(key_reg != key) //detect the  key state  changed
        delay_cnt <= 32'd1000000; //delay cnt initial time :20ms
   else if(key_reg == key) begin 
          if(delay_cnt > 32'd0)
             delay_cnt <= delay_cnt - 1'b1;
          else
             delay_cnt <= delay_cnt;
       end
end

always @(posedge clk ) begin
    if(delay_cnt == 32'd1) //the key state keep steady for 20ms
        key_value <= key; 
    else 
      key_value <= debounced_key;
end

   assign debounced_key = key & key_value ;

 endmodule

三、参考资料

1. 正点原子逻辑设计指南v1.9 p89

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值