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

2022-7-20 06:09 2721 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-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的输出...
二月半 2025-06-02 21:24
【Milk-V Duo 开发板】+初用体验
许久未在面包板社区申请板卡评测了。这一次偶然最近的这款Milk-V Duo开发板正在评测。首次看到如此简单切功能强大的嵌入式平台:· 支持linux、rtos· 可接一路Camera,做人脸检测、目标...
二月半 2025-05-18 20:54
7. ESP32开发之freeRTOS的互斥量
什么是互斥量互斥量的应用场合互斥量的API函数基本代码结构互斥量使用举例递归锁递归锁举例总结什么是互斥量在freeRTOS中,多个任务访问一块共享资源,会产生竞争现象。比如马路上只有一个很早以前的电话...
二月半 2025-05-18 20:48
6. ESP32开发之freeRTOS的信号量
什么是信号量信号量能干啥信号量的函数实例举例总结什么是信号量简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的...
二月半 2025-04-17 16:27
【原创奖励】ESP开发之ubuntu环境搭建
1. 在Ubuntu官网下载Ubuntu server  20.04版本https://releases.ubuntu.com/20.04.6/2. 在vmware下安装Ubuntu3. 改...
我要评论
8
12
关闭 站长推荐上一条 /2 下一条