本代码在按键按下和松开情况下均能消抖,消抖延时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。
文章来源:https://www.toymoban.com/news/detail-432433.html
文章来源地址https://www.toymoban.com/news/detail-432433.html
到了这里,关于用verilog编写按键消抖代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!