信号去抖模块
前面已经提过了按键去抖模块,这里就简单的讲下信号去抖模块。信号去抖的原理跟按键去抖的原理很像,都是去除不必要的毛刺信号。信号去抖多用于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信号加该模块并配置相应的去抖时间,以减少毛刺对测量信号频率的干扰。