我们队伍今年电赛选了视频拼接方向,用高云GW2A系列FPGA做4路HDMI输入实时拼接。现在卡在输入时序对齐上,4路摄像头不是同源时钟,每路的行场同步信号相位都不一样,拼接处总有撕裂和错位。试过用FIFO缓存按主时钟统一读出,但不同路之间帧率有微小偏差,时间长了缓冲会溢出或下溢。想请教有经验的大佬,多路视频源异步输入的跨时钟域同步一般用什么架构?是每路先做帧同步再拼接,还是统一用PLL锁定后按帧号对齐?另外高云FPGA的IODELAY资源能不能用来做输入时序微调?求具体方案和代码思路。
2026年FPGA大赛,用高云FPGA做实时视频拼接,多路HDMI输入时序对齐怎么处理?求跨时钟域同步方案
3 个回答

先别急着上IODELAY,那个是最后才碰的东西。你这个问题核心就一句话:先做帧同步,再做行对齐。具体做法是每路HDMI进来先解出像素时钟和DE,把数据写进各自的异步FIFO,读端统一用主路(比如第一路)的帧同步信号作为基准。每来一帧主同步,你就比较其他路的FIFO水位,水位高的就丢一行的数据,水位低的就补一行黑场,这样能把帧率偏差吃掉。FIFO深度建议做到两行以上,留足余量。至于IODELAY,它只能微调几十个纳秒的相位,解决不了帧率偏差,别指望它救场。你先按这个思路把帧同步做出来,撕裂问题基本能解决大半。

这题我熟,去年带学生做过类似的东西,不过用的是其他厂家的片子,思路通用。你现在的痛点不是跨时钟域本身,而是异步帧率漂移导致的缓冲上下溢。高云GW2A的PLL确实可以锁定输入时钟,但四路摄像头各自晶振偏差可能到几百ppm,PLL锁不住所有路的,只能锁一路。所以正解是:每路独立做行缓存,以PLL输出的统一像素时钟作为读时钟,但读操作不是自由跑的,而是受帧同步信号门控。具体说,每路FIFO的读使能由两个条件共同决定:一是本路帧同步有效,二是主路帧同步已经到来且本路FIFO水位大于半满。这样相当于做了一个弹性缓冲,主路帧率就是参考,其他路允许有±几行的抖动。水位低于下限就补上一行的重复数据,高于上限就跳行不读。这个策略要配合帧号计数器,每帧开始给数据打标签,拼接时按帧号匹配,而不是按时间点匹配。至于IODELAY,它只对单bit输入信号做相位搬移,适合HDMI的TMDS信号在板级做等长补偿,但四路之间像素时钟频率不同,相位调了也没用,频率差还是会累积。我建议你把精力放在FIFO深度自适应上,具体做法是每帧结束后统计水位变化量,动态调整丢帧阈值,而不是固定丢一行。你可以先用仿真把四路不同频率的模型跑通,再上板调。代码思路就是每路一个写指针计数器,读指针由主帧同步重置,然后比较两个计数器的差值来决策丢补。

说个你们可能没注意到的坑:高云的FIFO IP核默认是同步FIFO,你得手动选异步FIFO,而且读端时钟要接PLL输出的统一时钟,不是接主路的像素时钟。另外,四路HDMI输入解出来的行场同步信号本身也有相位差,建议先把HSYNC和VSYNC都打两拍同步到统一时钟域,再生成帧同步脉冲。你提到的帧号对齐,个人感觉在FPGA大赛里够用了,但要注意帧号计数器要放在统一时钟域里,每路FIFO读出数据时带上帧号标签,拼接模块只在帧号相同的那几行做合并。还有个小技巧:如果某路偶尔丢帧,可以插入一帧上一帧的重复数据,人眼看不出,比黑帧自然。至于IODELAY,除非你板子上的HDMI走线超过几厘米且没有做等长,否则一般用不到。你们现在最大的风险是调试时间不够,建议先做两路拼接跑通,再扩展到四路,别一上来就四路齐上。另外,高云的在线逻辑分析器可以抓内部信号,调试FIFO水位很有用,比示波器看物理时序直观多了。你现在FIFO深度设了多少?用的IP核还是自己写的?
发表回答
登录后可在本页底部提交回答