您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > vhdl按键消抖程序
1.vhdl按键消抖程序一:延时性消抖在本例子中,input是按键的输入,output是消抖之后的按键输出是clk经历8个上升沿之后就让output输出一个CLK周期的高电平libraryieee;useieee.std_logic_1164.all;entityPWlockisport(clk:instd_logic;input:instd_logic;output:outstd_logic);endPWlock;architectureoneofPWlockissignala:std_logic;signalcount:integerrange0to9;beginprocess(clk)beginifinput=‘0’thencount=0;elsif(clk‘eventandclk=’1‘)thenifcount=9thencount=count;elsecount=count+1;endif;endif;-ifcount=8thena=’0‘;elsea=’1‘;endif;endprocess;output=a;endone;2.vhdl按键消抖程序二一般按键延时在20ms左右,根据时钟频率决定你的计数范围。程序非常简单,但经常用到,对于FPGA初学者要好好学习这部分。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityreseterisport(clk,reset_in:instd_logic;--按键按下时为0reset_out:outstd_logic:=‘0’);endreseter;architecturebehavofreseterisbeginPROCESS(clk,reset_in)VARIABLECOUNT1:INTEGERRANGE0TO100000;BEGINIFreset_in=‘0’THENIFRISING_EDGE(clk)THENIFCOUNT110000THENCOUNT1:=COUNT1+1;ELSECOUNT1:=COUNT1;ENDIF;IFCOUNT1=9999THENreset_out=‘1’;ELSEreset_out=‘0’;ENDIF;ENDIF;ELSECOUNT1:=0;reset_out=‘1’;ENDIF;ENDPROCESS;endbehav;3.vhdl按键消抖程序三:计数器型消抖电路(一)计数器型消抖电路是设置一个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in=‘1’,计数器加1,key_in=‘0’时,计数器清零。当计数器值为2时,key_out输出才为1,其他值为0时。计数器值为N时处于保持状态。因此按键key_in持续时间大于N个clk时钟周期时,计数器输出一个单脉冲,否则没有脉冲输出。如果按键开关抖动产生的毛刺宽度小于N个时钟周期,因而毛刺作用不可能使计数器有输出,防抖动目的得以实现。clk的时钟周期与N的值可以根据按键抖动时间由设计者自行设定。主要程序结构如下:if(clk’eventandclk=’1’)thenif(key_in=’1’)thenifcount=Nthencount=count;elsecount=count+1;endif;endif;elsecount=0;endif;4.vhdl按键消抖程序四:计数器型消抖电路(二)计数器型消抖电路(二)是控制计数器工作一个循环周期(N+1个状态),且仅在计数器为0时输出为“1”。电路设计了连锁控制设施。在计数器处于状态0时,此时若有按键操作,则计数器进入状态1,同时输出单脉冲(其宽度等于时钟周期)。计数器处于其他状态,都没有单脉冲输出。计数器处于状态N时,控制en=‘0’,导致计数器退出状态N,进入状态0。计数器能否保持状态0,取决于人工按键操作,若按键key_in=‘1’,控制en=‘1’(计数器能正常工作),key_in=‘0’,计数器状态保持。显见计数器处于状态0,人工不按键,则计数器保持状态0。主要程序结构如下:ifcount=Nthencount=0;elsecount=count+1;endif;ifcount=0thenkey_out=’0’;endif;endifendprocess;B:process(clk)beginif(clk’eventandclk=’1’)thenifcountNthenifkey_in=’1’thenen=’1’;elseen=en;endif;endif;endprocess;5.vhdl按键消抖程序五:D触发器型消抖电路D触发器型消抖电路设计了三个D触发器与一个三输入与门。三个D触发器串行连接,其Q输出端分别与三输入与门的输入端连接.主要程序结构如下:key_out=d1ord2ord3;process(clock)beginif(clk’eventandclk=’1’)thend1=key_in;d2=d1;d3=d2;endif;endprocess;补充:改进型D触发器(正负双输出端,本次实验被多次引用)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityqddisport(key,clk:instd_logic;up:outstd_logic);endqdd;architectureaofqddissignalq0,q1:std_logic;beginprocess(clk)beginif(clk'eventandclk='1')thenq0=key;q1=q0;endif;endprocess;up=(q1and(notq0));enda;6.vhdl按键消抖程序六:状态机型消抖电路状态机型消抖电路采用有限状态机的设计方法来描述与实现,状态机有S0,S1,S2三种状态,在S0状态下key_out输出为低电平,并以clk时钟信号的频率采样按键输入信号,如果key_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输出低电平。主要程序结构如下:ifclk’eventandclk=’1’thencasestaiswhens0=key_out=’0’;ifkey_in=’1’thens=s1;elses=s0;endif;whens2=ifkey_in=’1’thenkey_out=’1’;s=s2;elses=s0;endif;whens2=ifkey_in=’1’thenkey_out=’1’;s=s2;elsekey_out=’0’;s=s0;endif;endcase;endif;7.vhdl按键消抖程序七end程序中所用的方法是不断检测按键值。每当Count[17]上升沿到来,就进行检测输入信号。其中dout1,dout2,dout3分别为当前、上个Count[17]上升沿、上上个Count[17]上升沿输入数值。正常情况下为1,假如连续三次为0,三个信号作或运算,使得key_done信号为0,出现下降沿,这样就认为是有按键。assignkey_done=(dout1|dout2|dout3);//按键消抖输出always@(posedgecount[17])begindout1=key_in;dout2=dout1;dout3=dout2;endalways@(negedgekey_done[0])beginkeyen=~keyen;
本文标题:vhdl按键消抖程序
链接地址:https://www.777doc.com/doc-5879444 .html