您的位置:首页 > 科技 > 能源 > 兰州业之峰装饰公司_市建设工程信息网_专业做网站设计_百度seo关键词排名优化工具

兰州业之峰装饰公司_市建设工程信息网_专业做网站设计_百度seo关键词排名优化工具

2025/2/25 1:20:26 来源:https://blog.csdn.net/weixin_65793170/article/details/144256949  浏览:    关键词:兰州业之峰装饰公司_市建设工程信息网_专业做网站设计_百度seo关键词排名优化工具
兰州业之峰装饰公司_市建设工程信息网_专业做网站设计_百度seo关键词排名优化工具

目录

前言
一. 具体场景
二. 消抖方法
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网络

    1. 利用电阻和电容组成低通滤波器,滤除按键抖动产生的高频噪声。

    2. 当按键按下或释放时,RC电路会平滑电压变化,输出稳定的电平信号。

  • 施密特触发器:通过施密特触发器的滞回特性,消除抖动信号中的不稳定电平。

优点
  1. 不占用FPGA逻辑资源。

  2. 消抖效果稳定,不受软件逻辑影响。

缺点
  1. 需要额外的硬件电路,增加成本和PCB面积。

  2. 延时时间固定,无法灵活调整。

适用场景
  1. 对FPGA资源敏感或需要高可靠性的场景。

  2. 适用于简单的按键输入,无需复杂逻辑处理。

2. 软件消抖

软件消抖是通过在FPGA或嵌入式系统中编写消抖逻辑来实现的。根据实现方式的不同,软件消抖可以进一步分为状态机实现消抖计数器实现消抖

① 状态机实现消抖

状态机实现消抖是通过有限状态机(FSM)来描述按键的状态变化,从而消除抖动。

实现原理
  • 状态定义:定义按键的几种状态,如“未按下”、“按下中”、“已按下”等。

  • 状态转移

    1. 根据按键输入信号和计时器,实现状态之间的转移。

    2. 例如,在检测到按键从高电平变为低电平时,状态机不会立即确认按键事件,而是进入一个“等待确认”的中间状态,经过一段时间后再次检查按键状态。

  • 输出逻辑:在稳定按下或释放状态时,输出有效的按键状态。

优点
  1. 逻辑清晰,易于扩展。

  2. 可以处理复杂的按键行为(如长按、双击等)。

缺点
  1. 实现相对复杂,需要设计状态机和状态转移逻辑。

  2. 占用一定的逻辑资源。

适用场景
  1. 需要处理复杂按键行为的场景(如长按、双击、组合键等)。

  2. FPGA设计中需要高可靠性和灵活性的按键处理。

② 计数器实现消抖

计数器实现消抖是一种常见的数字逻辑消抖方法,其核心思想是通过计数器记录按键按下的时间,只有当按键状态稳定一段时间后,才认为按键有效。

实现原理
  • 计数器逻辑

    1. 当按键按下时,计数器开始计数。

    2. 当计数器达到设定的延时值(如20ms对应的时钟周期数)时,认为按键状态稳定。

    3. 如果按键在计数过程中被释放,计数器会被清零。

  • 标志信号:当计数器接近最大值时,生成一个标志信号,表示按键状态已经稳定。

优点
  1. 实现简单,逻辑清晰。

  2. 不依赖外部硬件,纯数字逻辑实现。

  3. 延时时间可通过参数灵活调整。

缺点
  1. 需要占用一定的逻辑资源(计数器)。

  2. 延时时间受时钟频率影响,需要根据具体硬件调整。

适用场景
  1. FPGA设计中需要简单、高效的按键消抖。

  2. 适用于按键数量较少、逻辑资源充足的项目。


三. 方法对比

以下是各类消抖方法的对比总结:

消抖方法实现方式分类优点缺点适用场景
硬件消抖外部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)软件消抖

  1. 这段代码是通过FPGA内部的数字逻辑实现的,不依赖外部硬件电路。

  2. 消抖逻辑完全由Verilog代码实现,属于软件消抖的范畴(软硬结合)。

(2)计数器实现消抖

  1. 代码的核心是通过计数器cnt记录按键按下的时间,只有当按键状态稳定一段时间后,才认为按键有效。

  2. 这种方法属于计数器实现消抖,是软件消抖的一种具体实现方式。


3. 代码特点

优点

  1. 实现简单:通过计数器和简单的逻辑判断即可实现消抖。

  2. 灵活性高:延时时间可通过参数delay灵活调整。

  3. 不依赖外部硬件:完全由FPGA内部的逻辑资源实现。

缺点

  1. 占用逻辑资源:计数器cnt和标志信号flag会占用一定的FPGA资源。

  2. 受时钟频率影响:延时时间与时钟频率相关,需要根据具体硬件调整delay的值。


4. 适用场景

  1. FPGA设计:适用于需要在FPGA中实现按键消抖的场景。

  2. 简单按键处理:适用于按键数量较少、逻辑资源充足的项目。

  3. 延时要求灵活:适用于需要动态调整消抖时间的场景。

代码图片:


五. 本文总结

按键消抖是FPGA设计中的重要环节,分为硬件消抖软件消抖两大类。硬件消抖通过外部电路实现,不占用FPGA资源但增加硬件成本;软件消抖通过逻辑设计实现,包括状态机和计数器两种方式,状态机适合复杂按键行为,计数器则简单高效。我们应该根据资源、延时需求和系统复杂度选择合适方法,以提高系统稳定性和用户体验。


六. 更多操作

完整FPGA系列,请看

FPGA系列,文章目录https://blog.csdn.net/weixin_65793170/article/details/144185217?spm=1001.2014.3001.5501icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_65793170/article/details/144185217?spm=1001.2014.3001.5501

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com