FPGA搭积木之按键消抖(改进版)

目录

1.前言

2.回顾之前的设计

3.基于读者思路的设计

4.ModelSim仿真


1.前言

  昨天分享的关于FPGA对机械按键消抖的设计,有读者指出了其中的不足,并给出了他的思路。今天就读者的设计思路,来再做一个按键消抖模块。这个程序大概是大学的时候写的,当时才开始学,没考虑那么多。现在开始写博客,才陆续把以前写过的东西翻出来、分享。首先感谢这位读者,给我提出意见,学习的时候就是要多互相交流才能进步。大家对文章有问题,欢迎来和我讨论。

2.回顾之前的设计

  之前的按键消抖模块链接

按键消抖过程

  之前的设计思路是,在检测到按键稳定时,延迟20ms再进行采样,然后得到稳定的按键信号。但是有读者说了,这样处理,按下去至少20ms才会生效,对于年轻人来说可能会明显的感觉到延迟,这样设计似乎更适合老年人哈哈哈哈。不过,该方法的一个好处就是,获取的按键值是稳定后的,可以避免一些误触,或者由于抖动之类的导致按键闭合,影响判断。

之前设计的消抖模块如下图所示,如果把延迟时间设置为5ms,一方面迟滞感就不会那么强,另一方面按键也还是稳定了一段时间才进行采样,避免了亚稳态。具体延迟时间可能要根据需求去设置,思路是这么个思路。

按键消抖过程

按键消抖过程

3.基于读者思路的设计

(1)在检测到按键按下时,按键即刻生效,输出一个时钟高电平脉冲。
(2)按键生效时,设置一个标志位;并开始计时20ms
(3)在计时没有完成之前,对按键作输入无效处理。
(4)计时结束,更改标志位状态,按键输入重新有效。
代码如下:

`timescale 1ns / 1ps
module key_debounce #(parameter DELAY_CNT = 'd1_000_000)//50M时钟时的20ms计数值
(    //防抖模块端口声明input  clk   ,//50Minput  rst_n  ,input  key   , //定义按键输入output  key_out  //定义按键输出
);wire        key_edge_pluse ;
wire [$clog2(DELAY_CNT) - 1:0] cnt    ;
wire        cnt_last  ;
reg         key_flag  ;edge_detection #(.POSEDGE(1'b0))
u_edge_detection (.clk   (clk   ), .edge_din     (key   ),.edge_pluse     (key_edge_pluse )
);assign key_out = key_edge_pluse & ~key_flag;always @ (posedge clk or negedge rst_n) beginif (!rst_n) key_flag <= 1'b0;else if(key_edge_pluse)key_flag <= 1'b1;//检测到按键按下后,在计数结束前后续按键值无效else if(cnt_last)key_flag <= 1'b0;
endcounter #(.CNT_NUM(DELAY_CNT),.ADD(1'b1))
u_counter(.clk  (clk  ), .rst_n  (rst_n  ),.En_cnt  (key_flag ),      .cnt  (cnt  ), .cnt_last (cnt_last )
);
endmodule

其中使用到的计数器模块和边沿检测请参考之前的设计。
FPGA搭积木之计数器
FPGA搭积木之边沿检测电路

4.ModelSim仿真

`timescale 1ns / 1ps
module key_debounce_tb;
parameter T = 20;
reg  clk  ;
reg  rst_n ;
reg  key  ;
wire key_out ;key_debounce #(.DELAY_CNT('d2_0))//为了减小仿真时间,将延时减小
u_key_debounce(
.clk    (clk    ), 
.rst_n  (rst_n  ),
.key    (key    ), 
.key_out(key_out) 
);always #(T/2) clk = ~clk;initial beginclk = 1'b0;rst_n = 1'b0;key = 1'b1;#(10*T)rst_n = 1'b1;//模拟按键抖动,实际只有一次按键输入#(T)key = 1'b0;#(T)key = 1'b1;#(T)key = 1'b0;#(3*T)key = 1'b1;#(T)key = 1'b0;#(5*T)key = 1'b1;#(T)key = 1'b0;#(T)key = 1'b1;//模拟第二次按键抖动#(20*T)key = 1'b0;#(T)key = 1'b1;#(2*T)key = 1'b0;#(T)key = 1'b1;#(T)key = 1'b0;#(5*T)key = 1'b1;#(T)key = 1'b0;#(T)key = 1'b1;end
endmodule

