按键消抖的原理和基于fpga的消抖设计

合集下载

按键消抖的原理和基于fpga的消抖设计

按键消抖的原理和基于fpga的消抖设计

按键消抖1功能概述按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。

实际应用中,按键开关通常为机械式弹性开关。

当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。

为保证系统及时正确识别,必须对这种情况作出相应处理。

我们称之为按键消抖。

按键消抖可分为硬件消抖和软件消抖。

硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。

如果按键较多,则使用软件消抖。

软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。

需要注意的是,软件消抖需要占据一定的系统资源。

尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。

而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。

优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。

在本例中,我们的只需要用4个信号界定,并用很短的代码即可。

下面我们先来看看功能要求:在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。

在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。

2 设计思路一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。

抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。

1图1 按键抖动过程示意当系统检测出按键闭合后,执行一个延时程序,产生5ms~10ms的延时;前沿抖动消失后,再一次检测键的状态;如果仍保持闭合状态电平,则确认为真正有键按下。

当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

FPGA按键去抖程序

FPGA按键去抖程序

FPGA按键去抖程序代码是特权同学的,我将其理解后加上了注释。

去抖的原理和单片机是一样的,即通过延时来过滤掉按键抖动产生的毛刺信号。

不同的是判断按键按下的条件不同,单片机通常是已知按键不按时IO口的电平(如高电平),当IO口电平发生改变时(如低电平),则开启定时器进行延时,延时20ms后再次读取IO口的电平,若仍为低电平,则说明有按键按下;若为高电平,则说明是按键抖动,没有按键按下。

FPGA的采样频率很高,它可以在每个时钟周期的上升沿到来时对IO口的电平进行一次读取。

通过读取相邻2个时钟周期内IO口的电平值并进行比较,若电平值发生改变(此代码中是判断电平从0变为1),则计数器清零,若持续20ms后电平值没有发生改变,则读取按键的键值,同时将这一键值存储起来,当下一个20ms后再次读取键值,将2次键值进行比较,若键值发生改变,则说明按键有动作(要么按下,要么松手)。

此代码中是判断键值从0变为1,即松手检测。

// 按键去抖// 实现一个简单的三个按键分别控制三个发光二极管亮或暗的控制。

// 例如,按键1控制发光二极管1。

上电初始发光二极管1不亮,// 当检测到按键1被按下后,发光二极管1则点亮,// 按键1再次被按下时,发光二极管1则不亮,如此反复。

// 该实验需要把握好按键消抖检测的设计技巧。

// 注:此代码的按键操作是包括松手检测的,// 即按键按下后要等到松手才算一次按键操作module key_debounce(clk,rst_n,key1_n,key2_n,key3_n,led1_n,led2_n,led3_n);input clk;input rst_n;input key1_n,key2_n,key3_n;output led1_n,led2_n,led3_n;reg [2:0] key_rst;always @(posedge clk or negedge rst_n)beginif(!rst_n)key_rst <= 3'b111;elsekey_rst <= {key3_n,key2_n,key1_n}; // 读取当前时刻的按键值endreg [2:0] key_rst_r;always @(posedge clk or negedge rst_n)beginif(!rst_n)key_rst_r <= 3'b111;elsekey_rst_r <= key_rst; // 将上一时刻的按键值进行存储endwire [2:0]key_an = key_rst_r & (~key_rst); // 当键值从0到1时key_an改变//wire [2:0]key_an = key_rst_r ^ key_rst; // 注:也可以这样写reg [19:0] cnt; // 延时用计数器always @(posedge clk or negedge rst_n)beginif(!rst_n)cnt <= 20'd0;else if(key_an)cnt <= 20'd0;elsecnt <= cnt + 20'd1;endreg [2:0] key_value;always @(posedge clk or negedge rst_n)beginif(!rst_n)key_value <= 3'b111;else if(cnt == 20'hfffff) // 2^20*1/(50MHZ)=20ms key_value <= {key3_n,key2_n,key1_n}; // 去抖20ms 后读取当前时刻的按键值endreg [2:0] key_value_r;always @(posedge clk or negedge rst_n)beginif(!rst_n)key_value_r <= 3'b111;elsekey_value_r <= key_value; // 将去抖前一时刻的按键值进行存储endwire [2:0] key_ctrl = key_value_r & (~key_value); // 当键值从0到1时key_ctrl改变reg d1;reg d2;reg d3;always @(posedge clk or negedge rst_n)beginif(!rst_n)begin // 一个if内有多条语句时不要忘了begin end d1 <= 0;d2 <= 0;d3 <= 0;endelsebeginif(key_ctrl[0]) d1 <= ~d1;if(key_ctrl[1]) d2 <= ~d2;if(key_ctrl[2]) d3 <= ~d3;endendassign led1_n = d1? 1'b1:1'b0; // 此处只是为了将LED输出进行翻转,RTL级与下面注释代码无差别assign led2_n = d2? 1'b1:1'b0; assign led3_n = d3? 1'b1:1'b0; endmodule。

