以按键驱动蜂鸣器为例
module key_beep(
input sys_clk,
input sys_rst,
input key,
output reg beep
);
reg key_flag;
reg key_value;
reg [23:0] counter;
reg key_reg;
// 按键防抖
// count 1_000_000 times for 20ms delay
always @(posedge sys_clk or negedge sys_rst) begin
if (!sys_rst) begin
counter <= 24'd0;
key_reg <= 1'd1;
end
else begin
key_reg <= key;
if (key != key_reg) begin
counter <= 24'd0;
end
else begin
if (counter == 24'd1_000_000)
counter <= counter;
else
counter <= counter + 1'b1;
end
end
end
always @(posedge sys_clk or negedge sys_rst) begin
if (!sys_rst) begin
key_flag <= 1'd0;
key_value <= 1'd1;
end
else begin
if (counter == 24'd999_999) begin
key_flag <= 1'd1;
key_value <= key;
end
else begin
key_flag <= 1'd0;
key_value <= key_value;
end
end
end
// key controls beep
always @(posedge sys_clk or negedge sys_rst) begin
if (!sys_rst)
beep <= 1'b1;
else if (key_value && key_flag)
beep <= ~beep;
else
beep <= beep;
end
endmodule
Testbench如下:
`timescale 1ns/1ns
module key_beep_tb();
reg sys_clk;
reg sys_rst;
reg key;
wire beep;
reg key_flag;
reg key_value;
reg [23:0]counter;
parameter T = 10;
always #T sys_clk = ~ sys_clk;
initial begin
key <= 1'b1;
sys_clk <= 1'b0;
sys_rst <= 1'b0;
#20 sys_rst <= 1'b1;
#30 key <= 1'b0;
#20 key <= 1'b1;
#20 key <= 1'b0;
#20 key <= 1'b1;
#20 key <= 1'b0;
#170 key <= 1'b1;
#20 key <= 1'b0;
#20 key <= 1'b1;
#20 key <= 1'b0;
#20 key <= 1'b1;
#170 key <= 1'b0;
end
key_beep u1(
sys_clk,
sys_rst,
key,
beep
);
endmodule
基于Modelsim的仿真时序如下: