原创 三十而立学FPGA之按键消抖

2022-7-20 06:09 2739 12 1 分类: FPGA/CPLD 文集: FPGA
1.简介

按键为何消抖,原因是当按键按下和松开时,由于弹片回弹抖动,而导致按键对应管脚误判为多次按下和松开。

从以下动图对比可以看出:

2.原理

如图,我们认为的按键波形是理想的,然而其实正真的实际波形是每次按下和弹起都是由回弹的,如图实际波形其实也是理想化的,为了方便理解。

既然有回弹,那么怎么避免呢?一般采用方式为延时法。C语言最直接直接一个delay就完事了,简单粗暴。在FPGA里,使用延时+判断的方式,既延时完后再次判断是否已经稳定。

3.源代码
3.1状态机转移图

3.2实现
3.2.1延时模块
//计数延迟5ms always@(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) delay_cnt <= 20'd0; else if(cnt_start == 1'b1) delay_cnt <= delay_cnt + 20'd1; else delay_cnt <= 20'd0; end always@(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) cnt_finish <= 1'b0; else if(delay_cnt == 20'd499999) cnt_finish <= 1'b1; else cnt_finish <= 1'b0; end

//FSM for the key always@(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin state <= IDLE; cnt_start <= 1'b0; key_o_r <= 1'b1; end else case(state) IDLE :begin if(key_neg == 1'b1) begin cnt_start <= 1'b1; state <= FILTER0; end else state <= IDLE; end FILTER0 :begin if(cnt_finish == 1'b1) begin cnt_start <= 1'b0; key_o_r <= 1'b0; state <= DOWN; end else if(key_pos == 1'b1) begin state <= IDLE; cnt_start <= 1'b0; end else begin state <= FILTER0; end end DOWN :begin if(key_pos == 1'b1) begin state <= FILTER1; cnt_start <= 1'b1; end else begin state <= DOWN; end end FILTER1 :begin if(cnt_finish == 1'b1) begin cnt_start <= 1'b0; state <= IDLE; key_o_r <= 1'b1; end else if(key_neg == 1'b1) begin state <= DOWN; cnt_start <= 1'b0; end else begin state <= FILTER1; end end default :begin state <= IDLE; key_o_r <= 1'b1; cnt_start <= 1'b0; end endcase end

作者: 二月半, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1862109.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

追忆流年寻梦少年 2022-7-20 12:59

雏羽: 没示波器,打算设计个示波器,以后展示波形
期待ing。。。。
赞!

雏羽 2022-7-20 12:54

追忆流年寻梦少年: 是的,消抖效果很好!
对于硬件接触的抖动,想看看其波形、频率等,工程师的好奇心啊哈哈
没示波器,打算设计个示波器,以后展示波形

追忆流年寻梦少年 2022-7-20 12:44

雏羽: 现象很明显了
是的,消抖效果很好!
对于硬件接触的抖动,想看看其波形、频率等,工程师的好奇心啊哈哈

雏羽 2022-7-20 10:59

追忆流年寻梦少年: 可以用示波器抓波形比对一下啊,现在的消抖效果明显啊。
现象很明显了

追忆流年寻梦少年 2022-7-20 10:30

可以用示波器抓波形比对一下啊,现在的消抖效果明显啊。

雏羽 2022-7-20 09:31

nufuvcgx: 哦 看到了
之前开启了私有视频,现在公开了

nufuvcgx 2022-7-20 09:14

哦 看到了

nufuvcgx 2022-7-20 09:13

视频看不到啊
相关推荐阅读
二月半 2025-06-29 20:40
14. ESP32开发之ST7789显示
SPI概述ESP IDF中SPI LCD的相关API简单使用LVGL完整代码总结SPI概述当进入嵌入式行业开始,SPI总线是最需要且基础的知识了,它是高速全双工串行总线,可做到同时收发数据。时序和控制...
二月半 2025-06-17 16:39
13. ESP32开发之定时器中断
概述相关API函数举例:定时发送一个事件总结概述ESP32有一组外设--定时器组。它可以选择不同的时钟源和分配系数。该定时器应用灵活,超时报警可以自动更新计数值。相关API函数1.定时器配置结构体ty...
二月半 2025-06-12 14:32
【拆解】一款远程控制开关
七年前买了个远程控制开关,想想那个时候应该物联网才兴起的时候吧。如今因为控制麻烦且经常出现连接掉线问题,于是给淘汰了。这个设备我是拿来控制吊灯,特别麻烦的是,当晚上关灯后,会有一点灯点亮着,掉线的时候...
二月半 2025-06-12 10:11
ESP32开发之GPIO中断
电路图GPIO的中断类型相关API函数应用举例总结电路图在ESP32中内部有完整的控制电路,比如上下拉以及滤波器等,所以我们这里可以直接用一个微动开关连接到地。GPIO的中断类型GPIO_INTR_D...
二月半 2025-06-09 22:37
ESP32开发之WS2812B控制
WS2812B数据手册重点摘录硬件电路Remote Control Transceive(RMT)概念RMT的相关API函数一段简单的控制WS2812B的应用举例总结WS2812B数据手册重点摘录WS...
二月半 2025-06-04 09:07
10. ESP32开发之LED闪烁和呼吸的实现
硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程硬件电路介绍电路图如下:只要有硬件基础的应该都知道上图中,当GPIO4的输出...
EE直播间
更多
我要评论
8
12
关闭 站长推荐上一条 /5 下一条