按键消抖
工程地址: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