拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vivado中MIPI D-PHY初始化失败排查与解决方案

Vivado中MIPI D-PHY初始化失败排查与解决方案 1. MIPI D-PHY在Vivado中的定位与初始化难点MIPI D-PHY这套东西刚接触Xilinx FPGA做图像采集或者显示输出的朋友十有八九会在初始化阶段卡上一阵子。它不像AXI-Stream或者普通GPIO那样配置完就能跑。D-PHY本质是一个高速差分物理层协议涉及时钟通道、数据通道、LP低功耗模式和HS高速模式之间的来回切换任何一个环节的时序或者参数没对齐IP核就停在初始化状态不动你盯着ILA波形看半天也看不出所以然。我在几个基于Artix-7和Zynq-7000的MIPI摄像头采集项目里反复踩过D-PHY初始化的坑。有的问题出在IP核配置阶段有的出在时钟约束上还有的纯粹是PCB差分走线或者参考时钟抖动导致的。这篇文章就把这些常见问题拆开来讲从IP核选型、参数配置、时钟架构、约束文件到上板调试把每个环节容易出问题的地方说清楚同时给出经过验证的解决方案。不管你是刚上手Vivado的MIPI D-PHY还是已经调了一阵子但总在初始化阶段反复翻车下面的内容应该都能帮你省下不少时间。需要提前说明的是Xilinx的MIPI D-PHY解决方案主要有两条路线一是使用MIPI D-PHY LogiCORE IP现在叫MIPI D-PHY IP二是用SelectIO或者HP Bank的差分资源自己搭物理层。前者适合快速集成后者适合对成本或者灵活性有特殊要求的场景。本文主要围绕IP核方案展开因为绝大多数初始化问题都集中在这条路线上。2. IP核配置阶段最容易埋下的隐患2.1 通道数与Lane分配不匹配MIPI D-PHY IP核在配置界面里会让你选择Lane数量常见的是1 Lane、2 Lane、4 Lane。这里第一个坑就是你选的Lane数和实际硬件上接的Lane数不一致。比如摄像头是2 Lane输出但你在IP核里配了4 Lane那初始化阶段IP核会一直等待第3、第4 Lane的握手信号自然就卡住了。更隐蔽的一种情况是Lane的物理映射搞错了。Vivado的IP核在综合后会生成一个引脚约束模板但模板里的Lane顺序不一定和你的PCB走线顺序一致。我遇到过一块板子原理图上Lane0和Lane1是交叉走的但约束文件里没改结果IP核初始化时HS模式一直进不去。排查方法很简单在IP核的示例设计Example Design里跑一遍仿真看看Lane的握手信号是否按预期顺序到达。如果仿真通过但上板失败基本就是物理映射的问题。注意Lane映射错误不会导致综合或实现报错只会在上板初始化时表现为超时或者状态机卡死。建议在约束文件里显式标注每个Lane的P/N引脚位置不要依赖自动推导。2.2 参考时钟频率与PLL配置D-PHY IP核内部有一个PLL用来从参考时钟生成HS模式所需的高速位时钟。参考时钟的频率范围通常在IP核文档里有明确要求比如6MHz到200MHz之间。如果你给的参考时钟超出了这个范围或者抖动太大PLL就锁不住初始化直接失败。我见过一个典型案例板子上给D-PHY IP核的参考时钟是24MHz但那个时钟是从一个通用晶振分频出来的抖动指标很差。IP核配置界面里显示PLL锁定信号一直为低ILA抓波形发现参考时钟的周期抖动超过了IP核能容忍的范围。换成专用的低抖动时钟源之后问题立刻消失。这里有个经验公式可以参考D-PHY的HS位时钟频率 参考时钟频率 × PLL倍频系数 / 分频系数。你需要根据摄像头或者显示屏的MIPI速率要求反推出PLL的配置参数。比如目标速率是800Mbps per Lane那么HS位时钟就是400MHzDDR模式下如果参考时钟是24MHz就需要PLL倍频到400MHz倍频系数大约是16.67实际配置时可能需要用分数分频或者调整参考时钟频率来凑整。2.3 时序参数与LP/HS切换时间D-PHY协议里对LP模式和HS模式之间的切换时间有严格要求包括TLPX、THS-SETTLE、THS-TRAIL等参数。IP核配置界面里通常会让你填这些值单位是纳秒。如果你填的值和实际硬件不匹配初始化阶段就会在LP到HS的切换过程中失败。这些参数的典型值可以从MIPI D-PHY规范或者摄像头的Datasheet里查到。比如THS-SETTLE通常在85ns到145ns之间具体取决于数据速率和PCB走线长度。我一般会先按Datasheet的推荐值填然后用ILA抓LP和HS的切换波形看实际切换时间是否落在允许范围内。如果偏差较大再微调这些参数。实操心得THS-SETTLE这个参数特别关键它决定了HS模式进入后多久开始采样数据。如果设得太小采样点可能落在信号建立之前导致误码设得太大又会压缩有效数据窗口。建议先用保守值比如120ns确认初始化通过后再逐步优化。3. 时钟架构与约束文件的正确写法3.1 时钟域划分与跨时钟处理MIPI D-PHY IP核通常涉及三个时钟域参考时钟域RefClk、HS位时钟域HSClk和LP模式下的低速时钟域LPClk。这三个时钟域之间的跨时钟处理如果没做好初始化状态机就可能在不同时钟域之间传递错误的状态信息。Vivado的IP核一般会自动生成时钟域交叉逻辑但前提是你在约束文件里正确声明了这些时钟。我见过有人只约束了参考时钟忘了约束HSClk和LPClk结果实现阶段工具把这两个时钟当成了异步时钟时序报告里一堆违例上板后初始化随机失败。正确的做法是在XDC文件里为每个时钟域创建独立的时钟约束并用set_clock_groups或者set_false_path明确它们之间的关系。比如create_clock -name ref_clk -period 41.667 [get_ports ref_clk_p] create_clock -name hs_clk -period 2.5 [get_pins dphy_inst/pll_inst/CLKOUT] set_clock_groups -asynchronous -group [get_clocks ref_clk] -group [get_clocks hs_clk]这里ref_clk是24MHz周期41.667nshs_clk是400MHz周期2.5ns。set_clock_groups告诉工具这两个时钟是异步的不需要做时序分析但跨时钟域的信号需要额外的同步处理。3.2 输入延迟与输出延迟约束MIPI D-PHY的差分信号在PCB上走线会有延迟这个延迟需要在约束文件里通过set_input_delay和set_output_delay来建模。如果忽略这部分IP核在采样时可能采到错误的数据初始化阶段表现为CRC校验失败或者状态机异常。输入延迟的计算方法是PCB走线延迟 外部器件输出延迟。比如PCB走线长度是50mm信号传播速度大约是6.5ps/mm那么走线延迟就是325ps。外部摄像头的输出延迟可以从Datasheet里查到假设是500ps那么总的输入延迟就是825ps。在约束文件里这样写set_input_delay -clock [get_clocks hs_clk] -max 0.825 [get_ports data_p*] set_input_delay -clock [get_clocks hs_clk] -min 0.325 [get_ports data_p*]输出延迟的约束类似只是方向相反。这些值不需要非常精确但一定要有否则工具会按默认值通常是0来处理导致时序偏差。3.3 差分对约束与IO标准MIPI D-PHY的差分对需要正确的IO标准约束。Xilinx FPGA的HP Bank支持LVDS、TMDS等差分标准但MIPI D-PHY通常需要特定的IO标准比如LVDS_25或者MIPI_DPHY。具体用哪个取决于你的FPGA型号和Bank电压。在Vivado里差分对的约束需要指定P端和N端并设置正确的IO标准set_property IOSTANDARD LVDS_25 [get_ports data_p[0]] set_property IOSTANDARD LVDS_25 [get_ports data_n[0]] set_property DIFF_TERM TRUE [get_ports data_p[0]]DIFF_TERM TRUE表示启用片内差分终端电阻通常MIPI D-PHY需要100欧姆的差分阻抗匹配。如果PCB上已经有外部终端电阻这里就要设为FALSE否则阻抗不匹配会导致信号反射初始化失败。注意不是所有Bank都支持MIPI D-PHY所需的IO标准。在选型阶段就要确认你的FPGA型号和Bank电压是否满足要求。比如Artix-7的HR Bank不支持LVDS_25只有HP Bank才支持。4. 上板调试与初始化失败的排查路径4.1 用ILA抓取初始化状态机初始化失败时最直接的排查手段是用ILAIntegrated Logic Analyzer抓取IP核内部的状态机信号。Vivado的MIPI D-PHY IP核通常会输出一些调试信号比如初始化完成标志、PLL锁定标志、Lane握手状态等。把这些信号接到ILA上触发条件设为初始化开始信号就能看到状态机卡在哪一步。我一般会抓这几组信号PLL锁定信号pll_lock初始化状态机当前状态state_reg每个Lane的LP/HS切换信号lp_hs_state错误标志err_flag如果PLL锁定信号一直为低说明参考时钟或者PLL配置有问题如果PLL锁定了但状态机停在某个中间状态说明Lane握手或者LP/HS切换有问题如果错误标志被置起可以进一步看错误码来判断具体原因。4.2 参考时钟质量测量参考时钟的质量对D-PHY初始化至关重要。如果手头有示波器可以直接测量参考时钟的峰峰值抖动和周期抖动。MIPI D-PHY IP核对参考时钟的抖动要求通常在文档里有说明比如周期抖动小于50ps RMS。如果没有示波器也可以用FPGA内部的MMCM或者PLL来间接评估参考时钟质量。比如把参考时钟接到一个MMCM上看MMCM的锁定信号是否稳定。如果MMCM都锁不住那D-PHY的PLL大概率也锁不住。我遇到过一次参考时钟抖动导致初始化失败的情况后来在参考时钟路径上加了一个专用的时钟缓冲器比如NB3N502抖动从120ps RMS降到了30ps RMS初始化立刻通过。这个经验说明参考时钟的质量不能凑合该加缓冲器就加。4.3 Lane极性反转与交换有些PCB设计为了方便走线会把差分对的P端和N端反过来接。这种情况下IP核默认的极性假设就不成立了初始化会失败。解决方法是在约束文件里或者IP核配置界面里启用极性反转Polarity Inversion选项。Vivado的MIPI D-PHY IP核通常支持每个Lane独立配置极性反转。如果你不确定PCB上是否反了可以先在IP核里把所有Lane的极性反转都打开如果初始化通过了再逐个关闭来确定哪些Lane需要反转。Lane交换Lane Swap也是类似的问题。如果PCB上Lane0和Lane1交换了需要在IP核配置里调整Lane的映射关系。这个在IP核的配置界面里通常有选项或者在约束文件里通过调整引脚分配来实现。4.4 常见问题速查表下面这张表整理了我在实际项目中遇到过的D-PHY初始化问题、现象和解决方法方便快速定位问题现象可能原因排查方法解决方案PLL锁定信号一直为低参考时钟频率超范围或抖动过大用示波器测参考时钟质量更换低抖动时钟源或加时钟缓冲器状态机停在Lane握手阶段Lane数配置错误或物理映射不对检查IP核Lane配置和约束文件修正Lane数或调整引脚映射LP到HS切换失败THS-SETTLE等时序参数不匹配用ILA抓LP/HS切换波形调整时序参数到Datasheet推荐值初始化随机失败跨时钟域处理不当或时序违例检查时序报告和时钟约束补充时钟约束和跨时钟同步逻辑CRC校验失败输入延迟未约束或采样点偏移检查set_input_delay约束补充输入延迟约束并优化采样点某个Lane始终不工作该Lane极性反转或差分对约束错误检查该Lane的IO标准和极性配置启用极性反转或修正IO标准实操心得这张表里的问题我几乎都遇到过其中“初始化随机失败”是最难排查的因为它不是每次都复现。后来发现是跨时钟域的信号没有做同步处理导致状态机偶尔采到亚稳态值。加上两级触发器同步之后问题再没出现过。5. 工具版本与IP核兼容性避坑5.1 Vivado版本选择Xilinx的MIPI D-PHY IP核在不同Vivado版本里的行为可能有差异。比如Vivado 2018.3和2020.2里的D-PHY IP核在初始化状态机的实现上就有细微差别某些版本可能存在已知的Bug。我一般建议选择经过验证的稳定版本比如Vivado 2020.2或者2021.1这些版本在社区里的反馈比较好已知问题较少。如果你用的是比较老的版本比如Vivado 2015.4可能会遇到IP核不支持某些新特性或者初始化逻辑有缺陷的情况。这种情况下要么升级Vivado要么找Xilinx的补丁Patch来修复。不过升级Vivado涉及整个工程的迁移成本较高建议在项目初期就选好版本。5.2 IP核License与授权MIPI D-PHY IP核是收费IP需要有效的License才能生成比特流。如果你在生成比特流时遇到License相关的报错比如“IP核未授权”或者“License过期”初始化阶段可能根本跑不起来。这种情况下先确认License文件是否正确加载以及License是否包含MIPI D-PHY IP核的授权。有些朋友会用评估版License来跑评估版通常有时间限制或者功能限制比如只能跑仿真不能上板。如果你发现仿真通过但上板失败而且ILA里什么信号都没有先检查一下License状态。5.3 IP核版本与FPGA型号匹配不同系列的FPGA对MIPI D-PHY IP核的支持程度不同。比如Artix-7和Zynq-7000支持得比较好而Spartan-7或者某些低端型号可能不支持或者需要额外的逻辑资源。在选型阶段就要确认你的FPGA型号是否在IP核的支持列表里。另外IP核的版本也要和Vivado版本匹配。比如Vivado 2020.2自带的D-PHY IP核版本是1.0如果你从网上下了一个2.0版本的IP核可能不兼容。建议直接用Vivado自带的IP核或者从Xilinx官网下载与Vivado版本匹配的IP核。6. 从仿真到上板的完整验证流程6.1 仿真阶段的关键检查点在跑仿真之前先确认IP核的示例设计Example Design能正常跑通。Xilinx的D-PHY IP核通常会附带一个示例设计里面包含了仿真测试平台Testbench和激励文件。如果示例设计都跑不通那你的工程大概率也有问题。仿真阶段重点看这几个信号初始化完成信号是否在预期时间内拉高PLL锁定信号是否稳定Lane握手信号是否按顺序完成LP/HS切换是否在允许的时间窗口内如果仿真阶段就发现问题先解决仿真问题再上板。仿真阶段排查成本低上板排查成本高这个顺序不能反。6.2 上板调试的逐步验证法上板之后不要一上来就跑完整功能。建议按以下步骤逐步验证先确认FPGA配置成功LED或者GPIO有正常输出用ILA抓参考时钟和PLL锁定信号确认PLL能锁住抓初始化状态机确认状态机能走到初始化完成抓Lane握手信号确认每个Lane都能完成LP到HS的切换最后再验证数据通路看CRC校验是否通过每一步都确认无误后再进行下一步这样一旦出问题能快速定位到具体环节。6.3 实测案例从失败到成功的完整记录我最近做的一个项目用的是Zynq-7020 MIPI摄像头2 Lane800Mbps per Lane。第一次上板时初始化一直卡在Lane握手阶段。用ILA抓波形发现Lane0能完成握手但Lane1一直停在LP模式。排查过程检查IP核配置Lane数设为2没问题检查约束文件Lane1的引脚分配和原理图一致用示波器测Lane1的差分信号发现幅度只有Lane0的一半检查PCB发现Lane1的差分对走线长度比Lane0长了15mm而且没有做阻抗匹配在Lane1的差分对上并联了一个100欧姆的终端电阻问题解决这个案例说明PCB层面的问题也会导致初始化失败而且这类问题在仿真阶段完全看不出来。所以上板调试时硬件和软件都要查。7. 几个容易被忽略的细节与个人经验7.1 复位信号的时序要求D-PHY IP核的复位信号有严格的时序要求通常需要在参考时钟稳定之后保持至少100ns的低电平然后拉高。如果复位信号和参考时钟同时上电或者复位脉冲太短IP核可能进入不确定状态初始化失败。我一般会在复位路径上加一个复位同步器用参考时钟对复位信号做同步并确保复位脉冲宽度足够。比如reg [3:0] rst_sync; always (posedge ref_clk) begin rst_sync {rst_sync[2:0], rst_n}; end wire rst_synced rst_sync;这样复位信号会被同步到参考时钟域并且保持至少4个时钟周期的低电平满足IP核的要求。7.2 电源噪声对HS模式的影响HS模式下D-PHY的速率很高电源噪声会直接影响信号完整性。如果FPGA的Bank电源滤波不好HS模式下的误码率会升高初始化阶段可能表现为CRC校验失败。建议在D-PHY相关的Bank电源引脚附近放置足够的去耦电容通常是一个100nF和一个10uF的组合。如果条件允许可以用LDO单独给这个Bank供电减少开关噪声的干扰。7.3 温度对初始化成功率的影响这个可能有点反直觉但温度确实会影响D-PHY的初始化成功率。低温下PLL的锁定时间会变长高温下信号抖动会增加。我遇到过一块板子在室温下初始化正常但在低温箱里-20度初始化失败的情况。后来发现是PLL的锁定时间在低温下超过了IP核的超时阈值调整超时参数后问题解决。如果你的产品需要在宽温范围内工作建议在高低温环境下都做一遍初始化测试确保参数有足够的余量。7.4 个人经验总结调MIPI D-PHY初始化这件事我的体会是软件配置和硬件设计各占一半。软件方面IP核配置、时钟约束、时序参数要仔细核对硬件方面参考时钟质量、差分走线、电源滤波要严格把关。两者任何一个出问题初始化都会失败。另外ILA是排查初始化问题的最强工具没有之一。把关键信号引出来触发条件设好大部分问题都能在几分钟内定位。相比之下靠猜或者靠改参数试错效率低得多。最后分享一个小技巧如果你不确定某个参数该填多少可以先在IP核的示例设计里跑一遍仿真看看示例设计里用的参数值是多少然后以那个值为基准进行调整。示例设计通常是经过验证的参数值有参考价值。
返回列表