当前位置:文档之家› 实验05按键消抖

实验05按键消抖

实验五按键消抖一. 实验目的1. 掌握QuartusII的硬件描述语言设计方法2. 了解同步计数器的原理及应用3. 设计一个带使能输入、进位输出及同步清零的增1四位N (N<16)进制同步计数器二. 准备知识在按键使用的过程中,常常遇到按键抖动的问题,开关在闭合(断开)的瞬间,不能一接触就一直保持导通(断开),因为开关的机械特性,重要经历接触-断开-再接触-再断开,最终稳定在接触位置,这就是开关的抖动,即虽然只是按下按键一次然后放掉,结果在按键信号稳定前后,竟出现了一些不该存在的噪声,这样就会引起电路的误动作。

在很多应用按键的场合,要求具有消抖措施。

按键抖动与开关的机械特性有关,其抖动期一般为5-10ms。

键按下键稳定前沿抖动后沿抖动图5.1 按键电平抖动示意图按键的消除抖动分为硬件消除抖动和软件消除抖动。

硬件消除抖动一般采用滤波的方法,通常在按键两端并联一个1~10u左右的电容,有时这样也不能完全消除按键的抖动。

软件消除抖动的方法有多种,常用的是延时扫描和定时器扫描。

延时扫描其原理为:检测到按键操作后延时一端时间(如10ms)后,再检测是否为仍然为同样的按键操作状态,如果相同,就认为是进行了按键操作,然后对该操作进行相应的处理。

定时器扫描的原理是:每隔一端时间(几毫秒)扫描一次键盘,如果连续两次(或3次)的所获得的按键状态相同,就输出按键状态,然后再对这种按键状态进行处理,这里的扫描时间间隔和连续判断按键状态的次数是有关系的,一般总时间要大于按键的抖动期。

如果总时间太长,则感觉按键迟钝,太短可能不能完全消除抖动,要根据实际的情况合适的选择。

在实际电路设计中,经常采用的是软硬件相结合对按键进行消除抖动的处理方法。

本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。

我们采用5ms的定时器扫描FPGA管脚电平,如果连续3次为低电平时,存储连续按键状态的次数CNT的值加1,直到该计数值等于10(或再大一些),就不再累加(防止长按该值溢出而重新计数),此时认为按键已稳定,输出按键操作标志;在该过程中,一旦FPGA管脚电平为低电平就对CNT复位清零并同时对按键操作标志位复位,即一个异步复位。

本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。

我们采用5ms的定时器扫描采样FPGA管脚电平,如果连续3次为低电平时,可以认为此时按键已稳定,输出一个低电平按键信号;继续采样的过程中如果不能满足连续3次采样为低,则认为键稳定状态结束,这时输出变为高电平(连线3次采用信号相“或”),认为按键松开。

其原理图如图5.2所示。

时间间隔可以更小、采样次数更多效果可能会更好,但是增加了硬件的复杂度和资源利用。

CLRNDPRNQ DFF instCLRN DPRNQ DFF inst1CLRN DPRNQDFFinst2OR3inst3VCCKey _inINPUT VCCCLK200Hz INPUT Key _outOUTPUT Key _inCLK200Hz Key _out图5.2 按键抖动硬件原理图本实验的思路为:用按键消抖与不消抖的信号,分别当作时钟信号触发16进制计数器,计数结果用数码管静态显示,比较按键消抖与不消抖的区别。

三. 实验步骤1、 新建工程antiwobble新建文件夹,并在该文件夹下新建工程。

2、 编写硬件描述语言文件将图3.2所示的电路用语言描述出来,并扩展多个通道(多路按键输入,多路消抖信号输出)。

文件名为debounce ,并封装生成模块符号文件。

编写16进制计数器文件CNT16,并封装生成模块符号文件,或添加兆功能计数器模块实现16进制的计数器。

编写译码电路文件DECODE7,并封装生成模块符号文件。

添加计数器分频模块DIV200Hz ,我们需要周期为5ms 的时钟信号,故分频次数240000。

最后生成顶层原理图文件antiwobble 如图5.3所示。

