基于FPGA的按键消抖模块

以按键驱动蜂鸣器为例

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的仿真时序如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值