Lattice Crosslink-NX MIPI D-PHY硬核配置与OV9734传感器联调实战
1. 项目缘起与方案选型思考1.1 为什么盯上了Crosslink-NX这颗片子做嵌入式视觉方案的同行大概都有体会选FPGA做图像采集前端最怕两件事一是功耗压不下来二是MIPI接口调不通。我这次接到的需求是给一款小型工业内窥镜做图像采集板空间只有指甲盖大小功耗预算卡在300mW以内还要直接对接一颗OV9734图像传感器输出720p的MIPI信号。翻了一圈市面上带硬核MIPI D-PHY的FPGALattice Crosslink-NX几乎是唯一能在这种功耗和体积约束下还能把事办成的选择。Crosslink-NX用的是Nexus平台28nm FD-SOI工艺静态功耗低得离谱而且它内置的MIPI D-PHY硬核IP支持CSI-2接口最高能跑到单lane 2.5Gbps。OV9734这颗传感器输出的是1-lane MIPI720p30fps算下来每lane速率大概在450Mbps左右对Crosslink-NX来说属于轻负载。但问题在于Lattice的硬核IP配置工具和文档体系跟Xilinx、Altera那套完全不是一个路数第一次上手的人很容易在参数配置环节栽跟头。我写这篇东西的目的很直接把我在Crosslink-NX上配置MIPI D-PHY硬核IP的完整过程、踩过的坑、以及OV9734传感器联调的实际记录摊开来聊。如果你手头正好有Lattice的板子要接MIPI传感器或者你正在评估用Crosslink-NX做图像采集方案这篇内容应该能帮你省下至少两天的试错时间。1.2 硬核IP和软核IP的取舍逻辑在动手之前有必要把硬核和软核的选择逻辑说清楚。MIPI D-PHY这个接口如果拿FPGA的普通IO配合软核逻辑去实现理论上可行但实际做起来会遇到几个绕不过去的坎。D-PHY的物理层要求差分信号阻抗严格控制在100欧姆时序裕量非常窄高速模式下对抖动的要求在皮秒级别。用普通IO加外部电阻网络去凑信号完整性很难保证而且会占用大量逻辑资源去做串并转换和时钟恢复。Crosslink-NX的硬核D-PHY是直接嵌在芯片里的专用电路物理层、时钟恢复、串并转换全部由硬件完成FPGA逻辑只需要处理CSI-2协议层的数据包解析。这样做的好处很明显功耗低、时序稳定、不占逻辑资源。代价就是灵活性差一些参数配置必须按照硬核IP的规定来不能随心所欲地改。我选硬核方案还有一个实际原因板子面积太小实在没空间放外部电阻网络和匹配电路。硬核D-PHY直接走芯片内部的差分对外围只需要做AC耦合电容和ESD保护布线上省心很多。1.3 OV9734传感器的信号特征OV9734是一颗1/4英寸的CMOS图像传感器输出1280x72030fps的RAW10数据MIPI CSI-2接口1-lane配置。它的MIPI时钟 lane 频率是372MHz数据lane在高速模式下每时钟周期传输两bit所以实际数据率是744Mbps。这个速率在D-PHY的HS模式下属于中低速档位但对时钟 lane 和数据 lane 之间的偏斜skew还是有要求的传感器手册上标的是数据lane相对时钟lane的偏斜不超过0.5UI。这里有个细节值得注意OV9734的MIPI输出是可配置的默认状态下它输出的是连续时钟模式continuous clock也就是说时钟lane在高速传输期间一直保持翻转。有些FPGA的D-PHY硬核只支持非连续时钟模式配置的时候如果没注意这个匹配关系后面会一直收不到数据。Crosslink-NX的硬核D-PHY两种模式都支持但需要在IP配置界面里明确选对。2. 硬核IP配置的详细拆解2.1 开发环境搭建与IP核获取Lattice的开发环境是Radiant我用的版本是3.2.2。安装过程没什么好说的去官网下载安装包一路下一步就行。需要注意的是Radiant的License需要单独申请而且MIPI D-PHY硬核IP是收费IP虽然Crosslink-NX系列自带这个硬核但要在Radiant里调用它还是需要对应的License授权。我这边用的是官方开发板附带的License如果你是自己画的板子需要联系Lattice的代理商获取。安装完Radiant之后在IP Catalog里搜索“MIPI D-PHY”能找到两个相关的IP一个是“MIPI D-PHY”另一个是“CSI-2 to Parallel Bridge”。前者是纯物理层硬核的配置接口后者是在硬核基础上封装了CSI-2协议解析和并行数据输出。我这次两个都用了D-PHY硬核负责物理层CSI-2 Bridge负责把数据包解析成并行像素数据。注意Radiant 3.2.2版本的IP Catalog里MIPI D-PHY IP的版本号是1.5CSI-2 Bridge的版本号是1.3。不同版本的参数界面可能有细微差异建议对照对应版本的User Guide操作。2.2 D-PHY硬核的关键参数配置打开MIPI D-PHY IP的配置界面第一页是“General”选项卡。这里有几个参数必须仔细核对Lane数量OV9734是1-lane输出所以这里选“1 Lane”。Crosslink-NX的硬核D-PHY最多支持4-lane但配置成1-lane时其他lane的引脚可以释放出来做普通IO用。数据速率范围这里要填的是每lane的最高速率。OV9734的744Mbps我填了800Mbps留一点余量。这个参数会影响硬核内部PLL的配置填得太高会导致功耗增加填得太低可能导致高速数据采样出错。时钟模式前面提到OV9734默认是连续时钟模式所以这里选“Continuous Clock”。如果你选的传感器是非连续时钟模式这里要对应改成“Non-Continuous Clock”。选错了后面收不到数据而且从波形上很难看出来问题出在哪。HS-TX和HS-RX方向Crosslink-NX的D-PHY硬核可以配置成发送、接收或双向。我这里只需要接收传感器数据所以配置成“HS-RX Only”。配置成双向会占用额外的引脚和逻辑资源没必要。第二页是“Timing”选项卡这里的参数比较细但大部分可以用默认值。需要关注的是“HS Settle”和“HS Term En”这两个时间参数。HS Settle是高速传输开始后接收端等待信号稳定的时间默认值是120ns。OV9734的时序手册上建议值是100ns到150ns之间我用了默认的120ns实测没问题。HS Term En是终端电阻使能的时间这个一般不用改。第三页是“Pin Assignment”选项卡这里要把硬核的引脚映射到具体的芯片管脚上。Crosslink-NX的D-PHY硬核引脚是固定的不能随便映射必须查芯片的Pinout手册找到对应的专用差分对。我用的器件是LIFCL-40-9BG256CMIPI D-PHY的时钟lane固定在C4和C5引脚数据lane 0固定在D4和D5引脚。这些在Pinout手册里都有标注照着填就行。2.3 CSI-2 Bridge IP的配置要点D-PHY硬核配置好之后接下来是CSI-2 Bridge IP。这个IP的作用是把D-PHY输出的高速串行数据解析成CSI-2协议包然后提取出像素数据、行同步、帧同步等信号。配置界面第一页是“CSI-2 Configuration”Virtual ChannelOV9734只输出一个虚拟通道所以这里选“VC0”。如果你接的是多路传感器通过MIPI虚拟通道复用这里要对应配置。Data TypeOV9734输出的是RAW10格式对应的CSI-2 Data Type是0x2B。这个在传感器手册的MIPI配置章节里有说明填错了会导致Bridge IP无法正确解析数据包。Pixel Clock频率这个参数要根据传感器的输出速率来算。OV9734在720p30fps下像素时钟大约是74.25MHz。我填了75MHz留了一点余量。这个参数会影响Bridge IP内部FIFO的读写时钟配置。第二页是“Output Configuration”输出数据宽度RAW10数据在CSI-2里是按10bit打包的但Bridge IP输出时可以配置成8bit、10bit或16bit。我选的是10bit因为后面要接一个简单的图像处理模块做坏点校正10bit精度够用。如果你只是想把数据存到DDR里选8bit可以省一半带宽。行有效信号极性这个要根据你后级模块的接口来定。我后级模块是上升沿有效所以这里选“Active High”。FIFO深度默认是512字节我改成了1024字节。因为OV9734的输出速率不算特别稳定FIFO深一点可以吸收一些突发抖动避免溢出。2.4 时钟树的设计与约束Crosslink-NX的时钟资源比较灵活但MIPI D-PHY硬核对时钟有特殊要求。硬核内部有一个专用的PLL用来从MIPI时钟lane恢复出高速时钟。这个PLL的参考时钟必须由外部晶振提供不能从FPGA内部逻辑分频得到。我的板子上放了一颗24MHz的晶振接到Crosslink-NX的专用时钟输入引脚。在Radiant的Clock Constraints里需要把这个24MHz时钟约束到硬核的参考时钟输入端口。同时CSI-2 Bridge IP输出的像素时钟需要约束到后级逻辑的时钟域。这里有个容易忽略的点D-PHY硬核恢复出来的高速时钟在Radiant的时序分析里是自动处理的不需要手动约束。但如果你在硬核和Bridge IP之间插了额外的逻辑那部分逻辑的时钟域需要单独约束。我一开始在D-PHY和Bridge之间加了一个简单的位对齐模块结果时序报告里出现了大量违例后来把位对齐逻辑放到Bridge IP内部Bridge IP自带位对齐功能问题就解决了。3. 实操过程与OV9734联调记录3.1 硬件连接与上电检查板子回来之后第一步是检查硬件连接。OV9734通过一个24pin的FPC座子连接到Crosslink-NX的MIPI差分对。这里要特别注意FPC排线的阻抗控制和长度匹配。我用的FPC排线是0.5mm间距、长度5cm的定制线差分对之间的长度偏差控制在0.2mm以内。如果排线太长或者阻抗不匹配高速信号的眼图会明显恶化。上电之前先用万用表量一下各路电源的对地阻抗确认没有短路。OV9734需要三路电源1.8V的模拟电源、1.2V的数字核心电源、2.8V的IO电源。Crosslink-NX这边需要1.1V的核心电源和2.5V的IO电源。我用的电源芯片是TPS62823和TPS62821都是小封装的DCDC效率在90%以上。上电顺序也有讲究。OV9734的手册要求先上1.8V模拟电源再上1.2V数字电源最后上2.8V IO电源。如果顺序反了传感器内部可能会闩锁。我在电源芯片的EN引脚上加了RC延时电路确保上电顺序正确。3.2 传感器初始化与I2C通信OV9734的初始化是通过I2C接口配置内部寄存器。Crosslink-NX这边我用了一个简单的I2C Master模块用Verilog写的挂在24MHz时钟域下。I2C的SCL和SDA引脚映射到Crosslink-NX的普通IO上外部各接一个4.7k的上拉电阻到2.8V。传感器上电后先要给它提供MCLK。OV9734的MCLK输入范围是6MHz到27MHz我用了24MHz跟Crosslink-NX的参考晶振同源。MCLK稳定之后通过I2C写入初始化寄存器序列。OV9734的初始化序列大概有200多个寄存器官方提供的是一份文本文件我把它转成了Verilog的ROM表上电后自动依次写入。这里踩了一个坑OV9734的I2C地址是0x367bit但有些批次的芯片出厂时地址可能被烧录成0x37。我第一批拿到的样品就是0x37结果I2C一直没应答。后来用逻辑分析仪抓了波形发现地址不对改了之后才通。建议在代码里把两个地址都试一遍或者加一个地址扫描的逻辑。3.3 MIPI数据接收的调试过程I2C配置完成之后传感器应该开始输出MIPI数据了。但这时候FPGA这边还没配置好所以第一步是先让D-PHY硬核进入接收状态然后用ChipScopeLattice的叫Reveal抓一下D-PHY的输出信号。Reveal的配置比较简单在Radiant里添加Reveal Inserter选择要抓的信号设置采样深度和触发条件。我一开始抓的是D-PHY硬核输出的并行数据和时钟触发条件设成“数据有效”。结果抓了半天一个数据都没抓到。排查过程是这样的先用示波器量MIPI时钟lane发现时钟lane有正常的差分波形频率372MHz幅度200mVpp说明传感器确实在输出。然后量数据lane发现数据lane在时钟lane翻转的时候也有翻转但波形看起来有点“糊”眼图张开度不够。这时候怀疑是FPC排线的信号完整性问题换了一根更短的排线3cm眼图明显改善但Reveal还是抓不到数据。接着查D-PHY硬核的配置把“Continuous Clock”改成“Non-Continuous Clock”试了一下还是不行。又查了CSI-2 Bridge的配置发现Data Type填的是0x2B但OV9734实际输出的Data Type是0x2ARAW8还是0x2BRAW10我记混了。翻了一下传感器手册确认是0x2B没错。最后发现问题出在D-PHY硬核的“HS Settle”参数上。默认值是120ns但OV9734的时序手册上写的是“HS Settle时间最小100ns典型120ns最大150ns”。我试着把HS Settle改成150nsReveal立刻就能抓到数据了。后来分析原因可能是FPC排线的寄生电容导致信号建立时间变长120ns不够用150ns刚好能覆盖。实操心得MIPI D-PHY调试时如果I2C配置没问题、时钟lane有波形、但数据收不到优先检查HS Settle参数。这个参数跟PCB走线和排线的寄生参数强相关不同板子可能需要微调。3.4 图像数据流的验证与优化D-PHY能收到数据之后接下来要验证CSI-2 Bridge输出的像素数据是否正确。我在Bridge IP后面接了一个简单的测试模块把收到的像素数据按行缓存然后通过UART打印到PC上。UART的波特率设成921600每帧打印一行像素1280个10bit数据看看有没有明显的错位或噪声。第一版测试结果不太理想打印出来的像素值有明显的周期性跳变每隔几十个像素就有一个异常值。一开始怀疑是CSI-2 Bridge的FIFO溢出把FIFO深度从1024加到2048问题依旧。后来用Reveal抓了Bridge IP的输入输出信号发现D-PHY输出的数据在Bridge IP的输入端口上就已经有异常了。回头查D-PHY硬核的配置发现“HS Term En”参数设的是默认值但OV9734的差分信号幅度偏小200mVpp而Crosslink-NX的D-PHY硬核默认终端电阻是100欧姆可能对信号幅度有影响。试着把HS Term En的时间提前了一些让终端电阻更早使能异常值的出现频率明显降低但没有完全消除。最后解决这个问题的方法有点意外在D-PHY硬核和CSI-2 Bridge之间加了一级简单的位对齐逻辑用D-PHY输出的时钟对数据进行重采样。虽然Bridge IP自带位对齐功能但它的对齐算法在信号质量一般的情况下可能会误判。加了一级外部对齐之后数据完全稳定了。3.5 功耗与资源占用实测方案跑通之后我测了一下实际功耗和资源占用。Crosslink-NX在接收720p30fps的MIPI数据时核心功耗大约是85mWIO功耗约30mWD-PHY硬核功耗约45mW总共约160mW。加上OV9734的功耗约120mW整板功耗在280mW左右满足300mW的预算。资源占用方面D-PHY硬核和CSI-2 Bridge都是硬核不占FPGA逻辑资源。我额外加的I2C Master、位对齐逻辑、UART测试模块总共用了大约600个LUT占LIFCL-40总资源的不到5%。剩下的资源足够跑一个简单的图像处理算法比如3x3的卷积滤波或者直方图统计。4. 常见问题与排查技巧实录4.1 MIPI D-PHY配置常见问题速查表问题现象可能原因排查方法解决方案I2C无应答传感器地址错误用逻辑分析仪抓I2C波形尝试0x36和0x37两个地址时钟lane有波形但数据lane无波形传感器未进入高速输出模式检查传感器寄存器配置确认MIPI使能位已置1数据lane有波形但Reveal抓不到数据HS Settle时间不足逐步增大HS Settle值从120ns试到150ns像素数据周期性异常位对齐错误用Reveal抓D-PHY输出加一级外部位对齐逻辑图像有横条纹FIFO溢出检查Bridge IP的FIFO状态增大FIFO深度或降低像素时钟图像整体偏暗或偏色Data Type配置错误核对传感器手册RAW8对应0x2ARAW10对应0x2B4.2 信号完整性问题的排查思路MIPI D-PHY跑高速信号信号完整性问题是最难排查的。我的经验是先看眼图再看时序最后查配置。眼图用高带宽示波器抓探头要用差分探头带宽至少1GHz。OV9734的744Mbps信号眼图张开度应该在0.6UI以上才算合格。如果眼图闭合优先检查FPC排线的长度和阻抗。我试过用普通排线非差分阻抗控制跑744Mbps眼图几乎完全闭合换成差分阻抗100欧姆的排线之后眼图立刻打开。时序方面重点看数据lane相对时钟lane的偏斜。用示波器的两个通道同时抓时钟lane和数据lane测量数据跳变沿相对时钟跳变沿的延迟。OV9734的偏斜要求是0.5UI以内744Mbps对应的UI是1.34ns所以偏斜要控制在0.67ns以内。如果偏斜超标可以在PCB上调整差分对的长度或者在FPGA内部加延时逻辑。配置方面前面提到的HS Settle、HS Term En、时钟模式这几个参数任何一个配错都可能导致数据收不到。建议在调试初期把D-PHY硬核的配置参数打印到UART上方便对照检查。4.3 独家避坑经验分享第一个坑Radiant的IP Catalog里MIPI D-PHY IP和CSI-2 Bridge IP的版本要匹配。我一开始用了D-PHY 1.5和Bridge 1.2结果综合的时候报了一堆端口不匹配的错误。后来把Bridge也升级到1.3问题消失。Lattice的IP版本兼容性文档藏得比较深在官网的IP Release Notes里建议配置之前先查一下。第二个坑Crosslink-NX的D-PHY硬核引脚是固定的但不同封装的引脚位置不一样。我用的BG256封装和官方开发板的BG256封装D-PHY引脚位置居然不一样。后来查了Pinout手册才发现官方开发板用的是另一个型号的BG256引脚定义有差异。画板子之前一定要下载对应型号的Pinout手册不要参考开发板的原理图。第三个坑OV9734的MCLK输入不能悬空。我一开始以为传感器内部有振荡器MCLK不接也能工作。结果上电后I2C能通但MIPI死活没输出。后来查手册才发现OV9734必须外部提供MCLK内部没有振荡器。把24MHz晶振接到MCLK引脚之后MIPI立刻就有输出了。第四个坑Reveal的采样深度和触发条件要合理设置。我一开始把采样深度设成最大8192触发条件设成“数据有效”结果Reveal占用了大量逻辑资源导致时序违例。后来把采样深度降到2048触发条件改成“帧同步上升沿”资源占用降下来了而且抓到的数据更有针对性。4.4 调试工具与辅助手段除了Reveal我还用了几个辅助工具。一个是Lattice的Diamond Programmer用来烧录bitstream。Crosslink-NX支持SPI Flash启动我把bitstream烧到板子上的SPI Flash里上电自动加载。另一个是串口调试助手用来打印调试信息。我用的波特率是921600每帧打印一次状态信息包括帧计数、FIFO状态、错误计数等。逻辑分析仪用的是Saleae Logic Pro 16抓I2C和MIPI的低速信号够用。但MIPI的高速信号744Mbps超出了Logic Pro 16的采样率上限100MS/s所以高速信号只能用示波器看。如果你手头没有高带宽示波器可以考虑用FPGA内部的Reveal来替代虽然精度不如示波器但看个大概的时序关系还是可以的。还有一个小技巧在D-PHY硬核的输出端口上可以加一个简单的计数器统计高速数据的翻转次数。如果计数器在帧同步信号到来时能稳定增加说明数据接收基本正常。这个方法不需要额外的仪器在Radiant里加几行Verilog就能实现。5. 方案扩展与后续优化方向5.1 从单lane到多lane的扩展OV9734是1-lane输出如果换成更高分辨率的传感器比如1080p或者4K通常需要2-lane或4-lane MIPI。Crosslink-NX的D-PHY硬核支持最多4-lane扩展的时候需要注意几点一是lane之间的偏斜要控制在更小的范围内4-lane配置下lane间偏斜要求通常在0.3UI以内二是CSI-2 Bridge IP的Virtual Channel配置要对应修改多lane数据会交织在一起Bridge IP需要正确解交织三是FIFO深度要相应增加因为多lane的数据率成倍提高。5.2 图像处理管线的集成目前方案只是把MIPI数据接收下来后续可以集成一些简单的图像处理功能。Crosslink-NX的逻辑资源比较充裕跑一个3x3的卷积滤波或者中值滤波问题不大。如果要做更复杂的处理比如边缘检测或者特征提取可以考虑用Lattice的mVision或者sensAI方案这些方案提供了预构建的图像处理IP可以直接调用。5.3 低功耗优化空间虽然当前方案已经满足300mW的功耗预算但还有优化空间。D-PHY硬核的功耗跟数据速率正相关如果应用场景允许降低帧率比如从30fps降到15fpsD-PHY的功耗可以降低约30%。另外CSI-2 Bridge IP的FIFO深度也可以根据实际数据率动态调整不需要一直保持最大深度。我个人在实际操作中的体会是Crosslink-NX的MIPI D-PHY硬核虽然配置起来比软核方案省心但参数之间的耦合关系比较紧密改一个参数往往需要连带调整其他参数。建议在调试初期把每个参数的作用和取值范围都搞清楚不要盲目试错。另外Lattice的官方文档虽然详细但有些关键信息分散在不同的文档里比如Pinout手册、IP User Guide、器件手册需要交叉查阅。我习惯在调试之前先把相关文档过一遍把关键参数和引脚定义整理成一张表调试的时候对照着看效率会高很多。