用verilog编写按键消抖代码
本代码在按键按下和松开情况下均能消抖,消抖延时20ms(时钟频率为100MHz时)。
代码如下
module key3_led2(
//from system input
?? ?input?? ?clk,
?? ?input?? ?rstn,
//from external input to pl
?? ?input?? ?ex_key1,?? ??? ?//按键从PL端输入
//from pl to ps
?? ?output?? ?reg?? ?pl_key1?? ?//处理后的按键信号传给PS端
?? ?
);
parameter?? ?delay_t=21'd2_00;//0_000;?? ?//时钟100MHz,延时20ms
//按键输入信号异步转同步(消除亚稳态)
reg [1:0]?? ??? ?key1_r;
//捕捉按键跳变沿
wire?? ??? ?key1_change;
//按键消抖延时计数
reg [20:0]?? ??? ?delay_key1_cnt;
//按键状态
wire?? ??? ?key1_state_down;//(按键未按时为1,按下为0)检测按下时的下降沿
wire?? ??? ?key1_state_up;?? ?//检测按键松开时的上升沿。
//key1消抖
//消除亚稳态,单bit信号异步转同步
always@(posedge clk or negedge rstn)
begin
?? ?if(!rstn)
?? ??? ?begin
?? ??? ??? ?key1_r<=1;
?? ??? ?end
?? ?else
?? ??? ?begin
?? ??? ??? ?key1_r<={key1_r[0],ex_key1};
?? ??? ?end
end
//边沿检测上升沿和下降沿
assign key1_change=(~key1_r[1]&key1_r[0]) | (key1_r[1] & ~key1_r[0]);
//延时20ms
always@(posedge clk or negedge rstn)
begin
?? ?if(!rstn)
?? ??? ?begin
?? ??? ??? ?delay_key1_cnt<=0;
?? ??? ?end
?? ?else if(key1_change==1'b1)
?? ??? ?begin
?? ??? ??? ?delay_key1_cnt<=0;?? ?
?? ??? ?end
?? ??????? else if (delay_key1_cnt == delay_t)
?? ??? ??? ?begin
?? ??? ??? ??? ?delay_key1_cnt<=delay_t;
?? ??? ??? ?end
?? ?????????????? else
?? ??? ??? ?begin
?? ??? ??? ??? ?delay_key1_cnt<=delay_key1_cnt+1'b1;
?? ??? ??? ?end
end
//按键状态输出,key1_state_a假定按键默认状态为1,按下为0;
assign?? ?key1_state_down = ((delay_key1_cnt == delay_t)&&(key1_r[1] == 1'b0))?1'b0:1'b1;
assign?? ?key1_state_up = ((delay_key1_cnt == delay_t)&&(key1_r[1] == 1'b1))?1'b1:1'b0;
always@(posedge clk or negedge rstn)
begin
?? ?if(!rstn)
?? ??? ?begin
?? ??? ??? ?pl_key1<=1'd1;
?? ??? ?end
?? ?else
?? ??? if(pl_key1)
?? ??? ??? ?pl_key1<=key1_state_down;
?? ??? ?else
?? ??? ?? pl_key1<=key1_state_up;
end
endmodule
用该代码扩展到3个按键,仿真结果如下图,按键信号输入名称ex_key1、ex_key2、ex_key4;按键边沿检测信号key1_change、key2_change、key4_change;消抖后的信号pl_key1、pl_key2、pl_key4。
?
相关文章
- SpringBoot 实现 Excel 导入导出,性能爆表,用起来够优雅_肥肥技术宅
- ZYNQ简介_西岸贤_zynq
- SpringBoot+jsp实现水果商城系统(含源码+数据库+文档)_程序员小王java_jsp程序设计
- AD学习之旅(16)? 差分线规则的设置及走线_Willliam_william_ad16差分线等长设置
- 数字信号处理----数字上变频和下变频都FPGA实现_Born_toward_数字上变频
- 模拟电子技术最终章??直流电源:整流+滤波+稳压(知识点归纳总结及例题详细分析)LDO与DCDC详解_Cheeky_man_整流滤波稳压
- PCIe5.0 协议_Bigbee_i_pcie协议
- 基于SSM+Vue+OSS的“依伴汉服”商城设计与开发(含源码+论文+ppt+数据库)_程序员小王java
- 【Proteus】多功能数字时钟设计_你我山巅自相逢y_多功能数字钟电路设计
- questasim的傻瓜式安装与仿真教程_树下等苹果_questasim安装
- 【C++】STL??vector模拟实现_霄沫凡
- C++实现---学生选课系统_小小圆脸_c++学生选课系统
- k8s中pv的回收策略_农民工老王_pv回收策略
- verilog写寄存器_oneway1995_寄存器verilog
- IAR安装_"dandan"不能定义_iar
- STM32硬件I2C与软件模拟I2C超详解_rivencode_stm32软件模拟i2c