基于FPGA的按键消抖

文章目录

  • 基于FPGA的按键消抖
    • 一、按键消抖原理
    • 二、按键消抖代码
    • 三、仿真代码编写
    • 四:总结

基于FPGA的按键消抖

一、按键消抖原理

按键抖动:按键抖动通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。当按下一次按键,可能在A点检测到一次低电平,在B点检测到一次高电平,在C点又检测到一次低电平。同时抖动是随机,不可测的。那么按下一次按键,抖动可能会误以为按下多次按键。

按键原理图:

在这里插入图片描述

按键默认为低电平有效,高电平无效

1.按键消抖目的:消除按键抖动对我们程序的影响。

2.按键消抖解决方案1:延迟采样。延迟一定时间取样,去除没有抖动时的稳定值

延迟采样1

3.按键消抖解决方案2:信号变化频率平稳后并且持续20ms则采样。

延迟采样2

这里我们采用第二种方式,第二种方式相对于第一种方式更加稳定,效果也会更好。

二、按键消抖代码

key_debounce.v

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : 辣子鸡味的橘子,331197689@qq.com
// File   : key_debounce.v
// Create : 2023-07-14 10:36:44
// Revise : 2023-07-14 10:36:44
// Editor : sublime text4, tab size (4)
// -----------------------------------------------------------------------------
module key_debounce(input wire clk,input wire rst_n,input wire[3:0] key_in,//四个按键信号输入output reg[3:0] key_out//四个按键信号消抖输出
);parameter TIME_20MS = 1000_000;
reg[19:0] cnt;//20ms计数器
wire add_cnt;//计数开始
wire ent_cnt;//计数终止
wire nedge;//下降沿检测reg[3:0] key_in_r0;//同步key_in输入信号
reg[3:0] key_in_r1;//延迟一个周期
reg[3:0] key_in_r2;//延迟两个周期reg flag;//消抖开始标志信号//计数器模块,当addent满足时开始计数,检测到下降沿重新计数,end_ent满足时停止计数,消抖完成
always @(posedge clk or negedge rst_n) beginif(~rst_n) begincnt<=20'd0;endelse if(add_cnt)beginif(ent_cnt)begincnt<=20'd0;endelse if(nedge)begincnt<=20'd0;endelse begincnt<=cnt+1;endendelse begincnt<=cnt;end
endassign add_cnt = flag;//计数开始条件
assign end_cnt = (cnt == TIME_20MS - 1)&&add_cnt;//终止结束条件,当满足计时到20ms,且满足计时条件时成立//信号延时模块
always @(posedge clk or negedge rst_n) beginif(~rst_n) beginkey_in_r0<=4'b1111;key_in_r1<=4'b1111;key_in_r2<=4'b1111;endelse beginkey_in_r0<=key_in;key_in_r1<=key_in_r0;key_in_r2<=key_in_r1;end
end//检测下降沿,当任意一个按键出现下降沿都会被检测到
assign nedge = (~key_in_r1[0]&key_in_r2[0])||(~key_in_r1[1]&key_in_r2[1])||(~key_in_r1[2]&key_in_r2[2])||(~key_in_r1[3]&key_in_r2[3]);//消抖开始模块
always @(posedge clk or negedge rst_n) beginif(~rst_n) beginflag<=1'b0;endelse if(nedge)begin//当出现下降沿开始消抖flag<=1'b1;endelse if(end_cnt)begin//当end_cnt满足时停止消抖flag<=1'b0;endelse beginflag<=flag;end
end//输出信号赋值模块,当消抖完毕标志按键按下,出现一个脉冲信号表示按键按下
always @(posedge clk or negedge rst_n) beginif(~rst_n) beginkey_out<=4'b1111;//默认为高电平endelse if(end_cnt)beginkey_out<=key_in;//稳定信号赋值endelse beginkey_out<=4'b1111;//其他信号默认为高电平end
endendmodule

三、仿真代码编写

