FPGA入门基础之按键消抖实验

引言:按键在电子产品中经常用到,由于按键的机械特性,按键在闭合或松开的瞬间伴随着一连串的抖动,这样的抖动将直接影响设计系统的稳定性。因此,必须对抖动进行处理。本文介绍如何在FPGA中实现按键消抖处理。

1. 原理概述

在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。按键抖动如下图所示。

图片

图1:按键机械抖动

图片

图2:按键输入在FPGA IO接口产生的抖动

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起一次按键被误读多次,如图2所示。

按键消抖处理即:每次在按键闭合或松开期间,跳过这段抖动时间,再检测按键的状态。故通过简单的延时就可实现按键的消抖动。

2.软件代码设计

按键滤波模块key_filter.v设计采用状态机实现按键按下和弹起检测。

10ms延迟定时器:

always @(posedge clk_i)begin //10ms 延迟定时器
    if(cnt10ms < CNT_10MS) 
        cnt10ms <= cnt10ms + 1'b1;
    else 
        cnt10ms <= 25'd0;
end

按键检测状态机:

always @(posedge clk_i)begin
    key_s_r <= key_s;
end

always @(posedge clk_i)begin
    if(en_10ms)begin //10ms 延迟定时器
        case(key_s)
        KEY_S0:begin
           if(!key_i) //判断按键是否按下,如果按下,则转入状态KEY_S1
               key_s <= KEY_S1; 
        end  
        KEY_S1:begin
           if(!key_i) //10ms后,再次判断按键是否按下,
               key_s <= KEY_S2; //如果按下,则转入状态KEY_S2
            else 
               key_s <= KEY_S0; //如果未按下,则转回KEY_S0
        end 
        KEY_S2:begin
           if(key_i) //10ms后,判断按键是否弹起,如果弹起,则转入状态KEY_S3
               key_s <= KEY_S3; 
        end  
        KEY_S3:begin
           if(key_i) //10ms后,再次判断按键是否弹起,
              key_s <= KEY_S0; //如果弹起,则转入状态KEY_S0
            else   
              key_s <= KEY_S2; //如果未弹起,则转回KEY_S2
        end
        endcase                  
    end
end

按键有效输出:当状态从KEY_S1 转到 KEY_S2 代表依次按钮按下 key_cap 输出一次高电平。

assign key_cap = (key_s==KEY_S2)&&(key_s_r==KEY_S1);

图片

欢迎关注FPGA技术实战公众号,喜欢就多多转发吧!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA技术实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值