FPGA入门系列10--按键消抖

news2024/11/15 18:06:09

文章简介

本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作为读者参考。

第十一章:按键消抖

之前的章节讲解了呼吸灯、状态机、top-down 设计,本章将这些知识点进行串联起来,设计要求如下:

        ①在开发板上完成自动售货机的实验,投币的动作通过按键实现,当按1次按键(按下到抬起算一次),算作投币1次; 

        ②按下一次按键,led 灯亮一个,按下两次按键后,led 灯亮两个,当按三次按键后,用呼吸灯充当出可乐的效果,呼吸灯持续十秒后熄灭,状态回到初始状态。 

        根据上面的要求,先画出对应的状态转移图如图 1 所示。

图 1 状态转移图

        根据图 1 所示的状态转移图可以描述出该状态机,IDLE 状态、ONE 状 态、TWO 状态、THREE 状态的跳转条件均是 key(按键),THREE 状态进入 IDLE 状态的条件为十秒钟结束。在 IDLE 状态 led 灯全灭,ONE 状态 led 灯亮一个, TWO 状态 led 灯亮两个,THREE 状态 led 灯进入呼吸状态。

        一般情况下,我们从按下按键到松开基本需要大于几十毫秒的时间,系统时钟的周期处于纳秒级,因此我们按下一次按键会被大于十万个时钟的上升沿采集到,然而我们希望的是按下一次按键只被一次上升沿采集到,不然会被认为按了多次按键,所以我们需要对我们的按键进行处理。假设按键在没被按下时为高电平,被按下时处于低电平,如图 2 所示的波形图。

图 2 按键波形图

        由图 2 分析可知在 key 被按下时有且仅有一个 key 的上升沿和一个 key 的下降沿,我们可以通过检测 key 的上升沿或者下降沿来确定按键被按下一次, 这就涉及到边缘检测,具体方法如图 3 所示,可以用 clk 的上升沿将 key 延时一 个周期产生 key_reg,通过 key 和 key_reg 的值同时判断 key 的上升沿或下降 沿。由图 3 可知,当用 clk 的上升沿检测到 key 等于 1 的同时 key_reg 等于 0, 此时则为 key 的上升沿,若 key 等于 0 的同时 key_reg 等于 1 则为 key 的下降 沿。

图 3 边缘检测

        由图 3 可知根据 key 的上升沿或下降沿可确定按键按了一次,然而事实却不允许我们这么做。图 4 给出了一个按键的模型,当不按下按键 s 时,a、b 两点 是断开的,按下按键 s 时线路才接通,然而当按下按键时,会存在物理上的抖动现象,此时 a、b 两点会在断开和接通之间反复的一段时间,就会出现图 5 所 示的抖动、稳定的波形。

图 4 按键模型

图 5 按键抖动

        图 5 所示前抖动为按下时产生的抖动,后抖动为按键松开时造成的抖动, 前、后抖动持续时间一般均为 5~10ms,在有抖动的情况下,key 会被 clk 上升沿采集到很多的上升沿和下降沿,因此用 key 的上升沿和下降沿判断按键一次就不成立了,我们需要寻找新的方法。

        我们知道按键被按下时 key 值为低电平(0),在抖动期间 key 既有高电平也有低电平,我们可以使用 clk 的上升沿计算 key 连续为低电平的时间,期间当检 测到 key 为高电平时,则从头开始计数,当计数超过 5~10ms 时,我们可以认定按键有被按下的时候,此时我们可以产生一个 clk 周期为高电平的标志,当该标 志位高电平认为有一次按键即可,具体波形如图 6 所示。

图 6 按键消抖波形图

        此处我们认为 key 值有连续性的 5ms 时为按键被按下,时钟周期为 50MHz, 即 20ns,可以算出 5ms 占 250000 个 clk 周期,也就是说 cnt 从 0 计数到 249999 为 5ms,当 cnt 等于 249999 时可以将 po_key_flag 拉高一个周期,由于按键时间长短无法确定,因此 cnt 有可能多次达到 249999 这个值,会造成 po_key_flag 多次被拉高,这样又会出现按下一次键被当成按下多次,所以在 图 6 中出现了 cnt_flag 变量,在遇到 cnt 等于 249999 时,cnt_flag 就会被置高,直到遇到 key 等于高电平时才会被拉低,这样我们就可以将第一个 cnt 等 于 249999 和后面的区分开,那么我们也可以用 cnt 和 cnt_flag 共同控制在一次按键中,保证 po_key_flag 有且仅有一个时钟周期的高电平。根据波形图可得到如下所示的代码。