为了减小仿真时间,例化按键消抖模块时,将延时计数器值改小,方便验证逻辑。然后模拟两次按键输入。

仿真

仿真

从仿真波形可以看到,只输出了两次按键值。   将设计参数化,放入自己的代码库,供有需要时直接使用。相比于官方提供的封闭的IP核,自己设计的IP核虽然性能比不过,但是更灵活,方便进行个性化修改。FPGA其实就像搭积木一样,只要自己的代码库够丰富,设计只会越来越轻松! 此合集持续分享一些笔者自己设计的可复用硬件模块:FPGA搭积木

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

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

相关文章

《Python编程从入门到实践》day34

# 昨日知识点回顾 json文件提取数据、绘制图表渐变色显示 # 今日知识点学习 第17章 17.1 使用Web API Web API作为网站的一部分&#xff0c;用于与使用具体URL请求特定信息的程序交互&#xff0c;这种请求称为API调用。 17.1.1 Git 和 GitHub Git&#xff1a;分布式版本控制系…

每日5题Day4 - LeetCode 16 - 20

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;16. 最接近的三数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int threeSumClosest(int[] nums, int target) {//别用dp了&#xff0c;…

docker-compose Install homer

homer前言 一个非常简单的静态主页,为您的服务器保持您的服务在手,从一个简单的yaml配置文件。 前提要求 安装 docker docker-compose 参考创建一键安装homer 脚本 homer安装位置/homerhomer 脚本位置/homer/assetshomer logo 图标/home/assets/iconshomer 端口80homer 颜色…

MySQL5个查询

# 总查询 EXPLAIN SELECT * FROM city; # 范围查询 EXPLAIN SELECT * from city where ID>5 and ID<20; #主键查询 EXPLAIN SELECT * from city where ID5; # 索引查询 EXPLAIN SELECT * from city where CountryCodeNLD; # 普通索引 EXPLAIn SELECT * from cit…

工业交换机的好处有哪些?

工业交换机是现代工业网络中不可或缺的重要组成部分&#xff0c;它扮演着连接和管理各种网络设备的关键角色。工业交换机的优点不言而喻&#xff0c;首先是其稳定可靠的性能&#xff0c;能够支撑工业环境下的高负荷工作。无论是在恶劣的温度、湿度或电磁干扰的环境下&#xff0…

springboot2.x3.x的A项目(作为sdk)集成到启动B项目调用2

一 概述 1.1 说明 本博客记录的案例&#xff0c;逻辑是&#xff1a; 项目A读取配置文件&#xff0c;并在service类的方法进行打印输出。项目A作为sdk被项目B进行依赖&#xff0c; 在项目B启动后&#xff0c;进行调用&#xff0c;并且在B进行参数的配置&#xff0c;能够覆盖…

stm32常用编写C语言基础知识,条件编译,结构体等

位操作 宏定义#define 带参数的宏定义 条件编译 下面是头文件中常见的编译语句&#xff0c;其中_LED_H可以认为是一个编译段的名字。 下面代码表示满足某个条件&#xff0c;进行包含头文件的编译&#xff0c;SYSTEM_SUPPORT_OS可能是条件&#xff0c;当非0时&#xff0c;可以…

路由引入实验(华为)

思科设备参考&#xff1a;路由引入实验&#xff08;思科&#xff09; 技术简介 路由引入技术在网络通信中起着重要的作用&#xff0c;能够实现不同路由协议之间的路由传递&#xff0c;并在路由引入时部署路由控制&#xff0c;实现路径或策略的控制 实验目的 不同的路由协议之…

工大智信智能听诊器:开启个人健康管理的全新模式

工大智信智能听诊器&#xff1a;开启个人健康管理的全新模式 在快节奏的现代生活中&#xff0c;健康管理已成为人们关注的焦点。工大智信智能听诊器&#xff0c;作为一款创新的医疗设备&#xff0c;不仅提供高级数据管理功能&#xff0c;而且成为了个人健康管理的得力助手。 这…

【FreeRTOS移植到STM32F103C8T6超详细教程-->>>基于标准库】

移植教程 FreeRTOS简介FreeRTOS 介绍FreeRTOS优点 FreeRTOS移植FreeRTOS 下载FreeRTOS目录结构移植开始Keil5打开工程修改FreeRTOSConfig.h文件修改stm32f10x_it.c 测试FreeRTOS闪烁第一颗小灯 FreeRTOS简介 FreeRTOS 介绍 FreeRTOS 是市场领先的面向微控制器和小型微处理器的…

Flutter Text导致A RenderFlex overflowed by xxx pixels on the right.

使用Row用来展示两个Text的时候页面出现如下异常,提示"A RenderFlex overflowed by xxx pixels on the right." The following assertion was thrown during layout: A RenderFlex overflowed by 4.8 pixels on the right.The relevant error-causing widget was:…

如何排查hpet导致的CPU高负载——《OceanBase诊断系列》之十

1. 前言 我在OceanBase问答社区协助用户排查了一个CPU占用率过高的问题&#xff0c;帖子原文是&#xff1a; 《刚刚新安装的OceanBase集群&#xff0c;没有任何数据&#xff0c;CPU占用非常高&#xff0c;这正常吗&#xff1f;》。从这个场景出发&#xff0c;来分享相关的诊断…

【Python自动化测试】:Unittest单元测试与HTMLTestRunner自动生成测试用例的好帮手

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;unittest编写测试用例&#x1f680;unittest测…

智慧医疗时代:探索互联网医院开发的新篇章

在智慧医疗时代&#xff0c;互联网医院开发正引领着医疗服务的创新浪潮。通过将先进的技术与医疗服务相结合&#xff0c;互联网医院为患者和医生提供了全新的互动方式&#xff0c;极大地提升了医疗服务的便捷性和效率。本文将深入探讨互联网医院的开发&#xff0c;介绍其技术实…

巧秒用AI写作工具做影视解说文案,效率高!

在自媒体内容输出的快节奏当下&#xff0c;影视解说已经成为一种受欢迎的内容形式。然而&#xff0c;创作高质量的影视解说文案往往需要花费大量的时间和精力。随着人工智能技术的不断发展&#xff0c;AI写作工具为我们提供了一种全新的、高效的解决方案。 AI写作工具利用先进的…

电商API接口接入电商平台实现品牌价格、销量、评论数据监控

电商数据接口API在现代电商运营中扮演着至关重要的角色。它不仅能够实现品牌价格、销量、评论数据的监控&#xff0c;还能帮助商家优化销售策略&#xff0c;提升业务效率。下面将详细探讨如何通过接入电商平台的API接口来实现这些功能&#xff1a; 选择适合的电商平台 主流平台…

思科模拟器--06.单臂路由升级版--多端路由互连实验--24.5.20

实验图纸如下: 第0步: 先放置六台个人电脑,一台交换机和一台2911路由器(千兆路由器(G0开头的)) 接着,用直通线将 PC0的F0,PC1的F0分别和交换机的F0/0, F0/1连接 交换机的F0/3和路由器的G0/0连接 PC2的F0,PC3的F0分别和交换机的F0/4, F0/5连接 交换机的F0/6和路由器的G0/1…

【杂七杂八】Huawei Gt runner手表系统降级

文章目录 Step1&#xff1a;下载安装修改版华为运动与健康Step2&#xff1a;在APP里进行配置Step3&#xff1a;更新固件(时间会很长) 目前在使用用鸿蒙4 111版本的手表系统&#xff0c;但是感觉睡眠检测和运动心率检测一言难尽&#xff0c;于是想到是否能回退到以前的版本&…

Elasticsearch 分析器的高级用法二(停用词,拼音搜索)

Elasticsearch 分析器的高级用法二&#xff08;停用词&#xff0c;拼音搜索&#xff09; 停用词简介停用词分词过滤器自定义停用词分词过滤器内置分析器的停用词过滤器注意&#xff0c;有一个细节 拼音搜索安装使用相关配置 停用词 简介 停用词是指&#xff0c;在被分词后的词…

Qt案例练习(有源码)

项目源码和资源&#xff1a;Qt案例练习: qt各种小案例练习,有完整资源和完整代码 1.案例1 项目需求&#xff1a;中间为文本框&#xff0c;当点击上面的复选框和单选按钮时&#xff0c;文本框内的文本会进行相应的变化。 代码如下&#xff1a; #include "dialog.h" …