脉冲信号正常与否的判断(附全部verilog源码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 讲废话
最近闲得蛋疼,翻阅了一下以前的项目笔记,想起去年折腾的一个小玩意儿。
记得当时
是由于项目需要,boss找到我,说主板上有一个单片机,会发出heartbeat信号(就是MCU 等一些芯片的心跳信号,只要芯片活着,就会一直发送固定频率的脉冲出去,如果芯片挂了,heartbeat就一直为0或1),能不能用CPLD判断这个信号是否处于正常状态?(说白了,也就是判断单片机是否还活着)。
于是着手研究了一下这个heartbeat信号,用示波器测了一下,是一个标准的脉冲,频率为1HZ,占空比为50%,捯饬了两个小时,给出的解决方案是:每3s钟,计算一次上升沿的个数,如果此数值等于0,则heartbeat信号异常(用0表示),否则heartbeat信号正常(用1表示)。
把这个问题和方案贴出来,一是觉得实用性比较强,以前也没有看到有人做过,二是此解决方案对于其他同类问题有启发作用,只要弄懂此个案,其他问题也会触类旁通,易于解决。
现在给出方案的verilog源码,供大家研究,代码已通过项目验证,可靠好用。
2. 晒干货
ps. 带★号处可根据需要进行修改.
/*********************************************************************** *******************
Author: Bob Liu
E-mail:*************************
Device: LCMX0256C-3T100C
Tool: Diamond 1.1
Function:判断脉冲输入信号是否正常
Version: 2012-1-11 v1.0
************************************************************************ ******************/
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
3. 扯犊子
以上源码,可适用于不同频率脉冲信号的判断,占空比不是关键点,如果你的脉冲信号是10HZ(占空比任意),即时钟周期为0.1s,那么你可以判断0.3s内脉冲的个数,从而判别此脉冲输入是否正常,只需修改代码中带★号的地方即可。