独立按键消抖设计与验证

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

开发板:小梅哥AC620
软件:quartus 13.1


一般情况下抖动的总时间会持续20ms以内。

状态机的基本结构,下面是一个状态机的样例,我们只需要在以后模仿着写即可,下面程序不是我们的独立按键消抖程序,是我以前写的一个程序,基本上,我写状态机都是按照这种三段式的方法来写。/* 有限状态机,三过程块建模风格 ***************************************** */// 状态编码localparam IDLE  = 3'b001,DELAY = 3'b010,GENE  = 3'b100;reg [2:0] now_state = IDLE, next_state = IDLE;// 1.实现状态转换always @ (posedge clk) begin//: trans_stateif (rst)now_state <= IDLE;elsenow_state <= next_state;end//: trans_state// 2.产生下一个状态always @ (*) begin//: set_next_state//next_state = now_state; // 下面分支的缺省状态case (now_state)IDLE  : if (valid )beginif (delay=='b0)next_state = GENE;elsenext_state = DELAY;endelsenext_state = IDLE;DELAY : if (delay_cnt >= delay)next_state = GENE;elsenext_state = DELAY;GENE  : if (nop_cnt >= nop)next_state = IDLE;elsenext_state = GENE;default:next_state=IDLE;endcaseend//: set_next_state// 3.产生状态机的输出值always @ (posedge clk) begin//: set_out_proccase (next_state)IDLE  : beginnop_cnt     <= 'b0;delay_cnt   <= 'b0;endDELAY : begindelay_cnt   <= delay_cnt + 1'b1;endGENE  : beginif (pulse_dec)nop_cnt <= nop_cnt + 1'b1;elsenop_cnt <= nop_cnt;enddefault: ;endcaseend//: set_out_proc

独立按键消抖程序

module key_detect
(
input clk,
input rst_n,
input key,
output led
);reg key_n;
reg key_n_n;reg [23:0]cnt_fall=0;//
reg [23:0]cnt_rise=0;/*--------边沿检测部分---------*/
wire dectect_fall,dectect_rise;
always @ (posedge clk)
begin
key_n<=key;
key_n_n<=key_n;
end
assign dectect_fall=key_n_n&!key;//下降沿检测
assign dectect_rise=!key_n_n&key;//上升沿检测localparam idle=0;//不按时候的空闲状态
localparam fall_shake=1;//按下时候的抖动状态
localparam fall_stable=2;//按下时候的稳定状态
localparam rise_shake=3;//释放时候的抖动状态/*--------状态机部分---------*/
reg[2:0] state_next=idle;
reg [2:0] state_now=idle;//参数化设计
localparam fall_shake_time=24'd10;//20ms的下降延抖动延时  10*20=200ns
localparam rise_shake_time=24'd10;//20ms的上升延抖动延时//状态转移
always @ (posedge clk or negedge rst_n)
beginif(!rst_n)state_now<=idle;elsestate_now<=state_next;
end//转移条件
always@ (*)
begincase(state_now)idle:beginif(dectect_fall)//如果检测到下降沿,那么就跳转到下降沿抖动状态state_next=fall_shake;else if(key)state_next=idle;elsestate_next=fall_stable;endfall_shake:beginif(cnt_fall<fall_shake_time) begin   if(dectect_rise)state_next=idle;elsestate_next=fall_shake;endelse if(cnt_fall==fall_shake_time)state_next=fall_stable;elsestate_next=idle;    endfall_stable:beginif(dectect_rise)//如果检测到下降沿,那么就跳转到下降沿抖动状态state_next=rise_shake;else if(!key)state_next=fall_stable;elsestate_next=idle;endrise_shake:begin if(cnt_rise<rise_shake_time)begin    if(dectect_fall)state_next=fall_shake;elsestate_next=rise_shake;endelse if(cnt_rise==rise_shake_time)state_next=idle;elsestate_next=rise_shake;   enddefault:;endcase
end//状态输出
always@ (posedge clk)
begincase(state_next)idle:begincnt_fall<=0;cnt_rise<=0;endfall_shake:begincnt_fall<=cnt_fall+1;end fall_stable:;rise_shake:begincnt_rise<=cnt_rise+1;endendcase
end//判断按键是否真的按下
assign led=(state_now==fall_stable|state_now==rise_shake)?0:1;
endmodule

