代码如下
module key_debounce(input clk,
input rst_n,
input[3:0] key_v,
output reg[7:0] led);
wire key;//所有按键值相与的结果
reg[3:0] keyr;//key的缓存寄存器
assign key = key_v[3]&key_v[2]&key_v[1]&key_v[0];
//获得按键是否有按下或者释放的标志位 keg_neg keg_pos
always @(posedge clk or negedge rst_n)//按键变化的检测
if(!rst_n)
keyr <= 4'b1111;
else
keyr <= {keyr[2:0],key};
wire keg_neg = ~keyr[2]&keyr[3];//某个按键被按下
wire keg_pos = keyr[2]&~keyr[3];//某个按键被释放
reg[19:0] cnt;
//计数器,40ms采集一次键值
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt <= 20'd0;
else if(keg_neg||keg_pos)
cnt <= 20'd0;
else if(cnt<20'd999_999)
cnt <= cnt + 1'b1;
else
cnt <= 20'd0;
reg[3:0] key_value[1:0];
//定时采集键值
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
key_value[0] <= 4'b1111;
key_value[1] <= 4'b1111;
end
else
begin
key_value[1] <= key_value[0];
if(cnt == 20'd999_999)
key_value[0] <= key_v;
else;
end
wire[3:0] key_press = key_value[1]&~key_value[0];//判断哪个按键被按下
always @(posedge clk or negedge rst_n)
if(!rst_n)
led <= 8'hff;
else if(key_press[0])
led[0] <= ~led[0];
else if(key_press[1])
led[1] <= ~led[1];
else if(key_press[2])
led[2] <= ~led[2];
else if(key_press[3])
led[3] <= ~led[3];
else;
endmodule