按键去抖动程序
- 格式:doc
- 大小:29.00 KB
- 文档页数:3
io按键消抖算法
IO按键消抖算法是电子设备中常用的一种技术,用于处理按键在按下或释放时可能出现的抖动现象。
抖动现象是由于机械开关在接触或断开时,由于物理原因(如弹性、接触电阻等)导致电路状态瞬间不稳定,从而产生多个快速的电平变化。
如果不进行消抖处理,这些快速变化可能会被设备误识别为多次按键操作,导致程序逻辑混乱。
消抖算法的主要目的是识别并过滤这些快速的电平变化,确保设备只响应一次按键操作。
一种常用的消抖算法是延时消抖法。
当检测到按键被按下时,程序会先等待一段时间(通常是几十毫秒),然后再读取按键状态。
如果按键仍然处于按下状态,则认为是有效的按键操作;如果按键已经释放,则认为是抖动现象,忽略这次操作。
同样地,当检测到按键被释放时,也需要进行类似的延时处理。
除了延时消抖法外,还有其他一些消抖算法,如软件定时器消抖、硬件消抖等。
软件定时器消抖是通过在程序中设置一个定时器,在定时器到期后再读取按键状态,从而过滤掉抖动现象。
硬件消抖则是通过外部电路实现消抖功能,例如使用施密特触发器、RC滤波器等。
需要注意的是,消抖算法的实现方式和参数选择需要根据具体的硬件环境和应用场景来确定。
在实际应用中,可能需要根据按键的特性和使用频率来调整消抖时间和算法复杂度,以确保程序的稳定性和响应速度。
总之,IO按键消抖算法是电子设备中不可或缺的一部分,它能够提高设备的可靠性和用户体验。
在实际应用中,需要根据具体情况选择合适的消抖算法和参数,以确保设备的正常运行。
前几天看了特权同学用Verilog写的按键消抖程序,感觉很经典。
在这里将程序贴出来分享一下。
module lcd_button2(clk,rst,seg,wei,sw1,sw2,sw3,sw4);//按键按下,数码管依次显示0-9input clk;input rst;input sw1,sw2,sw3,sw4;output [3:0] wei;output[7:0] seg;reg [7:0] seg;reg [3:0] wei;integer num;initial beginnum = 0;endreg[3:0] key_rst;always @(posedge clk or negedge rst)if(!rst)key_rst <= 4'b1111;elsekey_rst <= {sw4,sw3,sw2,sw1};reg[3:0] key_rst_r;always @(posedge clk or negedge rst)if(!rst)key_rst_r <= 4'b111;elsekey_rst_r <= key_rst;wire[3:0] key_an = key_rst_r & (~key_rst);reg[19:0] cnt;always @(posedge clk or negedge rst)if(!rst)cnt <= 0;else if(key_an) cnt <= 0;else cnt <= cnt+1'b1;reg [3:0] low_sw;always @(posedge clk or negedge rst)if(!rst)low_sw <= 4'b1111;else if(cnt==10'hfffff)low_sw <= {sw4,sw3,sw2,sw1};reg[3:0] low_sw_r;always @(posedge clk or negedge rst)if(!rst)low_sw_r <= 4'b1111;elselow_sw_r <= low_sw;wire [3:0] led_ctrl = low_sw_r[3:0] & (~low_sw[3:0]);reg d1,d2,d3,d4;always @(posedge clk or negedge rst)if(!rst) begind1 <= 0;d2 <= 0;d3 <= 0;d4 <= 0;endelse beginif(led_ctrl[0]) beginnum <= num+1;if(num==9)num <= 0;endendalways @(posedge clk ) beginwei <= 4'b1111;case(num)0: seg <= 8'hfc;1: seg <= 8'h60;2: seg <= 8'hda;3: seg <= 8'hf2;4: seg <= 8'h66;5: seg <= 8'hb6;6: seg <= 8'hbe;7: seg <= 8'he0;8: seg <= 8'hfe;9: seg <= 8'hf6;default: seg <= 8'h02;endcaseendendmodule参考了特权的代码。
状态机实现去抖动原理:按键去抖动关键在弄提取键稳定的电平状态,滤除前沿、后沿抖动毛刺。
对于一个按键信号,可以用一个脉冲对它进行取样,如果连续三次取样为低电平,可以认为信号已经处于键稳定状态,这时输出一个低电平的按键信号。
继续取样的过程如果不能满足连续三次取样为低,则认为键稳定状态结束,这时输出变为高电平。
设计的状态转换图如图所示。
Reset信号有效时,电路进入复位状态s0,这时认为取样没有检测到低电平,在输入取样过程中,每次检测到一个低电平,发生依次向下的状态转移,直到连续检测到三个低电平时,进s3态,这时输出置低(按键信号稳定态),在中间状态s1,s2时,一旦检测到高电平,就进入s0状态,重新检测。
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;beginprocess( reset, clk )beginif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;end process;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 ;end rtl;程序中din为要去抖动的热键信号,dou为去抖后输出的稳定信号。
51单片机按键消抖程序原理一、引言按键消抖是嵌入式系统编程中常见的问题之一,尤其是在使用51单片机时。
51单片机是一款常用的微控制器,广泛应用于各种嵌入式系统中。
按键作为常见的输入设备,在51单片机应用中经常被使用。
由于按键的机械特性,当按键按下或释放时,会产生机械抖动,给系统带来误操作。
因此,了解并编写按键消抖程序对于保证系统的正常运行至关重要。
二、消抖原理按键消抖,简单来说,就是通过一定的算法,消除按键产生的机械抖动,从而准确识别按键的状态。
其原理主要基于以下两点:1.机械抖动的特点:按键的机械抖动主要表现为按键触点之间的快速开关,产生一系列微小的电信号。
这些信号通常包含真实的按键输入信号和噪声信号。
2.消抖算法:通过分析这些信号,识别出真实的按键输入信号,并忽略噪声信号,从而达到消除机械抖动的目的。
常用的消抖算法有阈值比较法、防抖延时法、防抖滤波法等。
三、消抖程序实现下面以51单片机为例,介绍一种简单的阈值比较法消抖程序实现:```cvoidkey_debounce(intkey_pin){//定义按键引脚intdebounce_time=50;//消抖时间,单位毫秒intthreshold=5;//阈值,可以根据实际情况调整intkey_state=0;//按键状态,初始化为0(未按下)intlast_key_state=0;//上一次的按键状态while(1){//读取按键状态key_state=digitalRead(key_pin);last_key_state=key_state;//判断按键是否按下if(key_state==LOW){//按键按下,开始消抖if(millis()-last_key_state>=debounce_time){//经过一定时间,确定按键状态if(key_state==digitalRead(key_pin)){//检测到真实的按键输入信号//这里可以进行相应的操作,例如点亮LED灯等}else{//检测到噪声信号或其他干扰,忽略}}else{//消抖时间不足,忽略当前状态}}else{//按键释放,忽略当前状态}}}```上述程序中,通过设置一个阈值和消抖时间,来判断按键状态是否发生变化。
单片机按键去抖动程序设计思路1.硬件电路设计为了能够较好地去抖动按键,我们可以在按键的输入引脚上加一个RC组合电路,以延迟触发信号的上升沿和下降沿,从而消除抖动。
RC组合电路一般由一个电阻R和一个电容C组成,其原理是通过RC的时间常数来控制信号的上升和下降过程。
2.软件设计在单片机程序中,我们需要采取一定的算法来检测按键的真实触发信号,下面是一个简单的按键去抖动的程序设计思路:(1)初始化首先,我们需要对按键的输入引脚进行初始化,配置为输入模式,并设置为上拉电阻模式。
这样可以确保在按键未按下时,输入引脚保持高电平。
(2)读取按键状态通过读取按键的输入引脚状态,来判断当前按键是否处于按下状态。
一般来说,输入引脚为高电平时表示按键未按下,为低电平时表示按键已按下。
(3)去抖动算法当检测到按键状态发生变化时,即从未按下到按下或从按下到未按下,可以认为触发了一次按键操作。
在这个过程中,我们需要使用去抖动算法来过滤掉抖动信号。
常见的去抖动算法有两种:软件延时法和状态延时法。
软件延时法是通过在检测到按键状态发生变化后,延时一段时间,再次读取按键状态来判断是否真正触发了按键操作。
通过调整延时时间,可以达到去抖动的效果。
但是使用软件延时法会占用较多CPU时间,因此在需要很高响应速度的系统中不适用。
状态延时法是通过引入一个状态变量,用来保存按键的状态。
在检测到按键状态发生变化后,将状态置为相反的值,并延时一段时间。
在延时结束后,读取按键状态和状态变量的值,如果相等则认为触发了按键操作,否则不触发。
需要注意的是,为了防止按键的持续震动导致多次触发,我们一般会设置一个最小的按键触发间隔。
即在两次按键操作之间需要间隔一段时间,才能再次触发。
(4)执行按键操作当确认触发了按键操作后,我们可以执行相应的操作,如触发一个中断、改变LED灯的状态等。
通过上述程序设计思路,可以实现按键去抖动的功能,从而得到准确的按键触发信号。
当然,具体的实现还需要根据具体的单片机平台和开发环境来进行调整。
FPGA入门系列实验教程——按键消抖控制LED亮灭1.实验任务实现按键控制LED亮灭。
通过这个实验,掌握采用Verilog HDL语言编程实现按键控制LED亮灭及按键消抖方法。
2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。
软件实验环境为Quartus II8.1开发软件。
3.实验原理当独立按键key1按下后,相应的LED被点亮;再次按下后,LED做翻转输出,即LED熄灭,从而实现按键控制LED亮灭。
本实验对按键进行了消抖处理。
作为机械开关的按键,操作时,机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造成误触发。
按键去抖动的关键在于提取稳定的低电平状态,滤除前沿、后沿抖动毛刺。
按键消抖处理一般有硬件和软件两种方法。
软件消抖是检测到有触发后,延时一段时间后再检测触发状态,如果与之前检测到的状态相同,则认为有按键按下;如果没有则认为是误触发。
硬件就是加去抖电路。
4.实验程序module key_debounce(rst_n,clk,key,led);input rst_n;input clk;input key;output led;//通过降采样对key的输入做低通滤波,将其高频分量滤除,得到low_sw值reg[17:0]cnt;always@(posedge clk)if(!rst_n)cnt<=18'd0;elsecnt<=cnt+1'b1;wire sample_pulse=cnt==18'h3ffff;reg low_sw;always@(posedge clk)if(!rst_n)low_sw<=1'b1;else if(sample_pulse)low_sw<=key;//在整个low_sw(active_low)有效过程中取一个控制量作为led的控制信号//本实例中使用low_sw的下降沿reg low_sw_r;//将low_sw信号锁存一个时钟周期,延时不是真的“锁存”always@(posedge clk)low_sw_r<=low_sw;wire led_ctrl=low_sw_r&(!low_sw);reg led;always@(posedge clk or negedge rst_n)if(!rst_n)led<=1'b0;else if(led_ctrl)led<=~led;endmodule5.实验步骤(1)建立新工程项目:打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目key_debounce。
贝朗抖抖机按键说明书首先,感谢您购买贝朗抖抖机。
本说明书将为您详细介绍抖抖机的按键功能和使用方法。
一、按键介绍抖抖机共有五个按键,分别是:1.开/关键:长按此键3秒可启动或关闭抖抖机。
2.模式切换键:按下此键可切换不同的抖动模式。
3.音量加键:按下此键可调节抖抖机的声音大小。
4.振动强度加键:按下此键可增加抖抖机的振动强度。
5.设置键:长按此键3秒可进入设置界面,进行相关设置操作。
二、按键功能详解1.开/关键:长按此键3秒可开启或关闭抖抖机。
开启后,抖动机会根据设置好的模式和参数进行抖动操作。
关闭后,抖抖机停止工作。
2.模式切换键:按下此键可切换不同的抖动模式。
抖动机有多种内置模式可供选择,如连续抖动、交替抖动、随机抖动等。
每次按下此键,抖抖机会切换到下一个模式。
3.音量加键:按下此键可调节抖抖机的声音大小。
每次按下此键,抖抖机的声音会逐步增大。
长按此键3秒可以静音抖抖机。
4.振动强度加键:按下此键可增加抖抖机的振动强度。
抖抖机的振动强度可以逐步增大,以满足不同用户的需求。
5.设置键:长按此键3秒可进入抖抖机的设置界面,进行相关设置操作。
在设置界面中,您可以调整抖抖机的模式、振动强度、声音大小等参数。
三、注意事项1.请在使用前确保抖抖机已经充电完成,以免因电量不足而影响正常使用。
3.抖抖机仅适用于放松、按摩等常见需求,不适合用于治疗或诊断任何疾病,请勿将其误用。
4.请勿将抖抖机浸入水中,以免发生短路或损坏机器。
5.请勿在睡眠或疲劳的情况下使用抖抖机,以免因过度使用导致身体不适。
6.使用过程中,请注意保持机器的清洁和卫生,避免积存灰尘或污垢。
四、使用方法1.打开包装,取出抖抖机及相关附件。
2.连接抖抖机的电源线,将其插入电源插座进行充电。
3.充电完成后,按下抖抖机的开/关键3秒,启动抖抖机。
4.可根据需要按下模式切换键、音量加键和振动强度加键,调整抖抖机的模式、声音大小和振动强度。
5.使用完毕后,按下开/关键3秒,关闭抖抖机。
c语⾔按键防抖程序,按键防抖处理程序按键防抖处理程序来源:--作者:--浏览:1628时间:2016-08-10 14:18标签:摘要:/***************************************************** 本程序的⽬标是这样的: 1:不使⽤INTn中断功能,按键接在普通IO上 2:由定时器T/C2每隔⼀段时间检测按键⼀次, 并具有防抖动功能 3:每点击按键⼀次,在按键松开后,变量A=A+1 4:如果按键按下后不放,则每隔 n/*****************************************************本程序的⽬标是这样的:1:不使⽤INTn中断功能,按键接在普通IO上2:由定时器T/C2每隔⼀段时间检测按键⼀次, 并具有防抖动功能3:每点击按键⼀次,在按键松开后,变量A=A+14:如果按键按下后不放,则每隔 n ms 就做A=A+1运算⼀次5:在按键按下期间,CPU除了处理按键外,还必须能正常运⾏主程序6:本程序的系统时钟是1MHz*****************************************************/ #include#include#include unsigned char A,B;unsigned char n;bit step1, step2, step3,step4; //使⽤⼏个位变量记忆按键状态//***************************************************interrupt [10] void TC2_OVF(void){if(n<255) n++;if(PIND.2==1 && n>8) step1=1; //按键松开⼀定时间后开始进⼊可⽤状态if(PIND.2==0 && step1) {step1=0; step2=1; n=0;} //按键由可⽤状态进⼊到按下状态if(PIND.2==1 && step2) {step2=0; step3=1; n=0;} //按键由按下状态进⼊到松开状态//-------------------------------------------------//按键按下后...if(step2){n++;if(n>60) //如果按下超过⼀定时间{A+=1;n=40;step4=1;}}//-------------------------------------------------if(step3) //按键松开后...{step3=0;if(step4) step4=0; else A+=1;}} //***************************************************//www。
按键消抖原理
按键消抖通俗来说就是在按下或松开按键时,由于机械性能的限制,会出现短时间内多次开关状态的变化,这种现象称为按键抖动。
对于需要按键精准响应的电子设备而言,按键抖动会给正常使用带来很大的干扰。
按键消抖的原理是通过软件算法实现。
一般来说,消抖分为两个阶段:第一阶段叫做消除抖动,第二阶段叫做确认有效。
具体做法是在按键按下时,先等待一段时间(一般为几毫秒),然后读取按键的状态。
如果读取到的状态与第一次读取到的状态相同,就确认按键是有效的;如果读取到的状态与第一次不同,则重新进行第一阶段的消抖处理。
按键消抖的实现方法有多种,其中比较常见的是基于中断处理的方法和基于定时器的方法。
基于中断处理的方法是指在按键按下时,通过中断函数来响应按键事件,并进行消抖处理;基于定时器的方法是指通过定时器设定一定时间,在这段时间内进行按键状态的检测和消抖处理。
无论采用哪种方法,按键消抖的原理都是一样的。
综上所述,按键消抖是通过软件算法实现的,可以有效地消除按键抖动对电子设备的干扰。
在实际应用中,需要根据实际情况选择合适的消抖方法和参数,以达到最佳的按键响应效果。
- 1 -。
按键去抖说明-CAL-FENGHAI.-(YICAI)-Company One1由于机械触点的弹性振动,按键在按下时不会马上稳定地接通而在弹起时也不能一下子完全地断开,因而在按键闭合和断开的瞬间均会出现一连串的抖动,这称为按键的抖动干扰,其产生的波形如图所示,当按键按下时会产生前沿抖动,当按键弹起时会产生后沿抖动。
这是所有机械触点式按键在状态输出时的共性问题,抖动的时间长短取决于按键的机械特性与操作状态,一般为10~100ms,此为键处理设计时要考虑的一个重要参数。
按键的抖动会造成按一次键产生的开关状态被CPU 误读几次。
为了使CPU 能正确地读取按键状态,必须在按键闭合或断开时,消除产生的前沿或后沿抖动,去抖动的方法有硬件方法和软件方法两种。
1. 硬件方法硬件方法是设计一个滤波延时电路或单稳态电路等硬件电路来避开按键的抖动时间。
图是由R2 和C 组成的滤波延时消抖电路,设置在按键S 与CPU 数据线Di 之间。
按键S 未按下时,电容两端电压为0,即与非门输入V i 为0,输出V o 为1。
当S 按下时,由于C 两端电压不能突变,充电电压V i 在充电时间内未达到与非门的开启电压,门的输出V o将不会改变,直到充电电压V i 大于门的开启电压时,与非门的输出V o 才变为0,这段充电延迟时间取决于R1、R2 和C 值的大小,电路设计时只要使之大于或等于100ms 即可避开按键抖动的影响。
同理,按键S 断开时,即使出现抖动,由于C 的放电延迟过程,也会消除按键抖动的影响图中,V1 是未施加滤波电路含有前沿抖动、后沿抖动的波形,V2 是施加滤波电路后消除抖动的波形。
2. 软件方法软件方法是指编制一段时间大于100ms 的延时程序,在第一次检测到有键按下时,执行这段延时子程序使键的前沿抖动消失后再检测该键状态,如果该键仍保持闭合状态电平,则确认为该键已稳定按下,否则无键按下,从而消除了抖动的影响。
同理,在检测到按键释放后,也同样要延迟一段时间,以消除后沿抖动,然后转入对该按键的处理。
单片机按键防抖策略及实用代码笔者从事单片机类工作多年,碰到过很多问题,也成功解决过很多问题。
闲来无事想分享一些经验、心得,今天就聊一下按键防抖的问题,希望能够帮助到大家。
按键分好多种,就拿微动(非自锁) 开关举例吧,如下图1为实物,图2为原理。
大家注意,按键S1两端并没有并联104或103消抖电容,其实是出于成图1图2本考虑,因为有的行业每天生产电路板达100000个,如果每个电容按0.03元计算,那么每天因为一个电容产生的成本为3000元,那一年多出的成本呢?所以就需要软件消抖了,软件的价值就体现出来了。
为了找到按键抖动的一般规律,笔者接上示波器测量开关S1两端的波形,通过数百次按动按键,挑选了3组非常有代表性的波形,理想波形如下图3:图3可惜的是理想波形出现的概率比较低,实际的波形基本都存在不同程度的抖动,如下图4和图5:图4图5其实抖动的原因多半是按动时触点接触不实,触点有油污,氧化等等。
抖动电平的特点是持续时间较短,时间上靠近触点接触的时刻。
此按键的抖动时间不超过5ms,其他按键的抖动时间可能会更长,实际以示波器测量为准。
有了以上测量和分析,就要考虑如何过滤抖动,避免按键功能异常。
笔者整理了两个思路,使用场景有些区别,需要根据实际情况灵活选择。
第一个思路:判断按键连续低电平的时间是否超过(15ms~30ms),适合非自锁按键短按或长按,代码段示例如下:void ReadKey(void) //微动(非自锁) 开关检测,假设函数1ms运行一次{static unsigned short int key_counter=0; //统计按键按下且持续低电平的时间if(IO == 1) //IO口识别到高电平(可能是按键松开或按下时出现了高电平抖动) {key_counter=0; //持续低电平时间计数器清0,重新等待低电平}else //IO口识别到低电平{if(key_counter < 3000) //计数器限制最大值,防止溢出key_counter++; //持续低电平时间计数器累加if(key_counter == 20) //持续低电平时间达到20ms(按键短按){短按用户代码}else if(key_counter == 3000) //持续低电平时间达到3000ms(按键长按){长按用户代码}}}第二个思路:延时一段固定的时间,再判断哪个电平的持续时间长,适合自锁开关或拨动开关,代码段示例如下:unsigned char ReadKey(void)//拨动(或自锁) 开关检测,假设函数1ms运行一次{static unsigned short int high_level_counter=0; //一段时间内高电平的时间static unsigned short int low_level_counter=0; //一段时间内低电平的时间static unsigned short int judge_counter=0; //时间长度计数器static unsigned char level_value=1; //开关的返回值judge_counter++; //时间长度累计if(IO == 1) //IO口识别到高电平{if(high_level_counter < 25)high_level_counter++; //高电平时间计数累加}else //IO口识别到低电平{if(low_level_counter < 25)low_level_counter++; //低电平时间计数累加}if(judge_counter > 25) //固定延时时间(15~30ms)到,判定有效电平状态{judge_counter =0;if(high_level_counter > low_level_counter) //高电平时间>低电平时间{if(high_level_counter > 20) //高电平总时间超过固定时间的一半{level_value = 1; //此时判定IO口为高电平可以在此添加用户高电平功能代码}}else if(low_level_counter > high_level_counter) //低电平时间>高电平时间{if(low_level_counter > 20) //低电平总时间超过固定时间的一半{level_value = 0; //此时判定IO口为低电平可以在此添加用户低电平功能代码}}high_level_counter = 0;low_level_counter = 0;}return level_value; //返回开关的值}以上是笔者实际使用的两段防抖代码,测试效果很好。
一、实验电路图、状态图、流程图、程序代码、仿真代码、仿真波形图(可以只写出核心功能代码,代码要有注释)
设计思路:
在第一个状态时,等待按键按下,一旦有按键按下(按键下降沿到来),便跳转到第二个状态,抖动滤除状态。
在第二个状态,有检测到高电平(上升沿),就会被认为是毛刺,进而返回第一个状态继续等待下降沿。
等毛刺被滤除后(计数满)则进入按下稳定状态。
在按下稳定状态,等待释放(上升沿),同按键按下的状态,再次滤除释放按键的抖动。
等抖动滤除后,恢复到第一个状态。
状态转移图:
程序代码:
译码器模块:
Modelsim测试代码:
Modelsim功能仿真波形图:。
按键去抖动
一、实验目的
1、学习基于VHDL 描述状态机的方法;
2、学习 VHDL 语言的规范化编程,学习按键去抖动的原理方法。
二、实验平台
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。
三、设计要求
机械式轻触按键是常用的一种外围器件,由于机械原因导致的抖动会使得按键输入出现毛
刺。
设计一个按键去抖动电路,并用按键作为时钟,结合计数器观察去抖动前后的效果有什么不同。
四设计方案
思路提示:按键去抖动通常采用延时判断的方法,去除按键过程中出现的毛刺。
其实现过程是:当查询到按键按下时,延时一段时间再去判断按键是否仍然被按下,若是则此次按键有
效,否则看作是干扰。
这可以利用状态机来实现,
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity qudou is
port(
clk, en: in std_logic;
sp: out integer range 0 to 7);
end qudou ;
architecture behave of qudou is
type state is (S0,s1,s2);
signal z: std_logic;
signal q: integer range 0 to 2; signal a: integer range 0 to 7; signal s: state;
begin
p1:process(clk)
begin
if(clk'event and clk = '1') then
if en='1' then
if q=2 then
q<=q;
else q<=q+1;
end if;
else q<=0;
end if;
if q=2 then
z<='1';
else z<='0';
end if;
case s is
when s0=>
if (z = '0') then
s<=s0;a<=a;
else
s<=s1;a<=a+1;
end if;
when s1=>
if (z='0') then
s<=s0;a<=a;
else
s<=s2;a<=a;
end if;
when s2=>
if (z='0') then
s<=s0;a<=a;
else
s<=s2;a<=a;
end if;
end case;
sp<=a;
end if;
end process p1;
end behave;
五.实验结果:。