按alt可以竖向选择文本
用的是正点原子的fpga教程
有源(直接加直流)与无源(外加震荡源)蜂鸣器,区别在于是否有黑胶。要区分正负极
按键抖动时间,一般设置为20ms
多模块要记得将其中一个设为顶层模块,右键菜单选择即可。或者在assignment→setting里面设置
按键延时代码
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_0000;
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
蜂鸣器控制代码
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;
end
endmodule
顶层模块代码
module kep_beep(
input clk,
input rst_n,
input key,
output beep
);
wire key_value;
wire key_flag;
key_debounce u_key_debounce(
.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
对应的模块图: