基于VHDL语言的几种消抖电路的设计
- 格式:doc
- 大小:215.00 KB
- 文档页数:5
EDA实验四消抖电路的顶层设计和移位寄存器的功能仿真一、实验目的:了解消抖电路的原理与应用并用VHDL顶层代码实现;了解触发器的基本原理,并且掌握LPM元件定制;掌握基本时序电路VHDL编写;了解移位寄存器的工作原理与应用;熟悉波形仿真基本方法;熟悉相关LPM元件定制;掌握VHDL元件例化方法;了解混合模块的工程设计方法。
二、实验内容:实验内容分为两部分,一是消抖电路的设计与实现,其中底层用DFF:LPM_FF定制,顶层用VHDL结构式描述;此外一个内容是74194(移位寄存器)功能仿真,了解具体的仿真方法与环节。
三、实验方法:实验方法:采用基于FPGA进行数字逻辑电路设计的方法。
采用的软件工具是QuartusII软件仿真平台,采用的硬件平台是Altera EPF10K20TI144_4的FPGA实验箱。
实验环节:1、编写源代码(或者绘制电路逻辑图)。
打开QuartusII软件平台,点击File中的New建立一个文献。
编写的文献名与实体名一致,点击File/Save as以“.vhd”为扩展名存盘文献。
2、按照实验箱上FPGA的芯片名更改编程芯片的设立。
操作是点击Assign/Device,选取芯片的类型。
3、编译与调试。
拟定源代码文献为当前工程文献,点击Complier进行文献编译。
编译结果有错误或警告,则将要调试修改直至文献编译成功。
4、波形仿真及验证。
在编译成功后,点击Waveform开始设计波形。
点击“insert the node”,按照程序所述引脚,任意设立各输入节点的输入波形…点击保存按钮保存。
5、FPGA芯片编程及验证,应记录实验结果进行分析。
四、实验过程:实验(一)消抖电路的设计与实现a)运用LPM元件定制D触发器,具体环节如下:(1)按照上次实验定制LPM的环节和方法进行定制,lpm_ff元件所示的宏功能选择对话框的左侧列表中选择Installed Plug_Ins->Storage->lpm_ff项。
—科教导刊(电子版)·2017年第24期/8月(下)—222基于VHDL 的按键消抖程序设计程佳佳(重庆科创职业学院重庆402160)摘要按键被广泛用于基于CPLD/FPGA 的数字电路系统设计中,机械式按键开关在按键操作时经常会出现抖动现象,如果不进行消除将会造成电路系统的误操作。
基于此介绍了采用VHDL 语言有限状态机的方法实现消抖的电路系统的工作原理、编程思路,并进行了硬件验证,消抖效果良好,性能稳定,可广泛用于CPLD/FPGA 的按键电路中。
关键词按键消抖电路仿真VHDL 状态机中图分类号:TP274文献标识码:A 0引言按键开关是电子设备实现人机对话的重要器件之一。
而大多数按键都采用机械触点的方式。
因此其最大的缺陷就在于在触点闭合和断开瞬间会伴随一连串的随机抖动,这些抖动往往会造成电路的误动作,而使整个系统工作异常。
因此在具有按键开关的电路系统中,尤其是在密码锁等精确度要求高的电路中,需要加入按键消抖模块,确保按键每按一次只做一次响应。
1按键消抖方案按键消抖一般采用硬件和软件消抖两种方法。
硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。
目前。
随着EDA 技术的广泛应用,更多采用软件消抖,主要采用延时的原理。
本文将介绍两种在可编程逻辑器件FPGA/CPLD 设计数字系统,基于VHDL 语言设计的按键消抖方法。
1.1计数器型消抖此方法的基本思想是:通过计数的方法来测量高电平的持续时间,若时间小于N (计数器模值)个时钟周期则认为是抖动产生的毛刺,则从消除毛刺的角度来设计。
因此设置当按键开关按下key_in=1,计数器以时钟上升沿开始计数,计数值持续加1;若key_in=0时,计数器清零。
只有当计数值为N ,keyout=1,而且计数器进入保持状态,其余情况下keyout=0。
即抖动产生的毛刺作用不可能使计数器有输出,这样防抖动目的就得以实现。
而且在本方法中,clk 的时钟周期与N 可以根据按键抖动时间由设计者自行设定。
实 验 报 告实验日期: 学 号:姓 名:实验名称:消抖电路总 分:一、实验概述运用LPM 原件定制DFF 触发器,并调用LPM 定制的DFF 触发器,用VHDL 语言的元件例化实现消抖电路并了解其工作原理。
二、实验原理 1、触发器原理触发器是一种可存储1位二进制码的逻辑电路,是构成各种时序电路的最基本逻辑单元。
触发器有一对互补输出端,输出状态不仅与当前输入有关,还与前一输出状态有关。
触发器有两个稳定状态,在一定的外界信号作用下会发生状态翻转。
2、消抖电路原理脉冲按键与电平按键通常采用机械式开关结构,其核心部件为弹性金属簧片。
按键信号在开关拨片与触电接触后经多次弹跳才会稳定,而在按键过程中,可能出现了多个脉冲。
因此需要根据实际情况进行按键消抖处理以提取稳定脉冲,在按键过程中提取稳定的电平状态,通过对抖动脉冲多次检测信号按键电平值,并提取一前一后两个信号按键电平值来进行比较,以此来获取开关状态。
输出一个周期的脉冲时,要求前一次检测到的电平信号为低电平,后一次检测到的电平信号为高电平时。
3、结构图:三、实验设计时钟信号 元件记忆当前的按键信号电平 元件记忆上一次按键信号电平 两次按键的电平进行比较 脉冲信号1、LPM元件定制DFF触发器(1)设置lpm_ff元件选择Installed Plug-Ins→Storage→lpm_ff项。
(2)LPM元件定制步骤,设置输入data为1位,clock为时钟信号,类型为D 型。
(3)添加异步清零和异步置1。
(4)aclr异步清零且高电平有效,aset异步置1且高电平有效,二者无效时,q输出由clock上升沿触发更新为data。
(5)调出其vhd文件添加至消抖电路的工程中。
(6)仿真验证并下载。
功能仿真波形分析参数:end time 为2.0ns,grid size为100ns;信号:alcr 异步清零且高电平有效,二进制;aset异步置1且高电平有效,二进制;二者无效,q(二进制)输出由clock(二进制)上升沿触发更新为data(二进制)。
实验三键盘扫描显示实验一、实验目的1.了解普通4×4键盘扫描的原理。
2.掌握组合逻辑电路和时序逻辑电路的混和设计。
3.进一步加深七段码管显示过程的理解。
二、实验仪器及设备1、4×4键盘阵列。
2、FPGA主芯片。
3、可变时钟源。
4、七段码显示区。
5、LED显示模块。
三、实验原理本实验主要完成的实验是完成4×4键盘扫描的,然后获取其键值,并对其进行编码,从而进行按键的识别,并将相应的按键值进行显示。
键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。
获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管和LED显示。
四、实验内容(1)本实验内容是完成4×4键盘的扫描,然后将正确的键值进行显示,实验步骤如下:1、编写键盘扫描和显示的VHDL代码。
2、用MaxPlusII对其进行编译仿真。
3、在仿真确定无误后,选择芯片ACEX1K EP1K30QC208。
4、给芯片进行管脚绑定,在此进行编译。
5、根据自己绑定的管脚,在实验箱上对键盘接口、显示接口和FPGA之间进行正确连线。
6、给目标板下载代码,在4×4键盘输入键值,观看实验结果。
(2)按键加1减1显示并且移位的程序与调试。
五、实验数据记录与分析1、4×4键盘的扫描VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity scanf isport( clk : in std_logic;-------------扫描时钟信号start : in std_logic;-------------开始信号,高电平有效kbcol : in std_logic_vector(3 downto 0);--------------行扫描信号kbrow : out std_logic_vector(3 downto 0);-------------列扫描信号seg7_out : out std_logic_vector(6 downto 0);-------------七段显示控制信号(abcdefg) scan : out std_logic_vector(2 downto 0));-------------数码管地址选择控制信号end scanf;architecture one of scanf issignal count : std_logic_vector(1 downto 0);signal sta : std_logic_vector(1 downto 0);signal seg7 : std_logic_vector(6 downto 0);signal dat : std_logic_vector(4 downto 0);signal fn : std_logic;------------------按键标志位,判断是否有键被按下beginscan<="000";---------------只使用一个数码管显示---------------------循环扫描计数器process(clk)beginif clk'event and clk='1' then count<=count+1;end if;end process;---------------------循环列扫描process(clk)beginif clk'event and clk='1' thencase count iswhen "00"=>kbrow<="0001";sta<="00";when "01"=>kbrow<="0010";sta<="01";when "10"=>kbrow<="0100";sta<="10";when "11"=>kbrow<="1000";sta<="11";when others=>kbrow<="1111";end case;end if;end process;---------------------行扫描译码process(clk,start)if start='0' then seg7<="0000000";elsif clk'event and clk='1' thencase sta iswhen "00"=>case kbcol iswhen "0001"=>seg7<="1111001";dat<="00011";-----3 when "0010"=>seg7<="1101101";dat<="00010";-----2when "0100"=>seg7<="0110000";dat<="00001";-----1when "1000"=>seg7<="1111110";dat<="00000";-----0when others=>seg7<="0000000";dat<="11111";end case;when "01"=>case kbcol iswhen "0001"=>seg7<="1110000";dat<="00111";-----7 when "0010"=>seg7<="1011111";dat<="00110";-----6when "0100"=>seg7<="1011011";dat<="00101";-----5when "1000"=>seg7<="0110011";dat<="00100";-----4when others=>seg7<="0000000";dat<="11111";end case;when "10"=>case kbcol iswhen "0001"=>seg7<="0011111";dat<="01011";-----b when "0010"=>seg7<="1110111";dat<="01010";-----awhen "0100"=>seg7<="1111011";dat<="01001";-----9when "1000"=>seg7<="1111111";dat<="01000";-----8when others=>seg7<="0000000";dat<="11111";end case;when "11"=>case kbcol iswhen "0001"=>seg7<="1000111";dat<="01111";-----f when "0010"=>seg7<="1001111";dat<="01110";-----ewhen "0100"=>seg7<="0111101";dat<="01101";-----dwhen "1000"=>seg7<="1001110";dat<="01100";-----cwhen others=>seg7<="0000000";dat<="11111";end case;when others=>seg7<="0000000";end case;end if;end process;fn<=not(dat(0)and dat(1)and dat(2)and dat(3)and dat(4));-------------------产生按键标志位,用于存储按键信息process(fn)if fn'event and fn='1' then------------按键信息存储seg7_out<=seg7;end if;end process;end one;从实验的结果可以看出,当使能端处于高电平即有效电平时,把时钟输出按键打开,此时按。
一、实验目的:熟悉元件例化的VHDL 输入法。
二、实验原理电路中,当d_in 输入脉冲由高电平到电平转换过程中发生多次抖动时电路仅输出一个时钟周期宽单脉冲。
三、实验步骤1 首先用lpm 定制一个D 触发器,然后把其中生成的〉.vhd.qip 文件放入顶层设计的工程中,可以在写代码时直接调用。
CLRND PRN Q DFFinstCLRND PRN Q DFFinst1VCCd_inINPUT VCC clk INPUT AND2inst3NOTinst4clk_outOUTPUT2 消抖电路设计代码library ieee;use ieee.std_logic_1164.all;entity xiaodou isport(d_in,clk: in std_logic;clk_out: out std_logic);end xiaodou;architecture aaa of xiaodou issignal s_line1,s_line2 ,s_line3:std_logic; // 内部连线component cufaqi is //触发器的声明port(data,clock:in std_logic;q:out std_logic);end component ;component and_gate is //与门的声明port(x,y :in std_logic;z:out std_logic);end component and_gate;component not_gate is //非门的声明port(m:in std_logic;n:out std_logic);end component not_gate;begin //端口映射各个元件例化 And_gate Not_gate Chufaqi (lpm 定制) 顶层VHDL 整合设计g1:cufaqi port map(d_in,clk,s_line1);g2:cufaqi port map(s_line1,clk,s_line2);g3:not_gate port map(s_line2,s_line3);g4:and_gate port map(s_line3,s_line1,clk_out);end aaa;library ieee; //与门描述use ieee.std_logic_1164.all;entity and_gate isport(x,y :in std_logic;z:out std_logic);end and_gate;architecture rtl of and_gate isbeginz<=x and y;end rtl;library ieee; // 非门描述use ieee.std_logic_1164.all;entity not_gate isport(m:in std_logic;n:out std_logic);end not_gate;architecture rtl of not_gate isbeginn<=not m;end rtl;3.波形仿真结果参数设置:END TIME:20.0us, GRID SIZE:100.0ns输入输出功能属性:功能属性连续脉冲clk 提供触发器工作使能上升沿Binary 1位单脉冲d_in 提供测试的抖动马脉冲Binary 1位输出d_out 经过消抖电路后的结果Binary 1位仿真结果分析:经过仿真电路,波形实现了消抖功能。
消抖电路实验报告一、 实验目的脉冲按键与点评按键通常采用机械式开关结构,其核心部件为弹性金属黄片。
因为按键信号在开关拨片与触点接触后经多弹跳才会稳定,所以设计者需要根据实际情况进行按键消抖处理以及提取稳定脉冲。
二、 实验原理利用D 触发器仅在时钟信号上升沿有效特性实现消抖电路当输入脉冲由低电平到高电平转换过程发生多次抖动时,电路仅输出一个时钟周期宽单脉冲。
三、 实验设计方案可根据以上消抖电路的结构框图利用连接电路图或是编写VHDL 语言代码实现消抖电路。
四、 实验内容1. LPM 定制D 触发器(1) 选择Installed Plug-Ins →Storage →lpmdff;(2) data 选用1位,类型为D 型;(3) 添加异步清零和一步置1;2. 连接电路图实现3. VHDL 实现分析:端口映射中h1:将d_in与clk经过D触发器后输出的值赋给p1;h2:将s1与clk经过D触发器后输出的值赋给p2;h3:将s2经过非门后输出的值赋给p3;h4:将s1与s3经过与门的输出即为clk_out。
4.波形仿真参数设置:End time:2.0us Grid size:100nsclk,d_in:Random Value结论:d_in输入脉冲由低到高电平转换过程中发生多次抖动时,电路仅输出一个时钟周期宽单脉冲,符合预想的结果,故实验验证成功。
5.下载验证锁定管脚:clk:PIN_43 d_in:PIN_82clk_out:PIN_118每次82号灯亮时,连续按43号按钮,118号灯闪烁一次,符合预期结果,正确。
五、实验日志1.在利用LPM定制后的D触发器元件时,我将vhd文件直接拷到xiaodou文件中,但创建bsf文件失败,然后我想到以前调用自己创建的元件时发现直接拷bsf文件到工程文件夹下使用是不行的,后来我又把bdf文件一起拷进去就行了,我就去看看是不是又是有什么没拷进来,发现创建D触发器时会产生一个bsf文件,我直接拷过来放到xiaodou工程文件夹下居然就成功了,多多联想,不管是不是想对了,总是有好处的。
VHDL语言实现数字电路设计数字电路是由逻辑门、寄存器以及其他数字组件组成的电子系统,用于处理和传输数字信号。
VHDL(Very High-Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统。
通过使用VHDL语言,我们可以实现数字电路的设计,从而满足各种需求。
VHDL语言提供了一种结构化的设计方法,允许设计者描述硬件电路的结构、功能以及时序行为。
以下是一些常见的数字电路设计任务,以及如何使用VHDL语言来实现它们。
1. 门电路设计门电路是最简单的数字电路之一,由逻辑门组成。
使用VHDL语言,我们可以通过描述逻辑门的输入和输出来实现门电路的设计。
例如,我们可以使用VHDL语言描述一个与门:```vhdlentity AND_gate isport (A, B : in bit;Y : out bit);end entity AND_gate;architecture dataflow of AND_gate isbeginY <= A and B;end architecture dataflow;```在这个例子中,我们定义了一个输入端口A和B,以及一个输出端口Y。
在architecture部分,我们使用VHDL语言描述了Y的逻辑值为A和B的逻辑与。
2. 时序逻辑电路设计时序逻辑电路是根据时钟信号进行操作和状态转换的电路。
使用VHDL语言,我们可以描述时序逻辑电路的行为和状态变化。
例如,我们可以使用VHDL语言描述一个触发器:```vhdlentity D_flip_flop isport (D, CLK : in bit;Q : out bit);end entity D_flip_flop;architecture behavior of D_flip_flop issignal Q_temp : bit;beginprocess(CLK)beginif CLK'event and CLK = '1' thenQ_temp <= D;end if;end process;Q <= Q_temp;end architecture behavior;```在这个例子中,我们定义了一个输入端口D和CLK,以及一个输出端口Q。
按键消抖用按键控制一个数字,按键每按一次,这个数字加1,并通过数码管将这个数字显示出来(以16进制)。
可能是悟性比较低,按键消抖都搞了1天才搞出来,下面这个程序是我经过参考别人的(有些地方没想明白),然后自己领会,写的一个程序,经过在开发板上实验,还是有一点小问题,但是我觉得,按键消抖的原理应该是这样的。
希望本文能帮到需要的人,我也是一个初学者,可能程序中也有很多不足,还请能提出来,相互交流。
QQ:1664619265module SW_debounce(rst_n,sy_clk,key,HEX0_D);input rst_n;/低电平复位input sy_clk;//系统时钟50Mhzinput key; 按键output [6:0]HEX0_D;数码管//*************************/reg key_rst;always@(posedge sy_clk or negedge rst_n) beginif(!rst_n)key_rst<=1'b1;else每个时钟周期读一次按键的值key_rst<=key;end 将按键的值存在key_rst中//*************************/reg key_rst_r;always@(posedge sy_clk or negedge rst_n) beginif(!rst_n)key_rst_r<=1'b1;else 每个时钟周期将key_rst中的值存入key_rst_r中。
key_rst_r<=key_rst;这样key_rst和key_rst_r中存放的是前后两个时钟周期,按键的值end//*************************/wire key_en,key_an;重点1:抖动时期的标志量,这两个标志量是用来给后面的计数器清零的assign key_en=key_rst&(~key_rst_r);当按键由0变1时,key_en为1 assign key_an=key_rst_r&(~key_rst);当按键由1变0时,key_an为1;看下面的按键波形,俺觉得,抖动期间,这两个标志量都有可能为1 //**************************/reg[18:0] count; 计数,是为了延时10ms左右always@(posedge sy_clk or negedge rst_n) beginif(!rst_n)count<=19'd0;else if(key_en | key_an)count<=19'd0;出现抖动就将count清零,使其计不满,因为后面是每10ms读一次按键的值else if(count==19'h7ffff)//10mscount<=19'd0;elsecount<=count+1'b1;end//************************/reg low_sw;always@(posedge sy_clk or negedge rst_n) beginif(!rst_n)low_sw<=1'b1;else if(count==19'h7ffff)low_sw<=key;每10ms读一次按键的值,因为抖动期间,count的值是到不了7ffff的,所以抖动期间是不会读按键的值的,因此能消除抖动。
这学期的EDA课程设计有涉及到一个按键信号稳定的问题,虽然就算没有这块处理,最后成绩只会扣3分,但自己觉得像LED亮度变化,数字钟设置这些功能,如果没有加进一个稳定按键信号的模块,根本不能算是已实现的功能。
按键消抖的程序在网上有几种可供选择,但这里只讨论一种,本人觉得简单得来又比较强大的一种。
其实消抖的原理就是把一个按键周期内所输入的所有有效信号,包括那些毛刺,处理成一个脉冲输入。
能达到这点,就可以实现消抖功能了。
功能的源代码:
代码中的key是按键输入,count是自定义的计数器,N的值可以根据需要结合时钟频率设置,如果只是想达到按键一次输入一个脉冲的效果,建议count 的时长设为5ms,key_en是处理完后输出的单个脉冲,至于有效信号是'0'还是'1',这要看板上的电路设计了。
此代码中是'0'为有效信号。
不要怀疑这段代码有错,理清逻辑后再套用,如果弄不明白什么原理,建议还是别用,用了可能会更糟糕。
要注意的是一个process中只能有一个时钟信号,否则很容易出错,就算编译通过,实际操作还是不行。
所以如果要对多个按键消抖,一定要在"if clk'event and clk='1' then"语句的内部增加,别重新设置一个clk'event。
还有就是按键的消抖功能块最好用单独的process运行,将
key_en设置成新的按键输入信号,而实际的输入信号key只在按键消抖的process中读入。
1/ 1。
图1是N为3的波形仿真图,当按键持续时间大于3个时钟周期,计数器输出一个单脉冲,其宽度为1个时钟周期,小于3个时钟周期的窄脉冲用作模拟抖动干扰,从图1可以看出,抖动不能干扰正常的单脉冲输出。
该方案的特点是能很好消除按键抖动产生的窄脉冲,还可以滤去干扰、噪音等其他尖峰波,但遇到脉宽大于N个Tclk时钟周期的干扰、噪音等时会有输出从而产生误操作,而对于按键操作要求按键时间必须大于N个Tclk时钟周期,否则按键操作也没有输出。
1.2计数器型消抖电路(二)计数器型消抖电路(二)是控制计数器工作一个循环周期(N+1个状态),且仅在计数器为0时输出为“1”。
电路设计了连锁控制设施。
在计数器处于状态0时,此时若有按键操作,则计数器进入状态1,同时输出单脉冲(其宽度等于时钟周期)。
计数器处于其他状态,都没有单脉冲输出。
计数器处于状态N时,控制en='0',导致计数器退出状态N,进入状态0。
计数器能否保持状态0,取决于人工按键操作,若按键key_in='1',控制en='1'(计数器能正常工作),key_in='0',计数器状态保持。
显见计数器处于状态0,人工不按键,则计数器保持状态0。
图2是N为7的波形仿真图。
在计数器状态为0时,key_in有按键操作,计数器开始连续计数直到计数器状态为0;计数器状态为1-7时,key_in任何操作对计数器工作无影响,计数器在状态为1时,输出一个单脉冲,脉冲宽度为1个时钟周期。
该设计方案的特点是能很好消除按键抖动产生的连续脉冲,对按键时间没有要求,缺点是在计数器状态为0时,遇到干扰、噪音等时会有输出,从而产生误操作。
2D触发器型消抖电路D触发器型消抖电路设计了三个D触发器与一个三输入与门。
三个D触发器串行连接,其Q输出端分别与三输入与门的输入端连接,D触发器型消抖电路RTL电路如图3所示。
图4为D触发器型消抖电路波形仿真图,由图可见,当按键操作时间大于或等于clk 时钟周期的3倍时,输出一个正脉冲,正脉冲的宽度比key_in少2个clk时钟周期。
VHDL——按键消抖按键检测需要消抖,一般有硬件和软件两种方式。
硬件就是加去抖动电路,这样从根本上解决按键抖动问题。
除了用专用电路以外,用可编程FPGA或者CPLD设计相应的逻辑和时序电路,对按键信号进行处理,同样可以达到去抖动的目的。
本例中用状态机实现了消抖电路:端口描述:clk输入检测时钟;reset复位信号;din原始按键信号输入;dout去抖动输出信号。
VHDL源码如下:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY xiaod ISPORT(clk:IN STD_LOGIC ;reset:IN STD_LOGIC ;din:IN STD_LOGIC ;dout:OUT STD_LOGIC);END ENTITY; ARCHITECTURE RTL OF xiaod IS TYPE state IS( s0,s1,s2,s3); SIGNAL pre_s, next_s:state;BEGINP0:PROCESS( reset, clk ) BEGINif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;END PROCESS P0;P1:PROCESS( pre_s, next_s, din ) BEGINcase pre_s isdout <= '1';if din = '1' then next_s <= s0; elsenext_s <= s1; end if;when s1 => dout <= '1';if din = '1' then next_s <= s0; elsenext_s <= s2; end if;when s2 => dout <= '1';if din = '1' then next_s <= s0; elsenext_s <= s3; end if;dout <= '0';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;end case;END PROCESS P1;END RTL;多按键去抖动电路VHDL源码,按键个数参数化,每个按键处理调用了上面的模块:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY Nxiaod ISGENERIC( width:positive:= 5 );PORT(clk:IN STD_LOGIC ;reset:IN STD_LOGIC ;din:IN STD_LOGIC_VECTOR( width - 1 DOWNTO 0); dout:OUT STD_LOGIC_VECTOR( width - 1 DOWNTO 0) );END ENTITY;ARCHITECTURE RTL OF Nxiaod IS COMPONENT xiaod ISPORT(clk:IN STD_LOGIC ;reset:IN STD_LOGIC ;din:IN STD_LOGIC ;dout:OUT STD_LOGIC);END COMPONENT;BEGINg1: FOR i IN 0 to width - 1 GENERATEux:xiaod port map( clk => clk, reset => reset, din => din(i), dout =>dout(i)); END GENERATE;END RTL;。
实 验 报 告实验日期: 学 号:姓 名:实验名称:消抖电路总 分:一、实验概述运用LPM 原件定制DFF 触发器,并调用LPM 定制的DFF 触发器,用VHDL 语言的元件例化实现消抖电路并了解其工作原理。
二、实验原理 1、触发器原理触发器是一种可存储1位二进制码的逻辑电路,是构成各种时序电路的最基本逻辑单元。
触发器有一对互补输出端,输出状态不仅与当前输入有关,还与前一输出状态有关。
触发器有两个稳定状态,在一定的外界信号作用下会发生状态翻转。
2、消抖电路原理脉冲按键与电平按键通常采用机械式开关结构,其核心部件为弹性金属簧片。
按键信号在开关拨片与触电接触后经多次弹跳才会稳定,而在按键过程中,可能出现了多个脉冲。
因此需要根据实际情况进行按键消抖处理以提取稳定脉冲,在按键过程中提取稳定的电平状态,通过对抖动脉冲多次检测信号按键电平值,并提取一前一后两个信号按键电平值来进行比较,以此来获取开关状态。
输出一个周期的脉冲时,要求前一次检测到的电平信号为低电平,后一次检测到的电平信号为高电平时。
3、结构图:三、实验设计时钟信号 元件记忆当前的按键信号电平 元件记忆上一次按键信号电平 两次按键的电平进行比较 脉冲信号1、LPM元件定制DFF触发器(1)设置lpm_ff元件选择Installed Plug-Ins→Storage→lpm_ff项。
(2)LPM元件定制步骤,设置输入data为1位,clock为时钟信号,类型为D 型。
(3)添加异步清零和异步置1。
(4)aclr异步清零且高电平有效,aset异步置1且高电平有效,二者无效时,q输出由clock上升沿触发更新为data。
(5)调出其vhd文件添加至消抖电路的工程中。
(6)仿真验证并下载。
功能仿真波形分析参数:end time 为2.0ns,grid size为100ns;信号:alcr 异步清零且高电平有效,二进制;aset异步置1且高电平有效,二进制;二者无效,q(二进制)输出由clock(二进制)上升沿触发更新为data(二进制)。
VHDL——按键消抖VHDL——按键消抖按键检测需要消抖,一般有硬件和软件两种方式。
硬件就是加去抖动电路,这样从根本上解决按键抖动问题。
除了用专用电路以外,用可编程FPGA或者CPLD设计相应的逻辑和时序电路,对按键信号进行处理,同样可以达到去抖动的目的。
本例中用状态机实现了消抖电路:端口描述:clk 输入检测时钟;reset 复位信号;din 原始按键信号输入; dout 去抖动输出信号。
VHDL源码如下:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY xiaod ISPORT(clk : IN STD_LOGIC ;reset : IN STD_LOGIC ;din : IN STD_LOGIC ;dout : OUT STD_LOGIC);END ENTITY;ARCHITECTURE RTL OF xiaod ISTYPE state IS( s0,s1,s2,s3);SIGNAL pre_s, next_s: state;BEGINP0:PROCESS( reset, clk )BEGINif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;END PROCESS P0;P1:PROCESS( pre_s, next_s, din ) BEGINcase pre_s iswhen s0 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;when s1 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s2;end if;when s2 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s3;end if;when s3 =>dout <= '0';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;end case;END PROCESS P1;END RTL;多按键去抖动电路VHDL源码,按键个数参数化,每个按键处理调用了上面的模块:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY Nxiaod ISGENERIC( width: positive:= 5 );PORT(clk : IN STD_LOGIC ;reset : IN STD_LOGIC ;din : IN STD_LOGIC_VECTOR( width - 1 DOWNTO 0);dout : OUT STD_LOGIC_VECTOR( width - 1 DOWNTO 0));END ENTITY;ARCHITECTURE RTL OF Nxiaod ISCOMPONENT xiaod ISPORT(clk : IN STD_LOGIC ;reset : IN STD_LOGIC ;din : IN STD_LOGIC ;dout : OUT STD_LOGIC);END COMPONENT;BEGINg1: FOR i IN 0 to width - 1 GENERATEux: xiaod port map( clk => clk, reset => reset, din => din(i), dout => dout(i));END GENERATE;END RTL;。
按键去抖设计姓名:学号:专业:班级:指导教师:目录一、实验目的--------------------------------------------1二、实验平台-----------------------------1三、设计要求-----------------------------11、设计原理---------------------------------1四、设计方案-----------------------------11、键盘分类-------------------------------12、设计方法-------------------------------23、去抖动电路模块--------------------------------3五、去抖动电路VHDL程序------------------------5六、实验结果--------------------------------------------61、Verilog结构图---------------------------62、时序仿真图-------------------------------63、功能仿真图-------------------------------7七、心得体会------------------------------------8八、参考文献------------------------------------9实验题目:按键去抖设计一、实验目的1、学习基于VHDL 描述状态机的方法;2、学习 VHDL 语言的规化编程,学习按键去抖动的原理方法。
二、实验平台微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)三、设计要求1、设计原理:机械式轻触按键是常用的一种外围器件,由于机械原因导致的抖动会使得按键输入出现毛刺。
滤除前沿和后延抖动毛刺,提取稳定的按键信息。
基于FPGA的按键消抖电路设计方法的研究于晶;杨晓慧;黄勇【摘要】采用了VHDL语言编程的设计方法,通过FPGA来实现按键消抖的硬件电路。
论述了基于计数器、RS触发器和状态机3种方法来实现按键消抖电路,并给出仿真结果。
通过下载到CycloneEP1C6T144芯片中进行验证,表明这3种方法设计的消抖电路都能够实现电路功能,其中有限状态机的方法更能确保每一次按键操作后准确输出按键确认信号,且性能稳定。
%In order to solve key jitter of FPGA system,use the design method of VHDL language programming to realize key-jitter.Discusses three methods base on counter,RS flip-flop and state machine with simulation and analysis.Being verified by theCycloneEP1C6T144,the three methods all able to achieve the circuit function,can guarantee a quick keypress once every time the response,and have stable property.The main innovation is using the most simple programming to realize key-jitter.【期刊名称】《电子设计工程》【年(卷),期】2011(019)022【总页数】3页(P1-3)【关键词】按键消抖;计数器;RS触发器;状态机【作者】于晶;杨晓慧;黄勇【作者单位】长春理工大学,吉林长春130000;长春理工大学,吉林长春130000;吉林博安消防设备有限公司,吉林长春130000【正文语种】中文【中图分类】TP274通常所用的按键都为机械触点开关,由于机械触点存在弹性作用,当按下按键或松开按键时,都不可避免地要在触点闭合及断开的瞬间产生一连串的键抖动。
VHDL实现按键消抖library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity key_scan isport (clk,en:in std_logic;keyin :in std_logic;key_en :out std_logic);end entity key_scan;architecture behave of key_scan is type state is (s0,s1,s2,s3);signal current_sta,next_sta :state ; signal en_flag: std_logic;signal debound ,debound1:std_logic; begintimer :process (clk)beginif rising_edge(clk) thenif en='1' thencurrent_sta <=next_sta;elseNULL;end if;end if;end process;com:process (current_sta,keyin) begincase current_sta iswhen s0 => --s0是表示按键没有按下去的状态en_flag <='1';if (keyin='1') thennext_sta <=s0;elsenext_sta <=s1;end if;when s1 => --s1表示有按键按下去的状态en_flag <='1';if (keyin='1') thennext_sta <=s0;elsenext_sta <=s2;end if;when s2 => --s2是再一次确认按键是否按下的状态,起到消抖的作用en_flag <='1';if (keyin='1') thennext_sta <=s0;elsenext_sta <=s3;end if;when s3 => -- s3是判断按键是否释放en_flag <='0';if (keyin='1') thennext_sta <=s0;elsenext_sta <=s3;end if;when others =>next_sta <=s0;end case;end process;debound <=en_flag when rising_edge(clk);debound1 <=debound when rising_edge (clk);key_en <= not debound and debound1 ;-- 之所以采用这样作为按键的使能,是为了产生一个使能信号的时间刚刚好是一个时钟周期的时间,抗干扰的性能可以达到很高,这样做的好处有两个:第一个就是抗干扰,因为这样把干扰发生的概率控制在了一个时钟周期内,所以说抗干扰性能是非常好的,第二个就是让使能信号同时钟信号同步工作,试想一下,如果一个使能信号从发生到结束的时间是不确定的话,那么这样就很难保证稳定性。
图1是N为3的波形仿真图,当按键持续时间大于3个时钟周期,计数器输出一个单脉冲,其宽度为1个时钟周期,小于3个时钟周期的窄脉冲用作模拟抖动干扰,从图1
可以看出,抖动不能干扰正常的单脉冲输出。
该方案的特点是能很好消除按键抖动产生的窄脉冲,还可以滤去干扰、噪音等其他尖峰波,但遇到脉宽大于N个Tclk时钟周期的干扰、噪音等时会有输出从而产生误操作,而对于按键操作要求按键时间必须大于N个Tclk时钟周期,否则按键操作也没有输出。
1.2计数器型消抖电路(二)
计数器型消抖电路(二)是控制计数器工作一个循环周期(N+1个状态),且仅在计数器为0时输出为“1”。
电路设计了连锁控制设施。
在计数器处于状态0时,此时若有按键操作,则计数器进入状态1,同时输出单脉冲(其宽度等于时钟周期)。
计数器处于其他状态,都没有单脉冲输出。
计数器处于状态N时,控制en='0',导致计数器退出状态N,进入状态0。
计数器能否保持状态0,取决于人工按键操作,若按键key_in='1',控制en='1'(计数器能正常工作),key_in='0',计数器状态保持。
显见计数器处于状态0,人工不按键,则计数器保持状态0。
图2是N为7的波形仿真图。
在计数器状态为0时,key_in有按键操作,计数器开始连续计数直到计数器状态为0;计数器状态为1-7时,key_in任何操作对计数器工作无影响,计数器在状态为1时,输出一个单脉冲,脉冲宽度为1个时钟周期。
该设计方案的特点是能很好消除按键抖动产生的连续脉冲,对按键时间没有要求,缺点是在计数器状态为0时,遇到干扰、噪音等时会有输出,从而产生误操作。
2D触发器型消抖电路
D触发器型消抖电路设计了三个D触发器与一个三输入与门。
三个D触发器串行连接,其Q输出端分别与三输入与门的输入端连接,D触发器型消抖电路RTL电路如图3所示。
图4为D触发器型消抖电路波形仿真图,由图可见,当按键操作时间大于或等于clk 时钟周期的3倍时,输出一个正脉冲,正脉冲的宽度比key_in少2个clk时钟周期。
D触发器型消抖电路与计数器型消抖电路(一)相似,计数器型消抖电路(一)输出脉冲宽度是固定的,D触发器型消抖电路输出脉冲宽度随着按键操作时间长短变化。
3状态机型消抖电路
状态机型消抖电路采用有限状态机的设计方法来描述与实现,状态机有S0,S1,S2三种状态,在S0状态下key_out输出为低电平,并以clk时钟信号的频率采样按键输入信号,如果ke y_in=…0‟,则保持在S0状态,并继续采样按键输入信号的状态,如果key_in=…1‟,则转入S1状态;在S1状态下key_out输出仍为低电平,继续采样按键输入信号的状态,如果key_in=…1‟,则转入S2状态,如果key_in=…0‟则转入S0状态;在S2状态下继续采样按键输入信号的状态,如果key_in=…1‟,则保持在S2状态,key_out输出正脉冲,如果key_in=…0‟,则转入S0状态,key_out输出低电平。
图5为状态机型消抖电路波形仿真图,由图可见,该状态机型消抖电路与D触发器型消抖电路仿真结果一致。
4结束语
采用VHDL语言实现按键的消抖电路的方法有很多,本文介绍的几种消抖电路都通过仿真分析及实验验证,消抖效果良好,性能稳定,而且各有自己的优势与缺点,设计者可以根据设计需求选择使用。