代码示例:

代码解析:

        ①第 17 行的 always 块实现了一个计数器,当 key 键按下(值为 0)的时候开始计数,当检测到按键松开(值为 1)的时候计数器归零,这样在抖动时候,该计数器会出现计数、归零循环的一个过程,直到 key 值一直 为 0,即按键持续被按下并且抖动过程结束,计数器才会持续计数到 5ms; 

        ②第 26 行的 always 块产生一个标志,当检测到 cnt 第一次等于 5ms 的时候,该标志则被置为高电平,这样就可以将 cnt 第一次等于 5ms 和之后 的 cnt 等于 5ms 区分开,直到 key 松开(值为 1)时,该标志才被置为低电平; 

        ③第 34 行的 always 块实现产生整个按键过程中的一个时钟周期高电平的标志,当 cnt 计数到 5ms 时,为了确保只有一次的 po_key_flag 有效, 因此此处条件中不仅需要 cnt==5ms,而且需要 cnt_flag==0。至此,实现了按键的消抖处理,在此基础上就可以很好地实现最初的要求了。

在第十二章中将对Verilog HDL 中数码管进行讲解。

往期回顾

FPGA入门系列1--模块书写&电路综合

FPGA入门系列2--仿真验证

FPGA入门系列3--wire与reg

FPGA入门系列4--赋值语句

FPGA入门系列5--运算符号

FPGA入门系列6--判断语句

FPGA入门系列7--时钟分频

FPGA入门系列8--Top_Down设计

FPGA入门系列9--状态机及do文件

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

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

相关文章

Redis高可用系列——Set类型底层详解

文章目录 概述intsetintset 和 hashtable 的转换为什么加入了listpackhashtable 的空间开销高hashtable 的碰撞概率高intset 、listpack和hashtable的转换 概述 在讲解set结构之前,需要先说明一下set结构编码的更替,如下 在Redis7.2之前,se…

Ansys Lumerical | CMOS - 光学仿真方法

通过使用更小的像素尺寸和更大的填充因子,基于CMOS图像传感器像素的数码相机系统的成本正在降低。但是,只有在不牺牲图像质量的情况下,CMOS像素尺寸减小才是可以接受的。随着CMOS像素尺寸的不断减小,图像信噪比降低,相…

《我命由我不由天》蔡志忠——笔记一

目录 简介 经典摘录 三岁决定一生 父母该什么时候放手 确定将来要成为什么 积极主动为目标而努力 叛逆是最伟大的创意 父亲给蔡志忠最大的影响是教会他两件事 价值观缺陷导致的后果 人有三个阶段 简介 作者 蔡志忠,李虹。 蔡志忠:漫画家、哲…

力扣-1769. 移动所有球到每个盒子所需的最小操作数

题目: 有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。 在一步操作中,你可以将 一个 小球从某个盒子移动到一个与…

搜索引擎优化SEO和SEM有什么不一样

SEO(搜索引擎优化)和SEM(搜索引擎营销)都是用于提高网站在搜索引擎中的排名和能见度的技术。虽然它们的目标是相同的,但它们的方法和重点略有不同,今天和大家聊聊SEO和SEM有什么不同。 一、SEO SEO是指通…

红帽8配置yum源

使用传输工具 上传文件到/etc/yum.repos.d/ 或 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo 注:不能下载wget直接上传文件 关闭订阅插件提示 [redhatroot ~]$ vi /etc/yum.conf #添加 plugins0 [redhatroot ~]$ …

docker+jenkins自动化部署springboot项目

前置:环境配置 阿里云服务器1核2GBjava 1.8.0._371maven apache-maven3.8.8git 1.8.3.1 docker和jenkins在一台服务器上,环境的配置,对于java和maven可以自己下载对应tar包进行配置,记得配置环境,也可以使用yum进行安装。记得配置…

FS5175AE降压型1-4节锂电池充电芯片

