FPGA(Verilog)实现按键消抖

实现按键消抖功能:

1.滤除按键按下时的噪声和松开时的噪声信号。

2.获取已消抖的按键按下的标志信号。

3.实现已消抖的按键的连续功能。

Verilog实现

模块端口

key_filter(input	wire 	clk		,input	wire 	rst_n	,input	wire 	key_in	,	//按下按键时为0output 	reg 	key_flag,	//第一次按下的标志信号(已消抖)output 	reg 	key_out	,	//输出按键信号(已消抖)output 	reg 	key_cont	//输出连续按键信号(已消抖)-计时一段时间拉高1次
);

20ms计数

always@(posedge clk or negedge rst_n)if(!rst_n) cnt_20ms <= 20'd0;else if(key_in)	//松下按键cnt_20ms <= 20'd0;else if(cnt_20ms == CNT_20MS_MAX)	//达到消抖时间cnt_20ms <= CNT_20MS_MAX;elsecnt_20ms <= cnt_20ms+20'd1;

按键第一次按下的标志信号

always@(posedge clk or negedge rst_n)if(!rst_n) key_flag<=1'b0;else if(cnt_20ms == CNT_20MS_MAX-20'd1)	//已消抖,拉高key_flag一个周期key_flag<= 1'b1;else key_flag<=1'b0;

已消抖的按键信号

always@(posedge clk or negedge rst_n)if(!rst_n) key_out<=1'b0;else if(key_in)	//松下按键key_out<= 1'b0;else if(key_flag)	//已消抖key_out<= 1'b1;else ;

连续信号所需计数器

always@(posedge clk or negedge rst_n)if(!rst_n) cnt_cont <= 20'd0;else if(key_out) begin	//已消抖if(cnt_cont == CNT_CONT_MAX)cnt_cont <= 20'd0;else cnt_cont <= cnt_cont+20'd1;endelsecnt_cont <= 20'd0;

连续按键信号(已消抖)-计时一段时间拉高1次

always@(posedge clk or negedge rst_n)if(!rst_n) key_cont<=1'b0;else if(key_flag)key_cont <= 1'b1;else if(key_out) begin	//已消抖if(cnt_cont == CNT_CONT_MAX)	//连续按下一定时间,拉高key_cont一个周期key_cont <= 1'b1;else key_cont <= 1'b0;endelsekey_cont <= 1'b0;

testbench:

