前段时间的调试遇到了很多问题,主要是两块:
1.PPC问题
2.actel fpga时钟问题
这里先讨论第二个问题吧,第一个问题,需要好好总结一下,有空要把PCI总线协议再复习一遍。
1.基本介绍
A板与B板之间有五路LVDS数据信号、一路LVDS控制信号和一路LVDS时钟信号:
一路LVDS控制信号和一路LVDS时钟信号方向:A->B
五路LVDS数据信号方向:B->A
2.问题描述
B板回传给A板的数据信号会发生周期性漏读的情况,比如每隔十个数漏五个数。
3.问题分析与定位
由于B板所使用的是actel芯片,无法观察其内部逻辑,因此将B板的FIFO写使能通过一路数据LVDS回传给A板。
B板内部FIFO的写使能是对时钟做两分频后产生的一个信号syn_pixel,用signaptap观测syn_pixel,当其它几路数据线上无信号传输时,syn_pixel的翻转没问题,但是当其它几路数据线上有数据传输时,syn_pixel的反转发生周期性的不稳定,就是有时候会两个时钟才翻转一次,而且不稳定的现象的时间间隔与之前看到的数据漏传的周期是相同的,当然应该说数据漏传本身就可能是由写使能造成的。
针对这一问题的定位基本上是从去年十二月份底就开始的,定位了一个多月,实在不知道是怎么回事。我一度还怀疑是时序优化没有做好,一直在看时序优化方面的资料,但其实我的代码运行时钟只有5M而已,根本不需要进行时序优化。
后来在网上看到有人提议,对于外部输入的时钟应该使用下降沿采样。代码是别人留下来的,原本也都是使用的下降沿,只有FIFO的读写时钟是上升沿。于是我将读写时钟也一并改成下降沿,问题居然好了。于是我很长一段时间都以为是时钟沿的问题,并且以为通过对FIFO时钟采用下降沿就将问题解决了。直到最近,我对代码做了一点小改动后,问题又复现了。至此已经快两个月了,关键是我还在部门例会的时候说问题已经如何如何解决了,汗。。。
看来问题还是没有改到点上,于是向主管求助,不得不说主管就是主管啊,三两下就让我把问题定位出来了。
他根据signaltap采到的图,分析应该不是漏掉数据,而是时钟有毛刺,signaltap的20MHz没有把毛刺读出的数据采到,原因是B的FIFO提10in5out的,而syn_pixel只对写有作用,如果该信号确实如上所说没有翻转,那么我在A端看到的数据应该是一次错1个10bit所对应的2个5bit,而我实际观测到的是只漏了一个5bit,他让我把signaltap的时钟由原来的20M改为100M,加大采样频率,于是我终于看到了,在原来漏数据的地方其实并不是漏到了而是有一个很小宽度的正确数据,这个数据只维持了一个100MHz时钟,所以原来的20MHz当然就采不到了。但当我将A-B的时钟放了一路到B-A的数据线中的其中一路上,并用signaltap观测,发现并没有毛刺,于是沿他的思路,我又将时钟频率提高到200MHz,终于发现原来B-A的时钟有好多小的毛刺,每个毛刺都是周期性的叮在一个完整时钟的后面。所以问题总算是定位了。那些数据并不是漏了,而是没有被时钟采到
说到这里,发现原来我一直以来太过于疆硬地相信signaltap图了,说白了,signaltap看到的也是采样过后的图,和它自己的采样时钟有很大关系,而我一直就局限在20M时钟采到的图上去分析