FS5175AE是一款工作于5V到24V的多串锂电池同步开关降压充电管理芯片。内置MOS管集成了低导通阻抗的NMOS,FS5175AE采用1MHz同步开关架构,实现高 效率充电并简化外围器件,降低BOM成本。通过调节检测电阻,可实现**2A充电电流&#xf…

【Java校招面试】基础知识(八)——Linux服务器

目录 前言一、基础概念二、常用命令后记 前言 本篇主要介绍Linux服务器的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第八篇博文,如有需要,可: 点击这里,返回本专栏的索引文章点击这里,返回…

仿抖音开发需要注意的问题

一、版权问题 仿抖音开发需要注意版权问题,包括内容的版权和软件的版权。在开发的过程中,不要直接抄袭他人的作品,应该注重保护知识产权。 二、安全性问题 仿抖音开发需要重视应用的安全性问题,避免应用在使用过程中发生安全漏…

OpenCv 图像的算数运算

1. 图像加法 函数 cv.add(img1, img2) 参数中的img1 和 img2 应该是相同的深度和类型, 或者第二个图像可以是像素值 代码示例: >>> x np.uint8([250]) >>> y np.uint8([10])>>> print(cv.add(x,y)) #250 10 260 > 255 [[255]]&g…

Winform控件数据绑定 DataBindings

目录 引言 绑定的方式 双向绑定 验证时更改数据源 立即更改数据源 单向绑定 绑定方法 属性界面选择绑定 通过代码手动绑定 绑定自定义数据类型 引言 DataBindings 的出现显然是为了解决后台数据与前端界面的同步问题,通过绑定控件属性与对象属性,解决…

Spring Cloud整合XXL-Job

目录 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 重点&#xff1a; 第一步&#xff1a; 整合pom文件&#xff0c;在Spring Cloud中添加XXL-Job的依赖 <!-- xxl-job-core --> <dependency><groupId>com.xuxueli<…

工业设备安装可视化AR互动培训降低企业成本

随着污水处理厂构筑物、设备、管阀及电器、仪表、自控等工艺设施逐步大型化、复杂化、多样化,污水厂日常运行安全检查尤为重要。通过对不同污水处理工艺运行厂家实际调研分析&#xff0c;发现开发污水厂AR远程可视化巡检系统是很多厂家的实际需求。 AR远程可视化巡检系统也被称…

JAVA—— Steam流

一、 引言 初识Stream流的作用&#xff1a; 需求&#xff1a;按照下面的要求完成集合的创建和遍历&#xff0c;创建一个集合&#xff0c;存储多个字符串元素 通过下面代码&#xff0c;显然我们清晰的看到使用Stream流更为方便&#xff0c;而使用不同的集合遍历就有些复杂。 i…

【CMIP6月、日数据】【ERA5-LAND陆面再分析数据】【全球VIPPHEN物候数据】

国际耦合模式比较计划进入新的阶段——第六阶段&#xff08;CMIP6&#xff09;&#xff0c;这将为气候变化研究领域提供更丰富的全球气候模式数据。相比于 CMIP5&#xff0c;CMIP6 模式有两个主要的特点&#xff1a;一是 CMIP6 考虑的过程更为复杂&#xff0c;很多模式实现了大…

js - typeof与instanceof类型判断的区别

1&#xff0c;typeof 描述&#xff1a;运算符返回一个字符串&#xff0c;表示操作数的类型。 常用的类型判断 console.log(typeof 42); // numberconsole.log(typeof "blubber"); // stringconsole.log(typeof true); // booleanconsole.log(…

【Linux】Linux入门学习之常用命令一

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

stable diffusion 安装教程

stable diffusion安装教程 环境准备硬件要求安装软件Python 安装安装git安装cuda工具安装工具包模型下载 生成图片成果展示 环境准备 硬件要求 1.需要拥有NVIDIA显卡&#xff0c;GT1060起&#xff0c;显存4G以上。&#xff08;已经不需要3080起&#xff0c;亲民不少&#xff0…

中文润色ai-ai原创文章生成器

在现代社会&#xff0c;每天都有大量的中文文章被发布到互联网上&#xff0c;这些文章的质量和可读性直接影响着读者的阅读体验和文章的传播效果。为了让文章更加美好&#xff0c;越来越多的人开始尝试使用中文润色ai技术。 中文润色ai是一种先进的人工智能技术&#xff0c;它能…