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