关于FPGA测不规则脉冲数,怎样才能不丢脉冲,测试与分析!
我现在是这么做的:做一个500us的闸门信号,在此时间内,每个脉冲的上升沿到来计数器加1,闸门信号到达时锁存计数器值,清零后再循环计数。为了在清零时不丢失脉冲,我使用乒乓操作,保证500us闸门信号内的脉冲肯定都能检测到。
但是我现在检测的结果是有±1个脉冲数的偏差,比如输入1MHz的脉冲信号,大部分值是500,可是有时也有499和501,而且这两个值不是挨在一块的;输入是2MHz的脉冲信号,大部分计数值是1000,但是也有999和1001。测试低频信号时完全正确,没有出现误差(10Hz-几百K)。另外我在FPGA内部,使用8MHz系统时钟分频出1MHz的测试脉冲,结果也完全正确,没有误差。
由于是在规定时间内测试不规则的脉冲数,因此有些测频方法不能够使用,比如等精度测频等等;我现在使用的原理只是在给定时间内检测脉冲上升沿,我认为这个方法很简单,只要脉冲信号质量好,应该能达到要求;其它的方法我暂时还没想到,不知哪位大侠有好的方面么?
我现在怀疑出现问题的原因有这么几种:1,脉冲信号质量不好,因为高频时出问题,低频时没问题,因此怀疑高频时脉冲信号质量变差。(脉冲信号现在是由信号源输出,直接给FPGA的)2,脉冲上升沿在闸门跳变的瞬间到来,导致漏脉冲,因为内部时钟和外部脉冲不同步,因此我觉得有可能发生。3,为什么能多检测出1个脉冲数,这个问题我还没想到原因。
接下来想到的解决方法:1,脉冲信号进行整形后再输入FPGA;2,由于脉冲信号最高为2.5MHz,使用8MHz系统时钟的D触发器对输入脉冲信号进行整形和同步。
以上是我的测量原理,问题分析及解决方法的描述,欢迎大家在任何方面提些建议,谢谢!
后面我会把我修改后的结果发上来,做进一步分析。
估计是 脉冲刚刚出现在500us的闸门信号的 起始 或者 结束 位置
但是我认为如果有一次是正确的,按时间向后推,都应该是正确的,因为是周期信号。
detect_en 和 pulse 两个信号同时从0变成1 能检测 到吗?
外部的检测信号相对你的内部电路是否同步?
不同步
同时变化的话,我仿真的结果是正确的,而且我用内部同步时钟分出的脉冲信号测试结果也是正常的,所以应该能判断可以检测到。
关于第一种和第二种可能,如果是信号质量不好,或者内外信号不同步导致漏检,那么不可能每次测出来刚好不多不少相差一个脉冲吧。因该是像二楼说的,脉冲刚刚出现在500us的起始或者结束位置。
如果你的设计是采用高频时钟(如你说的8M)先同步输入信号(2M)再通过监测上升沿来计数脉冲的话,即
D-->Syn1-->Syn2-->Syn3;
pulse=Syn2&(~Syn3);
极端情况下,多采一个脉冲是有可能的。少采一个很难理解,觉得很难发生。
不知道小编是不是在实际应用中使用的还是只是自己的练习?
如果是实际应用具体应用在什么情形下呢?
这个问题一直有疑问。没想明白啊。
因为输入的脉冲信号与系统内部时钟不同步,可能出现在有效检测时间信号的上升沿和下降沿的时候出现亚稳态,即此时可能判断为1或0,那么就有可能多一个或少一个
8MHz是怎么得到的,如果你的方法还不能解决的话,可以怀疑一下这个8MHz。有可能同步所用的高频时钟本身有问题。最好是经过PLL输出得到的。另外下次设计可以考虑对被测信号加入一个整形的电路。
我认为2楼的说法是正确的,这个正负1对你来说那么重要?
1.首先,你的这个500us的这个脉冲信号,需要明确是由什么时钟产生的?
以及是由时钟的posedge 还是negedge 产生的?
2.低频信号没有出现计算错误,应该只是概率小
你说的低频信号(10Hz-几百K)中有的频率貌似频率比500us信号(2KHZ)还高,
未必不会出现漏检,只是概率小多了。然后10HZ的信号在500us内怎么检测呢?
3.脉冲信号如果有毛刺,你就像楼上说的,用clk_8M打拍,取反相与,
一般的毛刺就可以处理掉了。
4.多一个脉冲,或者少一个脉冲,可能是因为毛刺,也可能是因为脉冲与500us信号不同源。
但是你的脉冲频率很低,应该出现的概率不大。
5.“但是我认为如果有一次是正确的,按时间向后推,都应该是正确的,因为是周期信号。”
这个不一定,因为进来的信号与你FPGA工作的时钟多半不是同源的,也就是说周期并不是一
直绝对相等的。
总之,
(1)脉冲的打拍整型是肯定要做的;
(2)为了保证“脉冲刚刚出现在500us的闸门信号的起始或者结束位置”的现象出现,建议可以将
500us信号用clk_8MHZ的下降沿产生,然后输入的脉冲信号用clk_8MHZ打拍整型,
这样输入脉冲的边沿与500us信号的边沿永远不会重合或者接近。
然后再进行计数就清楚多了。
(3)8MHZ的时钟再提高一些会更好。
(4)再不行就不知道了。
