去除毛刺的方法除了用纯硬件的方法(串电阻并电容),还常用软硬件的方式,数字电路的方式
input ain; //输入信号
reg[3:0] ainr; //输入信号缓存
//输入信号打4拍
always @(posedge clk or negedge rst_n)
if(!rst_n) ainr <= 4'd0;
else ainr <= {ainr[2:0],ain};
//输入信号上升沿检测,高电平有效
wire pos_ain = ~ainr[3] & ~ainr[2] & ainr[1] & ainr[0];
//通常只要两个信号就行,即wire pos_ain = ~ainr[2] & ainr[1] ;。
//这里用了4个信号就是多次采样滤波的效果
//输入信号下降沿检测,高电平有效
wire neg_ain = ainr[3] & ainr[2] & ~ainr[1] & ~ainr[0];
//通常只要两个信号就行,即wire neg_ain = ainr[2] & ~ainr[1] ;。
//这里用了4个信号就是多次采样滤波的效果
//若该输入信号主要关注其高脉冲,那么可以做以下滤波
wire high_ain = ainr[1] & ainr[0];
//两个信号相与通常可以滤除1个clk的毛刺,相应的,3个信号相与可以滤除2个clk的毛刺
//若该输入信号主要关注其低脉冲,那么可以做以下滤波
wire low_ain = ainr[1] | ainr[0];
|