2023年11月,學習了梅雪松的消抖電路,但始終覺得他用狀態機來判斷抖動並消除抖動會增加很多功耗,畢竟乙個按鍵的每次抖動都要用狀態機來判斷,增加了電路電平某段時間的翻轉率,覺得不妥。
可是本人始終覺得兩人的寫法都有些欠缺。
恰巧入職未滿一周,有幸接觸到了公司合作方所給的fpga**,其中簡潔的消抖電路令我拍案驚奇——這才是它應該有的樣子!
細細一看,發現這段**可能是德州儀器所寫的,畢竟題頭已經標註了「ti」兩字。
module debouncer (
clk,
rstn,
din,
dout );
input clk;
input rstn;
input din;
output dout;
reg dout;
reg [15:
0] clk_c;
//counter for clock divider
reg debounce_clk;
reg signal_sample_1, signal_sample_2, signal_sample_3, signal_sample_4;
always@(posedge clk or negedge rstn) begin
if(~rstn) begin
clk_c <=
16'h0;
debounce_clk <=
1'b0;
end
else
if(clk_c ==
3) begin //28'h16590
clk_c <=
16'h0;
debounce_clk <=
~debounce_clk;
end
else begin
clk_c <= clk_c +
1'b1;
debounce_clk <= debounce_clk;
endendalways@(posedge debounce_clk or negedge rstn)begin
if(~rstn) begin
signal_sample_1 <=
1'b1;
signal_sample_2 <=
1'b1;
signal_sample_3 <=
1'b1;
signal_sample_4 <=
1'b1;
end
else begin
signal_sample_1 <= signal_i;
signal_sample_2 <= signal_sample_1;
signal_sample_3 <= signal_sample_2;
signal_sample_4 <= signal_sample_3;
end
endalways@(posedge clk or negedge reset_z)
begin
if(~rstn)
signal_o <=
1'b1;
else
if(signal_o ==
1'b1 &&
signal_sample_1 ==
1'b0 &&
signal_sample_2 ==
1'b0 &&
signal_sample_3 ==
1'b0 &&
signal_sample_4 ==
1'b0)
signal_o <=
1'b0;
else
if(signal_o ==
1'b0 &&
signal_sample_1 ==
1'b1 &&
signal_sample_2 ==
1'b1 &&
signal_sample_3 ==
1'b1 &&
signal_sample_4 ==
1'b1)
signal_o <=
1'b1;
else
signal_o <= signal_o;
endendmodule
//此debouncer電路,最終的輸出signal_o相對於signal_i的延遲為
// 3*debounce_clk_period + clk_perild
`timescale 1ns/
1ns`define p 20
module debouncer_tb;
reg clk ;
reg rstn ;
reg signal_i;
wire signal_o;
debouncer test
(.clk (clk )
,.reset_z (rstn )
,.signal_i (signal_i)
,.signal_o (signal_o));
initial clk =
1'b0;
always #(`p/
2) clk =
~clk;
//clk 頻率50mhz
initial begin
rstn =
1'b0;
signal_i =
1'b0;
#(`p*10+
3); rstn =
1'b1;
repeat (
5) begin
#(`p*
200)
; signal_i =
~signal_i;
end#(`p*10)
; $stop;
endendmodule
這才是消抖電路該有的邏輯,該有的樣子。
最後關於輸入到輸出的時間計算,假設debounce_clk
的週期為pd,而clk
的週期為p,則
別看了用了四個暫存器(分別是signal_sample_1, signal_sample_2, signal_sample_3, signal_sample_4
),實際上dout
距離din
的時間差為:
t =3
∗pd+
pt = 3*p_d + p
t=3∗pd
+p以上。
按鍵消抖電路原理
按鍵消抖電路原理 fpga開發中按鍵消抖與單脈衝發生器電路 為了使按鍵消抖電路模組簡潔,移植性好,在此用計數器的方式實現按鍵消抖的功能。計數器模值n根據抖動訊號的脈衝寬度和取樣脈衝訊號clk的週期大小決定。計數模值n 延時 脈衝訊號取樣週期。一般按鍵抖動時間為5 10 ms,甚至更長。筆者用的開發板...
按鍵消抖電路設計
用verilog實現按鍵抖動消除電路,抖動小於15ms,輸入時鐘 12mhz 設計思路 使用計數器,計算按鍵時間,如果大於15ms,則認為是有效訊號,若小於15ms,則認為是無效訊號 12mhz 1 clk 83ns 15ms 83ns 180722 0x2c1f2 module rebounce ...
從硬體電路和軟體方面進行按鍵消抖
什麼是按鍵抖動及按鍵抖動產生的原因?最近在專案中用到了機械彈性開關,這種開關在按下時候不會馬上就有穩定的接通,在彈開時候也不會馬上斷開,在按下和彈開的瞬間會產生一系列抖動。而我專案中stm32晶元是通過中斷對按鍵進行判斷的,當晶元檢測到上公升沿時認為按鍵按下一次,因為存在開關抖動,所以一次按鍵操作會...