ARTICLE DETAIL

资讯详情

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

SLVS转MIPI CSI-2桥接方案:IMX4xx系列传感器与FPGA实现详解

SLVS转MIPI CSI-2桥接方案:IMX4xx系列传感器与FPGA实现详解 这两年做工业视觉和嵌入式视觉项目我碰到最多的一类硬件对接问题就是传感器性能明明很能打输出接口却和主控对不上。IMX429、IMX430、IMX432、IMX437这一系列全局快门传感器在工业检测、医疗成像、车载相机里用得非常多可它们最主要的输出接口是SLVSSub-LVDS。而市面上大量嵌入式SoC、AI模组、边缘计算盒子往往只给了MIPI CSI-2接口。做SLVS-MIPI桥接方案说白了就是要解决一个接口错位的问题把传感器的高帧率原始数据完整、低延迟地送进主控能吃的通道里。这篇内容适合三类人看一是正在做硬件选型、发现传感器和主控接口不匹配的嵌入式工程师二是拿到FPGA板卡和IMX4xx模组、准备自己写桥接逻辑的开发者三是纯粹想弄明白SLVS和MIPI CSI-2到底差在哪、为什么桥接不是简单“接几根线”的人。我会把选型逻辑、原理图要点、FPGA内部的实现思路、以及实测调试中踩过的坑一次讲透。1. 先搞明白为什么工业相机还在用SLVS而我们偏要往MIPI上搬1.1 从工业相机到嵌入式平台的接口错位IMX429、IMX430、IMX432、IMX437这一系列传感器本来是为工业相机设计的。工业相机的架构通常是“传感器 FPGA 上位机接口”传感器到FPGA之间多用SLVS高速差分信号FPGA再转成Camera Link、CoaXPress或千兆网出去。SLVS这种接口在板内短距离传输上优势很明显功耗低、EMI小、差分抗干扰强而且在传感器端实现起来不像MIPI那样需要复杂的状态机适合纯粹的“高速数据搬运”。可到了嵌入式视觉平台情况完全变了。瑞芯微RK3567/RK3588、NXP i.MX8、海思、安霸、甚至英伟达Jetson这类SoC集成的ISP和视频输入控制器基本都是为MIPI CSI-2准备的。这就有个很尴尬的现实一颗原本能输出4K60fps全局快门图像的传感器因为接口是SLVS接不到消费级SoC的MIPI CSI口上性能再好也白搭。很多朋友第一反应是“那我用转接板不就行了”。实际上SLVS到MIPI不是简单做电平转换SLVS传输的是串行化后的RAW像素数据MIPI CSI-2也传RAW数据但两者在通道分配、同步机制、协议封装、电气规范上完全不同。中间必须有一个能“理解”两头时序的桥梁把传感器的像素流拆开、重组、重新封装成CSI-2包。这就是桥接方案存在的核心价值。1.2 SLVS到底和LVDS、MIPI D-PHY差在哪先看电气层。SLVS全称Sub-LVDS常被叫“低压版本的LVDS”。传统LVDS用3.5mA恒流源驱动在100Ω端接电阻上产生约350mV的差分摆幅共模电压在1.2V左右。SLVS把恒流源电流降到大约2mA同样100Ω端接差分摆幅只有约200mV共模电压视传感器不同通常在0.6V到1.0V之间。摆幅小意味着功耗低、上升沿快在相同速率下SI信号完整性压力更小。再看协议层。SLVS在图像传感器场景下通常指“带同步信号的串行Raw数据传输”。传感器通过独立的差分时钟lane提供位时钟数据lane把每个像素的10bit或12bit数据、行同步、帧同步信息串行发出来。严格来说SLVS是物理层简单的数据组织方式它没有一个完整的分层协议栈也不需要像MIPI那样区分LP低功耗和HS高速两种状态。MIPI D-PHY就不一样了它把每个lane都设计成双态HS状态专门跑高速有效数据LP状态专门传控制命令和时序标记。D-PHY的HS差分摆幅典型值在200mV左右共模在200mV上下这和SLVS的200mV摆幅看起来接近但共模差很多。LP状态是单端0V到1.2V的跳变这在物理层上就和SLVS完全不是一种东西。所以做桥接时接收端要接受SLVS的电气特征发送端要模拟MIPI D-PHY的HS和LP双态行为两边各是一套独立的知识体系。2. IMX429/430/432/437的SLVS输出规格与带宽估算2.1 分辨率、位深、帧率如何决定lane速率做桥接方案的第一步永远是算带宽。不要一上来就画原理图先把传感器的数据手册翻透找到四组参数分辨率、帧率、输出位深、数据通道lane数量。以这个系列常见的1200万像素级传感器为例假设分辨率约4096×3000也就是1230万像素每像素输出10bit跑30fps那么原始带宽就是4096 × 3000 × 30 × 10 3.6864GbpsSLVS单lane实际能承载多少这个系列传感器一般会根据型号配置2 lane、4 lane或8 lane单lane速率通常在600Mbps到900Mbps左右部分产品可以更高。上面算出来的3.69Gbps如果用4 lane跑每条lane需要大约922Mbps这在SLVS下已经比较紧如果用8 lane每条lane只跑460Mbps左右余量充足SI压力小很多。如果目标帧率提到60fps带宽翻倍到7.37Gbps这时8 lane下每条lane也要921Mbps基本贴着上限。遇到这种项目要么降低输出位深到8bit要么减少lane数用更高速率要么考虑多路MIPI输出。这个取舍会直接影响FPGA选型和时序裕量一定要在方案早期定下来。2.2 一组可参考的带宽计算示例借用上面的计算我列一个常见配置的带宽估算表方便你在方案设计时对照分辨率位深帧率总带宽8 lane每lane速率4 lane每lane速率4096×300010bit30fps3.69Gbps461Mbps922Mbps4096×300010bit60fps7.37Gbps921Mbps1.84Gbps1920×108012bit60fps1.49Gbps186Mbps373Mbps1920×108012bit120fps2.99Gbps374Mbps747Mbps注意上表算的是纯像素有效数据实际SLVS链路上还有行消隐、帧消隐、同步码这些开销通常要留10%到15%的裕量。比如最后一行的374Mbps看起来离900Mbps很远但加上同步和消隐开销后可能是410Mbps左右仍然够用。这些数字还要结合传感器的具体手册确认。宁可前期多看几遍Datasheet也不要等板子回来发现时序紧张、跑不到标称帧率那才是最痛苦的。3. 桥接方案选型FPGA为什么是首选以及选哪颗FPGA3.1 专用桥接芯片的局限性很多通用接口桥接芯片只做固定格式转换比如把某一种LVDS接口转成MIPI CSI-2。这类芯片的好处是开发周期短外围简单但用在IMX4xx这种传感器上有个致命问题不灵活。SLVS输出通道数、数据位宽、同步时序、RAW格式每颗传感器都不一样甚至同一个传感器通过寄存器配置可以改变lane数量或输出位深。通用桥接芯片通常只能覆盖一两种固定配置当你从IMX429换到IMX432或者同颗传感器想从30fps升到60fps时芯片可能完全不支持方案就得推倒重来。还有一个现实问题这个系列传感器的SLVS输出通常不是标准的“教科书式”波形很多厂家会在同步头里面塞自定义状态字。专用芯片不知道这些字节的含义只能把它当成普通数据透传一旦传感器端做了任何自定义同步协议桥接芯片就没法正确处理帧边界。FPGA则可以把这些同步逻辑全部拿在自己手里想怎么解就怎么解。3.2 不同价位FPGA的接口能力对比FPGA选型核心看四个指标可用IO bank电压是否支持SLVS共模范围、是否有足够的高速差分IO资源、内部逻辑能否支撑CSI-2 TX状态机、以及价格和供货。Lattice CrossLink系列是这类桥接项目里很讨喜的选择。这系列FPGA自带MIPI D-PHY硬核收发端都有硬件支持而且IO电平支持1.2V到3.3VSLVS接收和MIPI发送都能覆盖。更关键的是它功耗低、封装小很多工业相机模块上用的就是它。缺点是逻辑资源密度小如果你打算在桥接之外做图像预处理、坏点校正、ISPCrossLink可能装不下。Xilinx Artix-7和Kintex-7资源比较充足HR bank的LVDS接收能力可以拿来做SLVS发送端可以用普通IO加OSERDES实现CSI-2 TX。问题是Xilinx的MIPI D-PHY IP是需要License的很多免费评估License只能仿不能用或者强制在ISE/Vivado里用硬核。如果你不想买IP只能用SelectIO自己写物理层工作量会增加。Intel Cyclone系列的ALTLVDS_RX/TX能够比较方便地实现串行数据收发和Xilinx思路类似。低端Cyclone 10 LP的IO速率可能不够跑900Mbps的SLVS得用Cyclone 10 GX或Cyclone V产品成本会随之提高。我整理了一个简单的选型对比供参考FPGA型号SLVS接收能力MIPI TX实现难度逻辑资源成本档位Lattice CrossLink-NX有硬核支持自带D-PHY非常容易中等中Xilinx Artix-7用SelectIO接收需外部偏置需自研OSERDES方案或付费IP充足中高Intel Cyclone 10 GX用ALTLVDS_RX需外部偏置需自研方案高速bank支持较好充足中高Lattice ECP5IO可接收SLVS需仔细约束需自研方案速度级别要注意中等中低预算非常紧、只想做纯透传的场景可以选ECP5想省开发时间、又不需要额外图像处理的可以选CrossLink要是将来还要在上游塞自己的算法直接上Artix-7会更从容。4. SLVS接收端的硬件与逻辑实现细节4.1 硬件原理图端接电阻、共模偏置、引脚分配很多第一次做SLVS接收的人会把SLVS当成普通LVDS去画原理图直接在FPGA引脚上配置LVDS标准、打开内部端接结果发现信号不稳定。原因是SLVS共模电压和LVDS不同。SLVS共模可能在0.6V到1.0V之间而FPGA的LVDS输入标准通常假定共模在1.2V附近直接把SLVS信号怼到普通LVDS buffer里输入共模范围可能越界。稳妥的做法是外部处理每一对SLVS差分信号串一个AC耦合电容然后在FPGA引脚端接100Ω差分电阻同时通过电阻网络把共模偏置到FPGA Bank所要求的输入共模电压上。具体偏置电压要以FPGA手册的IBUFDS共模范围为准通常偏到0.9V到1.2V之间都不会出大问题。AC耦合电容典型值用100nF到1uF取值时要保证SLVS传输的低频分量不被吃掉。引脚分配也有讲究。SLVS数据lane必须分配在同一个差分IO Bank最好还集中在同一个Clock Region里这样布线延迟更一致。所有数据lane的长度差要严格控制理论上每英寸长度差大约对应150ps到170ps的延时差如果SLVS速率在900Mbps位周期约1.1nslane间偏差超过0.5ns基本就废了所以PCB上要做等长处理。4.2 RTL实现位对齐、通道对齐、数据同步FPGA内部接收SLVS第一个要解决的是位对齐。虽然SLVS通常有独立的差分时钟lane但数据lane相对时钟可能有几十皮秒甚至几百皮秒的相位偏移。用全局时钟直接采数据容易采到边沿附近稳定性差。最常用的办法是调用FPGA自带的硬核或原语比如Xilinx的ISERDESE2、Intel的ALTLVDS_RX。这些原语会在FPGA内部把高速差分数据变成多路并行低速数据同时在原语内部对数据位进行training保证采样点在眼图正中间。如果SLVS速率不高也可以用IDDDR等简单单元边沿采样但配套的时序约束会复杂一些不推荐新手自己硬写。位对齐之后是通道对齐。多lane传输时每条lane因为走线长度和串行化起始点不同数据位相对错开。通道对齐通常靠传感器发出的训练码或同步头。实现逻辑时我会在每个lane找到一个固定标志位然后把各lane的FIFO统一拉齐使所有lane在同一个frame同步信号到达时对齐。这个标志位可以从传感器的同步码找也可以在frame header里定义。最后是数据同步。SLVS传感器输出一般包括帧有效、行有效和像素数据。把这些信息从串行位流里还原成像素坐标之后再送进下一级处理模块。这里建议把原始行数据先存进一个小FIFO再做后续CSI-2打包。因为有消隐时间行与行之间天然有间隔FIFO正好可以吸收跨时钟域抖动。4.3 时序约束与跨时钟域处理写SLVS接收逻辑时最容易被综合工具埋掉的坑就是时序约束没写对。SLVS时钟lane输入FPGA后一般会进入BUFIO/CLK buffer作为ISERDES的采样时钟。每条数据lane需要单独约束input delay根据PCB走线长度算出最大值和最小值然后在约束文件里用set_input_delay标出来。跨时钟域处理也要说一句。传感器输入的位时钟域和FPGA内部打像素包的工作时钟域通常不是整数倍关系比如SLVS位时钟可能是900MHz内部工作时钟取150MHz比例是6:1但加上同步码后数据流不是严格每6个bit出一个像素。为了稳妥所有跨时钟域数据都过异步FIFO并且把FIFO的写使能和读使能逻辑分开打拍避免多bit信号跨域时产生亚稳态。很多桥接不稳定最后查下来都是某个手写的双触发器同步出了问题。5. MIPI CSI-2发射端的实现以及和SoC对接的坑5.1 CSI-2 D-PHY协议要点回顾MIPI CSI-2的发送侧分为两层物理层D-PHY和协议层CSI-2。物理层上每个lane有HS和LP两种状态。HS状态下Dp/Dn是一对差分高速信号用来传数据或时钟LP状态下Dp/Dn是两个独立的单端信号用来传SoT、EoT这些控制状态。数据lane上的传输并非一直高速每一包数据前要先发SoT包结束发EoT然后才能重新进入LP状态。协议层则是把图像数据包成一个个Long Packet每个Long Packet由三部分组成32bit包头的Data Type和Word Count、Payload数据、16bit CRC尾。帧开始FS和帧结束FE是Short Packet只有32bit包头和ECC没有payload。桥接器的作用就是把这些包按CSI-2规范组织好帧开始、第一行、第二行、……、帧结束。RAW格式对应关系也要提前定好。IMX4xx输出10bit或12bit RAW对应到CSI-2就是RAW10、RAW12两种Data Type。有些传感器会输出16bit扩展格式就要用RAW16。如果这里配错SoC端ISP出来的图像会是错位条纹或颜色通道全乱。5.2 RTL实现LP/HS状态切换、ECC计算、raw数据打包很多人在FPGA上写CSI-2 TX时第一个瓶颈就是D-PHY的LP/HS状态机。FPGA普通IO没有专门的MIPI物理层需要用两套输出机制HS数据用OSERDES/ODDR输出到差分对上LP状态则用普通单端IO控制Dp和Dn的高低。状态切换时要注意时序LP到HS要先切到High-Speed等一段时间T_HS-Zero再开始传数据HS回LP则要等T_HS-Trail结束再拉低。这些参数在D-PHY规范里有范围不同设备还不太一样调试时必须用示波器实测调整。ECC校验是CSI-2一个隐蔽坑点。CSI-2包头的ECC是6bit汉明码插在31bit数据之外覆盖Virtual Channel、Data Type、Word Count这几个字段。很多设备对错误的ECC包会直接丢弃导致图像不出图还难查原因。建议在RTL里把ECC计算做成组合逻辑模块单独拉出来测试用仿真或ILA核对每个包头。RAW数据打包其实不难麻烦在像素到字节的排列。RAW10每4个像素凑成5个字节RAW12每2个像素凑成3个字节。行宽度不一定能被这个字节数整除所以实际payload长度要按行像素数计算再填入Word Count。这里推荐先写一个纯软件的Python脚本把同一张大图分别用RAW10和RAW12打包成字节流然后用这个字节流做RTL仿真的测试激励能省下大量波形对比时间。5.3 和RK3567、NXP i.MX、x86平台对接的注意事项桥接器做完最终要接到SoC。以RK3567这类平台为例驱动侧要确认三件事CSI-2 D-PHY lane数量、虚拟通道号、以及Data Type。默认kernel驱动可能只开了4个lane如果你的桥接器输出了8 lane或者特意少用了lane数量必须同步修改设备树。还有lane映射也就是哪个数据lane对应SoC的哪个D-PHY pin顺序反了会完全不出图且错误现象非常隐蔽。NXP i.MX平台的MIPI CSI驱动在接收端会做严格的帧时序检查对行消隐长度、帧消隐长度都有默认上限。如果你的桥接器只关心数据有效性没有按SoC预期留够消隐时间驱动可能频繁报超时。解决办法是给桥接逻辑加一个可配置的line blanking计数器在每行数据之间插入足够的LP状态。x86平台则是另一套玩法。有些IPU或图像处理单元需要从BIOS的VBTVideo BIOS Table里读取MIPI sensor的时序参数这就要求把MIPI的lane数、速率、Data Type、分辨率、帧率写进VBT的对应表项否则内核驱动加载时根本不知道传感器存在。这个工作通常是BIOS工程师和Linux驱动工程师一起搞的调试时最好准备一个能dump VBT的脚本把你的配置项单独导出来核对反复对比到底有没有生效。6. 调试实录从示波器波形到内核日志的排查链路6.1 怎么看MIPI时钟波形测哪些点、用什么模式桥接板做回来第一步不要急着抓图像数据先看物理波形。用示波器测MIPI时钟lane时要使用差分探头或者两个同轴探头做A-B相减。示波器带宽建议至少2GHz或者更高采样率要够。MIPI D-PHY HS时钟在跑起来之前会有一段LP状态然后突然进入高速输出。示波器触发方式可以设为边沿触发也可以设成Timeout触发抓整个LP到HS的切换过程。判断波形好坏的关键点有三个HS差分摆幅是否在100mV到300mV之间共模是否在150mV到300mV附近以及HS时钟频率是否和配置的lane速率吻合。如果摆幅太小检查外部端接电阻和驱动强度如果频率不对回来查FPGA的PLL配置或参考时钟。SLVS接收端也要看波形。测量SLVS时钟lane时重点是看边沿是否单调、上升时间是否够快。SLVS摆幅只有200mV示波器底噪稍大就会淹没信号测量时要用示波器的带宽限制功能滤掉高频噪声并且探头尽量接地短。6.2 用FPGA内部ILA和vendor工具抓CSI-2包物理层波形正常之后就要确认数据内容对不对。FPGA内部调试最直接的手段是ILAIntegrated Logic Analyzer。把CSI-2 TX侧的数据字节、包头、字计数、ECC全部引到ILA里。配置ILA的采样深度要足够至少能抓到一整个帧起始到前几行数据。帧率低的时候数据很长时间才有一次有效事件ILA触发条件写错会让人怀疑人生。抓包时最典型的正确帧结构是先看到Short Packet FS接着是很多个Long Packet每行一个最后是Short Packet FE。如果ILA里只看到FS没有FE或者前几行正常后面全错多半是注意力状态机在行尾的换行时序不对或者是FIFO读空后没有及时补位导致字节流错开。Lattice的Reveal、Xilinx的Vivado Logic Analyzer、Intel的SignalTap其实原理都类似。建议先在bench上把CSI-2打包模块单独仿真再用片内逻辑分析仪实时抓最后才上SoC联调这样出错范围能一步步缩小避免一次同时面对多个变量。6.3 常见问题根因定位表我把实测中最常遇到的桥接问题整理成一张表方便你做快速排查现象可能原因检查方向完全不出图CSI-2 lane映射错误或极性反核对SoC手册和数据lane顺序图像花屏或颜色错乱Data Type与传感器位深不匹配确认RAW10/RAW12/RAW16设置图像左侧有条纹行像素数对不上Word Count回查每行打包字节数高帧率下丢帧SLVS lane对齐不稳定抓SLVS各lane对齐偏差偶发开不了机D-PHY LP-HS时序不达标示波器抓T_HS-Zero内核报CSI超时行消隐/帧消隐时间不足调大line blanking计数还有一种很容易忽略的问题供电噪声。SLVS接收和MIPI发送同时工作时数模混合区域的电源纹波会被放大。很多偶发丢帧或者HS信号抖动最后查出来是某个芯片的电源滤波电容布局太远导致谐振。这种问题用示波器看毛刺就能看到建议在FPGA内核电压和IO电压上都加磁珠隔离并且让SLVS和MIPI的电源平面分开铺。调试到后期如果SoC端内核日志反复报CRC错误一定要回到物理层看眼图。眼图张不开的时候软件上再怎么调时序参数都白搭。把MIPI到SoC的走线从过孔、换层、长度三个维度重新评估很多时候是两条差分线中间穿过了一个独立via stub导致阻抗不连续切开换线重走之后问题立刻消失。做SLVS-MIPI桥接方案硬件没有太多神秘的地方难的是把“传感器时序、SLVS物理层、FPGA逻辑、MIPI协议、SoC驱动”这一整条链路吃透。按我个人的习惯一定会先在文档里把带宽算清楚再用小规模FPGA跑通单lane最后再扩展到多lane。只要你把每个环节的验证节点都留足调试期会过得相当顺畅。
返回列表