按键消抖的原理和基于verilog的消抖设计
verilog按键消抖
![verilog按键消抖](https://img.taocdn.com/s3/m/b49209fc9e314332396893e8.png)
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按键消抖原理
![vivado按键消抖原理](https://img.taocdn.com/s3/m/c1aea954571252d380eb6294dd88d0d233d43cd4.png)
vivado按键消抖原理按键消抖是指在数字电路中,当按键按下或释放时,由于按键机械开关的特性,会导致电路出现不稳定的信号状态。
这种不稳定状态可能会导致错误的触发,例如出现多次触发或漏触发。
因此,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
按键消抖的原因主要有两个方面。
首先,按键机械开关的接触面存在微小的弹跳现象,当按键按下或释放时,接触面会在短时间内反复接触和分离,导致电路信号出现多次变化。
其次,由于电路中存在的噪声干扰,也会使得按键信号产生抖动。
为了解决按键消抖问题,可以采用硬件和软件两种方法。
硬件方法主要通过添加滤波电路或使用稳定的按键开关来消除按键弹跳现象。
滤波电路可以通过RC电路或者使用专用的按键消抖芯片来实现。
而软件方法主要通过在数字电路中添加按键消抖算法来处理按键信号。
在Vivado中,按键消抖可以通过使用状态机来实现。
状态机是一种用于描述系统行为的模型,可以根据输入信号的状态变化来改变系统的状态和输出。
在按键消抖中,可以使用状态机来检测按键信号的变化,并根据一定的状态转换规则来消除按键弹跳现象。
具体实现时,可以将按键信号作为输入,将按键状态和输出作为状态机的状态和输出。
当按键信号发生变化时,状态机会根据一定的状态转换规则进行状态转换,并输出消抖后的按键信号。
常用的状态转换规则包括按键按下时状态转换为按下状态,按键释放时状态转换为释放状态,以及连续按键时状态不变。
在Vivado中,可以使用Verilog或VHDL等硬件描述语言来编写状态机代码。
首先,需要定义状态机的输入、输出和状态变量,并初始化各个变量的初始值。
然后,需要编写状态转换规则和输出逻辑,根据输入信号的状态变化来改变状态和输出。
最后,需要将状态机代码综合生成对应的逻辑电路,并进行仿真和验证。
总结起来,按键消抖是数字电路设计中常见的问题,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
在Vivado中,可以使用状态机来实现按键消抖,通过定义状态转换规则和输出逻辑,消除按键弹跳现象。
键盘消抖原理代码说明(Verilog)
![键盘消抖原理代码说明(Verilog)](https://img.taocdn.com/s3/m/3d314dda50e2524de5187e2a.png)
笔记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写的按键消抖程序
![Verilog写的按键消抖程序](https://img.taocdn.com/s3/m/fc76c4eb18e8b8f67c1cfad6195f312b3169eba0.png)
前几天看了特权同学用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按键消抖的理解
![Verilog按键消抖的理解](https://img.taocdn.com/s3/m/991d5c50b0717fd5370cdcd0.png)
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。
基于FPGA的抖动及消抖的方法
![基于FPGA的抖动及消抖的方法](https://img.taocdn.com/s3/m/f9e16d23581b6bd97f19ea33.png)
基于FPGA的抖动及消抖的方法抖动的产生通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
抖动时间抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保FPGA对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
FPGA内实现消抖的方法在FPGA内实现按键消抖的方法多种多样,但是最简单的是采用移位寄存器的方法进行消抖。
因为移位寄存器的方法不需要对时钟进行分频,也不需要进行延时等复杂操作,即可实现对按键边沿的检测。
假设未按下时键值=1.1、在无键按下时,移位寄存器samp[7:0]始终采集到高电平,即samp[7:0]=8b1111_1111;2、当键按下时,samp[7:0]将采集到低电平,数据的变化方式为samp[7:0]=8b1111_1110--8b1111_1100--8b1111_1000-- ........8b0000_0000;samp[7:0]=8b1111_ 1110即为按键下降沿。
3、当松开按键时,samp[7:0]将重新采集到高电平,数据变化方式为samp[7:0]=8b0000_0001--8b0000_0011-- ........--8b1111_1111;当samp[7:0]=8b0111_1111时,即为按键上升沿。
参考Verilog代码//模块名:EdgeDetect,边沿检测//button:按键,无键按下时为高电平//clk:10M时钟//rst:复位按钮,低电平有效//rise:检测到上升沿,高电平有效,宽度为1个clk//fall:检测到下降沿,高电平有效,宽度为1个clkmodule EdgeDetect(input clk,input rst,input button,output reg rise,output reg fall);。
按键消抖原理
![按键消抖原理](https://img.taocdn.com/s3/m/a3005490ac51f01dc281e53a580216fc700a53fe.png)
按键消抖原理
按键消抖原理是指通过某种方法在按键被按下或松开时,消除或减少按键的抖动现象,使输入信号得到稳定的识别和处理。
在实际应用中,按键在被按下或松开时,由于机械结构的原因,往往会引起按键的不稳定状态,表现为按键在短时间内多次触发开关。
这种按键抖动不仅会导致输入信号的波动,还可能对系统造成误操作或不良影响。
为了解决按键抖动问题,常用的按键消抖原理主要有以下几种:
1. 软件延时消抖:通过在程序中设定一个适当的延时时间,当按键被按下或松开后,延时一段时间再读取按键状态,以判断按键是否稳定。
如果经过延时后按键状态仍然相同,则可以认为按键已经稳定按下或松开,从而减少抖动的影响。
2. 硬件滤波消抖:通过在按键电路上设计滤波器或添加电容元件,可以对按键信号进行滤波处理,去除短时间内的干扰信号,使输入信号更加稳定。
常用的滤波电路包括RC滤波电路、OTA滤波电路等。
3. 状态改变检测消抖:在按键电路中,通过检测按键的状态变化来判断按键是否按下或松开。
当按键在短时间内发生多次状态变化时,只会认为按键状态发生了一次改变,从而忽略了抖动现象。
这种方式适用于按键状态改变的速度较慢的情况。
通过以上的按键消抖原理,可以有效地减少按键抖动现象,提
高按键输入的可靠性和稳定性。
在实际应用中,可以根据具体情况选择适合的原理和方法来实现按键消抖,以满足不同的需求。
verilog按键消抖原理
![verilog按键消抖原理](https://img.taocdn.com/s3/m/9264fcdb9a89680203d8ce2f0066f5335b816768.png)
verilog按键消抖原理(原创版)目录1.Verilog 简介2.按键消抖的概念3.按键消抖的实现原理4.实际应用中的按键消抖设计5.总结正文【1.Verilog 简介】Verilog 是一种硬件描述语言,主要用于数字系统硬件的描述、模拟和验证。
在数字电路设计和 FPGA 开发领域,Verilog 被广泛应用。
通过Verilog,设计人员可以对硬件电路进行建模、模拟和验证,以确保设计满足性能要求。
【2.按键消抖的概念】按键消抖,又称按键去抖,是一种在按键输入过程中消除误触发的技术。
在实际应用中,按键输入可能会受到噪声、抖动等因素的影响,导致误触发。
按键消抖的目的就是消除这些干扰,确保按键输入的准确性。
【3.按键消抖的实现原理】按键消抖的实现原理主要有两种:软件消抖和硬件消抖。
(1)软件消抖:软件消抖是通过程序算法实现的。
在按键触发时,程序会检测按键触发信号是否满足一定的条件,例如连续触发次数、触发时间间隔等。
如果满足条件,则认为这是一个有效的按键触发,否则不予响应。
(2)硬件消抖:硬件消抖是通过硬件电路实现的。
硬件消抖电路通常包括滤波器、延迟器等组件。
当按键触发信号输入时,滤波器会滤除噪声,延迟器会消除触发信号的抖动,从而保证输出信号的稳定性。
【4.实际应用中的按键消抖设计】在实际应用中,按键消抖设计需要考虑多种因素,如按键触发信号的噪声、抖动特性,系统的响应速度等。
为了实现高效、可靠的按键消抖,设计人员需要对这些因素进行综合考虑,选择合适的消抖方案。
【5.总结】按键消抖是一种重要的技术,可以有效消除按键输入中的误触发,提高系统的稳定性和可靠性。
fpga按键消抖原理
![fpga按键消抖原理](https://img.taocdn.com/s3/m/e8cf8f36a200a6c30c22590102020740be1ecd83.png)
fpga按键消抖原理fpga按键消抖原理___________________FPGA按键消抖是一种用于处理按键输入信号的技术,它可以有效地降低噪声对按键信号的影响,从而确保按键输入的正确性。
## 一、什么是fpga按键消抖FPGA按键消抖是一种应用于处理外部输入的技术,它可以有效地减少按键输入的误差,同时防止因由噪声或触发时间过长等原因导致的误操作,从而保证操作系统的稳定性和正确性。
## 二、fpga按键消抖的原理FPGA按键消抖的原理是:当用户按下一个按钮时,FPGA会连续采集多个采样点,并判断采样点的平均值,如果采样值与平均值相差不大,则认为是有效的输入;如果采样点的平均值与采样值相差较大,则认为采样点受到了噪声干扰,此时不认为是有效的输入。
此外,FPGA还会根据按钮被按下的时间来决定是否应该将其作为有效输入:如果用户在一定的时间内多次重复按下一个按钮,FPGA会自动将其作为无效输入,从而避免重复操作。
## 三、fpga按键消抖的应用FPGA按键消抖在实际应用中最常用于处理用户输入,它可以有效地避免由于噪声或触发时间过长而导致的误差。
此外,FPGA也可以用于处理传感器输出,例如测量传感器的输出信号、光学传感器的输出信号等。
## 四、fpga按键消抖的注意事项在使用FPGA进行按键消抖时,应该注意以下几点:1. FPGA采样点的数量要适当:采样点的数量不宜过多或过少,要根据实际情况适当调整。
2. FPGA采样点的间隔要适当:采样点之间的间隔应该尽可能小,以便能够有效地减少噪声对信号的影响。
3. FPGA采样点的平均值要适当:采样点的平均值应该尽可能小,以便能够有效地减少噪声对信号的影响。
4. FPGA采样时间要适当:FPGA在采样信号时应该尽可能快,以便能够有效地减少噪声对信号的影响。
## 五、总结FPGA是一种常用的电子设备,它可以有效地处理外部输入信号,从而避免因由噪声或触发时间过长而导致的误差。
EDA实验五报告
![EDA实验五报告](https://img.taocdn.com/s3/m/b39916816529647d2728529b.png)
实验五按键消抖和分频器电路设计一、实验目的学习和掌握使用Verilog语言设计按键去抖动电路和分频器的方法二、实验原理分频器就是简单的加法计数器,对于偶数分频和奇数分频应注意其占空比的问题。
当按一次按健时,由于按健有反应时间、有大量的毛刺产生(抖动),可能按一次机器感应到几次。
消抖就是让在按键正常反应时间内机器只感应一次按键效果,防止误操作。
消抖的原理是:当检测到有键按下时,并不认为有键按下,而是等待20ms后,再次判断是否有键按下,若有则认为确实有键按下;若没有则认为上次的按键是误操作。
三、实验内容1.分频器设计:使用实验箱左下角的时钟频率源,编写一段Verilog程序,使led发光管,每隔1S闪烁一次。
程序设计:module clk5M_1s(clk5M,clk1s);input clk5M;output clk1s;parameter i1=4999;parameter i2=999;reg [12:0]t1,t2;reg k;reg clk1s;always @(posedge clk5M)begin //进行5000分频if(t1<=i1) t1<=t1+1'b1; else t1<=1'b0;if(t1==i1) k<=k+1'b1;endalways @(posedge k)begin //进行1000分频if(t2<=i2) t2<=t2+1'b1; else t2<=1'b0;if(t2==i2) clk1s<=clk1s+1'b1;endendmodule分析:选用的时钟频率源为5M,如果产生频率为1Hz的脉冲使led发光管每隔1s亮一次,则共需分频5000000次,因此分频次数超过内部芯片1个计数器所能承受的范围,故需用两个计数器进行两次分频,即程序中所指出的第一次5000分频,第二次1000分频。
FPGA入门系列实验教程——按键消抖控制LED亮灭
![FPGA入门系列实验教程——按键消抖控制LED亮灭](https://img.taocdn.com/s3/m/aef08500b52acfc789ebc932.png)
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。
10_基于FPGA进行按键消抖
![10_基于FPGA进行按键消抖](https://img.taocdn.com/s3/m/da9f75bfdc3383c4bb4cf7ec4afe04a1b171b05e.png)
10_基于FPGA进⾏按键消抖10_基于FPGA进⾏按键消抖实验原理计数器型消抖电路:计数器型消抖电路(⼀) 计数器型消抖电路(⼀)是设置⼀个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in='1',计数器加1,key_in='0'时,计数器清零。
当计数器值为2时,key_out输出才为1,其他值为0时。
计数器值为N时处于保持状态。
因此按键key_in持续时间⼤于N个clk时钟周期时,计数器输出⼀个单脉冲,否则没有脉冲输出。
如果按键开关抖动产⽣的⽑刺宽度⼩于N个时钟周期,因⽽⽑刺作⽤不可能使计数器有输出,防抖动⽬的得以实现。
clk的时钟周期与N的值可以根据按键抖动时间由设计者⾃⾏设定。
下图为N为3的波形仿真图,当按键持续时间⼤于3个时钟周期,计数器输出⼀个单脉冲,其宽度为1个时钟周期,⼩于3个时钟周期的窄脉冲⽤作模拟抖动⼲扰,从图1可以看出,抖动不能⼲扰正常的单脉冲输出。
该⽅法的特点是能很好消除按键抖动产⽣的窄脉冲,还可以滤去⼲扰、噪⾳等其他尖峰波,但遇到脉宽⼤于N个Tclk时钟周期的⼲扰、噪⾳等时会有输出从⽽产⽣误操作,⽽对于按键操作要求按键时间必须⼤于N个Tclk时钟周期,否则按键操作也没有输出。
计数器型消抖电路(⼆) 计数器型消抖电路(⼆)是控制计数器⼯作⼀个循环周期(N+1个状态),且仅在计数器为0时输出为"1"。
电路设计了连锁控制设施。
在计数器处于状态0时,此时若有按键操作,则计数器进⼊状态1,同时输出单脉冲(其宽度等于时钟周期)。
计数器处于其他状态,都没有单脉冲输出。
计数器处于状态N时,控制en='0',导致计数器退出状态N,进⼊状态0。
计数器能否保持状态0,取决于⼈⼯按键操作,若按键key_in='1',控制en='1'(计数器能正常⼯作),key_in='0',计数器状态保持。
阐述基于FPGA的按键抖动的消除方法
![阐述基于FPGA的按键抖动的消除方法](https://img.taocdn.com/s3/m/e3c633e2a76e58fafbb0033f.png)
阐述基于FPGA的按键抖动的消除方法我们在进行数字电路的设计的过程中,经常会碰到信号抖动相关的问题。
抖动信号大致分为两类:一类是时间极短的干扰信号(比如毛刺);另一类是时间较长的干扰信号(如本文所研究的按键抖动问题)。
对于第一类干扰信号——毛刺,它的时间极短,通常只有几纳秒,不能满足触发器的建立时间与保持时间,因此我们可以用一个D触发器去读带毛刺的信号,由于D触发器具有对毛刺不敏感的特点,可以去除信号中的毛刺,达到消除抖动的效果(消除毛刺的方法很多,在这里不做讨论,本文重点说明按键抖动的消除及其代码设计)。
在数字电路设计中,按键通常为一个个具有弹性的机械触点开关,其开启或者闭合的瞬间都会产生按键抖动,实际波形如图1所示:由图1可知,在按键闭合和断开的瞬间,我们往往只需要一组稳定的上升边沿和下降边沿,但实际上却产生了若干个边沿。
所以,在实际电路中,我们仅仅按动按键,简单地读取信号的边沿,却不滤除抖动,会导致一次按键操作被误读多次,从而引起电路的误动作。
为了达到一次按键操作得到一次正确的响应的目的(在按键闭合或者断开),信号稳定的状态下读取此时按键的状态,就必须在电路中采取消除抖动的措施。
在纯数字电路设计中,下面介绍几种消除按键抖动的常用实现方法。
1 设计硬件消抖电路(硬件方法)设计一个具有延时作用的滤波电路或者经常用到的单稳态电路等硬件电路,来消除按键的抖动(避免抖动时间)。
图2所示的电路,即为典型的滤波延时消抖电路,S为按键,Di为CPU数据线。
当按键S未闭合时,与非门的输入电压Vi(即电容的端电压)为0,从而输出电压Vo为1。
我们按下按键S,电容C的端电压不会发生突变,充电延迟时间取决于R1、R2和C值的大小,当电容端电压在充电时间内未达到与非门的开启电压,将不会改变门的输出电压;当电容端电压大于门的开启电压时,与非门的输出Vo发生改变,即输出为0(我们在数字电路的设计过程中,为了避开按键抖动的影响,需要使充电延时大于或等于100ms)。
fpga按键消抖的原理和方法
![fpga按键消抖的原理和方法](https://img.taocdn.com/s3/m/4731464f30b765ce0508763231126edb6f1a7607.png)
FPGA(现场可编程门阵列)是一种可按照用户需求重新配置其硬件资源的可编程硅芯片。
在数字电路中,按键消抖 (Debounce) 是一个非常常见但重要的问题,因为机械按钮在按下和释放时会产生不稳定的信号。
为了解决这个问题,我们需要消除机械按键所产生的抖动信号。
消抖的原理是为输入信号添加处理和判断逻辑,将抖动视为一个单位的无效信号,从而过滤有问题的输入信号。
针对 FPGA,常用的按键消抖方法有以下两种:1. **计数器方法 (Counter Method)**这种方法检测按键输入是否持续一定时间内(假设我们使用n 个时钟周期)保持稳定。
如果输入持续稳定,则将其作为有效输入信号。
通过计数器实现的消抖具备可配置的消抖时间,从而适应各种不同类型的按键。
以下是计数器消抖方法的大致步骤:1. 初始化一个 n 位计数器。
2. 如果按键输入保持稳定(按下或释放),计数器增加,否则计数器清零。
3. 当计数器达到预定的阈值时,改变按键的状态(按下或释放)。
4. **移位寄存器方法 (Shift Register Method)**其实现原理是将多个连续的抖动信号视为一个有效输入,适用于按键抖动时间较短的场景。
以下是移位寄存器消抖方法的大致步骤:1. 初始化一个 n 位移位寄存器。
2. 每个时钟周期将输入信号添加到移位寄存器的低位(或高位),同时向右(或左)移动一位。
3. 当移位寄存器中所有位的值都相同(全为 0 或全为 1)时,认为信号稳定,将其视为有效输入信号。
在消抖方法的选择上,实际应用要考虑系统性能、消抖精度、按键抖动时间等因素。
简单的消抖算法可能只跟踪按键的状态改变,而更高级的算法可以检测按键被按下并保持的持续时间,从而在功能上更灵活。
如何设计按键消抖
![如何设计按键消抖](https://img.taocdn.com/s3/m/fc7b7944b207e87101f69e3143323968011cf40d.png)
在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要0.2秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。
一、按键电路常用的非编码键盘,每个在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要0.2秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。
一、按键电路常用的非编码键盘,每个键都是一个常开开关电路。
计数器输入脉冲最好不要直接接普通的按键开关,因为记数器的记数速度非常快,按键、触点等接触时会有多次接通和断开的现象。
我们感觉不到,可是记数器却都记录了下来。
例如,虽然只按了1下,记数器可能记了3下。
因此,使用按键的记数电路都会增加单稳态电路避免记数错误。
二、按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。
由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合与断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
按键的抖动,可用硬件或软件两种方法。
三、硬件消抖在键数较少时可用硬件方法消除键抖动。
下图所示的RS触发器为常用的硬件去抖。
消抖电路如下图中两个“与非”门构成一个RS触发器。
当按键未按下时,输出为1;当键按下时,输出为0。
此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。
verilog按键消抖原理
![verilog按键消抖原理](https://img.taocdn.com/s3/m/51df6baf112de2bd960590c69ec3d5bbfc0ada7c.png)
verilog按键消抖原理
摘要:
1.按键消抖的原理
2.按键消抖的方法
3.基于Verilog 的按键消抖设计
4.结论
正文:
一、按键消抖的原理
按键消抖是指在按键输入过程中,由于按键机械特性和电路特性的影响,导致按键在按下或松开时,信号电平会在一段时间内发生抖动。
为了消除这种抖动,需要采用一定的方法来确认按键输入的稳定性,这就是按键消抖。
二、按键消抖的方法
常见的按键消抖方法有以下几种:
1.硬件消抖:通过硬件电路实现消抖,如使用滤波器、RC 电路等。
2.软件消抖:通过软件算法实现消抖,如使用计数器、计时器等。
3.结合硬件和软件消抖:既使用硬件电路,也使用软件算法来实现消抖。
三、基于Verilog 的按键消抖设计
基于Verilog 的按键消抖设计可以分为以下几个步骤:
1.输入信号处理:对输入的按键信号进行采样,并转化为数字信号。
2.计数器:使用计数器来统计按键信号的持续时间,以判断按键是否稳定。
3.状态判断:根据计数器的计数值来判断按键是按下还是松开。
4.输出信号处理:将判断结果输出,以控制其他电路或设备。
四、结论
按键消抖是电子设备中常见的一种技术,它可以有效地消除按键输入过程中的抖动,提高系统的稳定性和可靠性。
Verilog-按键消抖程序
![Verilog-按键消抖程序](https://img.taocdn.com/s3/m/3093746e89eb172dec63b766.png)
按键消抖一、程序(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二、框图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按键消抖的原理和基于verilog的消抖设计
按键开关是各种电子设备不可或缺的人机接口。
在实际应用中,很大一部分的按键是机械按键。
在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。
在系统设计中,有各种各样的消除按键抖动的设计方法,硬件电路和软件设计都很成熟。
不过我们这里要从另外一个角度来讨论按键的消抖,并给出一个用verilog给出一个具体的实现。
首先,看一个普通的机械按键的触点在闭合与断开时的波形(用示波器抓取)。
下面的四张图都是按键在闭合的时候抓到的波形。
可以看到两个明显的趋势:1. 按键在几个us之内就可以达到稳定状态,从高电平转换到底电平;2. 在高电平转换到低电平的过程中,触点有非常明显的抖动。
下面的两张图是按键在断开的时候抓到的波形。
也可以看到两个明显的趋势:1. 按键的变化趋势比较缓慢,从低电平变为高电平需要大概10~20ms的时间;2. 按键断开时没有闭合时那么大的抖动
下面两张图是用手迅速闭合按键然后就断开时,按键的输出波形。
在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。
所以,对于按键消抖的处理,必须按最差的情况来考虑。
我们从上面的图上可以看到,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。
按键一次闭合最短的时间大概是120ms 左右。
如果我们把按键的输出做为一个时钟域(时钟频率未知,但信号的slow rate是已知的,既最大20ms左右)的信号,用另外一个时钟来采集这个按键的输出,则就可以把按键的消抖归结为一个最基本的CDC问题来处理。
而问题的核心是如何确定采集时钟的频率。
假设采集时钟的周期小于20ms,那么,采集时钟就有可能两次采到按键断开时的不。