信号去抖模块

  前面已经提过了按键去抖模块,这里就简单的讲下信号去抖模块。信号去抖的原理跟按键去抖的原理很像,都是去除不必要的毛刺信号。信号去抖多用于ADC或者总线信号的去抖,即设置一个时间宽度阈值,当信号的高或者低超过该阈值的时候即输出相应的高低电平。代码如下:

  Dejitter_signal.v

 1 //**************************************************************************
 2 // *** file name      : Dejitter_signal.v
 3 // *** version        : 1.0
 4 // *** Description    : Dejitter_signal
 5 // *** Blogs          : https://www.cnblogs.com/WenGalois123/
 6 // *** Author         : Galois_V
 7 // *** Date           : 2022.09.09
 8 // *** Changes        : Initial
 9 //**************************************************************************
10 `timescale 1ns/1ps
11 module Dejitter_signal
12 #(
13     parameter                    DEJITTER_CLK_NUM = 10
14 )
15 (
16     input                        i_sys_clk          ,
17     input                        i_sys_rstn         ,
18     input                        i_signal           ,
19     input                        i_signal_en        ,
20     input                        o_signal_en        ,
21     output                        o_signal        
22 );
23 generate
24     reg        [DEJITTER_CLK_NUM-1:0]    r_dejitter      ;
25     reg                                  r_signal_out    ;
26     
27     if(DEJITTER_CLK_NUM >= 2)
28     begin:dejitter
29         always@(posedge i_sys_clk)
30         begin
31             if(~i_sys_rstn)
32             begin
33                 r_dejitter <= 'd0;
34             end
35             else if(i_signal_en)
36             begin
37                 r_dejitter <= {r_dejitter[DEJITTER_CLK_NUM-2:0],i_signal};
38             end
39         end
40 
41     /******************************************************************************\
42     Judgment of signal 0/1
43     \******************************************************************************/
44         always@(posedge i_sys_clk)
45         begin
46             if(~i_sys_rstn)
47             begin
48                 r_signal_out <= 'd0;
49             end
50             else if(i_signal_en)
51             begin
52                 if(&r_dejitter)            //Keep DEJITTER_CLK_NUM clock high output 1
53                 begin
54                     r_signal_out <= 1'b1;
55                 end
56                 else if(~(|r_dejitter))    //Keep DEJITTER_CLK_NUM clock low output 0
57                 begin
58                     r_signal_out <= 'd0;
59                 end
60                 else
61                 begin
62                     r_signal_out <= r_signal_out;//Keep currunt state
63                 end
64             end
65         end
66         
67         assign o_signal = r_signal_out;
68         assign o_signal_en = i_signal_en;
69     end
70     else
71     begin:
72         assign o_signal = i_signal;
73         assign o_signal_en = i_signal_en;
74     end
75 endgenerate
76 
77 endmodule

  由于代码过于简单,这里就不做相应的仿真。正常使用时,笔者是一直把输入的信号使能置高。一般对于测频率可以在PWM信号加该模块并配置相应的去抖时间,以减少毛刺对测量信号频率的干扰。

posted on 2022-09-09 10:10  Galois_V  阅读(83)  评论(0编辑  收藏  举报