按键消抖

2023-05-16

按键消抖

按键是FPGA实验工程中常见的电子元器件,通常用作系统复位信号或者控制。外部信号的输入。按键消抖主要针对的是机械弹性开关(按下去,一旦松开就会弹上去),当机械触点断开、闭合时,由于机械触点的弹性作用,按键开关在闭合时不会立刻稳定的接通,在断开时也不会一下子断开。按键在闭合和断开的瞬间会有一连串的抖动,为了保证系统能够正确识别按键开关,必须进行消抖处理。
按键消抖分为硬件消抖和软件消抖,硬件消抖会使用额外的器件,占用空间,增加布局布线复杂度。这里讲的是软件消抖,适用于按键比较多的情况。

设计目标

按键每次按下后,系统能够检测到按键仅被按下了一次,而不是因抖动发生重复按下的情况。

设计方法

设计打算应用延时程序去除抖动部分。
cnt_20ms为中间变量,当key_in高电平时,cnt_20ms清零,为低电平时加一。当计数值达到999999-1时,cnt_20ms保持最大值不变,直到遇到key_in高电平清零,这样可以防止因抖动多次检测到按键信号,保证按键按下只产生一个key_flag脉冲。
在这里插入图片描述
在这里插入图片描述

代码实现

下面直接上代码:

module	key_filter
#(
	parameter	CNT_MAX = 20'd999_999
)
(
	input		sys_clk		,
	input		rst_n		,
	input		key_in		,
	
	output	reg	key_flag
);

reg		[19:0]	cnt_20ms;

