【verilog】按键消抖(FPGA,低电平有效按键,状态机法)
- 在按键信号的首尾加上计数器,以达到去抖的效果。
- 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,低电平有效按键,状态机法)相关推荐
- Verilog中按键消抖检测的实现
Verilog按键消抖是FPGA学习时的一个入门教程,为避免眼高手低,还是再次分析与记录一下.此处着重介绍按键消抖的基本原理,对按键消抖与检测的关键技术进行分析,并进行功能仿真. 一.按键消抖基本原理 ...
- 【FPGA】实战之按键消抖
文章目录 一.按键消抖的原理 二.按键消抖的设计思路 三.代码部分 四.仿真验证 五.总结 一.按键消抖的原理 一般开发板上的按键都是机械按键,所以在按下的时候,会产生回弹的时刻,称为机械的弹性开关, ...
- FPGA编程按键消抖
FPGA按键消抖 编写思路 1.按键消抖的基本原理 2.代码原理 3.代码部分 4.仿真代码编写 5.仿真 6.总结 一.按键消抖的基本原理 按键消抖,按下,松开存在毛刺,主要为了消除毛刺.通过稳定后 ...
- 状态机按键消抖电路设计
按键消抖电路设计 1. 什么是按键抖动 2. 消抖电路设计思路 3. 代码实现 4. 仿真测试 4.1. initial语句块赋值 4.2. 调用task任务封装赋值并调用$random函数 重新补充 ...
- Linux驱动中按键消抖原理
为什么要用定时器来做按键消抖? 用到按键就要处理因为机械结构带来的按键抖动问题,也就是按键消抖.前面的实验中都是直接使用了延时函数来实现消抖,因为简单,但是直接用延时函数来实现消抖会浪费 CPU 性能 ...
- FPGA学习-Verilog实现独立按键消抖
文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...
- verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)
独立按键消抖设计与验证 本实验主要是为了锻炼状态机的思维模式以及熟练掌握TB的写法 本节主要收获了:define的用法,另外就是,顶层的input在TB中是reg的真正含义,其实就是把激励当做寄存器来 ...
- 基于verilog按键消抖设计
关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了.然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的.这两篇博文都是ednchina的博客 ...
- 【 FPGA 】按键消抖与LED灯流动小实验
记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...
- 我的 FPGA 学习历程(11)—— 实验:按键消抖
按键是一个输入设备,在理论上可以归为开关一类,理想的按键波形如下: 然而由于按键的机械特性,断开和闭合动作是不可能在一瞬间完成的,实际的波形如下: 抖动期间电平处于临界值,由于晶振的频率相当的高,数字 ...
最新文章
- python如何并发上千个get_用greenlet实现Python中的并发
- 日常运维管理技巧十七(Nethogs进程流量监控工具)(转载)
- 第6章-一阶多智体系统一致性-->6.4 切换拓扑系统一致性
- elasticSearch6源码分析(1)启动过程
- SSD 通俗易懂介绍
- 算法学习笔记(一):二分法及其实现
- 转 当当网资深DBA:DB运维四大现代化的实现
- 【Flutter教程】从零构建电商应用(一)
- 收藏 | Pytorch nn.Transformer的mask理解
- c语言实数的输出和占位_例4:C语言用%f输出实数
- html页面送值转换,在静态页面html中跳转传值
- win7下没有ntsd提供的程序支持
- css设置弹出信息,javaScript自定义alert弹出信息窗口
- cfe刷机教程 斐讯k3_小白专属------K3官方固件CFE刷LEDE教程
- mysql查询最大packet_mysql max_allowed_packet 查询和修改
- 安装oracle所有依赖包,安装oracle11g R2 缺少依赖包
- uClinux 启动过程详细分析(一)
- Allegro更新铜皮方法
- 60MongoDB学习笔记
- 抽象类和接口不能直接实例?
热门文章
- 《岗位怎么招》第二期:DBA岗位的人物画像
- Leetcode(347)——前 K 个高频元素
- 基金:波动率、收益率、贝塔系数、最大回撤率、夏普比率
- usage.txt-2
- 2020腾讯校园实习生招聘面经(Offer):系统技术运维岗和后台开发岗
- 关于电脑开启热点手机却无法连接的解决方法(关于网络连接的问题)
- excel怎么自动填充连续数字
- Chrome谷歌浏览器ImTranslator翻译插件安装使用教程
- 如何高效学习 三天学完一本书
- Codeforces Round #490 (Div. 3) C. Alphabetic Removals