MyFPGA Forum

 找回密码
 注册
搜索
查看: 16752|回复: 1
打印 上一主题 下一主题

一种PUSH BUTTON Debounce方法

[复制链接]
跳转到指定楼层
1#
发表于 2010-3-26 16:14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hdhuang 于 2010-3-26 16:23 编辑

按钮开关的毛刺去除问题是数字电路初级设计者必须碰到的问题,虽然现在已经有很多高级开关器件内部集成了数字硬滤波器,不过在FPGA领域下讨论此问题,还是期望能起到抛砖引玉的效果。
按钮开关按下去的时候,由于开关弹性接触片的跳跃性接触,所得波形如下所示(以常闭开关为例):

网络上存在许多关于如何去除毛刺的论述,有的相当专业,限于某人能力,理解不能。
某天在一位仁兄博客上看到转载的一种计数器方法,思路简单可行,不过他也是转载,从文章叙述中没有看到完整的解决方案。
我按照他的叙述,勉强用Verilog代码实现之,在DE0上验证通过,感觉效果还不错。不揣浅陋,前来分享。
思路:
   开关没有动作时,设置一个标志位(flag)为高,这时候允许FPGA的高速时钟信号下降沿采样开关输入,并次序移位至一个4bit长的移位寄存器。某个时刻,开关按下时,将会因为输入信号的一个下降沿而在移位寄存器里面出现0011,当出现此组合时,将通过高速时钟的上升沿同步置标志位(flag)为零,停止移位。
   同时,设置一计数器(长度决定于高速时钟频率以及延时时间),在开关输入为低电平时做加一计数,而如果有高电平,就清零计数器。设置计数器到其最大值时同步置位标志位(flag),并且置位优先级高于刚才的清零操作。开关反弹的高电平会清零计数器,而不断延迟计数器到达最大计数值。在开关稳定按下,出现连续的低电平后的某一时刻,标志位重新变为一。这样,通过标志位(flag)的电平变化完成了一次开关按下的记录过程,且记录过程的清零和置位是经由时钟同步的,所以不会有任何毛刺。
   在标志位变为零的时刻,移位寄存器里面始终为0011,不过由于置位操作优先级高于清零,所以在计数器到达最大值时刻,会将标志位置位,且在上升沿之后的时钟下降沿会因为移入一个新的bit至移位寄存器而使其内容发生改变,变为0001,这样在下个时钟上升沿时刻,就不会再有清零操作发生了。
  最后几行是一个简单的脉冲发生器
代码:
///debounce starts
//falling edge detect,
always@(negedge clock)
begin
  if (flag)
     sw<={din,sw[3:1]};
end
assign falling_edge = (sw==4'b0011)?1'b1:1'b0;
////////////
always@(posedge clock,negedge iRST_n)
begin
  if (!iRST_n)
     flag<=1'b1;
  else if (delay==7'd15)////modify the value here for a better debounce effect when using a high clock frequency;
     flag<=1'b1;
  else if (falling_edge)
     flag<=1'b0;
end
//
always@(posedge clock)
begin
  if (!din)
     delay<=delay+1;
  else
     delay<=7'd0;
end
///debounce over!
/////////////////////////////////////////
///////////脉冲发生器
always@(negedge clock)
begin
  D1<=flag;
  D2<=D1;
end
assign start = ((!D1) && D2);
2#
发表于 2010-4-1 09:59:45 | 只看该作者
分享一下在这边脉冲发生器的设计, 有时简化成如下, 也会有很好的效果喔~ :$

reg   [2:0]   button_d;
wire          start;

always @ (posedge clock)
     button_d <= {button_d[1:0], button};

assign start = button_d[2] && !button_d[1];
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-2 07:26 , Processed in 0.040447 second(s), 17 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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