按键消抖的原理和基于fpga的消抖设计
vivado按键消抖原理
vivado按键消抖原理
按键消抖是指在数字电路中,当按键按下或释放时,由于按键机械开关的特性,会导致电路出现不稳定的信号状态。这种不稳定状态可能会导致错误的触发,例如出现多次触发或漏触发。因此,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
按键消抖的原因主要有两个方面。首先,按键机械开关的接触面存在微小的弹跳现象,当按键按下或释放时,接触面会在短时间内反复接触和分离,导致电路信号出现多次变化。其次,由于电路中存在的噪声干扰,也会使得按键信号产生抖动。
为了解决按键消抖问题,可以采用硬件和软件两种方法。硬件方法主要通过添加滤波电路或使用稳定的按键开关来消除按键弹跳现象。滤波电路可以通过RC电路或者使用专用的按键消抖芯片来实现。而软件方法主要通过在数字电路中添加按键消抖算法来处理按键信号。
在Vivado中,按键消抖可以通过使用状态机来实现。状态机是一种用于描述系统行为的模型,可以根据输入信号的状态变化来改变系统的状态和输出。在按键消抖中,可以使用状态机来检测按键信号的变化,并根据一定的状态转换规则来消除按键弹跳现象。
具体实现时,可以将按键信号作为输入,将按键状态和输出作为状
态机的状态和输出。当按键信号发生变化时,状态机会根据一定的状态转换规则进行状态转换,并输出消抖后的按键信号。常用的状态转换规则包括按键按下时状态转换为按下状态,按键释放时状态转换为释放状态,以及连续按键时状态不变。
在Vivado中,可以使用Verilog或VHDL等硬件描述语言来编写状态机代码。首先,需要定义状态机的输入、输出和状态变量,并初始化各个变量的初始值。然后,需要编写状态转换规则和输出逻辑,根据输入信号的状态变化来改变状态和输出。最后,需要将状态机代码综合生成对应的逻辑电路,并进行仿真和验证。
fpga消抖模块的作用
fpga消抖模块的作用
在电子设备中,按键是常见的输入设备,用于接收用户操作指令。然而,按键的机械特性使得它们在按下和释放时容易产生抖动,即按键状态的不稳定。这种抖动现象会对后续的处理带来困扰,因为它可能会导致设备对单次按键行为产生误判,认为是一次或多次的按键动作。为了解决这一问题,FPGA(现场可编程门阵列)中的消抖模块应运而生。
FPGA消抖模块的主要作用是消除按键抖动。当按键被按下或释放时,由于机械触点的弹性作用,可能会产生一连串的抖动。这些抖动可能非常短暂,一般都在10ms以内,但对于系统来说,却可能导致误判。为了确保系统能够正确识别按键的开关状态,FPGA消抖模块通过特定的算法和逻辑处理,对按键的通断状态进行检测和过滤,消除这些短暂的抖动,从而确保按键状态识别的准确性。
在FPGA中实现消抖功能可以有多种方式。其中一种是采用硬件消抖的方式,即在FPGA上配置相应的硬件电路来直接处理按键信号。另一种方式是通过软件算法来实现消抖功能。无论采用哪种方式,其核心目的都是确保系统能够准确识别
按键状态,避免因按键抖动而产生的误操作。
FPGA消抖模块的作用是消除按键在按下和释放过程中产生的抖动,确保系统能够准确识别按键状态,从而提高设备的可靠性和用户体验。
基于FPGA的按键抖动的消除
感 的特点 ,可 以去 除信 号 中的毛刺 ,达到消 除抖 动 的效果 ( 消除毛刺 的方法很 多 ,在这里不 做讨 论 ,本文 重点说 明
按键抖 动的消除及 其代 码设 计 )。 在 数字 电路设 计 中,按 键通常 为一 个个具有 弹性 的机 械触 点开关 ,其开启或 者闭合 的瞬 间都 会产生按键 抖动 , 实际波形如 图1 所示 :
i n p u t c l k ; / / 主时钟 信号 ,5 0 M Hz
i np u t r s tn ; , / 复位信号
_
,低有效
3 1
2 0 1 3 年 第2 1 期
( 总 第 2 6 4 期 )
咿 蓟 南 熟
( C u m u l a t i v N e t O y N . 2 O 1 . 2 0 1 3 2 6 4)
键按F 键释放
同理 ,按键s 断开 时的情形 ,由读者 自己来进行分析 ,
此处不再赘述 。
厂
翦 甜抖动 闭 ☆稳 廑 t
图1
图2
图2 中,V 是 未消抖的波形 ,V 是消抖之后的波形 。
: 后 辩料 胡: 释竣 稳定
2 软 件 方 法 实 现 消 抖
信号 对按键输入信 号进行采样 。此方法消除抖动 的关键在 于确 定合适 的采样 时钟频率 ,使 得采样 间隔 时间适中 ,处 在按键抖动时 间和按键正常稳定闭合时间的范围之内。
按键消抖的原理
按键消抖的原理
一、引言
在电子设备中,按键是常见的输入方式。然而,由于按键的机械结构,当按下或松开按键时,会产生机械弹跳现象,导致信号出现多次跳变,这就是所谓的“按键抖动”现象。为了避免这种现象对电路造成干扰,需要进行按键消抖处理。
二、什么是按键消抖?
按键消抖是指在接收到按键信号后,在一定时间内只处理一次信号,
并且保证该信号为有效信号。其目的是消除因机械结构引起的多次跳
变信号。
三、按键消抖的原理
1. 机械弹跳原理
在了解按键消抖原理之前,需要先了解机械弹跳原理。当按下或松开
一个开关时,由于接触面积有限和金属表面不完全平整等因素影响,
开关触点会发生不稳定震荡,并在短时间内反复接通和断开。这种现
象称为“机械弹跳”。
2. 软件处理原理
软件处理原理是通过程序来实现对按键状态进行检测和判断的方式。具体实现方法包括:轮询法、中断法、计时法等。
(1)轮询法
轮询法是指通过循环检测按键状态的方式来实现按键消抖。具体实现方法为:在主程序中设置一个循环,不断检测按键状态,当检测到按键被按下时,进行一定的延时后再次检测按键状态,如果依然是按下状态,则判断为有效信号。
(2)中断法
中断法是指通过外部中断来实现对按键状态进行检测和判断的方式。具体实现方法为:将按键连接到微控制器的外部中断引脚上,在程序中设置好相应的中断服务程序,当检测到外部中断信号时,进入相应的中断服务程序进行处理。
(3)计时法
计时法是指通过定时器来实现对按键状态进行检测和判断的方式。具体实现方法为:当检测到按键被按下时,启动定时器并开始计数,在一定时间内只处理一次信号,并保证该信号为有效信号。
基于FPGA的抖动及消抖的方法
基于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时,即为按键上升沿。
详解MCU独立按键消抖原因、方法
详解MCU独立按键消抖
简单的说,进入了电子,不管是学纯模拟,还是学单片机,DSP、ARM等处理器,或者是我们的FPGA,一般没有不用到按键的地方。按键:人机交互控制,主要用于对系统的控制,信号的释放等。因此在这里,FPGA 上应用的按键消抖动,也不得不讲!
一、为什么要消抖动
在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。
对此一般产用消抖动的原理。一般可分为以下几种:
(1)延时
(2)N次低电平计数
(3)低通滤波
在数字电路中,一般产用(1)(2)种方法。后文中将详细介绍。
二、各种消抖动
1. 模拟电路按键消抖动
对于模拟电路中,一般消抖动用的是电容消抖动或者施密特触发等电路,再次不做具体介绍。
2. 单片机中按键消抖动
对于单片机中的按键消抖动,本节Bingo根据自己当年写过的单片机其中的一个代码来讲解,代码如下所示:
unsigned char key_sCAN(void)
{
if(key == 0) //检测到被按下
{
delay(5); //延时5ms,消抖
if(key != 0)
retrurn 0; //是抖动,返回退出
while(!key1); // 确认被按下,等下释放
delay(5); //延时5ms,消抖
while(!key1); //确认被释放
return 1; //返回按下信号
按键消抖原理
按键消抖原理
按键消抖原理是指通过某种方法在按键被按下或松开时,消除或减少按键的抖动现象,使输入信号得到稳定的识别和处理。
在实际应用中,按键在被按下或松开时,由于机械结构的原因,往往会引起按键的不稳定状态,表现为按键在短时间内多次触发开关。这种按键抖动不仅会导致输入信号的波动,还可能对系统造成误操作或不良影响。
为了解决按键抖动问题,常用的按键消抖原理主要有以下几种:
1. 软件延时消抖:通过在程序中设定一个适当的延时时间,当按键被按下或松开后,延时一段时间再读取按键状态,以判断按键是否稳定。如果经过延时后按键状态仍然相同,则可以认为按键已经稳定按下或松开,从而减少抖动的影响。
2. 硬件滤波消抖:通过在按键电路上设计滤波器或添加电容元件,可以对按键信号进行滤波处理,去除短时间内的干扰信号,使输入信号更加稳定。常用的滤波电路包括RC滤波电路、OTA滤波电路等。
3. 状态改变检测消抖:在按键电路中,通过检测按键的状态变化来判断按键是否按下或松开。当按键在短时间内发生多次状态变化时,只会认为按键状态发生了一次改变,从而忽略了抖动现象。这种方式适用于按键状态改变的速度较慢的情况。
通过以上的按键消抖原理,可以有效地减少按键抖动现象,提
高按键输入的可靠性和稳定性。在实际应用中,可以根据具体情况选择适合的原理和方法来实现按键消抖,以满足不同的需求。
单片机按键去抖原理
单片机按键去抖原理
在单片机系统中,按键的应用非常广泛,无论是控制还是交互,经常需要使用按键来进行操作。然而,由于按键的特性,往往会带来按键抖动的现象,这就需要对按键进行去抖处理。本文将详细介绍单片机按键去抖的原理和方法。
1.按键抖动的原因及影响因素
按键抖动是指按下或释放按键时,按键触点会产生不稳定的接触,导致按键信号在短时间内多次切换,造成系统误判。按键抖动的原因主要有以下几点:
(1)按键机械结构问题:按键存在接触不良、触点弹簧不稳定等机械问题,会导致接触突变。
(2)外部干扰:如按键线路附近的磁场、电源干扰等,会引发按键误触。
(3)按键的弹性和灵敏度:按键材料和设计的不同,会导致按键的弹性和灵敏度不一致,进而引发抖动。
按键抖动会带来以下几个问题:
(1)误判:按键抖动会使系统误判按键的按下或释放,导致错误的逻辑操作。
(2)数据错误:抖动会造成按键信号的短时间内多次切换,可能导致数据传输错误、丢失等问题。
(3)系统性能下降:由于抖动会产生大量的开关信号,会占用系统资源,影响系统的运行速度和响应时间。
2.去抖的原理
去抖的原理是通过软件或硬件的方式对按键信号进行滤波,消除了按
键抖动信号,从而得到稳定的按键信号。
软件去抖的原理是通过软件算法对按键信号进行处理,主要有两种方法:软件延时去抖和状态机去抖。
(1)软件延时去抖:
软件延时去抖的原理是在按键按下后,通过添加延时来屏蔽抖动信号。当检测到按键按下后,先延时一段时间,并再次检测按键的状态,如果按
键仍然处于按下状态,则确认按键按下有效。
软件延时去抖的优点是简单易行,只需通过软件延时来实现,无需额
verilog按键消抖原理
verilog按键消抖原理
(原创版)
目录
1.Verilog 简介
2.按键消抖的概念
3.按键消抖的实现原理
4.实际应用中的按键消抖设计
5.总结
正文
【1.Verilog 简介】
Verilog 是一种硬件描述语言,主要用于数字系统硬件的描述、模拟和验证。在数字电路设计和 FPGA 开发领域,Verilog 被广泛应用。通过Verilog,设计人员可以对硬件电路进行建模、模拟和验证,以确保设计满足性能要求。
【2.按键消抖的概念】
按键消抖,又称按键去抖,是一种在按键输入过程中消除误触发的技术。在实际应用中,按键输入可能会受到噪声、抖动等因素的影响,导致误触发。按键消抖的目的就是消除这些干扰,确保按键输入的准确性。
【3.按键消抖的实现原理】
按键消抖的实现原理主要有两种:软件消抖和硬件消抖。
(1)软件消抖:软件消抖是通过程序算法实现的。在按键触发时,程序会检测按键触发信号是否满足一定的条件,例如连续触发次数、触发时间间隔等。如果满足条件,则认为这是一个有效的按键触发,否则不予响应。
(2)硬件消抖:硬件消抖是通过硬件电路实现的。硬件消抖电路通常包括滤波器、延迟器等组件。当按键触发信号输入时,滤波器会滤除噪声,延迟器会消除触发信号的抖动,从而保证输出信号的稳定性。
【4.实际应用中的按键消抖设计】
在实际应用中,按键消抖设计需要考虑多种因素,如按键触发信号的噪声、抖动特性,系统的响应速度等。为了实现高效、可靠的按键消抖,设计人员需要对这些因素进行综合考虑,选择合适的消抖方案。
【5.总结】
按键消抖是一种重要的技术,可以有效消除按键输入中的误触发,提高系统的稳定性和可靠性。
fpga按键消抖原理
fpga按键消抖原理
fpga按键消抖原理
___________________
FPGA按键消抖是一种用于处理按键输入信号的技术,它可以有效地降低噪声对按键信号的影响,从而确保按键输入的正确性。
## 一、什么是fpga按键消抖
FPGA按键消抖是一种应用于处理外部输入的技术,它可以有效地减少按键输入的误差,同时防止因由噪声或触发时间过长等原因导致的误操作,从而保证操作系统的稳定性和正确性。
## 二、fpga按键消抖的原理
FPGA按键消抖的原理是:当用户按下一个按钮时,FPGA会连续采集多个采样点,并判断采样点的平均值,如果采样值与平均值相差不大,则认为是有效的输入;如果采样点的平均值与采样值相差较大,则认为采样点受到了噪声干扰,此时不认为是有效的输入。
此外,FPGA还会根据按钮被按下的时间来决定是否应该将其作为有效输入:如果用户在一定的时间内多次重复按下一个按钮,FPGA会自动将其作为无效输入,从而避免重复操作。
## 三、fpga按键消抖的应用
FPGA按键消抖在实际应用中最常用于处理用户输入,它可以有效地避免由于噪声或触发时间过长而导致的误差。此外,FPGA也可以用于处理传感器输出,例如测量传感器的输出信号、光学传感器的输出信号等。
## 四、fpga按键消抖的注意事项
在使用FPGA进行按键消抖时,应该注意以下几点:
1. FPGA采样点的数量要适当:采样点的数量不宜过多或过少,要根据实际情况适当调整。
2. FPGA采样点的间隔要适当:采样点之间的间隔应该尽可能小,以便能够有效地减少噪声对信号的影响。
键盘的消抖原理
键盘的消抖原理
键盘消抖是指在通过键盘输入时,对于一个按键在被按下到最终确认的过程中,可能会出现多次触发的情况,这样会导致输入数据错误,给使用者带来很大的困扰。消抖技术旨在解决这一问题,通过特定的电路设计或编程算法,将输入信号进行抑制或过滤,以保证输入数据的准确性。
一、消抖技术的原理
1. 机械式按键的消抖
机械式按键的消抖主要是通过按键的物理特性来实现的。当按键被按下时,按键头与底座之间会产生一定的位移或压缩,导致弹簧被压缩或弯曲,使得电路闭合,从而产生按键信号。为了避免按键震动在电路中产生的反复触发问题,通常会在按键电路中加入一个RC电路或短暂延时电路。在按键按下后,通过加电、蓄电和放电等过程,使得输入信号稳定下来,从而消除了多余的触发信号。
触摸式按键的消抖主要是通过电容值的变化来识别按键信号的。当手指接触到触摸板时,会引起电容量的变化,从而识别出按下的位置和时间。在识别过程中,通常利用滤波器或计数器进行信号的稳定化处理,消除不稳定的噪声输入。还可以利用防误触算法,对快速按下和抬起的操作进行识别和排除。
矩阵式按键是由多个按键交错排列而成的,通过多个行列连接交叉的方式来实现按键的输入。在输入时,需要依次扫描每个按键的状态,并将状态从矩阵输出到处理器或控制器中。为了防止按键的反复触发,通常可以采用“按下即认为有效,抬起则认为无效”的算法,以保证输入数据的准确性。还可以利用短暂延时电路或状态寄存器等技术来消除抖动干扰,从而有效地提高按键输入的精度和可靠性。
1. 电子游戏
电子游戏是一种需要快速响应、高精度的应用场景,玩家需要在短时间内完成复杂的操作,并保证输入的准确性和流畅度。此时,键盘消抖技术就显得尤为重要,可以有效消除按键的抖动和误触干扰,提高玩家的游戏体验和胜率。
按键消抖原理
按键消抖原理
按键消抖原理是指在按下按键后,由于机械特性引起的按键跳动现象被过滤掉,保证按键信号的稳定性和可靠性。按键消抖的实现原理通常是通过软件技术来实现。下面将介绍两种常见的按键消抖原理。
1. 软件延时消抖原理:
在按键按下时,通过软件延时一段时间,然后再读取按键状态。软件延时的作用是等待机械抖动的结束,只有当一段时间内按键状态保持不变时,才认为按键真正被按下。这种方法简单易行,但缺点是消抖时间较长,响应速度较慢。
2. 状态扫描消抖原理:
在按键按下时,通过不断扫描按键状态来判断按键是否真正被按下。状态扫描的过程是周期性地读取按键状态,如果发现连续几次读取到的按键状态相同,则认为按键稳定,即按键被按下。这种方法比延时消抖的响应速度更快,但需要一个额外的线程或中断服务程序来执行状态扫描。
以上是两种常见的按键消抖原理,它们都能有效解决按键抖动问题,提高按键信号的稳定性和可靠性。在具体应用中,可以根据需要选择适合的消抖原理来实现按键的稳定响应。
51单片机按键消抖程序原理
51单片机按键消抖程序原理
一、引言
按键消抖是嵌入式系统编程中常见的问题之一,尤其是在使用51单片机时。51单片机是一款常用的微控制器,广泛应用于各种嵌入式系统中。按键作为常见的输入设备,在51单片机应用中经常被使用。由于按键的机械特性,当按键按下或释放时,会产生机械抖动,给系统带来误操作。因此,了解并编写按键消抖程序对于保证系统的正常运行至关重要。
二、消抖原理
按键消抖,简单来说,就是通过一定的算法,消除按键产生的机械抖动,从而准确识别按键的状态。其原理主要基于以下两点:
1.机械抖动的特点:按键的机械抖动主要表现为按键触点之间的快速开关,产生一系列微小的电信号。这些信号通常包含真实的按键输入信号和噪声信号。
2.消抖算法:通过分析这些信号,识别出真实的按键输入信号,并忽略噪声信号,从而达到消除机械抖动的目的。常用的消抖算法有阈值比较法、防抖延时法、防抖滤波法等。
三、消抖程序实现
下面以51单片机为例,介绍一种简单的阈值比较法消抖程序实现:
```c
voidkey_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;
FPGA入门系列实验教程——按键消抖控制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;
else
cnt<=cnt+1'b1;
wire sample_pulse=cnt==18'h3ffff;
按键消抖原理
按键消抖原理
按键消抖通俗来说就是在按下或松开按键时,由于机械性能的限制,会出现短时间内多次开关状态的变化,这种现象称为按键抖动。对于需要按键精准响应的电子设备而言,按键抖动会给正常使用带来很大的干扰。
按键消抖的原理是通过软件算法实现。一般来说,消抖分为两个阶段:第一阶段叫做消除抖动,第二阶段叫做确认有效。具体做法是在按键按下时,先等待一段时间(一般为几毫秒),然后读取按键的状态。如果读取到的状态与第一次读取到的状态相同,就确认按键是有效的;如果读取到的状态与第一次不同,则重新进行第一阶段的消抖处理。
按键消抖的实现方法有多种,其中比较常见的是基于中断处理的方法和基于定时器的方法。基于中断处理的方法是指在按键按下时,通过中断函数来响应按键事件,并进行消抖处理;基于定时器的方法是指通过定时器设定一定时间,在这段时间内进行按键状态的检测和消抖处理。无论采用哪种方法,按键消抖的原理都是一样的。
综上所述,按键消抖是通过软件算法实现的,可以有效地消除按键抖动对电子设备的干扰。在实际应用中,需要根据实际情况选择合适的消抖方法和参数,以达到最佳的按键响应效果。
- 1 -
按键消抖的原理
按键消抖的原理
按键消抖是指在按键被按下或松开时,因按键触点的弹性以及机械结构原因,导致按键信号在短时间内频繁抖动,从而产生多次触发信号的现象。为了有效避免按键抖动对系统带来的干扰和误操作,需要进行按键消抖处理。按键消抖的原理主要包括硬件消抖和软件消抖两种方式。
硬件消抖是通过在按键电路中添加外部元件实现的。常见的硬件消抖方式包括使用电容、电感或者滤波器等元件,通过延迟、滤波或者稳定电平等方式来消除按键抖动信号。电容消抖的原理是利用电容的充放电特性,将抖动的信号通过电容进行延时处理,从而产生稳定的按键触发信号。电感消抖则是利用电感的滤波特性,通过电感对抖动信号进行滤波处理,从而获得稳定的按键信号。而滤波器消抖则是通过在电路中加入滤波器元件,对抖动信号进行滤波处理,使得按键信号变得稳定可靠。硬件消抖的优点是简单可靠,但缺点在于需要占用额外的电路资源和成本,且对于信号干扰抑制能力有一定的限制。
软件消抖是通过程序算法来实现的,常见的软件消抖方式包括延时消抖、状态机消抖和计数器消抖等。延时消抖的原理是在按键按下后通过一个设定的延时时间来判断按键的有效触发,若在延时时间内未出现抖动信号,则判定为有效触发信号。状态机消抖是通过设定按键的状态机来判断有效触发信号,只有在按键状态经过一定的稳定转换后才判断为有效触发。计数器消抖则是通过设定一个计数器,在计数器计数达到一定次数后才判断为有效触发信号。软件消抖的优点是不需要额外的硬件资源,可灵活性高,但缺点在于需要占用系统的处理器资源和对于时
间精度的要求较高。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按键消抖
1功能概述
按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。实际应用中,按键开关通常为机械式弹性开关。当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。为保证系统及时正确识别,必须对这种情况作出相应处理。我们称之为按键消抖。
按键消抖可分为硬件消抖和软件消抖。硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。如果按键较多,则使用软件消抖。软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。需要注意的是,软件消抖需要占据一定的系统资源。
尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。
优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。在本例中,我们的只需要用4个信号界定,并用很短的代码即可。下面我们先来看看功能要求:
在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。
2 设计思路
一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。
1
图1 按键抖动过程示意
当系统检测出按键闭合后,执行一个延时程序,产生5ms~10ms的延时;前沿抖动消失后,再一次检测键的状态;如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。本案例我们设置经过20 ms后的高电平才是真正的按键功能。
信号列表如下:
3 程序设计
模块代码
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18 module key_module(
clk ,
rst_n ,
key_in ,
key_vld
);
parameter DATA_W = 20 ;
parameter KEY_W = 4 ;
parameter TIME_20MS= 1_000_000 ;
input clk ;
input rst_n ;
input [KEY_W-1 :0] key_in ;
output [KEY_W-1 :0] key_vld ;
reg [KEY_W-1 :0] key_vld ;
reg [DATA_W-1:0] cnt ;
wire add_cnt ;
wire end_cnt ;
2
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
reg flag ;
reg [KEY_W-1 :0] key_in_ff1 ;
reg [KEY_W-1 :0] key_in_ff0 ;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
cnt <= 20'b0;
end
else if(add_cnt)begin
if(end_cnt)
cnt <= 20'b0;
else
cnt <= cnt + 1'b1;
end
else begin
cnt <= 0;
end
end
assign add_cnt = flag==1'b0 && (key_in_ff1!=0);
assign end_cnt = add_cnt && cnt == TIME_20MS - 1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag <= 1'b0;
end
else if(end_cnt)begin
flag <= 1'b1;
end
else if(key_in_ff1==0)begin
flag <= 1'b0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_in_ff0 <= 0;
key_in_ff1 <= 0;
end
else begin
key_in_ff0 <= key_in ;
key_in_ff1 <= key_in_ff0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_vld <= 0;
end
else if(end_cnt)begin
key_vld <= key_in_ff1;
end
else begin
key_vld <= 0;
end
end
endmodule
3