關於消抖電路的再認知(消抖電路的簡潔寫法)

2021-10-08 23:18:32 字數 3253 閱讀 9779

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晶元是通過中斷對按鍵進行判斷的,當晶元檢測到上公升沿時認為按鍵按下一次,因為存在開關抖動,所以一次按鍵操作會...