IT技术之家

首页 > 硬件开发

硬件开发

用verilog编写按键消抖代码

发布时间:2023-12-10 02:15:22 硬件开发 85次 标签:fpga开发
本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。

?