关注、星标公众号,精彩内容每日送达
来源:网络素材
还是调试图像问题,有一个芯片输出图像有闪屏现象。
系统初步定义如下:

说明:
(1)24MHz晶振输出时钟一方面输入FPGA,另一方面输入到CHIP0,作为CHIP0的工作时钟(绿色线条);
(2)FPGA输入24M时钟,经过PLL输出36MHz与74.25MHz,作为逻辑时钟,将视频流数据经过ENCODE编码模块,输出8/16bits并行数据到端口(灰色线条);
(3)与数据相关的随路时钟经过ODDR,从管脚输出;
(4)CHIP0与CHIP1是接收相同的时钟与数据的2款不同的芯片,差别可能就在于CHIP0为自研芯片,容错能力不如CHIP1。
现象是CHIP1可以正常解码输出图像,而CHIP0输出图像有闪屏。
由于CHIP0芯片设计人员确认说CHIP0的工作时钟与随路时钟要求同源,所以FPGA工作时设计的此方案,采用一个晶振24M,输出图像支持2种模式:1)36M随路时钟与数据,图像正常显示;2)74.25M随路时钟与数据,输出图像闪烁。
定位思路:
A、编码问题:基本可以排除,因为CHIP1可以正常解码并且显示图像,同时,CHIP0的解码状态寄存器显示解码正常;
B、时钟问题:硬件测量时钟,发现无论24M工作时钟,还是74.25M、36M随路时钟都很稳定,频偏3-13个ppm,按硬件说法,时钟满足要求;
C、相位问题:即输出时钟与数据的相位关系,因为芯片是上升沿采样,为了确保能正确采样,于是我在原来的数据路劲也加了ODDR,减少由于资源紧张时,布局布线异常引入时钟数据路径差异导致的问题,如下:

根据XILINX ODDR原语的输入输出时序关系:

将输入输出的时钟初始化为D1(0)、D2(1),则基本可以保证在上升沿采样数据。然而修改过后,图像还是闪烁。
这时,与芯片设计人员联调,尝试通过读写状态寄存器能否发现问题。
CHIP0内部根据个人初步理解,基本分为2部分,解码与显示,如下所示:

解码采用输入随路时钟对数据进行采样与解码,并将数据写入FIFO中,输入工作时钟产生读FIFO时钟,并将读数据送入DISPLAY模块,输出与显示。
通过读写寄存器发现,DECODE模块状态寄存器一直正常,而显示模块状态寄存器不正常,进一步定位发现FIFO有空读问题,即写的慢读的快了。从芯片角度分析,解码正常、时钟正常,就不应当出现FIFO空满错误。
这时,再次检查FPGA输出时钟,通过PLL核,发现FPGA输出的时钟并非74.25M,而是74M(被硬件坑说测量的稳定的74.25M)。
这是因为FPGA PLL并不能产生任意的无偏差的时钟,在当前所选器件下,如果由24M晶振输入,要求输出74.25M时钟,实际上只能输出74M时钟,而24M时钟则可以生成稳定的36M时钟;如果由27M晶振输入,可以输出稳定的74.25M时钟,但是无法输出稳定36M时钟,为36.033M,由此可以分析出,74M下生成的视频流实际上是略小于30帧(25帧),而芯片使用固定的30帧(25帧)去读取,而芯片又对两端频率帧率匹配要求较高,确实有可能造成读空现象。CHIP1之所以可以正常工作,应该也是因为容错能力较好,可以纠正过来两边的频偏或者帧率差。
为了兼容两种输出,于是修改时钟方案,如下:

使用2个晶振,分别位24M和27M,FPGA内部使用2个PLL,PLL0用于生成36M时钟,PLL1用于生成74.25M时钟,此时再读取芯片各状态寄存器正常,2种模式下图像也可以正常显示了。
一点总结:
(1)FPGA内部PLL的输入输出时钟频率,基本上我们只要设置好频率、相位、占空比等一些参数,一般都可以稳定工作,但对于一些外接的频偏容错能力差的外设来说,有时生成的频率,带一点点频差的都可能使得芯片无法正常工作,需要注意;
(2)理论上,芯片的工作时钟和采样时钟不应该有特殊的关系,比如此例中要求同源,如果要求同源,在不能正常工作的情况下,也要先确认随路时钟的准确性。
想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索