FPGA之按键消抖

2024-01-10 14:44
文章标签 fpga 按键 消抖

本文主要是介绍FPGA之按键消抖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.原理

2.代码

2.1 key_filter.v

2.2 tb_key_filter.v


1.原理

按键分为自锁式按键和机械按键,图左边为自锁式按键

上图为RS触发器硬件消抖,当按键的个数比较多时常常使用软件消抖。硬件消抖会使用额外的器件占用电路板上的空间。

思路就是使用延时程序去掉抖动的部分,抖动就是不规则的高低电平变化。

只要在20ms之内没有抖动的产生,就可以认为按键的可用的。计数器的作用就是当检测道低电平时就开始计数,当检测到高电平时就清零。

因为50MHZ的时钟,周期为20ns,要计满20ms,20ms=20000_000ns,则计数器要计数20000_000/20=1000_000个时钟周期,所以计数器的值是从0-999_999。

出现了一个问题,若稳定的时间足够长,在稳定期间就会出现多次清零,多个最大值,多个脉冲信号,这不是我们想要的结果。为此对波形图做修改。

此时的原理就是当计数道最大值时计数器不清零,直到下一个按键输入检测到为高电平再清零。

但此时输出信号就不再是一个脉冲信号了,而是一个长长的高电平。因此再次对波形图做修改。

当计数到999_999-1时,就把输出拉高一个时钟周期,然后清零。

以上这张图的tb_cnt是为了仿真的。19-49(前抖动),149-199赋值随机数模拟抖动(后抖动),0-19,199-249赋值为高电平模仿按键未被按下,其余时间赋值为0模仿按键按下。

2.代码

2.1 key_filter.v

module key_filter
#(parameter	CNT_MAX=20'd999_999
)
(input wire 		sys_clk			,input wire 		sys_rst_n		,input wire 		key_in			,output reg	 	key_flag		
);reg [19:0]	cnt_20ms		;always @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n==1'b0)cnt_20ms<=20'd0;else if(key_in==1'b1)cnt_20ms<=20'd0;else if(cnt_20ms==CNT_MAX)cnt_20ms<=CNT_MAX;elsecnt_20ms<=cnt_20ms+20'd1;always @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n==1'b0)key_flag<=1'b0;else if(cnt_20ms==CNT_MAX-20'd1)key_flag<=1'b1;elsekey_flag<=1'b0;endmodule

2.2 tb_key_filter.v

