一、蜂鸣器(BEEP)
蜂鸣器的鸣叫需要一个震荡源,蜂鸣器分为有源(有震荡源)蜂鸣器和无源(无震荡源)蜂鸣器。
有源蜂鸣器:内部带震荡源,只要一通电就会叫;
无源蜂鸣器:内部不带震荡源,如果用直流信号无法令其鸣叫,则必须用2K-5K的方波去驱动它。
二、按键消抖
1、按键抖动:抖动时间的长短由按键的机械特性决定,一般为5ms~10ms;在按键抖动后,按键才会趋于稳定状态。按下按键和释放按键时,都有一个5ms~10ms的抖动过程。
2、按键消抖目的:防止按键在闭合及断开的瞬间均伴随有一连串的抖动。
按键消抖方法:在按键按下和释放时采用延时采样(一般延时20ms)
三、程序设计
按键——按键消抖——蜂鸣器控制——蜂鸣器
实现功能:使用按键控制蜂鸣器发声,初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫。
四、代码实现
如图:
1、按键消抖模块
module key_debounce(
input clk,
input rst_n,
input key,
output reg key_value,
output reg key_flag
);
reg key_reg;
reg [19:0] delay_cnt;
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
key_reg <= 1'b1;
delay_cnt <= 20'd0;
end
else begin
key_reg <= key;
if(key != key_reg)
delay_cnt <= 20'd1000_000;
else begin
if(delay_cnt > 20'd0)
delay_cnt <= delay_cnt - 1'b1;
else
delay_cnt <= 20'd0;
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(delay_cnt == 20'd1) begin
key_flag <= 1'b1;
key_value <= key;
end
else begin
key_flag <= 1'b0;
key_value <= key_value;
end
end
end
endmodule
2、按键控制模块
module beep_control(
input clk,
input rst_n,
input key_flag,
input key_value,
output reg beep
);
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)
beep <= 1'b1;
else
if(key_flag & (~key_value))
beep <= ~beep;
else
beep <= beep;
end
endmodule
3、顶层文件设计模块
module top_key_beep(
input clk,
input rst_n,
input key,
output beep
);
wire key_value;
wire key_flag;
key_debounce u_key_debounc(
.clk (clk),
.rst_n (rst_n),
.key (key),
.key_value (key_value),
.key_flag (key_flag)
);
beep_control u_beep_control(
.clk (clk),
.rst_n (rst_n),
.key_flag (key_flag),
.key_value (key_value),
.beep (beep)
);
endmodule
五、演示效果
FPGA学习笔记之按键控制蜂鸣器