verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)
独立按键消抖设计与验证
本实验主要是为了锻炼状态机的思维模式以及熟练掌握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的写法)相关推荐
- FPGA学习-Verilog实现独立按键消抖
文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...
- Verilog实现独立按键消抖(状态机)
本文参考小梅哥的独立按键消抖视频 1,实验原理: 这里是黑金开发板教程中的图,可以看出,按键未按下时的状态是高电平,按下为低电平.下边是小梅哥画的图解. 因为是机械按键,按下时候有一个不稳定的抖动期, ...
- 前仿真和后仿真的区别,按键消抖设计思想、PLL使用、ODDR2的原语使用 --2020/10/29工作总结
2020/10/29工作总结 前仿真和后仿真的区别 前仿真 综合后仿真 后仿真 synthesize和implement.generate bitstream 参考链接 按键消抖设计思想 PLL使用 ...
- 基于verilog按键消抖设计
关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了.然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的.这两篇博文都是ednchina的博客 ...
- 【 FPGA 】按键消抖与LED灯流动小实验
记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...
- FPGA编程按键消抖
FPGA按键消抖 编写思路 1.按键消抖的基本原理 2.代码原理 3.代码部分 4.仿真代码编写 5.仿真 6.总结 一.按键消抖的基本原理 按键消抖,按下,松开存在毛刺,主要为了消除毛刺.通过稳定后 ...
- FPGA实现按键消抖及短时间按键和长时间按键不同动作
module key_test2(clk, //时钟信号:50Mhzrst, //按键复位key, //用户按键led //LED0~LED2);//端口定义input clk;input rst;i ...
- 【按键消抖】基于FPGA的按键消抖模块开发
1.软件版本 QUARTUSII8.1 Modelsim6.5d 2.系统源码 module tops(i_clk, //100Mi_rst, //系统复位功能,高电平复位,如果不使用这个角,那么一直 ...
- STM32按键消抖——入门状态机思维
在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架.掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能. 1 状态机思想 状态机,或称有限状态机F ...
最新文章
- cygwin nginx php mysql_Windows 下 Nginx + PHP5 的安装与配置
- escape与encodeURI、encodeURIComponent的区别
- 键盘I/O中断调用(INT 16H)和常见的int 17H、int 1A H
- VJ 1033 整数分解(版本2)
- 在2008 server上部署域
- BUUCTF-Reverse:reverse1
- .net 事件委托 java_仿net事件委托的java事件模型实现(转csdn)
- FindBugs和JSR-305
- 阿里数据总监分享《阿里数据中台建设实践案例》,PPT+语音讲解!
- 称特价影票被取消后影片仍正常放映 购票人起诉淘票票索赔500元
- mybatis+oracle批量插入报不符合协议和sql未正确结束
- 拓端tecdat|python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
- 【图像处理】基于matlab Hough变换人眼虹膜定位【含Matlab源码 387期】
- 【雷达通信】基于matlab线性调频(LFM)脉冲压缩雷达仿真【含Matlab源码 283期】
- 计算机网络实验——华为eNSP模拟器常用命令总结(总结的非常详细( •̀ .̫ •́ )✧快来看啊)
- 工作流框架Flowable
- Footprint 8月月报 DeFi市场多点开花,9月是否会迎来下一个爆发点
- 记一次IOS打包报错
- 微信QQ的二维码登录原理浅析
- 2019展望|二手车电商:停不下来的混战,但是大家都要准备过冬了