P IN_121VCCkey 1INPUT P IN_122VCC key 2INPUT P IN_164P IN_163P IN_166P IN_165P IN_168P IN_167P IN_170P IN_169seg[7..0]OUTPUTP IN_214P IN_213P IN_216P IN_215P IN_161P IN_162P IN_159P IN_160dig[7..0]OUTPUTup counter modulus 240000clockq[17..0]coutDIV200HzinstAND2inst2G N DKEY_WIDTH 1Parameter Value clk key _in[key _width-1..0]key _out[key _width-1..0]debounceinst1DIN[3..0]DOUT[7..0]DECODE7inst4CLKQ[3..0]CNT16inst3key 2V C C c l o c kI N P U TP IN_28key 1图5.3 按键消抖顶层模块说明:48MHz的系统晶振时钟频率经模240,000的计数器,得到的进位cout,其频率为200Hz,也可以使用其计数值的最高位Q[17]作为消抖模块的时钟信号。

二者的区别是占空比不同。

消抖模块“debounce”使用了参数传递说明语句,以关键词GENERIC引导一个类属参量表,在表中提供总线宽度等静态信息。

类属表说明用于设计实体和外部环境通信的参数和传递信息。

GENERIC语句在所定义的环境中的地位与常数相似,但却能从环境(如外部实体)外部动态地接受赋值,其行为又类似于端口PORT。

其使用本实验见参考程序。

在类属表的“KEY_WIDTH”参数的“Value”栏设为1,就是对一个按键进行消抖处理。

这时其模块输入输出管脚key_in、key_out为1位的逻辑位信号而非总线信号,但其模块间连线可以是总线连线(粗线),也可以是节点连线(细线)。

在debounce程序中,尽管设定了位宽KEY_WIDTH=8,但是在顶层文件中调用该模块时,可以重新更改其位宽设置,编译时以顶层文件的设置进行编译。

尽管在debounce程序中设置的位宽在顶层文件中无效,但必须进行设置,否则debounce文件封装生成模块符号文件时会报错。

Key1经过消抖处理,作为时钟信号触发计数器CNT16,而key2则位经过消抖处理。

3、编译、锁定管脚、再编译指定antiwobble原理图文件为顶层文件。

为了方便锁定管脚,我们先进行编译,发现错误进行纠正,直至成功为止。

锁定管脚(管脚表)再编译,把管脚锁定的信息编译到下载文件中去。

4、下载连接电源,进行下载观察按键key1和key2进行操作时,计数器变化结果的区别,以认识按键存在抖动以及对按键需要进行消抖处理才能使用正常。

四. 实验参考程序程序清单debounce.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_Unsigned.ALL;ENTITY debounce ISGENERIC(KEY_WIDTH:Integer:=8); --参数传递说明语句PORT(clk: IN STD_LOGIC; --系统时钟输入key_in: IN STD_LOGIC_VECTOR(KEY_WIDTH-1 DOWNTO 0); --外部按键输入key_out:OUT STD_LOGIC_VECTOR(KEY_WIDTH-1 DOWNTO 0) ); --按键消抖输出END;ARCHITECTURE one OF debounce ISSIGNAL dout1,dout2,dout3:STD_LOGIC_VECTOR(KEY_WIDTH-1 DOWNTO 0);BEGINkey_out<=dout1 OR dout2 OR dout3;--按键消抖输出PROCESS(clk)BEGINIF RISING_EDGE(clk)THEN --上升沿触发dout1<=key_in; --寄存dout2<=dout1;dout3<=dout2;END IF;END PROCESS;END one;说明:key_out<=dout1 OR dout2 OR dout3;是3个信号“或”。

对总线数据而言,相同的位进行“或”把运算后的结果赋值给输出的相同位。

即key_out[i]<=dout1[i] OR dout2[i] OR dout3[i]。

程序清单debounce.V五. 实验报告1.4位10进制、进位/借位功能、异步复位、使能功能、加减切换的硬件描述语言程序及仿真结果图。

2.理解图2.8所示的RTL电路图的含义。

3.利用10进制计数器设计0~99的百进制计数器。

画出原理图。

4.。

相关主题