目录
前言
一. 具体场景
二. 消抖方法
1. 硬件消抖
实现原理
优点
缺点
适用场景
2. 软件消抖
① 状态机实现消抖
实现原理
优点
缺点
适用场景
② 计数器实现消抖
实现原理
优点
缺点
适用场景
三. 方法对比
四. 代码实现
1. 代码分析
(1)计数器逻辑
(2)标志信号flag
(3)LED控制逻辑
2. 分类依据
(1)软件消抖
(2)计数器实现消抖
3. 代码特点
优点
缺点
4. 适用场景
五. 本文总结
六. 更多操作
前言
在数字电路FPGA(Field-Programmable Gate Array,现场可编程门阵列)设计中,按键开关的使用非常普遍。然而,由于机械按键的物理特性,在按下或释放瞬间会经历一段不稳定的时间,即所谓的“抖动”(Bounce)。这种抖动会在信号上产生短暂的、不稳定的高低电平变化,如果不处理,可能会导致误触发或计数错误。
FPGA的消抖方法通常分为硬件消抖和软件消抖。硬件消抖依赖外部电路(如RC网络),而软件消抖则通过FPGA内部的逻辑设计实现(如状态机或计数器)。
这里分享一种基于FPGA的计数器消抖方法,利用硬件逻辑资源实现软件消抖功能,并提供一个Verilog代码示例,用于按键消抖以及控制LED的状态切换。它是一种常见的软件消抖方法,利用FPGA内部的硬件资源(如计数器、触发器等)实现。
一. 具体场景
在FPGA(Field-Programmable Gate Array,现场可编程门阵列)设计中,按键消抖是一个常见的问题。由于机械按键的物理特性,按键在按下或释放时会产生抖动,导致短时间内多次触发信号。为了确保每次按键操作只被识别一次,需要进行消抖处理。
我们可以看到,当按键按下的那一刻,存在一段时间的抖动,同时在释放按键的一段时间里也是存在抖动的,这就可能导致状态在识别的时候可能检测为多次的按键,因为运行过程中普通的检测一
次状态key为1就执行一次按键操作,所以我们在使用按键时往往需要消抖。
消抖方式有很多种,相对而言比较简单容易理解的方式是通过延时来消抖。我们知道,抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。通过延时,只在中间稳定的某一个时刻(10ms)取
一个真正按键的使能值就可以很好的去抖动。
二. 消抖方法
按键消抖的基本原理是通过延时和采样,过滤掉按键抖动信号,确保系统能够准确识别按键的有效动作。常见的消抖方法可以分为两大类:硬件消抖和软件消抖。以下将详细介绍这两类方法及其子类。
1. 硬件消抖
硬件消抖是通过外部电路(如RC网络或施密特触发器)来消除按键抖动的方法。
实现原理
-
RC网络:
-
利用电阻和电容组成低通滤波器,滤除按键抖动产生的高频噪声。
-
当按键按下或释放时,RC电路会平滑电压变化,输出稳定的电平信号。
-
-
施密特触发器:通过施密特触发器的滞回特性,消除抖动信号中的不稳定电平。
优点
-
不占用FPGA逻辑资源。
-
消抖效果稳定,不受软件逻辑影响。
缺点
-
需要额外的硬件电路,增加成本和PCB面积。
-
延时时间固定,无法灵活调整。
适用场景
-
对FPGA资源敏感或需要高可靠性的场景。
-
适用于简单的按键输入,无需复杂逻辑处理。
2. 软件消抖
软件消抖是通过在FPGA或嵌入式系统中编写消抖逻辑来实现的。根据实现方式的不同,软件消抖可以进一步分为状态机实现消抖和计数器实现消抖。
① 状态机实现消抖
状态机实现消抖是通过有限状态机(FSM)来描述按键的状态变化,从而消除抖动。
实现原理
-
状态定义:定义按键的几种状态,如“未按下”、“按下中”、“已按下”等。
-
状态转移:
-
根据按键输入信号和计时器,实现状态之间的转移。
-
例如,在检测到按键从高电平变为低电平时,状态机不会立即确认按键事件,而是进入一个“等待确认”的中间状态,经过一段时间后再次检查按键状态。
-
-
输出逻辑:在稳定按下或释放状态时,输出有效的按键状态。
优点
-
逻辑清晰,易于扩展。
-
可以处理复杂的按键行为(如长按、双击等)。
缺点
-
实现相对复杂,需要设计状态机和状态转移逻辑。
-
占用一定的逻辑资源。
适用场景
-
需要处理复杂按键行为的场景(如长按、双击、组合键等)。
-
FPGA设计中需要高可靠性和灵活性的按键处理。
② 计数器实现消抖
计数器实现消抖是一种常见的数字逻辑消抖方法,其核心思想是通过计数器记录按键按下的时间,只有当按键状态稳定一段时间后,才认为按键有效。
实现原理
-
计数器逻辑:
-
当按键按下时,计数器开始计数。
-
当计数器达到设定的延时值(如20ms对应的时钟周期数)时,认为按键状态稳定。
-
如果按键在计数过程中被释放,计数器会被清零。
-
-
标志信号:当计数器接近最大值时,生成一个标志信号,表示按键状态已经稳定。
优点
-
实现简单,逻辑清晰。
-
不依赖外部硬件,纯数字逻辑实现。
-
延时时间可通过参数灵活调整。
缺点
-
需要占用一定的逻辑资源(计数器)。
-
延时时间受时钟频率影响,需要根据具体硬件调整。
适用场景
-
FPGA设计中需要简单、高效的按键消抖。
-
适用于按键数量较少、逻辑资源充足的项目。
三. 方法对比
以下是各类消抖方法的对比总结:
消抖方法 | 实现方式 | 分类 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|---|
硬件消抖 | 外部RC电路或施密特触发器 | 硬件消抖 | 不占用逻辑资源,消抖效果稳定 | 增加硬件成本,延时固定 | 对资源敏感或高可靠性要求的场景 |
状态机消抖 | 有限状态机描述按键状态变化 | 软件消抖 | 逻辑清晰,可处理复杂按键行为 | 实现复杂,占用逻辑资源 | 需要复杂按键行为的场景 |
计数器消抖 | 通过计数器记录按键稳定时间 | 软件消抖 | 实现简单,纯数字逻辑,延时可调 | 占用逻辑资源,受时钟频率影响 | FPGA数字逻辑设计 |
...... |
四. 代码实现
以下代码属于计数器实现消抖,是软件消抖的一种具体实现方式:
module key(input clk, // 时钟输入input rst_n, // 异步复位信号,低有效input key, // 按键输入output reg led // LED输出
);
parameter delay=50_0000; // 定义延时周期,假设clk频率为24MHz,则此值约为2ms左右reg [18:0] cnt; // 计数器,用于延时计数
wire flag; // 标志位,用于指示是否完成延时// 始终在时钟上升沿执行
always @(posedge clk)
beginif (!rst_n) begin // 如果复位信号有效(低电平)cnt <= 0; // 将计数器清零end else if (key == 0) begin // 如果按键被按下(低电平有效)if (cnt == delay - 1) begincnt <= cnt; // 如果计数达到最大值,则保持不变end else begincnt <= cnt + 1; // 否则增加计数值endend else begincnt <= 0; // 如果按键未按下,则重置计数器end
end// 分配flag信号,当计数达到delay-2时设置为高电平
assign flag = (cnt == delay - 2) ? 1 : 0;// 控制LED状态的逻辑
always @(posedge clk)
beginif (!rst_n) begin // 如果复位信号有效(低电平)led <= 0; // 关闭LEDend else if (key == 0 && flag) begin // 如果按键被按下且已经过了延时期间led <= ~led; // 切换LED状态end else beginled <= led; // 保持LED当前状态end
end
endmodule
这段代码通过计数器记录按键按下的时间,并在按键状态稳定后切换LED的状态,实现简单、灵活性高,适用于FPGA设计中的按键消抖场景。
1. 代码分析
这段代码的主要功能是通过计数器实现按键消抖,并在按键稳定按下后切换LED的状态。以下是代码的核心逻辑:
(1)计数器逻辑
-
计数器
cnt
:-
当按键按下时(
key == 0
),计数器开始计数。 -
当计数器达到设定的延时值(
delay - 1
)时,停止计数。 -
如果按键在计数过程中被释放,计数器会被清零。
-
-
延时时间:
-
delay
参数定义了延时周期。假设时钟频率为24MHz,delay=50_0000
对应的延时时间约为2ms。
-
(2)标志信号flag
-
当计数器接近最大值时(
cnt == delay - 2
),生成一个标志信号flag
,表示按键状态已经稳定。
(3)LED控制逻辑
-
当按键稳定按下且标志信号
flag
为高电平时,切换LED的状态(led <= ~led
)。
2. 分类依据
(1)软件消抖
-
这段代码是通过FPGA内部的数字逻辑实现的,不依赖外部硬件电路。
-
消抖逻辑完全由Verilog代码实现,属于软件消抖的范畴(软硬结合)。
(2)计数器实现消抖
-
代码的核心是通过计数器
cnt
记录按键按下的时间,只有当按键状态稳定一段时间后,才认为按键有效。 -
这种方法属于计数器实现消抖,是软件消抖的一种具体实现方式。
3. 代码特点
优点
-
实现简单:通过计数器和简单的逻辑判断即可实现消抖。
-
灵活性高:延时时间可通过参数
delay
灵活调整。 -
不依赖外部硬件:完全由FPGA内部的逻辑资源实现。
缺点
-
占用逻辑资源:计数器
cnt
和标志信号flag
会占用一定的FPGA资源。 -
受时钟频率影响:延时时间与时钟频率相关,需要根据具体硬件调整
delay
的值。
4. 适用场景
-
FPGA设计:适用于需要在FPGA中实现按键消抖的场景。
-
简单按键处理:适用于按键数量较少、逻辑资源充足的项目。
-
延时要求灵活:适用于需要动态调整消抖时间的场景。
代码图片:
五. 本文总结
按键消抖是FPGA设计中的重要环节,分为硬件消抖和软件消抖两大类。硬件消抖通过外部电路实现,不占用FPGA资源但增加硬件成本;软件消抖通过逻辑设计实现,包括状态机和计数器两种方式,状态机适合复杂按键行为,计数器则简单高效。我们应该根据资源、延时需求和系统复杂度选择合适方法,以提高系统稳定性和用户体验。
六. 更多操作
完整FPGA系列,请看
FPGA系列,文章目录https://blog.csdn.net/weixin_65793170/article/details/144185217?spm=1001.2014.3001.5501https://blog.csdn.net/weixin_65793170/article/details/144185217?spm=1001.2014.3001.5501