always @ (posedge CLK)
begin
//==============================================================
//检测被测脉冲的边沿(带消抖)
//==============================================================
if(CNT==5*delay) // ★ 延时5ms,此延时时间应大于脉冲抖动时间(一般为ms级),小于被测脉冲的半个时钟周期
begin
temp[0] <= pulse_in; // 保存pulse_in信号的当前状态值
CNT <= 0 ;
end
else
begin
temp[1] <= temp[0]; // 保存pulse_in信号的前一状态值
CNT <= CNT+1 ;
end
//==============================================================
//检测被测脉冲3s之内的上升沿个数,此数值等于0,则表示被测脉冲异常,否则为正常
//==============================================================
if(CNT2==3000*delay) // ★ 3s之内判断上升沿个数,如果依然为0,说明pulse_in脉冲信号异常,否则正常.
begin
if(pos_edge==0)
begin
pulse_in_status <= 0; // pulse_in脉冲信号异常
CNT2 <= 0; //复位计时寄存器
end
else
begin
pulse_in_status <= 1; // pulse_in脉冲信号正常
CNT2 <= 0; //复位计时寄存器
pos_edge <= 0; //清空上升沿个数寄存器
end
end
else
begin
CNT2 <= CNT2+1; //计时
if(temp==2'b01) // 如果检测到pulse_in的一个上升沿,上升沿个数计数器pos_edge加1
begin
pos_edge <= pos_edge+1;
end
end
end