最近在调一块国产FPGA的MIPI CSI-2接收接口,接的是索尼IMX系列传感器,信号速率1.2Gbps/lane。眼图测试总是不达标,波形张不开,误码率在10^-6左右徘徊。PCB走线已经找硬件同事改过两版了,差分阻抗也控制在100欧姆±10%,但问题依旧。想问问有经验的前辈,除了改板子,在FPGA侧有没有什么可以调的?比如IO delay、输入延时链、CDR的带宽配置、或者采样点位置微调这些,有没有一套系统的排查流程?
2026年了,FPGA工程师做MIPI CSI-2接口调试,眼图测试老是不过,除了调PCB走线还有哪些软件层面的招?
6 个回答

先别急着动采样点,最容易被忽略的是Bank的MRCC/SRCC时钟入口。你现在用的是普通IO还是时钟专用引脚?国产FPGA的CDR通常要依赖参考时钟的抖动指标,IMX的MCLK如果是从FPGA输出的,先量一下这个时钟的相位噪声。我之前遇到类似情况,最后是给CDR的PLL换了更小的环路带宽,同时把RX的CTLE增益调高两档,眼图垂直方向立刻张开不少。你先确认下IP核里有没有暴露CDR lock状态的输出,把它拉出来看着再调。

先说结论:如果你确认PCB差分阻抗和走线长度匹配都OK,那问题大概率出在参考时钟的稳定度和CDR的锁定裕量上,而不是采样点本身。1.2Gbps/lane对FPGA来说不算高,但国产器件的CDR模拟前端往往对参考时钟的抖动更敏感。我建议按这个顺序查:第一步,把传感器输出的MIPI时钟和FPGA恢复出的字节时钟用示波器做长余辉对比,看有没有周期性抖动(PJ)——很多情况下是传感器端MCLK的电源纹波耦合进来了,这种情况调FPGA没用,得让硬件把MCLK的LDO换掉;第二步,确认CDR的lock状态信号在整段测试时间里没有周期性跌落,如果有,说明PLL带宽太宽,跟着外部参考时钟的噪声跑了,把IP核里PLL带宽从默认的Medium改成Low再测;第三步,才轮到CTLE/DFE和采样点。CTLE的增益不要一上来就拉满,先看EOM(眼图监视器)报告里的水平余量,如果水平方向只有0.2UI,那优先调DFE的tap系数;如果垂直方向差,再动CTLE。另外有个小技巧:国产FPGA的IO delay链往往只有±几十ps的调节范围,你可以在软件里把每个lane的输入延时各自扫一遍,记录误码率最低的那组值,但要留意温度漂移,最好是让IP核支持自适应训练。最后提醒一句,别迷信EOM的数字,它和真实示波器测出来的眼图经常有出入,拿到仪器上复测才是最终标准。你用的是哪家的IP核?有些厂商的调试界面里直接能看到每个lane的CDR相位偏移寄存器,那个参数比采样点更直接。

换个思路:也许不是FPGA侧的问题,而是你误码率的测量方法有问题。1.2Gbps/lane、BER到10^-6,这个量级很容易被测试线缆或连接器的接触电阻干扰。你可以先用一根极短的FPC排线直连传感器和FPGA(去掉转接板),排除连接器因素。如果还是不过,再考虑软件层面。我上次调一个类似的项目,最后发现是FPGA的MIPI RX IP核里有个关于连续时钟lane(continuous clock)和DDR时钟模式的配置项,默认设成了non-continuous,导致CDR在帧间隙掉锁,重建锁定时产生误码。你检查下传感器是否在帧消隐期关闭了时钟,如果关闭了,IP核里得开启快速锁定模式,否则每帧开头那几十个字节都是错的。另外,可以试试在IP核里把每个lane的极性反转(lane polarity swap)功能打开,有些国产FPGA的差分引脚内部交叉了,软件上翻转一下就能救回来。最后,如果这些都不行,你可以在RX端加一个8B/10B的误码检测器(如果你的传感器支持PRBS测试模式),用FPGA自带的误码仪功能离线跑,这样能彻底区分是链路物理层问题还是协议层问题。你现在用的传感器有没有测试图案输出模式?有的话先跑那个,比真实视频流好定位得多。

先把IO Bank的电压和参考电压量准了再谈别的,很多国产FPGA的MIPI眼图问题其实是从Vref漂移开始的。另外把CDR lock信号拉出来看,如果它在帧间隙掉锁,那调整采样点根本没意义,先解决锁定问题再说。

我前几天刚好在调一个类似的项目,也是国产FPGA配IMX,速率比你低一点但现象很像。除了楼上说的Bank电压和CDR lock,建议你把眼图监视器(EOM)的数据读出来看看,很多国产IP核里其实自带EOM,能直接帮你定位是水平裕量不够还是垂直裕量不够,而不是靠猜。如果EOM显示水平方向裕量很小,那大概率是CDR的环路带宽设太宽了,跟着参考时钟的抖动跑,可以试试把PLL带宽从Medium降到Low,同时看下CTLE的增益,别一上来就拉满,有时候增益太猛反而会放大高频噪声,让眼图更糊。还有个小坑:传感器如果在帧消隐期关闭时钟(non-continuous模式),CDR可能会在每帧开头掉锁,这个时候需要在IP核里把快速锁定打开,或者干脆让传感器保持连续时钟模式。另外记得用ChipScope抓一段实际数据,跟传感器输出的已知pattern比对,看误码是随机分布还是集中在某一段,如果是集中在某一段,那多半是时序问题而非信号完整性问题。最后问一句,你这颗FPGA的CDR参考时钟是从传感器MCLK来的还是独立晶振?这个对排查方向影响很大。

其实可以试试在FPGA侧调整RX的相位偏移,很多IP核里都有per-lane的相位微调寄存器,不用动PCB就能把采样点往眼图中心推。做法是先把其他lane都固定,单独调一个lane的相位偏移,用ILA抓那个lane的误码率,画一条曲线出来,找到误码率最低的区间,然后所有lane都设到那个值附近。注意别所有lane一起调,否则互相干扰你根本不知道是谁的问题。另外如果IP核支持DFE,可以尝试开一阶DFE,对长走线带来的码间串扰挺有效的,但功耗会上去一点,看你能不能接受。你现在的误码率是10^-6,如果调完相位偏移能到10^-9以下,基本就说明是采样点位置的问题而不是通道本身太差。
发表回答
登录后可在本页底部提交回答