【豆丁-精品】-基于FPGA的按键消抖动设计

【豆丁-精品】-基于FPGA的按键消抖动设计

2009年11月吉林师范大学学报(自然科学版)№.4第4期Journal of Jilin Normal University (Natural Science Edition )Nov.2009收稿日期:2009209222 基金项目:吉林省信息产业厅专项发展基金项目(2007042)作者简介:许德成(19772),男,吉林省辽源市人,现为吉林师范大学信息技术学院讲师,硕士.研究方向:基础电子技术,单片机及可编程逻辑器件技术.基于FPG A 的按键消抖动设计许德成(吉林师范大学信息技术学院,吉林四平136000)摘 要:在研制测量仪表、电子仪器及电子设计的过程中,按键是常用器件,而按键的弹跳现象是数字系统设计中存在的客观问题.这就要求电路具有消抖措施,即对于由于机械弹跳产生的噪声信号经过消抖电路滤除,保证电路能够正确的响应.本文介绍了基于FPG A 的两种消除按键抖动的方法,并给出了相应的VH D L 代码以及仿真图形,从而解决了按键的机械抖动影响,保证电路稳定工作.关键词:机械抖动;仿真图形;电路中图分类号:T N912 文献标识码:A 文章编号:1674238732(2009)04201542030 引言我们通常所用的按键都为机械触点开关.由于机械触点存在弹性作用,当我们按下按键或松开按键时,都不可避免的要在触点闭合及断开的瞬间产生有一连串的键抖动.其按键信号的实际波形如图1所示.图1 按键信号的实际波形 由图1可见,在按键闭合和断开时产生了多个边沿.而在实际中每按一次键,我们只需要一组稳定的上升或下降边沿.所以对于电路中的按键信号,如果我们不滤除抖动的话,还是简单的读取信号的边沿,会引起一次按键被误读多次.这样就会引起电路的误动作.为了保证按一次键电路只有一次正确的响应,即在键闭合稳定时读取键的状态,就要求电路中必须采取滤除抖动的措施.消除案件抖动的方法一般有硬件和软件两种方式.对于硬件方式一般可用RS 触发器作为常用的消抖电路,从根本上解决按键抖动问题.但对于按键较多且从节省硬件资源和易于修改的角度考虑,我们常应用软件滤抖.1 基于计数器模式消抖电路的设计方法应用计数器实现,即采用延时的方法.先正确设定计数的时钟脉冲.当判断到按键按下时计数器开始计数,等计数器计满后再一次判断键的状态.如果仍为按下状态,则认为是按键稳定闭合.这时再针对具体按键信号做相应的处理,否则认为是抖动信号,电路不做任何处理.应用这种方法消除按键抖动,其计数器模值的确定和计数时钟的频率是按键抖动消除的关键问题,因为它们共同决定了延时的时间.如果延时时间过长,就会使正确的按键信号得不到处理;如果延时时间过短,则会将抖动误认为是输入信号,从而导致后电路做出错误处理.一般人按键的时间大于100ms ,抖动时间一般·451·为5ms ~10ms.按这种常规处理,我们一般认为接收到的按键信号持续时间如果小于40ms 则其为抖动信号,如果时间大于40ms 则为正确的按键信号.即让计数器的模值和计数时钟周期的乘积略大于40ms 即可.这样就可以把按下的时间小于40ms 的抖动信号滤掉.其VH D L 代码为:library ieee ;use ieee.std -logic -1164.all ;entity anjian is port (clk ,input :in std -logic ;output :out std -logic );end anjian ;architecture one of anjian is signal a :std -logic ;signal count :integer range 0to 9;beginprocess (clk )beginif input =′0′then count <=0;elsif clk ’event and clk =′1′thenif count =9then count <=count ;else count <=count +1;end if ;end if ;if count =8then a <=′1′;else a <=′0′;end if ;end process ;output <=a ;end one; 由上仿真图可以看出:当信号维持时间小于八个计数时钟周期的时候,认为这时的信号是短时间的抖动信号,所以电路输出不做任何反应.保持原电平不变,后续电路也无需处理.当信号维持时间超过八个计数时钟周期,认为这时定稳定的按键信号,即键稳定的闭合.所以输出一个按键脉冲,以供后续电路处理.2 基于RS 触发器模式的消抖动电路设计在设计中用时钟信号进行采样.对于按键输入信号,当两次采样信号相同时,这是判定已经稳定的按下或放开了按键.触发器相应的被置成0态或1态.如两次采样结果不相同.则触发器维持原输出信号不变.由于直接由触发器输出的信号时间宽度可能过长,所以在触发器后再接一级同步化电路,保证每次输出的信号只占有一个时钟周期的宽度.应用这种方法去滤除抖动,关键是确定采样时钟的频率.保证两次采样的时间间隔能够大于按键的抖动时间,且小于正常按键时的按键稳定闭合时间.其VH D L 代码和仿真如下:library ieee ;use ieee.std -logic -1164.all ;entity dou is port (din ,clk :in std -logic ;dout :out std -logic );end entity dou ;architecture one of dou issignal clr0,clr1,q0,q1,d1,d0:std -logic ;beginclr0<=din ;clr1<=q0;process (clk ,clr0,clr1)beginif clr0=′0′then q0<=′0′;elsif clk ′event and clk =′1′thenq0<=′1′;end if ;if clr1=′0′then q1<=′0′;elsif clk ′event and clk =′1′thenq1<=′1′;end if ;end process ;process (clk )beginif clk ′event and clk =′1′thend0<=q1;d1<=d0;end if ;end process ;dout <=d0and (not d1);end ;·551· 由上仿真图形可以看出:当两次的采样信号结果相同时,这时输出信号才可能发生变化,对应的按键的稳定闭合或断开,当两次的采样信号结果不同时,认为输入的信号定抖动信号.这时电路输出维持原状态不变,同时由于有同步化的处理,输出信号的高电平宽度只为采样时钟的一个周期.3 结束语通过以上的仿真图形可以看出,对于带有机械抖动的按键信号,当它经过消抖电路处理后其输出信号已经将抖动滤除,且输出信号只占有一个时钟信号的周期,从而能使后续电路能够正确的读取键值,做相应的响应,有效的避免了误动作.因此该设计有很大的实际应用意义.参 考 文 献[1]潘 松,黄继业.E DA 技术实用教程[M].北京:科学出版社,20051[2]谭会生,瞿遂春.E DA 技术综合应用实例与分析[M].西安:西安电子科技大学出版社,2004.[3]林明权等.VH D L 数字控制系统设计范例[M].北京:电子工业出版社,2003.[4]方 龙,肖献保,李 威.关于消除按键机械抖动的研究[J ].广西轻工业,2008,1:92.[5]潘永雄,泌河,刘向阳.电子线路CAD 实用教程[M].西安:西安电子科技大学出版社,2004.[6]杨 恒,李爱国,王辉,王新安.FPG A/CP LD 最新实用技术指南[M].北京:清华大学出版社,2005.[7][美]沃尔夫(W olr.w )基于FPG A 的系统设计(英语版)[M].北京:机械工业出版社,2005.[8]王强,曾繁泰,励娜.EPA 工程的理论与实践—S OC 系统蕊片设计[M].北京:电子工业出版社,2004.[9]李国洪,胡辉,沈阳山等.E DA 技术与实验[M].北京:电子工业出版社,2005.Shaking R elease Design on the K eys of FPGAXU De 2cheng(C ollege of In formation T echnology ,Jilin N ormal University ,S iping 136000,China )Abstract :K eys were the comm on elements during the research of measure instrument ,electronic apparatus ,and design of the electronic.The bounce phenomenon of keys was the objective problem in the digital system design.Therefore ,the shaking release measurement was necessary.That is to rem ove the noise signal at the engine bounce through the elimi 2nating the shaking circuit in order to ensure the right response of the circuit.The paper introduced tw o methods of elim 2inating shaking on FPG A and gave the relative VH D L code and the imitating picture.It res olved the in fluence of engine shaking on keys and ensurd the steady w orking of the circuit.K ey w ords :engine shaking ;imitating picture ;circuit·651·。

