按键防抖:检测到按键信号稳定后,再过20ms
按键防抖(先准备一个延迟时钟,)
module key_debounce(
input clk ,//50mhz,t=20ns
input rst_n ,
input key ,
output reg key_value ,
output reg key_flag
);
reg [19:0] cnt; //20ms-->20_000_000/20=1_000_000
reg key_reg; //存储按键上一周期的状态
//按键稳定且保持20ms
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt <= 0;
key_reg <= 1'b1; //按键默认状态为高电平
end else begin
key_reg <= key;
if(key_reg != key) //如果按键状态发生改变
cnt <= 20'd100_0000; //20ms准备好
else begin //如果按键状态不发生改变
if(cnt > 20'b0) //延迟20ms
cnt <= cnt - 20'b1;
else
cnt <= 20'b0;
end
end
end
//看按键什么时候消抖完成
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
key_value <= 1'b1;
key_flag <= 1'b0;
end else begin
if (cnt == 20'd1) begin//如果20ms延迟过了,为什么不是=0
key_value <= key;//因为如果=0时,cnt还是一直=0
key_flag <= 1'b1;//key_flag就一直=1,没有周期性了(1个周期内cnt=1的次数为一次)
end else begin
key_value <= key_value;
key_flag <= 1'b0;
end
end
end
endmodule
蜂鸣器控制
module beep_control(
input clk ,//50mhz,t=20ns
input rst_n ,
input key ,
output reg key_value ,
output reg key_flag ,
output reg beep
);
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)
beep <= 1'b1;//默认值为高电平
else if (key_flag && (key_value == 1'b0))//按键,按下(value=0)
beep <= ~beep;
end
endmodule
例化文件
module top_key_beep(
input clk ,//50mhz,t=20ns
input rst_n ,
input key ,
output beep
);
//因为是内部的变量所以是线网类型的
wire key_value;
wire key_flag;
//module例化
key_debounce u_key_debounce(
.clk (clk) ,//50mhz,t=20ns
.rst_n (rst_n) ,
.key (key) ,
.key_value (key_value) ,
.key_flag (key_flag)
);
beep_control u_beep_control(
.clk (clk) ,//50mhz,t=20ns
.rst_n (rst_n) ,
.key (key) ,
.key_value (key_value) ,
.key_flag (key_flag) ,
.beep (beep) //beep默认是wire类型
);
endmodule
io配置
set_property PACKAGE_PIN U18 [get_ports clk]
set_property PACKAGE_PIN J15 [get_ports rst_n]
set_property PACKAGE_PIN L20 [get_ports {key}]
set_property PACKAGE_PIN G18 [get_ports {beep}]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports {key}]
set_property IOSTANDARD LVCMOS33 [get_ports {beep}]