完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 Bob-Liu 于 2018-5-2 16:42 编辑
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: shuangfeiyanworld@163.com 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内脉冲的个数,从而判别此脉冲输入是否正常,只需修改代码中带★号的地方即可。 欢迎围观,留言,拍砖! 如有雷同,纯属扯淡! 楼主原创帖汇总: 1. 单总线传输协议b2s (附全部verilog源码) 2. 脉冲信号正常与否的判断(附全部verilog源码) 3. 基于CPLD/FPGA的呼吸灯效果实现(附全部verilog源码) 4. “同频异宽”脉冲的选择(附全部verilog源码) 5. 基于verilog的分频器设计 (可实现任意整数分频) (附全部源码) 6. 《ZedBoard高手之路》入门篇视频教程 评分 |
|
相关推荐
|
|
学习一下,,,,,,,,,,,
|
|
|
|
|
|
学习一下,,,,,,,,,,,
|
|
|
|
|
|
1287 浏览 1 评论
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
1036 浏览 0 评论
2359 浏览 1 评论
2067 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
2325 浏览 0 评论
1853 浏览 49 评论
6003 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 16:45 , Processed in 0.457465 second(s), Total 43, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号