基于FPGA按键抖动消除.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于FPGA按键抖动消除

基于FPGA按键抖动消除   摘要:我们在数字电路的设计中,会经常用到按键。按键即是一个个机械触点,当按键闭合或者断开,即当机械触点断开、闭合时会有抖动。为了使每一次按键闭合或者断开都会有正确的响应,就必须去除抖动。文章简单介绍了数字电路设计中的按键抖动信号以及进行消除的常用方法。   关键词:FPGA;按键抖动;数字电路   中图分类号:TN912 文献标识码:A 文章编号:1009-2374(2013)21-0031-02   我们在进行数字电路的设计的过程中,经常会碰到信号抖动相关的问题。抖动信号大致分为两类:一类是时间极短的干扰信号(比如毛刺);另一类是时间较长的干扰信号(如本文所研究的按键抖动问题)。对于第一类干扰信号——毛刺,它的时间极短,通常只有几纳秒,不能满足触发器的建立时间与保持时间,因此我们可以用一个D触发器去读带毛刺的信号,由于D触发器具有对毛刺不敏感的特点,可以去除信号中的毛刺,达到消除抖动的效果(消除毛刺的方法很多,在这里不做讨论,本文重点说明按键抖动的消除及其代码设计)。   在数字电路设计中,按键通常为一个个具有弹性的机械触点开关,其开启或者闭合的瞬间都会产生按键抖动,实际波形如图1所示:   由图1可知,在按键闭合和断开的瞬间,我们往往只需要一组稳定的上升边沿和下降边沿,但实际上却产生了若干个边沿。所以,在实际电路中,我们仅仅按动按键,简单地读取信号的边沿,却不滤除抖动,会导致一次按键操作被误读多次,从而引起电路的误动作。为了达到一次按键操作得到一次正确的响应的目的(在按键闭合或者断开),信号稳定的状态下读取此时按键的状态,就必须在电路中采取消除抖动的措施。在纯数字电路设计中,下面介绍几种消除按键抖动的常用实现方法。   1 设计硬件消抖电路(硬件方法)   设计一个具有延时作用的滤波电路或者经常用到的单稳态电路等硬件电路,来消除按键的抖动(避免抖动时间)。图2所示的电路,即为典型的滤波延时消抖电路,S为按键, Di为CPU数据线。当按键S未闭合时,与非门的输入电压Vi(即电容的端电压)为0,从而输出电压Vo为1。我们按下按键S,电容C的端电压不会发生突变,充电延迟时间取决于R1、R2和C值的大小,当电容端电压在充电时间内未达到与非门的开启电压,将不会改变门的输出电压;当电容端电压大于门的开启电压时,与非门的输出Vo发生改变,即输出为0(我们在数字电路的设计过程中,为了避开按键抖动的影响,需要使充电延时大于或等于100ms)。   同理,按键S断开时的情形,由读者自己来进行分析,此处不再赘述。   图2中,V1是未消抖的波形,V2是消抖之后的波形。   2 软件方法实现消抖   (1)计数器消抖的实现。计数器实现消除抖动,采用的是延时方法,其设计的核心是如何正确设定计数的时钟脉冲(即如何正确设计计数器的模值和计数时钟的频率,因为它们共同决定了延时的时间)。   (2)基于RS触发器的消抖设计。在实际设计中用时钟信号对按键输入信号进行采样。此方法消除抖动的关键在于确定合适的采样时钟频率,使得采样间隔时间适中,处在按键抖动时间和按键正常稳定闭合时间的范围之内。   3 按键消抖的程序实例分析   程序设计的基本思路是:(1)检测管脚电平是否拉低;(2)若检测到低电平,启动计数器,延时20ms左右的时间;(3)再次检测管脚是否低电平;(4)若还是低电平,确定按键被按下,输出控制信号。   程序实例:   input clk; //主时钟信号,50MHz   input rst_n; //复位信号,低有效   input key1; //按键1   reg reg0_key;   reg reg1_key;   always @(posedge clk or negedge rst_n) begin   if(!rst_n) begin   reg0_key = 1b1;   reg1_key = 1b1;   end   else begin   reg0_key = key1;   reg1_key = reg0_key;   end   end   wire key_an;   assign key_an = reg1_key ( ~reg0_key);   reg[19:0] cnt_key; //计数寄存器   always @ (posedge clk or negedge rst_n) begin   if (!rst_n) cnt_key = 20d0; //复位   else if(key_an) cnt_key =20d0;   else cnt_key = cnt_key + 1b1;   end

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档