菜农FPGA助学园地

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2429|回复: 0

单按键消抖

[复制链接]

12

主题

12

帖子

66

积分

超级版主

Rank: 8Rank: 8

积分
66
发表于 2021-5-20 19:34:49 | 显示全部楼层 |阅读模式
本帖最后由 码头小王 于 2021-5-20 19:38 编辑

抖动的产生:通常所用的按键开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因此在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
消除抖动的措施:一般我们采用软件方法消抖。即检测到按键按下动作之后进行 10ms~20ms 左右的延时,当前沿的抖动消失之后再一次检测按键的状态。如果仍然是按下的电平状态,则认为这是一次真正的按键按下;同样检测到按键释放,也要做 10ms~20ms 延时,检测到后沿抖动消失后认为是一个完整的按键弹起过程。

消抖的好处:执行按键消抖有两个好处,①消除误触发:我们想通过按键来翻转信号(例如按下一次 led 亮,在按一次 led 灭),如果没有进行消抖,则会产生很多误触发造成不必要的翻转。②记录按键次数:执行按键消抖可以让我们记录按键动作的次数。

代码:
新建top工程:
debounce.v
  1. module debounce(
  2.                           clk,
  3.                           rst,
  4.                           key,
  5.                           key_pulse
  6.                           );

  7.         input                clk;
  8.         input                rst;
  9.         input                key;
  10.         output              key_pulse;
  11.         reg                  key_rst_pre;
  12.         reg                  key_rst;
  13.         wire                 key_edge;
  14.         
  15.         always @ (posedge clk or negedge rst)
  16.                 begin
  17.                         if(!rst)
  18.                                 begin
  19.                                         key_rst <= 1;
  20.                                         key_rst_pre <= 1;
  21.                                 end
  22.                         else
  23.                                 begin
  24.                                         key_rst <= key;
  25.                                         key_rst_pre <= key_rst;
  26.                                 end
  27.                  end
  28.         
  29.         assign key_edge = key_rst_pre & (~key_rst);
  30.         
  31.         reg        [17:0]cnt;
  32.         
  33.         always @ (posedge clk or negedge rst)
  34.                 begin
  35.                         if(!rst)
  36.                                 cnt <= 18'h0;
  37.                         else if(key_edge)
  38.                                 cnt <= 18'h0;
  39.                         else
  40.                                 cnt <= cnt + 1'h1;
  41.                 end
  42.                
  43.         reg        key_sec_pre;
  44.         reg        key_sec;
  45.         
  46.         always @(posedge clk or negedge rst)
  47.                 begin
  48.                 if (!rst)
  49.                         key_sec <= 1'b1;
  50.                         else if (cnt==18'h3ffff)
  51.                         key_sec <= key;
  52.                 end
  53.         
  54.         always @ (posedge clk or negedge rst)
  55.                 begin
  56.                         if(!rst)
  57.                                 key_sec_pre <= 1;
  58.                         else
  59.                                 key_sec_pre <= key_sec;
  60.                 end
  61.                
  62.         assign key_pulse = key_sec_pre & (~key_sec);
  63.         
  64. endmodule
复制代码

top.v
  1. module top(
  2.                  clk,
  3.                  key,
  4.                  led,
  5.                  rst
  6.                  );
  7.                         
  8.         input         clk;
  9.         input         key;
  10.         output       reg        led;
  11.         input         rst;
  12.         
  13.         wire          key_pulse;
  14.         
  15.         always @ (posedge clk or negedge rst)
  16.                 begin
  17.                         if(!rst)
  18.                                 led <= 1;
  19.                         else if (key_pulse)
  20.                                 led <= ~led;
  21.                         else
  22.                                 led <= led;
  23.                 end        
  24.         
  25.         debounce                u1(
  26.                                                 .clk(clk),
  27.                                                 .rst(rst),
  28.                                                 .key(key),
  29.                                                 .key_pulse(key_pulse)
  30.                                                 );
  31.         
  32. endmodule
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|菜农FPGA助学园地

GMT+8, 2022-1-27 18:39 , Processed in 0.083708 second(s), 3 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表