`timescale 1ns/1ns
module tb_key_filter();reg 		sys_clk	;
reg 		sys_rst_n;
reg			key_in	;
reg [7:0]	tb_cnt	;//使用计数器进行一个周期的计数,模拟一次按键按下,计数的最大值暂定为250次(8位)wire 		key_flag	;initialbeginsys_clk=1'b1;sys_rst_n<=1'b0;#20sys_rst_n<=1'b1;endalways #10 sys_clk=~sys_clk;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+8'd1;//模拟按键过程,检测到低电平开始计数,检测到高电平清0
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)key_in<=1'b1;else if(((tb_cnt>=8'd19)&&(tb_cnt<=8'd49))||((tb_cnt>=8'd149)&&(tb_cnt<=8'd199)))	//模仿抖动key_in<={$random}%2;else if((tb_cnt<8'd19)||(tb_cnt>8'd199))//模仿按键未被按下key_in<=1'b1;else key_in<=1'b0;  //模仿稳定时候key_filter 
#(.CNT_MAX(20'd24)  //相当于计数25
)
tb_key_filter
(. sys_clk		(sys_clk),. sys_rst_n		(sys_rst_n),. key_in		(key_in)	,. key_flag		(key_flag)	
);endmodule

计数器最大计数到249,共计数250正确。

0-19 key_in是高电平

计数器计数19-49模拟抖动

49-149模拟按键按下稳定状态

观察标志信号,确在计数稳定25次之后,也就是计数第24的时候拉高标志信号一个时钟周期

这篇关于FPGA之按键消抖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591149

相关文章

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

FPGA编译与部署方法全方位介绍

FPGA编译与部署是FPGA开发中的核心环节,涉及从代码编写、调试到将设计部署到FPGA硬件的全过程。这个流程需要经过创建项目、编写FPGA VI、模拟调试、编译生成比特流文件,最后将设计部署到硬件上运行。编译的特点在于并行执行能力、定制化硬件实现以及复杂的时钟管理。通过LabVIEW的FPGA模块和NI硬件,可以快速完成开发和部署,尤其适用于复杂控制与高性能数据处理系统。 1. FPG

FPGA开发:条件语句 × 循环语句

条件语句 if_else语句 if_else语句,用来判断是否满足所给定的条件,根据判断的结果(真或假)决定执行给出的两种操作之一。 if(表达式)语句; 例如: if(a>b) out1=int1; if(表达式)         语句1; else         语句2; 例如: if(a>b)out1=int1;elseout1=int2; if(表达式1) 语句1; els

FPGA开发:模块 × 实例化

模块的结构 对于C语言,其基本单元为函数。与此类似,Verilog的基本设计单元称之为"模块"(block)。对于整个项目的设计思想就是模块套模块。 一个模块由两个部分组成:一部分描述接口,一部分描述逻辑功能。 每个Verilog模块包含4个部分:端口定义、IO说明、内部信号声明、功能定义。且位于module和endmodule之间,如下: module block(a,b,c);inpu

LabVIEW环境中等待FPGA模块初始化完成

这个程序使用的是LabVIEW环境中的FPGA模块和I/O模块初始化功能,主要实现等待FAM(Field-Programmable Gate Array Module,FPGA模块)的初始化完成,并处理初始化过程中的错误。让我们逐步分析各部分的功能: 1. Wait for FAM Initialization框架 此程序框架用于等待I/O模块成功初始化。如果在5秒钟内模块没有完成配

FPGA随记——小说 可综合和不可综合

当然我在网络上找到了些可综合和不可综合的解释 感觉也很有参考价值: https://wenda.so.com/q/1378362174074040 综合就是把你写的rtl代码转换成对应的实际电路。 比如你写代码assign a=b&c; EDA综合工具就会去元件库里拿一个二输入与门出来,然后输入端分别接上b和c,输出端接上a 假如你写了很多这样的语句 assign a=b&c; assig

Xilinx系FPGA学习笔记(五)ROM的IP核学习

系列文章目录 文章目录 系列文章目录前言ROM IP分布式ROM生成ROM配置创建COE文件 块ROM生成如何快速生成Example Design 两种ROM对比 前言 最近在学习小梅哥的xilinx型FPGA开发板,一边学习一边记录,简化整理一下笔记 ROM IP 在 Memories &Storage Elements 下可以看到有两个与 ROM 相关的

3.门锁_STM32_矩阵按键设备实现

概述 需求来源: 门锁肯定是要输入密码,这个门锁提供了两个输入密码的方式:一个是蓝牙输入,一个是按键输入。对于按键输入,采用矩阵按键来实现。矩阵按键是为了模拟触摸屏的按键输入,后续如果项目结束前还有时间就更新为触摸屏按键输入。 矩阵按键开发整体思路: 由于矩阵按键就是GPIO的控制,所以不进行芯片和设备的分层编写,控制写在同一个文件中,最终向应用层提供一个接口。 代码层级关系:

基于FPGA的开源项目:FOC/SHA/USB/JPEG等

文章目录 [1. USB 1.1控制器](https://github.com/WangXuan95/FPGA-USB-Device)[2. FOC控制算法](https://github.com/WangXuan95/FPGA-FOC)[3. BSV高级硬件描述语言入门指南](https://github.com/WangXuan95/BSV_Tutorial_cn)[4. 基于XDMA的

LCD彩条显示——FPGA学习笔记10

部分素材来自原子哥 一、LCD简介         基本原理:在两块平行玻璃板中填充液晶材料,通过电场控制液晶分子旋转从而达到透光和遮光的目的。