首页 > 其他分享 >14-按键消抖

14-按键消抖

时间:2023-06-01 15:46:41浏览次数:13  
标签:key 14 消抖 flag 计数器 信号 按键

1.按键消抖

按键是最常见的电子元器件之一,在电子设计中应用广泛;在日常生活中,遥控器\玩具\计算器等等电子产品都要使用按键

  • 在FPGA的实验工程中,我们可以使用其作为系统复位信号或者控制信号的外部输入
  • 常见的按键:自锁式按键或者是机械按键

    按键消抖主要针对的是机械弹性开关,当机械触点断开\闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,在断开时也不会一下子断开,因而在闭合及断开的瞬间伴随有一连串的抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理,就是按键消抖
  • 硬件消抖:使用RS触发器(按键数量少),消耗空间和资源
  • 软件消抖:使用延时程序去除抖动的部分

2.FPGA设计

2.1 框图和波形

  • 软件消抖:使用延时程序去除掉抖动的部分
  • 在按键按下后能够精准的识别到一次按键按下,所以需要计数器,所以要设计时序电路,输入有时钟信号和复位信号
  • 输入未处理的按键信号key_in,输出消抖之后稳定的按键信号key_flag
  • 前抖动和后抖动的时间大概是5s - 10ms,按键按下的稳定时间大概是20mm
  • 可以使用计数器消除防抖,当key_in是低电平的时候开始计数,当key_in为高电平的时候清0,按键按下的有效时间是20ms,需要计数1000_0000,最大计数值是999_999,在计数20ms内没有识别到高电平,就表示按键按下有效,注意要在时钟的上升沿采样key_in信号
  • 采用传统计数器的方式,当计数到最大值的时候计数器进行清0,输出信号在最大值的时候产生一个脉冲信号,如果信号稳定时间超过20ms,就会进行多次清0和计数,也会产生多个脉冲信号,分析这种情况是计数器清零条件导致的还是key_flag信号拉高时间导致的?如果key_flag不在最大值拉高,在其他位置拉高,也会出现这种问题,所以问题是清0条件导致的
  • 这时采用当计数器计数到最大值之后,如果超过计数器最大值,计数器不清0,一直维持计数器的最大值,当key_in为高电平的时候,计数器才清0,此时key_flag信号可以在计数器产生最大值之后产生一个周期的脉冲信号然后拉低为0,这样key_flag信号不会产生多次
  • 修改清0条件之后,key_flag信号虽然不会出现多次,但是不是脉冲信号,而是一个长时间的电平信号,

2.2 RTL

标签:key,14,消抖,flag,计数器,信号,按键
From: https://www.cnblogs.com/Icer-newer/p/17436414.html

相关文章

  • ORA-01403: 未找到任何数据
    登陆EBS系统 后,打开FORM窗体时,提示: ORA-01403:未找到任何数据——————————————————————————————————FRM-40735:WHEN-NEW-ITEM-INSTANCE触发器提出了不能处理的异常状况ORA-01422. 这种现象经常出现。怎么解决呢?......
  • 89C51实现单个指定按键消抖后计数(使用共阴极数码管7SEG-MPX8-CC-BLUE)
     位选关键锁存器按键(消抖)区小灯泡D1用于指示SW1是否被检测到按下(计数器设置为1次就溢出,在中断中计数num+1的同时对小灯泡连接的端口取反用于指示)。#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintun......
  • STA 141C 大数据与高性能统计
    STA141C-BigData&HighPerformanceStatisticalComputingSpring2022Homework4Lecturer:BoY.-C.NingDueJune02,2023DueJune02,2023by11:59pm.Afewnotes:1.Submityourhomeworkusingthefilename”LastNameFirstNamehw4”2.Answerallquest......
  • mongocxx c++ 14标准,进行多表联合查询
     #include<mongocxx/client.hpp>#include<mongocxx/instance.hpp>#include<mongocxx/uri.hpp>#include<bsoncxx/builder/stream/document.hpp>#include<bsoncxx/json.hpp>#include<bsoncxx/types.hpp>usingbsoncxx::builder::s......
  • flink1.14.5集群(flink on yarn)部署1
    先安装hadoop,yarn,zookeeper 配置环境变量vim/etc/profile(注意新增了HADOOP_CLASSPATH变量)exportHADOOP_CLASSPATH=`/home/opt/hadoop-2.9.2/bin/hadoopclasspath`exportFLINK_HOME=/home/opt/flink-1.14.5exportPATH=$PATH:$FLINK_HOME/binsource/etc/profile......
  • 146. LRU 缓存
    主要是利用LinkedHashMap的功能LinkedHashMap继承了HashMap学到了LinkedHashMap维护双向链表的方法LinkedHashMap的Entry加入了一个before和after,用于维护Entry的加入顺序。next维护各个桶的顺序。回忆LinkedHashMap源码记得看:https://blog.csdn.net/weixin......
  • HDU1403(后缀数组--最长公共子串)
    题目:LongestCommonSubstring题意:判断给定的两个串中,最长的公共串。思路:将它们合并为一个串,然后利用后缀数组求解。首先是二倍增算法:时间复杂度为O(n*log(n))#include<stdio.h>#include<string.h>#definemax1000010intwa[max],wb[max],wv[max],ws[max];intrank[max],he......
  • HDU1421 搬寝室
    题目:搬寝室 典型的DP,状态方程:dp[k][i]=min(dp[k-1][i-2]+(a[i]-a[i-1])^2,dp[k][i-1]);        dp[k][i]表示k对物品在前i个物品的最小值#include<iostream>#include<stdio.h>#include<algorithm>#defineN2005usingnamespacestd;intdp[N/2][N];inta[N......
  • 图解LeetCode——146. LRU 缓存
    一、题目请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intva......
  • Could not find the DLL(s) 'msvcp140_1.dll'. TensorFlow requires that these DLLs
      python-c"fromtransformersimportpipeline;print(pipeline('sentiment-analysis')('weloveyou'))"MicrosoftVisualC++Redistributableisnotinstalled,thismayleadtotheDLLloadfailure.                Itcanbedow......