按键去抖课程设计

按键去抖课程设计

按键去抖课程设计一、课程目标知识目标:1. 学生能理解按键去抖的概念,掌握其工作原理;2. 学生能了解按键去抖在电路设计和编程中的应用;3. 学生能掌握相关电子元件的功能和电路连接方式。

技能目标:1. 学生能运用所学知识,设计并搭建简单的按键去抖电路;2. 学生能编写简单的程序,实现对按键去抖功能的控制;3. 学生能通过实际操作,分析并解决按键去抖过程中遇到的问题。

情感态度价值观目标:1. 培养学生对电子技术的兴趣,激发创新意识;2. 培养学生动手实践、合作探究的学习态度;3. 培养学生严谨、细致、勇于克服困难的品质。

课程性质:本课程为电子技术实践课程,旨在帮助学生将理论知识与实际操作相结合,提高学生的动手能力和创新能力。

学生特点:学生处于初中阶段,具有一定的物理知识和电子元件基础,对电子技术有一定的好奇心和兴趣。

教学要求:结合学生特点,注重理论与实践相结合,以学生为主体,教师为主导,引导学生主动探究,培养学生的实践能力和创新精神。

通过本课程的学习,使学生能够将所学知识应用于实际生活中,提高解决实际问题的能力。

二、教学内容1. 按键去抖概念及工作原理- 理解按键抖动的产生原因及影响;- 掌握按键去抖的常用方法和技术;- 学习相关电子元件(如电容、电阻、二极管等)的作用和选型。

