ps. 带★号处可根据需要进行修改.
module pulse_in_status (
input CLK, // 基准时钟,50M
input pulse_in, // 被测脉冲
output reg pulse_in_status // 指示被测脉冲正常与否,1表示正常,0异常
);
reg [1 :0] temp; // 电平值寄存器
reg [31:0] CNT,CNT2;
reg [3 :0] pos_edge; // 上升沿个数
parameter delay = 50_000;
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
endmodule以上源码,可适用于不同频率脉冲信号的判断,占空比不是关键点,如果你的脉冲信号是10HZ(占空比任意),即时钟周期为0.1s,那么你可以判断0.3s内脉冲的个数,从而判别此脉冲输入是否正常,只需修改代码中带★号的地方即可。 |