测试文件:
注意:测试由于我们的抖动20ms,太长了,对于仿真不方便,我们就把顶层的20ms,改成了200ns的抖动时间

`define clock_period 0.02
`timescale 1 us/ 1 ns
module key_detect_vlg_tst();
reg clk;
reg key;
reg rst_n;wire led;// assign statements (if any)
key_detect i1 (
// port map - connection between master ports and signals/registers   .clk(clk),.key(key),.led(led),.rst_n(rst_n)
);initial
begin
clk=0;
rst_n=0;
key=1;
end//定义时钟
always #(`clock_period/2) clk=~clk;initial
begin  #(`clock_period*10); rst_n=1;#(`clock_period*10); key=0;#(`clock_period*500); key=1;#(`clock_period*10); key=0;#(`clock_period*5); key=1;#(`clock_period*500); $stop;
end  endmodule

实际测试:

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

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

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

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

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

  3. 前仿真和后仿真的区别,按键消抖设计思想、PLL使用、ODDR2的原语使用 --2020/10/29工作总结

    2020/10/29工作总结 前仿真和后仿真的区别 前仿真 综合后仿真 后仿真 synthesize和implement.generate bitstream 参考链接 按键消抖设计思想 PLL使用 ...

  4. 基于verilog按键消抖设计

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

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

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

  6. FPGA编程按键消抖

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

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

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

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

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

  9. STM32按键消抖——入门状态机思维

    在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架.掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能. 1 状态机思想 状态机,或称有限状态机F ...

最新文章

  1. cygwin nginx php mysql_Windows 下 Nginx + PHP5 的安装与配置
  2. escape与encodeURI、encodeURIComponent的区别
  3. 键盘I/O中断调用(INT 16H)和常见的int 17H、int 1A H
  4. VJ 1033 整数分解(版本2)
  5. 在2008 server上部署域
  6. BUUCTF-Reverse:reverse1
  7. .net 事件委托 java_仿net事件委托的java事件模型实现(转csdn)
  8. FindBugs和JSR-305
  9. 阿里数据总监分享《阿里数据中台建设实践案例》,PPT+语音讲解!
  10. 称特价影票被取消后影片仍正常放映 购票人起诉淘票票索赔500元
  11. mybatis+oracle批量插入报不符合协议和sql未正确结束
  12. 拓端tecdat|python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
  13. 【图像处理】基于matlab Hough变换人眼虹膜定位【含Matlab源码 387期】
  14. 【雷达通信】基于matlab线性调频(LFM)脉冲压缩雷达仿真【含Matlab源码 283期】
  15. 计算机网络实验——华为eNSP模拟器常用命令总结(总结的非常详细( •̀ .̫ •́ )✧快来看啊)
  16. 工作流框架Flowable
  17. Footprint 8月月报 DeFi市场多点开花,9月是否会迎来下一个爆发点
  18. 记一次IOS打包报错
  19. 微信QQ的二维码登录原理浅析
  20. 2019展望|二手车电商:停不下来的混战,但是大家都要准备过冬了

热门文章

  1. 个人开源作品,即时通讯App支持文本、语音、图片聊天
  2. Gui系统之View体系(2)---View的setContent
  3. 数据结构应用实例#栈#迷宫寻路
  4. linux入门教程(七) linux系统用户以及用户组管理
  5. Font Rending 的 Hint 机制对排版的影响
  6. linux修改selinux
  7. 什么时候使用webservice1
  8. UA OPTI570 量子力学2 物质波与物质粒子
  9. UA MATH574M 统计学习II 高维数据的二元分类
  10. 求正负数交互序列的和的MFC版