2. 按键去抖电路设计与搭建- 学习并应用电路图绘制软件;- 设计简单的按键去抖电路;- 搭建电路,进行实际测试和调试。

3. 按键去抖编程控制- 学习编程语言(如C语言、Arduino等)的基本语法;- 编写按键去抖的程序代码;- 调试程序,实现按键去抖功能。

4. 实际应用案例分析- 分析实际应用中按键去抖的解决方案;- 学习如何根据需求选择合适的按键去抖方法;- 探讨按键去抖在电子产品中的重要性。

教学内容安排与进度:第1课时:按键去抖概念及工作原理第2课时:按键去抖电路设计与搭建第3课时:按键去抖编程控制第4课时:实际应用案例分析及总结教材章节及内容:《电子技术基础》第四章第三节:按键去抖技术《电子技术实践》第二章第五节:按键去抖电路设计与搭建《编程语言》第一章:基本语法与结构《Arduino编程与实践》第三章:数字输入输出控制三、教学方法1. 讲授法:- 在介绍按键去抖的概念、工作原理及相关电子元件的基础知识时,采用讲授法进行教学,使学生在短时间内快速掌握理论要点。

按键消抖的原理和基于verilog的消抖设计

按键消抖的原理和基于verilog的消抖设计

按键消抖的原理和基于verilog的消抖设计按键开关是各种电子设备不可或缺的人机接口。

在实际应用中,很大一部分的按键是机械按键。

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

在系统设计中,有各种各样的消除按键抖动的设计方法,硬件电路和软件设计都很成熟。

不过我们这里要从另外一个角度来讨论按键的消抖,并给出一个用verilog给出一个具体的实现。

首先,看一个普通的机械按键的触点在闭合与断开时的波形(用示波器抓取)。

下面的四张图都是按键在闭合的时候抓到的波形。

可以看到两个明显的趋势:1. 按键在几个us之内就可以达到稳定状态,从高电平转换到底电平;2. 在高电平转换到低电平的过程中,触点有非常明显的抖动。

下面的两张图是按键在断开的时候抓到的波形。

也可以看到两个明显的趋势:1. 按键的变化趋势比较缓慢,从低电平变为高电平需要大概10~20ms的时间;2. 按键断开时没有闭合时那么大的抖动下面两张图是用手迅速闭合按键然后就断开时,按键的输出波形。

在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。

所以,对于按键消抖的处理,必须按最差的情况来考虑。

我们从上面的图上可以看到,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。

按键一次闭合最短的时间大概是120ms 左右。

