FPGA——按键消抖
按键消抖
按键消抖主要针对的是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理,这就是按键消抖。
开始时的回弹时间和结束时的回弹时间一般为5~10ms,稳定时间一般为20ms,这里采用一个计数器,计数最大时间的为20ms,系统的晶振为50Mhz(换算成时间为20ns),20ms/20ns=1000000,所以计数器计数最大值为999999(从0开始计数)。当是系统检测到按键为低电平时,计数器开始计数,当系统检测到高电平时,对计数器清零。当计数到最大值时,让计数器保持值不变
然后再定义一个标志信号对按键消抖的稳定状态进行采集。当是计数器计数到最大值时,说明按键已经处于稳定状态。
RTL代码
module key_shake
#(parameter CNT_MAX = 20'd999_999//计数最大值,20ms
)
(input wire sys_clk ,input wire sys_rst_n ,input wire key_in ,output reg key_flag
);reg [19:0] cnt;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt <= 20'd0;else if(key_in == 1'b1)cnt <= 20'd0;else if(cnt == CNT_MAX)cnt <= CNT_MAX;elsecnt <= cnt + 1'b1;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)key_flag <= 1'b0;else if(cnt == CNT_MAX)key_flag <= 1'b1;elsekey_flag <= 1'b0;endmodule
testbench
`timescale 1ns/1ns
module tb_key_shake();reg sys_clk;
reg sys_rst_n;
reg key_in;
reg [7:0] tb_cnt;
wire key_flag;initial beginsys_clk = 1'b0;sys_rst_n <= 1'b0;key_in <= 1'b1;#20sys_rst_n <= 1'b1;endalways #10 sys_clk = ~sys_clk;//把按键消抖过程压缩至250个系统周期
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)tb_cnt <= 8'd0;else if(tb_cnt == 8'd249)tb_cnt <= 8'd0;elsetb_cnt <= tb_cnt + 1'b1;//模拟按键抖动
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)tb_cnt <= 8'd0;else if(tb_cnt <= 8'd24 || tb_cnt >= 8'd224)key_in <= 1'b1;else if((tb_cnt <= 8'd74 && tb_cnt > 8'd24)||(tb_cnt <= 8'd224 && tb_cnt >= 8'd174))key_in <= {$random}%2;elsekey_in <= 1'b0;key_shake
#(.CNT_MAX(70)
)
key_shake_inst
(.sys_clk (sys_clk),.sys_rst_n (sys_rst_n),.key_in (key_in),.key_flag (key_flag)
);endmodule
仿真结果把按键按下时长缩短到250个系统时钟周期。定义一个计数器tb_cnt,计数最大值为249,然后模拟按键被按下的过程。过程如下图所示
modelsim仿真结果
由仿真结果得,每一次模拟按键的稳定状态都被标志信号key_flag采集到。
ps:(部分图片和学习教程由野火提供)
FPGA——按键消抖相关推荐
- stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全
写在前面: 物联网STM32入门 - 直播课程 - 创客学院www.makeru.com.cn 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖 ...
- stm32硬件消抖_STM32单片机按键消抖和FPGA按键消抖大全
原标题:STM32单片机按键消抖和FPGA按键消抖大全 写在前面: 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动时间的长短和按键的机械特性有 ...
- FPGA按键消抖(高级篇)
一. 硬件介绍 FPGA开发板 一个按键 一个led灯 二. 功能介绍 可以满足三种不同要求的消抖方式 通过led灯测试三种消抖方式 三. 消抖方式介绍 mode 0 : 按键按下消抖后,算一次. m ...
- FPGA编程按键消抖
FPGA按键消抖 编写思路 1.按键消抖的基本原理 2.代码原理 3.代码部分 4.仿真代码编写 5.仿真 6.总结 一.按键消抖的基本原理 按键消抖,按下,松开存在毛刺,主要为了消除毛刺.通过稳定后 ...
- 【 FPGA 】按键消抖与LED灯流动小实验
记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...
- FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖
最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如 #10 B = A; 当A的变化小于1 ...
- [FPGA入门笔记](十):按键消抖实验
简介 今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油. 本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2.开发板输入时钟为 ...
- FPGA VerilogHDL语言 数字钟 按键消抖
1.描述 一个简单的基于FPGA的数字钟,语言用的是VerilogHDL,可以实现以下功能: 1. 数码管显示0-59(秒表) 2. 数码管显示:时-分-秒 3. 数码管显示时分秒并且可以设置时间(小 ...
- FPGA学习-Verilog实现独立按键消抖
文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...
- verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)
独立按键消抖设计与验证 本实验主要是为了锻炼状态机的思维模式以及熟练掌握TB的写法 本节主要收获了:define的用法,另外就是,顶层的input在TB中是reg的真正含义,其实就是把激励当做寄存器来 ...
最新文章
- ubuntu server安装php mysql_Ubuntu Server 下Apache+MySQL+PHP安装
- VS2012及VS系列怎样屏蔽CMD窗口~
- 重游java(猜拳项目)
- signature=4bfbf257ebc393e8ee3071d531b76778,(Mannose).
- 2012-01-10 自己写的基于jquery的翻页效果
- mongodb python 存文件_Python保存MongoDB上的文件到本地的方法介绍
- php mvc 通过 htaccess 隐藏 index.php 或 index.php?arg=
- Android已申请动态权限报错,Android 读取或者写入U盘时,报错:Permission denied
- Autodesk Map3d的应用和开发
- java开发面试中经常问到的问题(2019年5月)
- oracle 两表关联查询
- jQuery 梁桐老师笔记 - 选择器
- 领扣LintCode算法问题答案-983. 棒球游戏
- 【LOJ6198】谢特(后缀自动机)(01Trie)(dsu on tree)
- 常用正则表达式大全(包含港澳台身份证等校验)
- linux安装tomcat,菜鸟教程
- 【Android折叠屏适配】基于AutoSize框架适配折叠屏并兼容多窗口模式
- [译] 3.泛型和子类型
- zip解压文件 删除文件和文件目录
- UV-ARC符合铁路应用EN 50317-2002标准,可用于动车组、高铁受电弓电火花检测