FPGA之按键消抖

news2024/11/20 10:40:10

目录

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;
	else
		cnt_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;
	else
		key_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	;

initial
	begin
		sys_clk=1'b1;
		
		sys_rst_n<=1'b0;
		#20
		sys_rst_n<=1'b1;
	end
	
always #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;
	else
		tb_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的时候拉高标志信号一个时钟周期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1371010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XS5018B是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片

产品概述 XS5018B 是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片&#xff0c;支持 1M/2M 像素 图像传感器&#xff0c;一组 10-bit DVP 输入接口&#xff0c; ISP 具备优异的 3D 降噪功能&#xff0c;标清模拟输出支持 960H &#xff0c; 高清模拟输出支…

NR cell配置带宽时,如何设置carrierBandwidth?

NR中带宽在38.101中有规定。 如上是FR1 38.101-1中与带宽设定有关的table&#xff0c;协议中根据SCS规定的传输带宽和可以配置的RB 数如上表&#xff0c;也就是说在实网下或者lab测试配置带宽时要根据上表内容去配置&#xff0c;举例如下。 如上图分别是几种带宽的配置参数&…

设备管理系统建设方案书

1.设备管理系统 1.1.系统概述 需求描述 建立设备信息库&#xff0c;对设备相关档案的登录、整理。通过建立完善的设备档案&#xff0c;将设备的各类原始信息进行信息化统一管理&#xff0c;使设备档案查询工作方便快捷&#xff0c;维修管理&#xff0c;针对维修计划、维修工单…

2024律师课程推荐:iCourt律师执行实务集训营(赠《执行实务大礼包》)

律师行业竞争激烈&#xff0c;想要突破困境&#xff0c;就一定要把握蓝海机遇&#xff0c;实现提早布局。 如今&#xff0c;还有哪些业务是尚未被“卷起来”的“蓝海业务”&#xff1f; 从数据来看&#xff0c;执行业务一定是其中之一。 在 Alpha 系统中&#xff0c;以“执行…

JAVA静态引擎企业网站源码带文档

JAVA静态引擎企业网站源码带文档 系统介绍&#xff1a; 1.网站后台采用主流的 SSM 框架 jsp JSTL&#xff0c;网站前台采用freemaker静态化模版引擎生成html5 2.因为是生成的html&#xff0c;无需重复读取数据库&#xff0c;所以访问速度快&#xff0c;轻便&#xff0c;对服务器…

Pytorch张量通过索引获取指定数据

import torch x torch.tensor([1,2,3])x Out[3]: tensor([1, 2, 3])x[0] # 索引操作&#xff1a;取单个数字 Out[4]: tensor(1)x[0:1] # 切片操作&#xff1a;可以保持维度不变 Out[5]: tensor([1])x[torch.tensor([True,False,True])] # 布尔值索引&#xff0c;通过条件筛…

程序员面试技巧:成为HR心动的程序猿

文章目录 程序员必备的面试技巧导语一、准备充分二、突出亮点三、展示解决问题的能力四、良好的沟通能力五、积极展示学习态度示例结语&#x1f636; 写在结尾 程序员必备的面试技巧 “程序员必备的面试技巧&#xff0c;就像是编写一段完美的代码一样重要。在面试战场上&#…

探索Shadowsocks-Android:保护你的网络隐私

探索Shadowsocks-Android&#xff1a;保护你的网络隐私 I. 引言 在数字时代&#xff0c;网络隐私和安全变得愈发重要。我们越来越依赖互联网&#xff0c;但同时也面临着各种网络限制和监控。在这个背景下&#xff0c;Shadowsocks-Android应用程序应运而生&#xff0c;为用户提…

2024PMP考试新考纲-【过程领域】近期典型真题和超详细解析

前面的文章&#xff0c;华研荟讲解了三十多道PMP新考纲下的【人员People领域】的近年真题&#xff0c;这篇文章开始为大家分享【过程Process领域】的新考纲下的真题&#xff0c;进一步帮助大家体会和理解新考纲下PMP的考试特点和如何应用知识来解题&#xff0c;并且举一反三&am…

基于ZU19EG的100G-UDP解决方案