如果我们把按键的输出做为一个时钟域(时钟频率未知,但信号的slow rate是已知的,既最大20ms左右)的信号,用另外一个时钟来采集这个按键的输出,则就可以把按键的消抖归结为一个最基本的CDC问题来处理。

而问题的核心是如何确定采集时钟的频率。

假设采集时钟的周期小于20ms,那么,采集时钟就有可能两次采到按键断开时的不。

基于FPGA的抖动及消抖的方法

基于FPGA的抖动及消抖的方法

基于FPGA的抖动及消抖的方法抖动的产生通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

抖动时间抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。

这是一个很重要的时间参数,在很多场合都要用到按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。

键抖动会引起一次按键被误读多次。

为确保FPGA对键的一次闭合仅作一次处理,必须去除键抖动。

在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。

FPGA内实现消抖的方法在FPGA内实现按键消抖的方法多种多样,但是最简单的是采用移位寄存器的方法进行消抖。

因为移位寄存器的方法不需要对时钟进行分频,也不需要进行延时等复杂操作,即可实现对按键边沿的检测。

假设未按下时键值=1.1、在无键按下时,移位寄存器samp[7:0]始终采集到高电平,即samp[7:0]=8b1111_1111;2、当键按下时,samp[7:0]将采集到低电平,数据的变化方式为samp[7:0]=8b1111_1110--8b1111_1100--8b1111_1000-- ........8b0000_0000;samp[7:0]=8b1111_ 1110即为按键下降沿。

3、当松开按键时,samp[7:0]将重新采集到高电平,数据变化方式为samp[7:0]=8b0000_0001--8b0000_0011-- ........--8b1111_1111;当samp[7:0]=8b0111_1111时,即为按键上升沿。

参考Verilog代码//模块名:EdgeDetect,边沿检测//button:按键,无键按下时为高电平//clk:10M时钟//rst:复位按钮,低电平有效//rise:检测到上升沿,高电平有效,宽度为1个clk//fall:检测到下降沿,高电平有效,宽度为1个clkmodule EdgeDetect(input clk,input rst,input button,output reg rise,output reg fall);。

按键消抖原理

按键消抖原理

按键消抖原理
按键消抖原理是指通过某种方法在按键被按下或松开时,消除或减少按键的抖动现象,使输入信号得到稳定的识别和处理。

在实际应用中,按键在被按下或松开时,由于机械结构的原因,往往会引起按键的不稳定状态,表现为按键在短时间内多次触发开关。

这种按键抖动不仅会导致输入信号的波动,还可能对系统造成误操作或不良影响。

为了解决按键抖动问题,常用的按键消抖原理主要有以下几种:
1. 软件延时消抖:通过在程序中设定一个适当的延时时间,当按键被按下或松开后,延时一段时间再读取按键状态,以判断按键是否稳定。

如果经过延时后按键状态仍然相同,则可以认为按键已经稳定按下或松开,从而减少抖动的影响。

2. 硬件滤波消抖:通过在按键电路上设计滤波器或添加电容元件,可以对按键信号进行滤波处理,去除短时间内的干扰信号,使输入信号更加稳定。

常用的滤波电路包括RC滤波电路、OTA滤波电路等。

3. 状态改变检测消抖:在按键电路中,通过检测按键的状态变化来判断按键是否按下或松开。

当按键在短时间内发生多次状态变化时,只会认为按键状态发生了一次改变,从而忽略了抖动现象。

这种方式适用于按键状态改变的速度较慢的情况。

通过以上的按键消抖原理,可以有效地减少按键抖动现象,提
高按键输入的可靠性和稳定性。

在实际应用中,可以根据具体情况选择适合的原理和方法来实现按键消抖,以满足不同的需求。

按键去抖FPGA设计 改良版-

按键去抖FPGA设计   改良版-

按键消抖sw_debounce什么是debounce,为什么要debounce?當按下按鈕時,表面上只按了一下。

但是訊號的傳遞並不是很單純的由’1’直接跳到’0’。

實際上的訊號會如上圖所示,當我們按下按鈕後,訊號會在高低電位之間彈跳(bounce)。

則電路所收到的訊號可能會像111110110110000000,會和我們所預期的111111111000000000不同。

如此一來,雖然我們只按了一下按鈕,電路可能會解讀成按了好幾下按鈕。

debounce的目的就是為了要除去訊號在高低電位之間彈跳所造成的不正確輸入。

