思路:

状态机的思想,分4个状态:

1.空闲状态,等待按键按下

2.消除抖动状态1,用计数器延时5ms至10ms

3.按键按下

4.消除抖动状态2,用计数器延时5ms至10ms

程序:

module Key_Filter(Clk,Rst_n,Key_in,Key_flag,Key_state);input Clk;input Rst_n;input Key_in;output reg Key_flag;output reg Key_state;reg [3:0] state;reg [19:0] cnt;reg en_cnt;reg cnt_full;reg temp0,temp1;wire pos_edge,neg_edge;localparam IDLE         = 4'b0001,FILTER0     = 4'b0010,DOWN        = 4'b0100,FILTER1 = 4'b1000;always@( posedge Clk or negedge Rst_n )beginif( Rst_n==0 )beginstate <= IDLE;Key_flag <= 0;Key_state <= 1;en_cnt <= 0;endcase ( state )IDLE:beginKey_flag <= 0;if( neg_edge==1 )beginstate <= FILTER0;en_cnt <= 1;endendFILTER0:beginif( cnt_full==1 )beginstate <= DOWN;Key_flag <= 1;Key_state <= 0;en_cnt <= 0;endelse if( pos_edge==1 )beginstate <= IDLE;en_cnt <= 0;end  endDOWN:beginKey_flag <= 0;if( pos_edge==1 )beginstate <= FILTER1;en_cnt <= 1;endendFILTER1:beginif( cnt_full==1 )beginstate <= IDLE;Key_flag <= 1;Key_state <= 1;endelse if( neg_edge==1 )beginstate <= DOWN;en_cnt <= 0;endenddefault:beginstate <= IDLE;Key_flag <= 0;Key_state <= 1;en_cnt <= 0;endendcaseendalways@(posedge Clk or negedge Rst_n)if(!Rst_n)begintemp0 <= 1'b0;temp1 <= 1'b0;endelse begintemp0 <= Key_in;temp1 <= temp0;  endassign neg_edge = !temp0 & temp1;assign pos_edge = temp0 & (!temp1);always@( posedge Clk or negedge Rst_n )beginif( Rst_n==0 )cnt <= 0; else if( en_cnt==1 )cnt <= cnt+1;elsecnt <= 0;endalways@( posedge Clk or negedge Rst_n )beginif( Rst_n==0 )cnt_full <= 0; else if( cnt==99_999 )cnt_full <= 1;elsecnt_full <= 0;end
endmodule

testbench程序:

`timescale 1ns/1ns
`define clk_period 20module Key_Filter_tb;reg Clk;reg Rst_n;reg Key_in;reg [15:0] rand;wire key_flag;wire key_state;Key_Filter Key_Filter0(.Clk(Clk),.Rst_n(Rst_n),.Key_in(Key_in),.Key_flag(key_flag),.Key_state(key_state));initial Clk= 1;always#(`clk_period/2) Clk = ~Clk;initial beginRst_n = 0;#(`clk_period*10);Rst_n = 1;#(`clk_period*10 + 1);   press_key;#10000;press_key;#10000;press_key;#10000;$stop;endtask press_key;beginrepeat(20)beginrand = {$random} % 65536 ;#rand;Key_in = ~Key_in;end       Key_in = 0;#50_000_000;repeat(20)beginrand = {$random} % 65536 ;#rand;Key_in = ~Key_in;endKey_in = 1;#50_000_000;   endendtask
endmodule

RTL仿真结果:

FPGA 独立按键消抖相关推荐

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

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

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

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

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

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

  4. 【 FPGA 】按键消抖与LED灯流动小实验

    记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...

  5. FPGA编程按键消抖

    FPGA按键消抖 编写思路 1.按键消抖的基本原理 2.代码原理 3.代码部分 4.仿真代码编写 5.仿真 6.总结 一.按键消抖的基本原理 按键消抖,按下,松开存在毛刺,主要为了消除毛刺.通过稳定后 ...

  6. FPGA实现按键消抖及短时间按键和长时间按键不同动作

    module key_test2(clk, //时钟信号:50Mhzrst, //按键复位key, //用户按键led //LED0~LED2);//端口定义input clk;input rst;i ...

  7. 【按键消抖】基于FPGA的按键消抖模块开发

    1.软件版本 QUARTUSII8.1 Modelsim6.5d 2.系统源码 module tops(i_clk, //100Mi_rst, //系统复位功能,高电平复位,如果不使用这个角,那么一直 ...

  8. FPGA VerilogHDL语言 数字钟 按键消抖

    1.描述 一个简单的基于FPGA的数字钟,语言用的是VerilogHDL,可以实现以下功能: 1. 数码管显示0-59(秒表) 2. 数码管显示:时-分-秒 3. 数码管显示时分秒并且可以设置时间(小 ...

  9. FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖

    最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如  #10 B = A; 当A的变化小于1 ...

  10. stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全

    写在前面: 物联网STM32入门 - 直播课程 - 创客学院​www.makeru.com.cn 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖 ...

最新文章

  1. 千万级游标_在一个千万级的数据库查寻中,如何提高查询效率
  2. php怎么查帮助,需要有关MySQL查询和PHP的帮助
  3. 手把手部署Linux下磁盘配额(quota)应用与实战
  4. SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
  5. 项目:NMEA2000的数据格式解析
  6. 如何看待蒂姆·库克在苹果的地位
  7. 计算机网络之网络层:8、开放最短路径优先算法OSPF
  8. SQL Server 索引基础知识(10)----Join 时的三种算法简介
  9. LNMP+HAProxy+Keepalived负载均衡(五)- 通过rsyncd实现文件的相互同步
  10. 如何解决Backup Exec Remote Agent推送安装失败的问题
  11. 环境变量 - Maven
  12. cmake Can‘t find third_party/gtest
  13. 深度森林DF21、deep forest、gcForest
  14. u检验中的查u界值表_u检验
  15. 分集增益的不同合并方式的性能分析
  16. NOI2015 小园丁与老司机
  17. 程序员是做全栈工程师好?还是专注一个领域好?
  18. PhantomReference虚引用
  19. Linux使用uinput实现虚拟鼠标
  20. mysql 统计表_MySQL统计表的设计

热门文章

  1. 从0开始学习C#第二天
  2. 定时重启php,linux系统定时重启
  3. [2018.11.03 T4] 7w523
  4. BZOJ4072[Wf2014] baggage
  5. 数组模拟栈解决括号匹配
  6. 安装MongoDB时弹窗错误,使用时无法启动服务器
  7. 云服务器 信息安全,云服务器怎么保证信息安全
  8. springboot图片上传和显示_Jeewx-Boot 1.1 版本发布,基于SpringBoot的开源微信管家系统...
  9. matlab实现2dpsk调制与解调,(完整版)matlab设计2DPSK信号调制与解调
  10. linux读取.data文件,Android获取文件夹路径 /data/data/