always@(posedge sys_clk or negedge rst_n)begin
	if(rst_n == 1'b0)
		cnt_20ms <= 20'd0;
	else if(key_in == 1'd1)			//按键处于没有按下的状态时,cnt_20ms清零
		cnt_20ms <= 20'd0;
	else if(cnt_20ms == CNT_MAX )	//计数到最大值时cnt_20ms保持最大值
		cnt_20ms <= CNT_MAX;
	else
		cnt_20ms <= cnt_20ms + 20'd1;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(rst_n == 1'b0)
		key_flag <= 1'd0;
	else if(cnt_20ms == CNT_MAX - 20'd1)		//保持一个周期高电平,其余时刻为零
		key_flag <= 1'd1;						
	else
		key_flag <= 1'd0;						//保证按键按下只产生一个脉冲
end
endmodule

仿真文件:

`timescale  1ns/1ns
module key_filter_tb();

reg		sys_clk	;
reg		rst_n	;
reg		key_in	;
reg	[7:0] cnt;

wire		key_flag;
parameter M = 249;
initial begin
	sys_clk = 1'd0;
	forever #10 sys_clk = ~sys_clk;
end

initial begin
	rst_n <= 1'd0;
	#20
	rst_n <= 1'd1;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(rst_n == 1'd0)
		cnt <= 8'd0;
	else if(cnt == M)
		cnt <= 8'd0;
	else
		cnt <= cnt + 8'd1;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(rst_n == 1'd0)
		key_in <= 1'd0;
	else if(((cnt>8'd19) && (cnt<=8'd69)) || ((cnt>8'd149) && (cnt<=8'd199)) )
		key_in <= {$random} % 2 ;
	else if((cnt>8'd69)&& (cnt<=8'd149))
		key_in <= 1'd0;
	else
		key_in <= 1'd1;
end

key_filter
#(
	.CNT_MAX (20'd24)
)
key_filter_inst
(
	.sys_clk	(sys_clk)	,
	.rst_n		(rst_n)		,
	.key_in		(key_in)	,
	        
	.key_flag   (key_flag)
);

endmodule 

仿真结果如图所示,按键按下(key_in长保持低电平时)两次产生了两个脉冲信号,和绘制波形图结果一致。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按键消抖 的相关文章

随机推荐

  • python 波浪号用法_「波浪号」matlab中波浪号~的作用和用法 - 金橙教程网

    波浪号 在Matlab中 xff0c 波浪号 也就是键盘上数字键1 旁边的那个 主要有两个用法 xff1a 第一是代表与或非中的非 xff0c 如在以下代码中 xff1a if flag end只有在flag为0或false时 xff0c
  • 服务器只显示一个登陆用户,远程服务器只允许1个用户登入设置

    远程服务器只允许1个用户登入设置 内容精选 换一换 已成功添加Guardian 如果Guardian处于在线状态 xff0c 只允许修改Guardian名称 如果Guardian处于连接超时状态 xff0c 可以输入登录远程服务器的用户名和
  • 关于mysql联合索引的一道简单笔试题与思考

    最近做了一道关于mysql联合索引的题 具体的题目个人的收获参考的链接索引的那些事 具体的题目 答案 xff1a 1 四个字段均使用了该索引 2 c1 xff0c c2字段使用了该索引 3 c1字段使用该索引 4 c1字段使用该索引 5 c
  • 目前spring阶段一些有用得文章

    自己写给自己看当作笔记 SpringBoot自动配置原理是什么 https www cnblogs com chenweichu p 12663798 html 1 在 64 SpringBootApplication中有一个注解 64 E
  • 面试常问的事情与题目

    随便给份工作我吧 提示 xff1a 面试多总结一下经验 xff0c 抓重点 xff0c 而不是什么都想准备好 其实自己就是一个菜狗 xff0c 备考了半年 xff0c 什么鸡儿都忘记了 xff0c 从零开始 文章目录 前言一 基本流程大概二
  • 我的常用基础指令

    docker相关 run it ubuntu span class token function bash span i 是以交互式的方式启动 t 是以终端的形式启动 p 映射端口号 xff1a 原始端口号 指定端口号启动 例 xff1a
  • vue jqurey 等前端常用

    vue components 注册组件 如 xff1a span class token keyword import span SelectDict span class token keyword from span span clas
  • 《Linux 内核完全注释》阅读笔记

    在阅读源代码之前 xff0c 有必要对Linux内核的体系结构 源代码的目录结构有个宏观地了解 xff0c Linux内核完全注释 非常详细地介绍了这方面的内容 xff0c 所以 这里仅仅进行概述性的讨论 xff0c 以便让所有的笔记构成一
  • 关于Java-stream的一下日常使用

    惰式执行 对 stream的操作并不会立即执行 如果用户真正需要的时候才会执行 span class token class name Stream span span class token punctuation span span c
  • 怎么获取别人服务器信息失败,获取服务器信息失败

    获取服务器信息失败 内容精选 换一换 1 若希望以主席身份入会 xff0c enter code必须传入主席密码 若希望以来宾身份入会 xff0c 当会议要求来宾密码时 xff0c enter code必须传入来宾密码 xff0c 会议不要
  • 我的世界服务器合成表修改,【组件教程】行为包03:修改合成表

    大家好我是那个谁 xff0c 今天为大家带来组件系列教程的第三课 xff0c 在上一课中我们对于掉落物进行了详细的讲解 xff0c 这一课中我们要把目光看向我的世界另一重要玩法组成部分 xff1a 合成 打开原版行为包中recipes文件夹
  • liunx 全盘查找_linux查找文件命令find怎么用

    linux查找文件命令find怎么用 Linux 文件搜索命令find的操作使用方法如下 xff1a 1 全盘搜索 xff0c 也可以指定目录搜索 find 搜索目录 name 目标名字 xff0c find name file 2 这样搜
  • 程序员的成长之路:回顾初心,质疑自我

    经过3 4年的成长期 xff0c 你说日常写代码无压力 xff0c 代码质量也可以 xff0c 完成日常工作后 xff0c 就不知道做什么 xff1f 如果现在的你正好是这么一种状态 xff0c 想提升却不知道往哪走 xff1f 那你一定进
  • CentOS 7中安装Oracle JDK

    1 前往Oracle官网http www oracle com technetwork java javase downloads index html下载JDK xff0c 这里我们选择rpm包 xff08 注意 xff1a 下载前须接受
  • 给android程序添加页面,向 Android 应用中添加闪屏页和启动页

    向 Android 应用中添加闪屏页和启动页 开启 Flutter 的体验需要短暂地等待 Dart 的初始化 一个完整的 Flutter 应用还额外需要 Android 应用程序标准的初始化时间 Flutter 支持在 Android 应用
  • ArchLinux必备命令记录(manjaro)

    1 添加新账户 useradd username新建账户 useradd d home xxx m xxx创建用户 xff0c 并同时生成用户目录 xff0c 不然账户无法正常启用 passwd username修改密码 userdel f
  • js使用lottie读取json文件并修改文件参数后渲染

    js使用lottie读取json文件并修改文件参数后渲染 1 效果图 说明 xff1a 车辆模型是通过json文件渲染的 2 代码 2 1 引入lottie js xff08 如果没有 xff0c 网上资源很多 xff0c 请自行下载 xf
  • Mybatis基础+增删改查(代码示例)

    目录 Mybatis基础 43 增删改查 xff08 代码示例 xff09 首先什么是MyBatis xff1f MyBatis中文文档 xff08 学习参考资料 xff09 xff1a MyBatis 基础框架搭建源码 xff1a MyB
  • KVM虚拟化工具简介及安装

    1 KVM简介 Kernel based Virtual Machine的简称 xff0c 是一个开源的系统虚拟化模块 xff0c 自Linux2 6 20之后集成在Linux的各个主要发行版本中 它使用Linux自身的调度器进行管理 xf
  • 按键消抖

    按键消抖 按键是FPGA实验工程中常见的电子元器件 xff0c 通常用作系统复位信号或者控制 外部信号的输入 按键消抖主要针对的是机械弹性开关 xff08 按下去 xff0c 一旦松开就会弹上去 xff09 xff0c 当机械触点断开 闭合