时钟频率为50MHz,从0开始计数记到999_999时为20ms,当key_in为低电平时cnt_20ms开始计数,当计数到999_998时,key_flag输出一个周期的脉冲信号,cnt_20ms保持为999_999(若计数到999_999时才输出脉冲的画,当中间停留时间太长就会导致输出多个脉冲周期,也是非常不好的一种现象)。

Verilog代码为

module key_filter
#(parameter CNT_MAX=20'd999_999)
(input wire sys_clk,input wire sys_rst_n,input wire key_in,output reg key_flag);reg [19:0]cnt_20ms;always@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n==1'b0)cnt_20ms<=20'd0;else if(key_in==1'b1)cnt_20ms<=20'd0;else if(cnt_20ms==CNT_MAX)cnt_20ms<=CNT_MAX;elsecnt_20ms<=cnt_20ms+20'd1;endalways@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n==1'b0)key_flag<=1'd0;else if(cnt_20ms==(CNT_MAX-20'd1))key_flag<=1'd1;elsekey_flag<=1'd0;end
endmodule

仿真测试的时候用一个tb_cnt来模拟按键的抖动,当 tb_cnt在0~19、169~249之间时保持一个高电平,在69~149时保持一个低电平,在16~69、149~169之间产生随机数来模拟按键的抖动。

则仿真测试代码为

`timescale 1ns / 1nsmodule tb_key_filter();reg sys_clk;
reg sys_rst_n;
reg key_in;
reg [7:0]tb_cnt;
wire key_flag;initialbeginsys_clk=1'b1;sys_rst_n<=1'b0;#20sys_rst_n<=1'b1;endalways #10 sys_clk<=~sys_clk;always@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n==1'b0)tb_cnt<=8'd0;else if(tb_cnt==8'd249)tb_cnt<=8'd0;elsetb_cnt<=tb_cnt+2'd1;end
always@(posedge sys_clk or negedge sys_rst_n)beginif(sys_rst_n==1'b0)key_in<=1'b1;else if((tb_cnt>=8'd19)&&(tb_cnt<=8'd69)||(tb_cnt>=8'd149)&&(tb_cnt<=8'd169))key_in<={$random}%2;else if((tb_cnt<8'd19)||(tb_cnt>8'd169))key_in<=1'b1;elsekey_in<=1'b0;end key_filter
#(.CNT_MAX(20'd50))
key_filter_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.key_in(key_in),
.key_flag(key_flag));endmodule

vivado仿真的波形图

计数到最大值减一的时候产生一个时钟周期的脉冲。

模拟按键消抖

按键消抖Verilog相关推荐

  1. 【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

  2. Verilog功能模块 —— 按键消抖

    一. 什么是按键消抖 按键消抖_百度百科 (baidu.com) 按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断 ...

  3. 基于verilog按键消抖设计

    关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了.然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的.这两篇博文都是ednchina的博客 ...

  4. Verilog中按键消抖检测的实现

    Verilog按键消抖是FPGA学习时的一个入门教程,为避免眼高手低,还是再次分析与记录一下.此处着重介绍按键消抖的基本原理,对按键消抖与检测的关键技术进行分析,并进行功能仿真. 一.按键消抖基本原理 ...

  5. c语言实现按键的抖动与消除,【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

  6. FPGA学习-Verilog实现独立按键消抖

    文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...

  7. Verilog实现4位按键消抖,分别控制一个LED

    Verilog实现4位按键消抖,分别控制一个LED 代码思路(完整代码在后) 完整代码 参考:(主要是第一篇,第二篇不严谨) <按键消抖与LED控制>实验的个人思考与总结 Verilog实 ...

  8. verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)

    独立按键消抖设计与验证 本实验主要是为了锻炼状态机的思维模式以及熟练掌握TB的写法 本节主要收获了:define的用法,另外就是,顶层的input在TB中是reg的真正含义,其实就是把激励当做寄存器来 ...

  9. Verilog实现独立按键消抖(状态机)

    本文参考小梅哥的独立按键消抖视频 1,实验原理: 这里是黑金开发板教程中的图,可以看出,按键未按下时的状态是高电平,按下为低电平.下边是小梅哥画的图解. 因为是机械按键,按下时候有一个不稳定的抖动期, ...

  10. verilog之按键消抖的理解

    按键在按下时会产生抖动,释放时也会产生抖动,所以在设计键盘扫描程序时必须考虑按键的消抖,我们一般只考虑按下时的抖动,而放弃对释放时抖动的消抖.抖动时间一般为20ms左右.按下的最终结果是低电平. 按键 ...

最新文章

  1. Java中的数据结构
  2. 特别篇 :从 0 开始创作云原生应用 (殷达)
  3. OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
  4. 《MySQL——如何解决一主多从的读写分离的过期读问题》
  5. leetcode 645. 错误的集合
  6. oracle只读事物,oracle的只读事务
  7. 第一行代码(第二版)全书代码下载
  8. Mysql数据库——高级用法(视图、事务、索引、自连接、用户管理)
  9. [区块链] 密码学——Merkle 树
  10. 排查DHCP服务器故障
  11. 有关Altera 的CPLD工程编译报错的解决方法
  12. 2021 泰迪杯 A 题思路
  13. 解决传奇hero引擎和登陆器不配套的方法
  14. WPS和Office 字体乱码问题
  15. 信捷XC PLC与施耐德ATV12变频器通讯程序
  16. [Codeforces1155F][DP]Delivery Oligopoly
  17. vue中forEach跳出循环的问题,以及for循环
  18. 网络摄像头IPC国标GB28181协议国标安防视频流媒体平台EasyGBS视频流不上线排查步骤
  19. PTA:最佳情侣身高差 (10分)(c++版)
  20. 二次判别分析(QDA)和Python实现

热门文章

  1. SDIO总线(一)SDIO接口是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备
  2. SpringBoot --- 整合Elasticsearch
  3. 入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
  4. Opencv系列1_opencv对单张DCM文件的读取并显示
  5. 在IIS管理器添加网站
  6. Linux之zip命令
  7. oracle导入源数据库文件,将dmp文件数据导入oracle数据库
  8. debian 安装五笔输入法
  9. OBJ格式模型详细介绍
  10. 大数据-数据仓库的概念