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

2022-7-20 06:09 2616 11 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

视频看不到啊
相关推荐阅读
二月半 2024-05-09 11:10
ADS软件分享与安装
ADS软件的简介ADS软件(Advanced Design System)主要用于射频(RF)、微波(Microwave)和毫米波(Millimeter-wave)电路的设计、仿真和分析。它提供了一套...
二月半 2024-03-31 09:22
从零开始摄像头驱动设计(一)_I2C框架及设备树插件应用
前言像我这样很多学习驱动的同学都会想一个问题:学了这个能干嘛?学了那个能干嘛?姑且找找网络上开源的项目,找找,看看,还是一脸懵。因为开源只提供源码和大致介绍下做什么和有什么。而面对于基础开发者的博客还...
二月半 2024-03-28 09:10
高速电路设计、完整性设计推荐书籍
信号传输如今是越来越高速,伴随着的将是更多的信号完整性的问题。然而电源的完整性也影响着信号的完整性。这样的高速传输,以前不用太多考虑的EMI问题,也越来越被关注。 针对于这些问题,对于layout工...
二月半 2024-03-15 07:01
Cadence之创建自己的titleblock
在刚接触PCB原理图设计的时候,很多人是不会关注图纸Tile Block的。原因是觉得用不上。然而工作的时候这个反而很重要。原因呢,一是形成一个统一标准,便于归档,整洁清楚,二是其中包含重要信息,比如...
二月半 2024-03-12 09:38
allegro之坚固的半孔制作
随着芯片不断的更新迭代,一浪拍死一浪。做硬件的特别头疼,核心电路或者可复用电路因为某一个板卡需要重新设计整板。很多都是做的无用功,为了更加高效的完成工作,然后摸鱼。硬件界的人才们,找到了很多方法。最多...
二月半 2024-03-07 11:03
ALLegro之单独设置PIN脚与覆铜连接方式
 设计PCB时,有很多时候在总电源输入处需要将一部分pin脚设置为全连接,给大电流拓宽通道。然而如果往常针对同一覆铜下的同属性pin脚只能全部设置为全连接或者其他。所以,在初学者手上也出现了...
EE直播间
更多
我要评论
8
11
关闭 站长推荐上一条 /3 下一条