• 在按键信号的首尾加上计数器,以达到去抖的效果。
  • testbench
  • 功能仿真
  • 测试

在按键信号的首尾加上计数器,以达到去抖的效果。

module key (in,clk,rst_n,outkey,outflag);input in;       //按键输入(物理)input clk;input rst_n;output reg outkey; //按键输出(同步)output reg outflag;//按下/松开标志//--------------------------------------------------------------------wire down;//检测到下降沿wire up;  //检测到上升沿reg temp1,temp2;always@(posedge clk or negedge rst_n)if(!rst_n)begintemp1 <= 1'b0;temp2 <= 1'b0;                  endelsebegintemp1 <= in ;temp2 <= temp1;endassign up = temp1 & (!temp2);assign down = (!temp1) & temp2;
//-------------------------------------------------------------------reg en_cnt;//去抖模块送进来的reg  cnt_full;reg [19:0]cnt;always@(posedge clk or negedge rst_n)if(!rst_n)cnt <= 20'd0;else if (en_cnt)    cnt <= cnt + 1'b1;else cnt <= 20'd0; always@(posedge clk or negedge rst_n)if(!rst_n)cnt_full <= 1'b0;else if (cnt == 999_999)    cnt_full <= 1 ;else cnt_full <= 1'b0;//---------------------------------------------------------------------localparamDENGXIA    = 4'b0001,YANSHI  = 4'b0010,WENDING    = 4'b0100,YANSHI2  = 4'b1000;reg [3:0]state; //状态寄存器always@(posedge clk or negedge rst_n)if(!rst_n) beginstate  <= DENGXIA;en_cnt <= 1'b0;outkey <= 1'b1;outflag <=1'b0;endelse  begincase(state)DENGXIA :beginoutflag <= 1'b0; //flagif(down) begin      state  <= YANSHI; en_cnt <= 1'b1;      endelse                 state <= DENGXIA;endYANSHI :if(cnt_full)begin  outflag <=1'b1; //flagoutkey <= 1'b0; //outstate <= WENDING;  en_cnt <= 1'b0; endelse if (up) begin  state <= DENGXIA;   en_cnt <= 1'b0;  endelse state  <= YANSHI;  WENDING :beginoutflag <=1'b0;  //flagif(up) begin  state  <= YANSHI2; en_cnt <= 1'b1;   endelse                   state  <= WENDING; endYANSHI2 :if(cnt_full)beginoutflag <=1'b1; //flagoutkey <= 1'b1; //outstate  <= DENGXIA; en_cnt <= 1'b0; endelse if (down) begin  state <= WENDING;   en_cnt <= 1'b0;  endelse state  <= YANSHI2;  default :  beginstate <= DENGXIA;en_cnt <= 1'b0;outkey <=1'b1; //outoutflag <=1'b0;//flagendendcaseendendmodule

testbench

模拟按键抖动

`timescale 1ns/1ns
`define shizhong 20
module key_tb;reg clk2;reg rst_n2;reg in2;wire outflag2;wire outkey2;key f1(.clk(clk2),.rst_n(rst_n2),.in(in2),.outflag(outflag2),.outkey(outkey2));initial clk2 = 1;always#(`shizhong/2) clk2 = ~clk2;initial begin rst_n2 = 1'b0;in2 = 1'b1;#(`shizhong*10);rst_n2 = 1'b1;//模拟出按键的抖动过程  按下抖动#(`shizhong*10 + 1);in2 = 0 ;#1000;in2 = 1 ;#2000;in2 = 0 ;#1400;in2 = 1 ;#2600;in2 = 0 ;#1300;in2 = 1 ;#200;in2 = 0 ;#2_000_000_00;   //按键稳定//释放时抖动in2 = 1 ;#2000;in2 = 0 ;#1000;in2 = 1 ;#2000;in2 = 0 ;#1000;in2 = 1 ;#2600;in2 = 0 ;#1300;in2 = 1 ;#2_000_000_00; //按键稳定松开$stop;        end
endmodule

功能仿真


生成了同步于当前时钟域的信号以供其他模块使用

测试

用按键改变数码管的显示内容,查看是否有抖动!

module top(input clk,input rst_n,input key1,output  [5:0] dig, output  [7:0] dict
);dig8_6 f0(.clk(clk),.rst(rst_n),.set_data(data),.dig(dig),  //六位独热码表示六个数码管.dict(dict) //位选数码管
);key  f1(.in(key1),.clk(clk),.rst_n(rst_n),.outkey(outkey1),.outflag1());//对outkey1进行上升沿检测,检测成功说明一次有效按键。——___——
wire outkey1;
reg dout;
wire out2dig;
always@(posedge clk or negedge rst_n)if(!rst_n)dout <= 1'b0;elsedout <= outkey1;assign out2dig = outkey1 & (!dout);//将只能维持一个时钟周期的out2dig,转化为一个开关量。
reg switch;
always@(posedge clk or negedge rst_n)if(!rst_n)switch <= 1'b0;elsebegin if(out2dig == 1'b1)switch <= ~switch;else switch <= switch;end//数码管指示
reg [23:0]data;
always@(posedge clk or negedge rst_n)if(!rst_n)data <= 1'b0;elsebeginif(switch == 1'b1)data <= 24'hffffff;elsedata <= 24'h000000;endendmodule

