题目概述:
使用按键控制蜂鸣器发声。初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫。
key_debounce.v
module key_debounce(
input sys_clk,
input sys_rst_n,
input key,
output reg key_value,
output reg key_flag
);
reg [19:0] cnt;
reg key_reg;
//按键消抖
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
cnt<=20'd0;
key_reg<=1'b1;
end
else begin
key_reg<=key;
if(key_reg!=key)begin
cnt<=20'd100_0000;
end
else begin
if(cnt>20'd0)
cnt<=cnt-1'b1;
else
cnt<=20'd0;
end
end
end
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
key_value<=1'b1;
key_flag<=1'b0;
end
else if(cnt==20'd2)begin
key_value<=key;
key_flag<=1'b1;
end
else begin
key_value<=key_value;
key_flag<=1'b0;
end
end
endmodule
beep_control.v
module beep_control(
input sys_clk,
input sys_rst_n,
input key_value,
input key_flag,
output reg beep
);
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
beep<=1'b1;
end
else if(key_flag && (key_value==1'b0))
beep<=~beep;
end
endmodule
top_key_beep.v
module top_key_beep(
input sys_clk,
input sys_rst_n,
input key,
output beep
);
wire key_value;
wire key_flag;
key_debounce u_key_bounce(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.key(key),
.key_value(key_value),
.key_flag(key_flag)
);
beep_control u_beep_control(
.sys_clk (sys_clk),
.sys_rst_n(sys_rst_n),
.key_value(key_value),
.key_flag(key_flag),
.beep(beep)
);
endmodule
上机实践:
QQ短视频20220805152356