具体原理:通常,按键抖动会产生10--20MS的毛刺,因此要做的实际上就是在20MS中采样一次,当检测到按键突变的时候,就认定按下,其他状态忽略。

采用50MHz晶振,时钟周期是20ns,消除按键消抖的关键在于,在检测到按键电平发生跳变后的20ms内,不对按键电平进行判定。

这就需要引入脉冲边沿检测法。

脉冲边沿检测法,个人觉得,在FPGA里的应用实在是太多了,几乎所有的程序都要用到,作用无非是防止竞争冒险,将一个信号延迟一个时钟周期,原来的信号取反,2个信号与一下,从而产生一个宽度为一个时钟周期(20ns)的脉冲,然后将这个脉冲作为控制信号去控制别的进程。

下面是之前开发板的一个按键程序:module sw_debounce(clk,rst_n,sw1_n,sw2_n,sw3_n,//outputled_d1, // led 1--off,0--onled_d2,led_d3);input clk;input rst_n;input sw1_n,sw2_n,sw3_n; //Active low 低电平有效output led_d1;output led_d2;output led_d3;//脉冲边沿检测法(当按键电平发生突变时产生一个时钟周期的高电平,用这个高电平控制计数器的工作)reg [2:0] key_rst;always@(posedge clk or negedge rst_n)if (!rst_n)key_rst<=3'b111;elsekey_rst<={sw3_n,sw2_n,sw1_n};reg [2:0] key_rst_r;always@(posedge clk or negedge rst_n)if (!rst_n)key_rst_r<=3'b111;elsekey_rst_r<=key_rst;wire [2:0] key_an= key_rst_r[2:0]&(~key_rst[2:0]);// ---------------------------------------------------------------------------reg [19:0] cnt;// 时钟频率50MHz,周期20ns,所以20ms对应的需要10的6次方个周期,需要一个20位计数器计数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按键消抖
1功能概述
按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。

实际应用中,按键开关通常为机械式弹性开关。

当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。

为保证系统及时正确识别,必须对这种情况作出相应处理。

我们称之为按键消抖。

按键消抖可分为硬件消抖和软件消抖。

硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。

如果按键较多,则使用软件消抖。

软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。

需要注意的是,软件消抖需要占据一定的系统资源。

尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。

而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。

优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。

在本例中,我们的只需要用4个信号界定,并用很短的代码即可。

下面我们先来看看功能要求:
在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。

在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。

2 设计思路
一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。

抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。

1
图1 按键抖动过程示意
当系统检测出按键闭合后,执行一个延时程序,产生5ms~10ms的延时;前沿抖动消失后,再一次检测键的状态;如果仍保持闭合状态电平,则确认为真正有键按下。

当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

本案例我们设置经过20 ms后的高电平才是真正的按键功能。

信号列表如下:
3 程序设计
模块代码
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18 module key_module(
clk ,
rst_n ,
key_in ,
key_vld
);
parameter DATA_W = 20 ;
parameter KEY_W = 4 ;
parameter TIME_20MS= 1_000_000 ;
input clk ;
input rst_n ;
input [KEY_W-1 :0] key_in ;
output [KEY_W-1 :0] key_vld ;
reg [KEY_W-1 :0] key_vld ;
reg [DATA_W-1:0] cnt ;
wire add_cnt ;
wire end_cnt ;
2
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
reg flag ;
reg [KEY_W-1 :0] key_in_ff1 ;
reg [KEY_W-1 :0] key_in_ff0 ;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
cnt <= 20'b0;
end
else if(add_cnt)begin
if(end_cnt)
cnt <= 20'b0;
else
cnt <= cnt + 1'b1;
end
else begin
cnt <= 0;
end
end
assign add_cnt = flag==1'b0 && (key_in_ff1!=0);
assign end_cnt = add_cnt && cnt == TIME_20MS - 1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag <= 1'b0;
end
else if(end_cnt)begin
flag <= 1'b1;
end
else if(key_in_ff1==0)begin
flag <= 1'b0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_in_ff0 <= 0;
key_in_ff1 <= 0;
end
else begin
key_in_ff0 <= key_in ;
key_in_ff1 <= key_in_ff0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_vld <= 0;
end
else if(end_cnt)begin
key_vld <= key_in_ff1;
end
else begin
key_vld <= 0;
end
end
endmodule
3。

相关文档
最新文档