verilog按键消抖原理
- 格式:docx
- 大小:16.71 KB
- 文档页数:2
module mybut(rst_n,clk,key_in,wei,duan);input rst_n,clk;input key_in;output wei;output[7:0]duan;wire key_edge;reg[7:0]duan;wire wei;reg[3:0]out;reg clkdiv;reg[25:0]cnt;reg key1,key2,key3,buff;////------------------------------------------------------------------------------------分频模块------------------------------------------------------------------------------////always@(posedge clk)beginif(!rst_n)cnt <=0;else if(cnt==2500000)begincnt <=0;clkdiv <=1'b1;endelse begincnt <=cnt+1;clkdiv <=1'b0;endend////------------------------------------------------------------------------在分频时钟下多次采样,消抖--------------------------------------------------------////always@(posedge clkdiv)beginif(!rst_n)beginkey1<=0;key2<=0;key3<=0;endelse beginkey1<=key_in;key2<=key1;key3<=key2;endend////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////buff 与(key1,key2,key3)之间有寄存器【熟悉边沿检测电路】//------------------------------------------在上升沿作用------------------------------------------//先有buff==0,后有key1&key2&key3==1上升沿//always@(posedge clk)begin//buff<=key1&key2&key3;//end//edge=~buff&(key1&key2&key3);//检测按键上升沿key_edge//assign key_//-------------------------------------------在下降沿作用----------------------------------------//先有buff==1,后有key1|key2|key3==0下降沿always@(posedge clk)beginbuff<=key1|key2|key3;endedge=~(key1|key2|key3)&buff;//检测按键下降沿key_edgeassign key_/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// always@(posedge clk)beginif(!rst_n)out<=0;else if(key_edge)beginif(out==9)out<=0;elseout<=out+1;endend////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// assign wei=1'b0;always@(*)case(out)0:duan=8'b11111100;//0duan1:duan=8'b01100000;//1【7】1342:duan=8'b11011010;//2【6】1353:duan=8'b11110010;//3【5】1364:duan=8'b01100110;//4【4】1375:duan=8'b10110110;//5【3】1266:duan=8'b10111110;//6【2】1297:duan=8'b11100000;//7【1】1328:duan=8'b11111110;//8【0】1339:duan=8'b11110110;//9default:duan=8'b11111100;//0endcaseendmodule。
vivado按键消抖原理按键消抖是指在数字电路中,当按键按下或释放时,由于按键机械开关的特性,会导致电路出现不稳定的信号状态。
这种不稳定状态可能会导致错误的触发,例如出现多次触发或漏触发。
因此,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
按键消抖的原因主要有两个方面。
首先,按键机械开关的接触面存在微小的弹跳现象,当按键按下或释放时,接触面会在短时间内反复接触和分离,导致电路信号出现多次变化。
其次,由于电路中存在的噪声干扰,也会使得按键信号产生抖动。
为了解决按键消抖问题,可以采用硬件和软件两种方法。
硬件方法主要通过添加滤波电路或使用稳定的按键开关来消除按键弹跳现象。
滤波电路可以通过RC电路或者使用专用的按键消抖芯片来实现。
而软件方法主要通过在数字电路中添加按键消抖算法来处理按键信号。
在Vivado中,按键消抖可以通过使用状态机来实现。
状态机是一种用于描述系统行为的模型,可以根据输入信号的状态变化来改变系统的状态和输出。
在按键消抖中,可以使用状态机来检测按键信号的变化,并根据一定的状态转换规则来消除按键弹跳现象。
具体实现时,可以将按键信号作为输入,将按键状态和输出作为状态机的状态和输出。
当按键信号发生变化时,状态机会根据一定的状态转换规则进行状态转换,并输出消抖后的按键信号。
常用的状态转换规则包括按键按下时状态转换为按下状态,按键释放时状态转换为释放状态,以及连续按键时状态不变。
在Vivado中,可以使用Verilog或VHDL等硬件描述语言来编写状态机代码。
首先,需要定义状态机的输入、输出和状态变量,并初始化各个变量的初始值。
然后,需要编写状态转换规则和输出逻辑,根据输入信号的状态变化来改变状态和输出。
最后,需要将状态机代码综合生成对应的逻辑电路,并进行仿真和验证。
总结起来,按键消抖是数字电路设计中常见的问题,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
在Vivado中,可以使用状态机来实现按键消抖,通过定义状态转换规则和输出逻辑,消除按键弹跳现象。
笔记2 键盘消抖(别人的笔记)老实说,这个实验的开始之前和之后,都给我蛋疼了。
时钟了解不到源码的思路,边看源码边睡着。
醒来的时候既然“惊”一下,相通了......module lesson02(CLK, RST,SW0, SW1, SW2,LED0, LED1, LED2);input CLK;input RST;input SW0, SW1, SW2;output LED0, LED1, LED2;//---------------------------------------------------------------------------//Detect the switch pressingreg [2:0] Press0;reg [2:0] Press1;wire [2:0] isPress;always @ (posedge CLK or negedge RST)if(!RST)Press0 <= 3'b111;elsePress0 <= {SW0, SW1, SW2}; //read the pin result;always @ (posedge CLK or negedge RST)if(!RST)Press1 <= 3'b111;elsePress1 <= Press0; //read the previous Press0 resultassign isPress=Press1 & (~Press0); //detect the logic with bit is changed from logic 1 to 0 //---------------------------------------------------------------------------//if pressing, counter start counting for 20msreg [19:0] Counter; //计数寄存器always @ (posedge CLK or negedge RST)if(!RST)Counter <= 20'd0;else if(isPress)Counter <= 20'd0;elseCounter <= Counter + 1'b1; //increment for counter//------------------------------------------------------------------------//After 20ms read the key pin resultreg [2:0] Press2;reg [2:0] Press3;wire [2:0] Result;always @ (posedge CLK or negedge RST)if(!RST)beginPress2 <= 3'b111;Press3 <= 3'b111;endelse if(Counter == 20'hfffff)Press2 <= {SW0, SW1, SW2}; //read the pin result after 20mselsealways @ (posedge CLK or negedge RST)if(!RST)elsePress3 <= Press2; //read the previous pin resultassign Result = Press3 & (~Press2); //detect the changing bit from logic 1 to 0//------------------------------------------------------------------------//turn on led with pin resultreg D1;reg D2;reg D3;always @ (posedge CLK or negedge RST)if(!RST)beginD1 <= 1'b0;D2 <= 1'b0;D3 <= 1'b0;endelsebeginif( Result[0] ) D1 <= ~D1;if( Result[1] ) D2 <= ~D2;if( Result[2] ) D3 <= ~D3;endassign LED0 = D1 ? 1'b1 : 1'b0;assign LED1 = D2 ? 1'b1 : 1'b0;assign LED2 = D3 ? 1'b1 : 1'b0;endmodule这个实验主要有计数器和边缘检查来实现按键消抖,按键功能。
前几天看了特权同学用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参考了特权的代码。
Verilog按键消抖的理解按键在按下时会产生抖动,释放时也会产生抖动,所以在设计键盘扫描程序时必须考虑按键的消抖,我们一般只考虑按下时的抖动,而放弃对释放时抖动的消抖。
抖动时间一般为20ms左右。
按下的最终结果是低电平'在单片机设计的的按键去抖思路是:检测到按下时延时20ms,再检测,如果状态仍为按下,贝U确认是按下的;如果状态为弹起的,则确认是干扰,无按键按下。
图1 按键抖动特性有一个概念要理一下,按键按下时会有抖动,也就是说我们其实只按一次,但是实际产生的“ 按下” 却是许多次的,这些许多次集中在这20ms 里。
我们按的只是一次,而实际却产生了许多次,那么就必须滤除其他的次数。
单片机为了得到真正的“ 按下”,通过延时20ms,把其他的“按下” (也就是抖动)给滤除了。
然后再次判断是否有按下,因为有的时候干扰很大。
而在FPGA中,基于下面的程序,理解如下:在这个程序里检测按键是否按下的方法是脉冲边沿检法。
而在单片机里是判断是否为低电平的方法(那么在FPGA中可不可以也用这个方法呢?)第一次检测到后,启动20ms 计数器,时间到后再检测。
这里的检测方法跟脉冲边沿检测法有异曲同工之处,FPGA过20ms检测按键是否按下,存储检测到的值,并且按位取反与前一个20ms检测的值相与,得到一个值,如果为1,则判断按键按下,否则则无按下。
所以跟单片机按键扫描的原理是一样的,不同的是检测方法不一样。
图2 FPGA 按键的理解示意图其中key_an 寄存器的功能是检测第一次的 “按 下”,是ent 的启动标志位。
通过也能滤除干扰信 号。
led_etrl是确实有按键按下的信号,维持一个时钟周期。
特权同学的Verilog 键盘扫描程序// 说明:当三个独立按键的某一个被按下后,相应的LED 被点亮;//再次按下后,LED 熄灭,按键控制 LED 亮灭 modulesw_debounce( clk,rst_n, sw1_n,sw2_n,sw3_n,下的JS生 谨产汞 按时彼伺隔勿吧时间轴110 UCi 111] 边沿唸迴注检测到"m 零汁数器并启动⑷矶的 时间计数 tn in no 110led_d1,led_d2,led_d3);input clk; // 主时钟信号,50MHzinput rst_n; // 复位信号,低有效input sw1_n,sw2_n,sw3_n; // 三个独立按键,低表示按下output led_d1,led_d2,led_d3; // 发光二极管,分别由按键控制// ----------------------------------------------reg[2:0] key_rst;always @(posedge clk or negedge rst_n)if (!rst_n) key_rst。
按键消抖的原理一、引言在电子设备中,按键是常见的输入方式。
然而,由于按键的机械结构,当按下或松开按键时,会产生机械弹跳现象,导致信号出现多次跳变,这就是所谓的“按键抖动”现象。
为了避免这种现象对电路造成干扰,需要进行按键消抖处理。
二、什么是按键消抖?按键消抖是指在接收到按键信号后,在一定时间内只处理一次信号,并且保证该信号为有效信号。
其目的是消除因机械结构引起的多次跳变信号。
三、按键消抖的原理1. 机械弹跳原理在了解按键消抖原理之前,需要先了解机械弹跳原理。
当按下或松开一个开关时,由于接触面积有限和金属表面不完全平整等因素影响,开关触点会发生不稳定震荡,并在短时间内反复接通和断开。
这种现象称为“机械弹跳”。
2. 软件处理原理软件处理原理是通过程序来实现对按键状态进行检测和判断的方式。
具体实现方法包括:轮询法、中断法、计时法等。
(1)轮询法轮询法是指通过循环检测按键状态的方式来实现按键消抖。
具体实现方法为:在主程序中设置一个循环,不断检测按键状态,当检测到按键被按下时,进行一定的延时后再次检测按键状态,如果依然是按下状态,则判断为有效信号。
(2)中断法中断法是指通过外部中断来实现对按键状态进行检测和判断的方式。
具体实现方法为:将按键连接到微控制器的外部中断引脚上,在程序中设置好相应的中断服务程序,当检测到外部中断信号时,进入相应的中断服务程序进行处理。
(3)计时法计时法是指通过定时器来实现对按键状态进行检测和判断的方式。
具体实现方法为:当检测到按键被按下时,启动定时器并开始计数,在一定时间内只处理一次信号,并保证该信号为有效信号。
四、硬件处理原理硬件处理原理是通过使用电路元件来实现对按键消抖的方式。
具体包括RC滤波器、Schmitt触发器、反相器等。
1. RC滤波器RC滤波器是将电容和电阻组合在一起,利用电容的充放电特性实现对信号的滤波。
当按键被按下时,由于电容的充放电时间常数较长,可以使机械弹跳信号被滤除。
按键消抖的原理和基于verilog的消抖设计按键开关是各种电子设备不可或缺的人机接口。
在实际应用中,很大一部分的按键是机械按键。
在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。
在系统设计中,有各种各样的消除按键抖动的设计方法,硬件电路和软件设计都很成熟。
不过我们这里要从另外一个角度来讨论按键的消抖,并给出一个用verilog给出一个具体的实现。
首先,看一个普通的机械按键的触点在闭合与断开时的波形(用示波器抓取)。
下面的四张图都是按键在闭合的时候抓到的波形。
可以看到两个明显的趋势:1. 按键在几个us之内就可以达到稳定状态,从高电平转换到底电平;2. 在高电平转换到低电平的过程中,触点有非常明显的抖动。
下面的两张图是按键在断开的时候抓到的波形。
也可以看到两个明显的趋势:1. 按键的变化趋势比较缓慢,从低电平变为高电平需要大概10~20ms的时间;2. 按键断开时没有闭合时那么大的抖动下面两张图是用手迅速闭合按键然后就断开时,按键的输出波形。
在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。
所以,对于按键消抖的处理,必须按最差的情况来考虑。
我们从上面的图上可以看到,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。
按键一次闭合最短的时间大概是120ms 左右。
如果我们把按键的输出做为一个时钟域(时钟频率未知,但信号的slow rate是已知的,既最大20ms左右)的信号,用另外一个时钟来采集这个按键的输出,则就可以把按键的消抖归结为一个最基本的CDC问题来处理。
而问题的核心是如何确定采集时钟的频率。
假设采集时钟的周期小于20ms,那么,采集时钟就有可能两次采到按键断开时的不。
按键消抖原理
按键消抖原理是指通过某种方法在按键被按下或松开时,消除或减少按键的抖动现象,使输入信号得到稳定的识别和处理。
在实际应用中,按键在被按下或松开时,由于机械结构的原因,往往会引起按键的不稳定状态,表现为按键在短时间内多次触发开关。
这种按键抖动不仅会导致输入信号的波动,还可能对系统造成误操作或不良影响。
为了解决按键抖动问题,常用的按键消抖原理主要有以下几种:
1. 软件延时消抖:通过在程序中设定一个适当的延时时间,当按键被按下或松开后,延时一段时间再读取按键状态,以判断按键是否稳定。
如果经过延时后按键状态仍然相同,则可以认为按键已经稳定按下或松开,从而减少抖动的影响。
2. 硬件滤波消抖:通过在按键电路上设计滤波器或添加电容元件,可以对按键信号进行滤波处理,去除短时间内的干扰信号,使输入信号更加稳定。
常用的滤波电路包括RC滤波电路、OTA滤波电路等。
3. 状态改变检测消抖:在按键电路中,通过检测按键的状态变化来判断按键是否按下或松开。
当按键在短时间内发生多次状态变化时,只会认为按键状态发生了一次改变,从而忽略了抖动现象。
这种方式适用于按键状态改变的速度较慢的情况。
通过以上的按键消抖原理,可以有效地减少按键抖动现象,提
高按键输入的可靠性和稳定性。
在实际应用中,可以根据具体情况选择适合的原理和方法来实现按键消抖,以满足不同的需求。
下面是转的一个源码,俺没有细看,有兴趣的看看,讲讲如何// author: Dandy Nee// mail: dandynee@// module: HW KeyScan Module// version:0.1// **************************// all functions are provided as if okay// run at your own risk// **************************//// problem: there is one keyvalue valid// indicator signal needed////------------------------------------------------//// ^ ^ ^ ^ Pull Up// | | | |// x0 >--|--|--|--|-// x1 >--|--|--|--|-// x2 >--|--|--|--|-// x3 >--|--|--|--|-// y0 <--+ | | |// y1 <-----+ | |// y2 <--------+ |// y3 <-----------+//module m_keyscan(clk, //system clkrstb, //system a-rst, low active//clkdiv, //clock divide coef//keyvalue, //returned key//x, //x-row scan outy //y-col scan in);input clk, rstb;input [19:0] clkdiv;output [15:0] keyvalue;output [3:0] x;input [3:0] y;reg [19:0] cnt;always @(posedge clk or negedge rstb) if(~rstb)cnt<=0;elsecnt <= cnt==clkdiv ? 0 : cnt+1;reg clken;always @(posedge clk or negedge rstb) if(~rstb)clken <= 0;elseclken <= cnt==clkdiv;reg [2:0] fsm;always @(posedge clk or negedge rstb) if(~rstb)fsm <= 0;else if(clken)fsm <= fsm+1; //8 statesreg [15:0] keyvalue;reg [3:0] x;always @(posedge clk or negedge rstb) if(~rstb)keyvalue <= 0;else if(clken)case(fsm)0: beginx <= 4'b1110;end1: beginkeyvalue[3:0] <= ~y;end2: beginx <= 4'b1101;end3: beginkeyvalue[7:4] <= ~y;end4: beginx <= 4'b1011;end5: beginkeyvalue[11:8] <= ~y;end6: beginx <= 4'b0111;end7: beginkeyvalue[15:12] <= ~y;endendcaseendmodule本程序做的只是按键单纯挂在IO上,并不是行列扫描的。
按键消抖原理
按键消抖原理是指在按下按键后,由于机械特性引起的按键跳动现象被过滤掉,保证按键信号的稳定性和可靠性。
按键消抖的实现原理通常是通过软件技术来实现。
下面将介绍两种常见的按键消抖原理。
1. 软件延时消抖原理:
在按键按下时,通过软件延时一段时间,然后再读取按键状态。
软件延时的作用是等待机械抖动的结束,只有当一段时间内按键状态保持不变时,才认为按键真正被按下。
这种方法简单易行,但缺点是消抖时间较长,响应速度较慢。
2. 状态扫描消抖原理:
在按键按下时,通过不断扫描按键状态来判断按键是否真正被按下。
状态扫描的过程是周期性地读取按键状态,如果发现连续几次读取到的按键状态相同,则认为按键稳定,即按键被按下。
这种方法比延时消抖的响应速度更快,但需要一个额外的线程或中断服务程序来执行状态扫描。
以上是两种常见的按键消抖原理,它们都能有效解决按键抖动问题,提高按键信号的稳定性和可靠性。
在具体应用中,可以根据需要选择适合的消抖原理来实现按键的稳定响应。
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 -。
按键消抖的原理引言按键消抖是电子设备中常见的一种技术处理方式,用于解决按键在按下或松开时可能出现的多次触发的问题。
本文将介绍按键消抖的原理、常见的实现方法以及应用场景。
什么是按键消抖?当我们按下或松开一个物理按键时,由于按键弹性或机械性能的原因,按键可能会在短时间内多次切换状态。
这种多次切换状态的现象被称为按键抖动。
按键消抖的目的是通过软件或硬件的方式,保证在按下或松开一个按键时,系统只识别一次按键操作,而不是多次。
按键消抖的原理按键消抖的原理是通过延时和状态稳定来处理按键信号。
通常情况下,按键的信号变化是非常快速的,因此需要通过延时来等待按键信号稳定。
延时的时间设置要根据按键的特性及使用环境而定,一般情况下,10毫秒的延时已经足够。
具体的按键消抖原理如下: 1. 监测按键状态:通过采集按键的电压信号或连接处的电流变化,检测按键的状态。
2. 检测按键抖动:将检测到的按键状态与先前的状态进行比较,判断是否出现按键抖动。
3. 延时处理:当检测到按键状态发生变化时,延时一段时间,等待按键信号稳定。
这段时间的长短要根据按键的特性和使用环境来决定。
4. 状态稳定判断:在延时过后,再次检测按键的状态,如果按键状态仍然保持稳定,则判断为有效的按键操作。
常见的按键消抖实现方法为了实现按键消抖,有多种方法可供选择,下面介绍几种常见的实现方式:软件消抖软件消抖是通过编程的方式来实现按键消抖的。
具体步骤如下: 1. 监测按键状态:在软件中定时采集按键状态。
2. 判断按键状态变化:将采集到的按键状态与先前的状态进行比较,判断是否出现按键抖动。
3. 延时处理:在检测到按键状态变化后,延时一段时间,等待按键信号稳定。
这段时间的长短要根据按键的特性和使用环境来决定。
4. 状态稳定判断:在延时过后,再次检测按键的状态,如果按键状态仍然保持稳定,则判断为有效的按键操作。
硬件消抖硬件消抖是通过电路设计来实现按键消抖的。
FPGA(现场可编程门阵列)是一种可按照用户需求重新配置其硬件资源的可编程硅芯片。
在数字电路中,按键消抖 (Debounce) 是一个非常常见但重要的问题,因为机械按钮在按下和释放时会产生不稳定的信号。
为了解决这个问题,我们需要消除机械按键所产生的抖动信号。
消抖的原理是为输入信号添加处理和判断逻辑,将抖动视为一个单位的无效信号,从而过滤有问题的输入信号。
针对 FPGA,常用的按键消抖方法有以下两种:1. **计数器方法 (Counter Method)**这种方法检测按键输入是否持续一定时间内(假设我们使用n 个时钟周期)保持稳定。
如果输入持续稳定,则将其作为有效输入信号。
通过计数器实现的消抖具备可配置的消抖时间,从而适应各种不同类型的按键。
以下是计数器消抖方法的大致步骤:1. 初始化一个 n 位计数器。
2. 如果按键输入保持稳定(按下或释放),计数器增加,否则计数器清零。
3. 当计数器达到预定的阈值时,改变按键的状态(按下或释放)。
4. **移位寄存器方法 (Shift Register Method)**其实现原理是将多个连续的抖动信号视为一个有效输入,适用于按键抖动时间较短的场景。
以下是移位寄存器消抖方法的大致步骤:1. 初始化一个 n 位移位寄存器。
2. 每个时钟周期将输入信号添加到移位寄存器的低位(或高位),同时向右(或左)移动一位。
3. 当移位寄存器中所有位的值都相同(全为 0 或全为 1)时,认为信号稳定,将其视为有效输入信号。
在消抖方法的选择上,实际应用要考虑系统性能、消抖精度、按键抖动时间等因素。
简单的消抖算法可能只跟踪按键的状态改变,而更高级的算法可以检测按键被按下并保持的持续时间,从而在功能上更灵活。
verilog按键消抖原理
摘要:
1.按键消抖的原理
2.按键消抖的方法
3.基于Verilog 的按键消抖设计
4.结论
正文:
一、按键消抖的原理
按键消抖是指在按键输入过程中,由于按键机械特性和电路特性的影响,导致按键在按下或松开时,信号电平会在一段时间内发生抖动。
为了消除这种抖动,需要采用一定的方法来确认按键输入的稳定性,这就是按键消抖。
二、按键消抖的方法
常见的按键消抖方法有以下几种:
1.硬件消抖:通过硬件电路实现消抖,如使用滤波器、RC 电路等。
2.软件消抖:通过软件算法实现消抖,如使用计数器、计时器等。
3.结合硬件和软件消抖:既使用硬件电路,也使用软件算法来实现消抖。
三、基于Verilog 的按键消抖设计
基于Verilog 的按键消抖设计可以分为以下几个步骤:
1.输入信号处理:对输入的按键信号进行采样,并转化为数字信号。
2.计数器:使用计数器来统计按键信号的持续时间,以判断按键是否稳定。
3.状态判断:根据计数器的计数值来判断按键是按下还是松开。
4.输出信号处理:将判断结果输出,以控制其他电路或设备。
四、结论
按键消抖是电子设备中常见的一种技术,它可以有效地消除按键输入过程中的抖动,提高系统的稳定性和可靠性。
【⿊⾦原创教程】【FPGA那些事⼉-驱动篇I】实验⼆:按键模块①-消抖实验⼆:按键模块① - 消抖按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在《建模篇》出现过,⽽且还惹来⼀堆⿇烦。
事实上,笔者这是在刁难各位同学,好让对⽅的惯性思维短路⼀下,但是惨遭⼝⽔攻击 ... ⾯对它,笔者宛如被甩的男⼈,对它⼜爱⼜恨。
不管怎么样,如今 I’ll be back,笔者再也不会重复⼀样的悲剧。
按键消抖说傻不傻说难不难。
所谓傻,它因为原理不仅简单(就是延迟⼏下下⽽已),⽽且顺序语⾔(C语⾔)也有⽆数不尽的例⼦。
所谓难,那是因为⼈们很难从单⽚机的思维跳出来 ... 此外,按键消抖也有许多细节未曾被⼈重视,真是让⼈伤⼼。
按键消抖⼀般有3段操作:l 检测电平变化;l 过滤抖动(延迟);l 产⽣有效按键。
假设C语⾔与单⽚机的组合想要检测电平变化,它们⼀般是利⽤if查询或者外部中断。
事后,如果这对组合想要过滤抖动,那么可以借⽤for 延迟的⼒量,⼜或者依赖定时中断产⽣精明的延迟效果。
反观有效案件的产⽣,这对组合视乎⽽外钟情“按下有效”似的 ... 不管怎么样,C语⾔与单⽚机这对组合在处理按键的时候,它们往往会错过⼀些黄⾦。
“黄⾦?”,读者震撼道。
所谓黄⾦时间就是电平发⽣变化那⼀瞬间,还有消抖(延迟)以后那⼀瞬间。
按键按下期间,按键的输⼊电平故会发⽣变化,如果使⽤if查询去检测,结果很容易浪费单⽚机的处理资源,因为单⽚机必须⼀直等待 ... 换之,如果反⽤外部中断,中断寻址也会耽误诺⼲时间。
假设C语⾔与单⽚机这对组合挨过电平检测这起难关,余下的困难却是消抖动作。
如果利⽤for循环实现去消抖,例如 Delay_ms(10) 之类的函数。
For循环不仅计数不紧密,⽽且还会⽩⽩浪费单⽚机的处理资源。
定时中断虽然计数紧密,但是中断触发依然也会产⽣诺⼲的寻址延迟。
补上,所谓寻址延迟是处理器处理中断触发的时候,它要事先保护现场之余,也要寻址中断处理⼊⼝,然后执⾏中断函数,完后回复现场,最后再返回当前的⼯作。
按键消抖一、程序(50mhz)modulexiaodou(clk,clr,key1,key2,key3,key4,key5,key_out1,key_out2,key_out3,key_out4,key_ out5);input clk,clr;input key1,key2,key3,key4,key5;output key_out1,key_out2,key_out3,key_out4,key_out5;//-------------------------------------------------reg [4:0] key_rst;reg [4:0] key_rst_n;reg [19:0] cnt;reg [4:0] key_next;reg [4:0] key_next_n;reg d1,d2,d3,d4,d5;wire[4:0] key_flag;wire [4:0] key_out_n;reg [23:0] count1;reg count_flag;always @(posedge clk or negedge clr) //get the fist valuebeginif(!clr)begin key_rst<=5'b11111;endelsebegin key_rst<={key5,key4,key3,key2,key1};endend//---------------------------------------always @(posedge clk or negedge clr) beginif(!clr)begin key_rst_n<=5'b11111;endelsebegin key_rst_n<=key_rst;endend//---------------------------------------- assign key_flag=key_rst_n&(~key_rst); //--------------jishu------------------- always @(posedge clk or negedge clr) beginif(!clr)begin cnt<=20'd0;endelse if(key_flag)begin cnt<=20'b0;endelsebegin cnt<=cnt+1'b1;endend//-----------------20ms after ------------- always @(posedge clk or negedge clr) beginif(!clr)begin key_next<=5'b11111;endelse if(cnt==20'hfffff)beginkey_next<={key5,key4,key3,key2,key1};endend//----------------------------------always @(posedge clk or negedge clr)beginif(!clr)begin key_next_n<=5'b11111;endelsebegin key_next_n<=key_next;endend//-------------------------------------------assign key_out_n=key_next_n&(~key_next);//--------------------------------------always @(posedge clk or negedge clr)beginif(!clr)begin d1<=1'b1;d2<=1'b1;d3<=1'b1;d4<=1'b1;d5<=1'b1;count_flag<=1;endelse //应led止显示一个时钟周期,我们观测不到,begin //此处有个计数延时,目的是led灯显示能够持续一段时间if(key_out_n[0])begin d1<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d1<=1'b1;count_flag<=1;endif(key_out_n[1])begin d2<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d2<=1'b1;count_flag<=1;endif(key_out_n[2])begin d3<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d3<=1'b1;count_flag<=1;endif(key_out_n[3])begin d4<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d4<=1'b1;count_flag<=1;endif(key_out_n[4])begin d5<=1'b0;count_flag<=1'b0;endelseif(count1==24'hffffff)begin d5<=1'b1;count_flag<=1;endendendassign key_out1=d1?1'b1:1'b0;assign key_out2=d2?1'b1:1'b0;assign key_out3=d3?1'b1:1'b0;assign key_out4=d4?1'b1:1'b0;assign key_out5=d5?1'b1:1'b0;always @(posedge clk or negedge clr) //计数延时,具体时间没有计算beginif(!clr)begin count1<=0;endelseif(count_flag==1'b0)begin count1<=count1+1'b1;endelsebegincount1<=0;endendendmodule二、框图。
verilog按键消抖原理
(原创版)
目录
1.Verilog 简介
2.按键消抖的概念
3.按键消抖的实现原理
4.实际应用中的按键消抖设计
5.总结
正文
【1.Verilog 简介】
Verilog 是一种硬件描述语言,主要用于数字系统硬件的描述、模拟和验证。
在数字电路设计和 FPGA 开发领域,Verilog 被广泛应用。
通过Verilog,设计人员可以对硬件电路进行建模、模拟和验证,以确保设计满足性能要求。
【2.按键消抖的概念】
按键消抖,又称按键去抖,是一种在按键输入过程中消除误触发的技术。
在实际应用中,按键输入可能会受到噪声、抖动等因素的影响,导致误触发。
按键消抖的目的就是消除这些干扰,确保按键输入的准确性。
【3.按键消抖的实现原理】
按键消抖的实现原理主要有两种:软件消抖和硬件消抖。
(1)软件消抖:软件消抖是通过程序算法实现的。
在按键触发时,程序会检测按键触发信号是否满足一定的条件,例如连续触发次数、触发时间间隔等。
如果满足条件,则认为这是一个有效的按键触发,否则不予响应。
(2)硬件消抖:硬件消抖是通过硬件电路实现的。
硬件消抖电路通常包括滤波器、延迟器等组件。
当按键触发信号输入时,滤波器会滤除噪声,延迟器会消除触发信号的抖动,从而保证输出信号的稳定性。
【4.实际应用中的按键消抖设计】
在实际应用中,按键消抖设计需要考虑多种因素,如按键触发信号的噪声、抖动特性,系统的响应速度等。
为了实现高效、可靠的按键消抖,设计人员需要对这些因素进行综合考虑,选择合适的消抖方案。
【5.总结】
按键消抖是一种重要的技术,可以有效消除按键输入中的误触发,提高系统的稳定性和可靠性。