按键抖动检测及控制灯翻转功能
2025-03-10
0
0
通过状态机S1~S2,在S2状态时key_cap输出高电平
module key (
input clk_i,
input key_i,
output key_cap
);
begin
//10ms时钟分频
always @(posedge clk_i)begin
if(cnt10ms < CNT_10MS)
cnt10ms <= cnt10ms + 1'b1;
else
cnt10ms <= 25'd0;
end
assign en_10ms = (cnt10ms == CNT_10MS);
//是否按下,按下为0
//10ms检测一次
always @(posedge clk_i)begin
if(en_10ms)begin
case(key_s)
KEY_S0:begin
if(!key_i)//按下
key_s <= KEY_S1;
end
KEY_S1:begin
if(!key_i)//按下
key_s <= KEY_S2;
else
key_s <= KEY_S0;
end
KEY_S2:begin
if(key_i) //抬起,如果不抬起,继续为S2
key_s <= KEY_S3;
end
KEY_S3:begin
if(key_i)//抬起
key_s <= KEY_S0;
else
key_s <= KEY_S2;
end
endcase
end
end
always @(posedge clk_i)begin
key_s_r <= key_s;
end
//当到达KEY_S2时,输出一次高电平
//保持一个时钟周期
assign key_cap = (key_s==KEY_S2)&&(key_s_r==KEY_S1);
//高电平的时间就是KEY2的保持的时长
assign key_cap = (key_s==KEY_S2);
end
上面作为通用模块,供下面模块调用,调用上面的模块
增加一键控制一灯功能
module Key_Jitter(
input clk_i,
input rst_n_i,
input key_i,
output [3:0] led_o
);
always @(posedge clk_i)
begin
if(!rst_n_i) begin
led_o <= 4'b0000;
end
else if(key_cap)begin
led_o <= ~led_o;
end
end
key0
(
.clk_i(clk_i),
.key_i(key_i),
.key_cap(key_cap)
);
end module