测试平台(正点原子开拓者开发板)

clk      Input   PIN_E1
key1        Input   PIN_E16
rst_n       Input   PIN_M1
dict[7]     Output  PIN_D9
dict[6]     Output  PIN_P11
dict[5]     Output  PIN_N11
dict[4]     Output  PIN_M10
dict[3]     Output  PIN_N13
dict[2]     Output  PIN_C9
dict[1]     Output  PIN_N12
dict[0]     Output  PIN_M11
dig[5]      Output  PIN_T15
dig[4]      Output  PIN_R16
dig[3]      Output  PIN_P15
dig[2]      Output  PIN_P16
dig[1]      Output  PIN_N15
dig[0]      Output  PIN_N16

【verilog】按键消抖(FPGA,低电平有效按键,状态机法)相关推荐

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

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

  2. 【FPGA】实战之按键消抖

    文章目录 一.按键消抖的原理 二.按键消抖的设计思路 三.代码部分 四.仿真验证 五.总结 一.按键消抖的原理 一般开发板上的按键都是机械按键,所以在按下的时候,会产生回弹的时刻,称为机械的弹性开关, ...

  3. FPGA编程按键消抖

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

  4. 状态机按键消抖电路设计

    按键消抖电路设计 1. 什么是按键抖动 2. 消抖电路设计思路 3. 代码实现 4. 仿真测试 4.1. initial语句块赋值 4.2. 调用task任务封装赋值并调用$random函数 重新补充 ...

  5. Linux驱动中按键消抖原理

    为什么要用定时器来做按键消抖? 用到按键就要处理因为机械结构带来的按键抖动问题,也就是按键消抖.前面的实验中都是直接使用了延时函数来实现消抖,因为简单,但是直接用延时函数来实现消抖会浪费 CPU 性能 ...

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

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

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

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

  8. 基于verilog按键消抖设计

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

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

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

  10. 我的 FPGA 学习历程(11)—— 实验:按键消抖

    按键是一个输入设备,在理论上可以归为开关一类,理想的按键波形如下: 然而由于按键的机械特性,断开和闭合动作是不可能在一瞬间完成的,实际的波形如下: 抖动期间电平处于临界值,由于晶振的频率相当的高,数字 ...

最新文章

  1. python如何并发上千个get_用greenlet实现Python中的并发
  2. 日常运维管理技巧十七(Nethogs进程流量监控工具)(转载)
  3. 第6章-一阶多智体系统一致性-->6.4 切换拓扑系统一致性
  4. elasticSearch6源码分析(1)启动过程
  5. SSD 通俗易懂介绍
  6. 算法学习笔记(一):二分法及其实现
  7. 转 当当网资深DBA:DB运维四大现代化的实现
  8. 【Flutter教程】从零构建电商应用(一)
  9. 收藏 | Pytorch nn.Transformer的mask理解
  10. c语言实数的输出和占位_例4:C语言用%f输出实数
  11. html页面送值转换,在静态页面html中跳转传值
  12. win7下没有ntsd提供的程序支持
  13. css设置弹出信息,javaScript自定义alert弹出信息窗口
  14. cfe刷机教程 斐讯k3_小白专属------K3官方固件CFE刷LEDE教程
  15. mysql查询最大packet_mysql max_allowed_packet 查询和修改
  16. 安装oracle所有依赖包,安装oracle11g R2 缺少依赖包
  17. uClinux 启动过程详细分析(一)
  18. Allegro更新铜皮方法
  19. 60MongoDB学习笔记
  20. 抽象类和接口不能直接实例?

热门文章

  1. 《岗位怎么招》第二期:DBA岗位的人物画像
  2. Leetcode(347)——前 K 个高频元素
  3. 基金:波动率、收益率、贝塔系数、最大回撤率、夏普比率
  4. usage.txt-2
  5. 2020腾讯校园实习生招聘面经(Offer):系统技术运维岗和后台开发岗
  6. 关于电脑开启热点手机却无法连接的解决方法(关于网络连接的问题)
  7. excel怎么自动填充连续数字
  8. Chrome谷歌浏览器ImTranslator翻译插件安装使用教程
  9. 如何高效学习 三天学完一本书
  10. Codeforces Round #490 (Div. 3) C. Alphabetic Removals