AC620FPGA学习笔记——按键消抖

AC620FPGA学习笔记——按键消抖

按键消抖

工程地址:https://github.com/HaHaHaHaHaGe/Planof2019_half/tree/master/Course_Project/FPGA/class02_pushkey
学习重点:
1、多模块之间的连接
2、消抖原理
3、亚稳态处理

多模块之间的连接

module key_cnt_led(
	led1,
	led2,
	led3,
	led4,
	key,
	clk,
	rst
);

input wire clk,rst;
input key;
reg key_1;
reg key_2;
output wire led1,led2,led3,led4;
wire outkey;

pushkey pushkey_01(
	.clk(clk),
	.key(key_2),
	.out(outkey)
);

count_led count_led_01(
	.led1(led1),
	.led2(led2),
	.led3(led3),
	.led4(led4),
	.clk(outkey),
	.rst(rst)
);

always@(posedge clk) begin
key_1 <= key;
key_2 <= key_1;
end
endmodule

就像用烙铁焊接元器件一样,使用wire将各个module连接起来

消抖原理

module pushkey(
	clk,
	key,
	out
);

input clk,key;
output reg out;

reg flag;
reg [20:0]cnt;

localparam PUSH = 1'b1;
localparam NO_PUSH = 1'b0;

always@(posedge clk) begin

if(!key) 
	flag <= PUSH;
else begin
	cnt[20:0] <= 21'd0;
	flag <= NO_PUSH;
end

case(flag)
	NO_PUSH:
		out <= 1'b0;
	PUSH:	if(cnt[20:0] == 21'd999999)
			out <= 1'b1;
		else
			cnt <= cnt + 21'b1;
endcase
end
endmodule

使用定时器对按键的状态进行检测,若20ms内没有出现波动,则认为按下了按键

亚稳态处理

亚稳态是由于异步系统信号的不确定性造成的。亚稳态的状态会对次级系统造成严重的影响,导致系统崩溃
处理的办法,使用级联DQ触发器即可解决

always@(posedge clk) begin
key_1 <= key;
key_2 <= key_1;
end

1

猜你喜欢

转载自blog.csdn.net/weixin_41738734/article/details/84108750