首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

脉冲信号正常与否的判断

脉冲信号正常与否的判断

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内脉冲的个数,从而判别此脉冲输入是否正常,只需修改代码中带★号的地方即可。
the king of nerds
返回列表