概述 本文档介绍ZU19EG与Mellanox CX6 100G网卡通信解决方案。 环境配置 FPGA硬件&#xff1a;519-ZU19EG的4路100G光纤PCIe加上计算卡 电脑&#xff1a;国产国鑫主板&#xff08;双PCU&#xff09;&#xff1a;Gooxi G2DA-B CPU:Intel Xeon Silver 2.2GHz 内存&#xff1…

React入门 - 04(从编写一个简单的 TodoList 说起)

继上一节我们已经对 React组件和 ”JSX语法“有了大概的了解&#xff0c;这一节我们继续在 react-demo这个工程里编写代码。这一节我们来简单实现一个 TodoList来更加了解编写组件的一些细节。 1、在编辑器中打开 react-demo这个工程 2、打开 index.js文件&#xff0c;将组件 …

Mysql判断一个表中的数据是否在另一个表存在

方式一&#xff1a; 判断A表中有多少条数据在B表中【存在】,并且显示这些数据–EXISTS语句 select A.ID, A.NAME from 表A where EXISTS(select * from 表B where A.IDB.ID) 判断A表中有多少条数据在B表中【不存在】&#xff0c;并且显示这些数据–NOT EXISTS语句 select …

Zookeeper系列(一)集群搭建(非容器)

系列文章 Zookeeper系列&#xff08;一&#xff09;集群搭建&#xff08;非容器&#xff09; 目录 前言 下载 搭建 Data目录 Conf目录 集群复制和修改 启动 配置示例 测试 总结 前言 Zookeeper是一个开源的分布式协调服务&#xff0c;其设计目标是将那些复杂的且容易出错的分…

flex布局(3)

九、骰子 *{margin:0;padding: 0;box-sizing: border-box; } .flex{display: flex;flex-flow: row wrap;justify-content: space-between;align-items: center;align-content: space-between;padding:20px; } .touzi{width: 120px;height: 120px;background-color: aliceblue;…

Rabbitmq 消息可靠性保证

1、简介 消息的可靠性投递就是要保证消息投递过程中每一个环节都要成功&#xff0c;本文详细介绍两个环节的消息可靠性传递方式&#xff1a;1&#xff09;、消息传递到交换机的 confirm 模式&#xff1b;2&#xff09;、消息传递到队列的 Return 模式。 消息从 producer 到 ex…

智能化输电线路定位技术:提升电网运行效率的未来发展方向

随着科技的不断发展&#xff0c;电力行业也在逐步引入智能化技术&#xff0c;以提高输电线路的运行效率和安全性。在这篇文章中&#xff0c;恒峰智慧科技将探讨一种新的输电线路定位技术——分布式行波测量技术&#xff0c;它如何帮助我们实现这一目标。 一、分布式故障定位及隐…

STM32-创建工程模板

STM32 工程模板没有统一的格式&#xff0c;可以参考 ST 官方的示例模板或者根据自己的开发经验和使用习惯总结。 Project Template 文档以库函数工程模板为例&#xff0c;HAL 库工程模板对应参考即可。 Official Project Template ST 发布的标准外设库 (STM32 Standard Per…

docker搭建部署mysql并挂载指定目录

Docker是一种轻量级、可移植的容器化平台&#xff0c;可以简化应用程序的部署和管理。在本文中&#xff0c;我们将探讨如何使用Docker来搭建和部署MySQL数据库&#xff0c;并将数据和配置文件挂载到外部目录&#xff0c;以实现数据持久化和方便的配置管理。 1: 安装Docker 首…

git撤销提交到本地的commit

有些时候&#xff0c;当我们提交代码到本地后&#xff0c;突然发现因为某些原因需要撤销提交本地的代码。 就比如我&#xff0c;因为代码写错了分支&#xff0c;已经提交到本地了&#xff0c;而我需要取消&#xff0c;并且还要把代码搞得另外的分支上。 提交前&#xff1a; …

MIB 变更周期

MIB 始终以 80 ms 的周期在 BCH 上传输并在 80 ms 内重复&#xff0c;并且它包括从小区获取 SIB1 所需的参数&#xff1b;如果 SSB 的周期大于 80 ms&#xff0c;则 MIB 的发送周期与 SSB 的周期相同。 在UE初始搜索时&#xff0c;SSB在半帧内的周期是20ms&#xff1b;所以对于…