`timescale 1ns/1ns
module key_debounce_tb();
reg clk;
reg rst_n;
reg[3:0] key;wire[3:0] key_r;
parameter SYS_CLK = 20;
parameter TIME = 100;
always #(SYS_CLK/2) clk = ~clk;
initial beginclk=1'b0;rst_n=1'b0;#(2*SYS_CLK);rst_n=1'b1;key = 4'b1111;#(2*SYS_CLK+10);repeat (39) beginkey[0] = ~key[0];#(2*SYS_CLK);endkey[0] = 1'b0;#(1100*SYS_CLK);$stop;
end
key_debounce #(.TIME_20MS(TIME)) inst_key_debounce (.clk     (clk),.rst_n   (rst_n),.key_in  (key),.key_out (key_r));endmodule

仿真时序图:

在这里插入图片描述

四:总结

其实别小看这个按键消抖,里面的细节有很多,自己之前尝试书写但是却没能达到想要的效果。特别是如何重新计数哪里确实困扰住了我,后面重新学习后完成了自己的效果,希望对你有所帮助。

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

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

相关文章

uboot移植裁剪原理和流程

一、Uboot的裁剪是裁剪什么&#xff1f; Uboot的裁剪分为两个方面&#xff1a;Uboot本身命令的裁剪和具体SoC硬件配置的裁剪。 1、Uboot本身命令的裁剪   Uboot提供了很多的操作命令&#xff0c;我们使用Uboot的时候通常只使用最常用的一些命令&#xff0c;其他很多的命令有…

类 和 对象

目录 1、面向对象编程 2、面向对象编程 2.1面向对象编程特征 3、类和对象的概念 3.1类的定义 3.11属性 3.12方法 3.13重载 3.14递归 3.13返回值return 3.2对象 3.2.1对象组合 4、jvm内主要三块内存空间 5、参数传值 1、面向对象编程 面向过程&#xff1a;关注的是步骤…

webpack笔记二

文章目录 背景拆分环境清除上次构建产物插件&#xff1a;clean-webpack-plugin合并配置文件插件&#xff1a;webpack-merge实时更新和预览效果&#xff1a;webpack-dev-server babel配置参考 背景 webpack笔记一 在前面的学习&#xff0c;完成了webpack的基本配置&#xff0c…

【云原生】k8s之包管理器Helm

前言 每个成功的软件平台都有一个优秀的打包系统&#xff0c;比如Debian、Ubuntu 的 apt&#xff0c;RedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器&#xff0c;方便我们更好的管理应用。 1.Helm的相关知识 1.1 Helm的简介与了解 Helm本质就是让K8s的应用管理&…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能&#xff0c;在以太网侧实现了ModbusTcp服务器功能&#xff0c;为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢&#xff1f;首先&#xff0c;让我们来看看它的Profib…

Linux 学习记录52(ARM篇)

Linux 学习记录52(ARM篇) 本文目录 Linux 学习记录52(ARM篇)一、汇编语言相关语法1. 汇编语言的组成部分2. 汇编指令的类型3. 汇编指令的使用格式 二、基本数据处理指令1. 数据搬移指令(1. 格式(2. 指令码类型(3. 使用示例 2. 立即数(1. 一条指令的组成 3. 移位操作指令(1. 格式…

Meta 最新发布 LLaMA 2(允许商业化)

2023年7月18日&#xff0c;Meta 发布了LLaMA 2&#xff0c;包含7B&#xff0c;13B&#xff0c;70B三种参数&#xff08;34B暂时还未发布&#xff09;。 官方&#xff1a; https://ai.meta.com/llama/ 论文&#xff1a;Llama 2: Open Foundation and Fine-Tuned Chat Models 模型…

网络编程——RPC与HTTP基本介绍、历史追溯、主流应用场景、对比分析、为什么还需要使用RPC

一、HTTP与RPC基本介绍 HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;超文本传输协议&#xff1a; 一个用于在网络上交换信息的标准协议&#xff0c;它定义了客户端(例如浏览器)和服务器之间的通信方式。如平时上网在浏览器上敲个网址url就能访问网页&#x…

关于电脑显示器屏幕看不出灰色,灰色和白色几乎一样无法区分,色彩调整方法

问题&#xff1a; 电脑显示器屏幕看不出灰色&#xff0c;灰色和白色几乎一样无法区分。白色和灰色有色差。 解决方法&#xff1a; 打开“控制面板” ->“色彩管理” ->“高级” ->“校正显示器” 在下一步调节中调成中间这一个实例的样子就可以了 进行微调&#x…

如何用3D格式转换工具HOOPS Exchange读取颜色和材料信息?

作为应用程序开发人员&#xff0c;非常希望导入部件的图形表示与它们在创作软件中的外观尽可能接近。外观可以在每个B-Rep面的基础上指定&#xff0c;而且&#xff0c;通过装配层次结构的特定路径可以在视觉外观上赋予父/子覆盖。HOOPS ExchangeHOOPS Exchange可捕获有关来自各…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前&#xff0c;“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献&#xff0c;成功当选为数据库应用创新实验室&#xff08;DBL&#xff09;电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…

11、动手学深度学习——语言模型和数据集:代码详解

我们了解了如何将文本数据映射为词元&#xff0c;以及将这些词元可以视为一系列离散的观测&#xff0c;例如单词或字符。 假设长度为 T T T的文本序列中的词元依次为 x 1 , x 2 , … , x T x_1, x_2, \ldots, x_T x1​,x2​,…,xT​。于是&#xff0c; x t x_t xt​&#xff08…