`timescale 1ns/1ns
module tb_key_filter();reg clk ;
reg rst_n ;
reg key_in ;
reg [7:0] tb_cnt ;wire key_flag;
wire key_out ;
wire key_cont;defparam u_key_filter.CNT_20MS_MAX = 20'd9;
defparam u_key_filter.CNT_CONT_MAX = 24'd49;initial begin clk = 1'b1 ;rst_n = 1'b0;#20rst_n = 1'b1;#(20*199+100)$stop;
endalways #10 clk=~clk;always@(posedge clk or negedge rst_n)if(!rst_n) tb_cnt <=8'b0;else if(tb_cnt ==8'd199)tb_cnt <=8'b0;elsetb_cnt <= tb_cnt +8'b1;always@(posedge clk or negedge rst_n)if(!rst_n) key_in <= 1'b1 ; else if(((tb_cnt>=8'd9) && (tb_cnt<=8'd39))||((tb_cnt>=8'd159) && (tb_cnt<=8'd179)))key_in<={$random}%2;else if((tb_cnt<8'd9)||(tb_cnt>8'd179))key_in<=1'b1;elsekey_in<=1'b0;key_filter u_key_filter(.clk		(clk		),.rst_n		(rst_n		),.key_in		(key_in		), .key_flag	(key_flag	),	//第一次按下的标志信号(已消抖).key_out	(key_out	),	//输出按键信号(已消抖).key_cont	(key_cont	)	//输出连续按键信号(已消抖)-计时一段时间拉高1次
);endmodule

仿真波形:

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

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

相关文章

[C++][C++11][六] -- [线程库]

目录 1.thread类的简单介绍2.线程对象的构造方法1.无参构造2.带参构造3.移动构造4.注意 3.thread提供的成员函数4.获取线程id5.线程函数的参数问题1.指针2.借助std::ref函数3.借助lambda表达式 6.join和detach1.join()2.detach() 7.[mutex](http://在C11中&#xff0c;Mutex总共…

无忧网络验证系统 getInfo SQL注入漏洞复现

0x01 产品简介 无忧网络验证是一套安全稳定高效的网络验证系统,基于统一核心的通用互联网+信息化服务解决方案,是为软件作者设计的一套完整免费的网络验证体系。可以为开发的软件增加收费授权的功能,让作者开发的软件可以进行销售、充值、登陆等操作,并且提供防破解验证功能…

Go 中无缓冲通道与容量为1的缓冲通道的区别

作为学Go的菜鸟&#xff0c;之前我以为这两个应该是同一个东西&#xff0c;以为无缓冲通道是缓冲通道容量为1的一种特殊情况。然鹅&#xff0c;这俩货根本不是同一个东西。 无缓冲通道 无缓冲通道也称为同步通道&#xff0c;发送操作会阻塞&#xff0c;直到另一个 goroutine …

TDengine Schemaless(无模式写入)常见问题的原因及故障排除

Tips&#xff1a;使用版本&#xff1a;3.0.2.6 &#xff08;一&#xff09;TDengine ERROR (80003002): Invalid data format 格式化问题&#xff1b;如缺少必要的组成格式&#xff08;时间戳、超级表等&#xff09;&#xff0c;或有字符串未作修饰符修饰&#xff0c;类似的还…

0基础如何进入IT行业?【模板】

0基础如何进入IT行业&#xff1f; 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 提醒&#xff1a;在发布作品前&#xff0c;请把不需要的内容删掉。 方…

工业通信原理——Modbus-RTU通信规约定义

工业通信原理——Modbus-RTU通信规约定义 前言 Modbus RTU是一种基于串行通信的通信协议&#xff0c;通常用于在设备之间进行数据通信。 Modbus-RTU通信规约定义 Modbus RTU通信规约的定义&#xff0c;包括客户机请求和服务器响应的基本流程&#xff1a; 物理层&#xff1…

c# wpf LiveCharts 饼图 简单试验

1.概要 c# wpf LiveCharts 饼图 简单试验 2.代码 <Window x:Class"WpfApp3.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…

javaScript中原型链

一、原型链 js 的对象分为普通对象和函数对象。每个对象都有__proto__ 但是只有函数对象 (非箭头函数) 才有 prototype 属性。 new的过程&#xff1a; 1、创建一个空的简单 javaScript对象 2、将空对象的 __proto__连接到该函数的 prototype 3、将函数的this指向新创建的对象…

ARP寻址过程

当知道目标的IP但是不知道目标的Mac地址的时候就需要借助ARP寻址获取目标的Mac地址&#xff0c;传输层借助四元组&#xff08;源IP源端口&#xff1a;目标IP目标端口&#xff09;匹配&#xff0c;网络层借助IP匹配&#xff0c;数据链路层则根据Mac地址匹配&#xff0c;数据传输…

RK3568---4G模块驱动实验

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

基于keepalived+gtid+双vip半同步主从复制的MySQL高性能集群

项目名称&#xff1a;基于keepalivedgtid双vip半同步主从复制的MySQL高性能集群 目录 项目名称&#xff1a;基于keepalivedgtid双vip半同步主从复制的MySQL高性能集群 项目规划图 1.配置4台MySQL服务器&#xff08;1台master&#xff0c;2台slave&#xff0c;1台backup&a…

本地代码第一次提交到远程仓库gitee

1.在gitee新建仓库 2.新建一个空文件夹 打开黑窗口,执行命令 克隆仓库地址 执行命令 git clone https://gitee.com/llncomms/test.git打开隐藏的项目 复制全部内容到需要提交的代码中 3.在提交的代码中执行命令 $ git add .git commit -m 首次提交$ git push提交成功

php curl发送文件请求

快手开发者文档&#xff1a;https://open.kuaishou.com/platform/openApi?menu20 1、body参数 Content-Type为 multipart/form-data public function sendPostFileRequest1($url,$file_path){// 初始化cURL会话$ch curl_init();// 设置目标URLcurl_setopt($ch, CURLOPT_URL,…

ssm033单位人事管理系统+jsp

单位人事管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本单位人事管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

SpringMVC数据接收(全面/详细注释)

SpringMVC涉及组件&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ]HandlerMapping : SpringMVC提供&#xff0c;我们需要进行…

从零开始:一步步学习爬虫技术的实用指南(一)

从零开始&#xff1a;一步步学习爬虫技术的实用指南&#xff08;一&#xff09; Urllib1.什么是互联网爬虫2.爬虫核心3.爬虫的用途4.爬虫的分类4.1 通用爬虫&#xff1a;4.1 聚焦爬虫&#xff1a; 5.反爬手段5.1 User‐Agent&#xff1a;5.2.代理IP5.3.验证码访问5.4.动态加载网…

11.python的字典dict(下) 遍历字典,结构优化

11.python的字典dict(下) 遍历所有的键值对 items()方法是字典的一个内置方法&#xff0c;用于返回字典中所有键值对的视图&#xff08;view&#xff09;。它返回一个可迭代的对象&#xff0c;每个元素都是一个包含键和对应值的元组。 下面用一个例子来说明items()方法的用法…

Vue中Suspense组件详细介绍

<Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成&#xff0c;并可以在等待时渲染一个加载状态。 异步依赖​ 要了解 <Suspense> 所解决的问题和它是如何与异步依赖进行交…

服务器负载均衡原理及算法

服务器负载均衡原理及算法 一、引言 随着互联网技术的飞速发展&#xff0c;网络服务的需求日益增长&#xff0c;单台服务器的性能往往难以满足大规模并发访问的需求。因此&#xff0c;服务器负载均衡技术应运而生&#xff0c;它能够有效地将网络请求分发到多台服务器上&#…

[C++/Linux] UDP编程

一. UDP函数 UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;是一种无连接的网络协议&#xff0c;用于在互联网上交换数据。它允许应用程序发送数据报给另一端的应用程序&#xff0c;但不保证数据报能成功到达&#xff0c;也就是说&#xff0c;它…