ARTICLE DETAIL

资讯详情

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

MIPI+FPGA+USB3.0双目相机硬件设计实战与避坑指南

MIPI+FPGA+USB3.0双目相机硬件设计实战与避坑指南 1. 项目缘起与整体设计思路双目视觉这几年在工业检测、机器人导航、三维重建这些领域的需求越来越旺盛但真正落到板级硬件设计上坑远比想象中多。我前后做过三版双目相机方案从最早的“两个USB摄像头拼一起”到后来的“GigE独立相机外触发同步”再到现在的“MIPIFPGAUSB3.0单板集成”每一版都在解决上一版暴露出来的问题。这篇文章就把第三版的设计思路、关键细节和踩过的坑完整梳理一遍给正在做类似方案的同行一个可参考的样本。先说清楚这个方案到底在做什么把两颗MIPI接口的工业图像传感器比如常见的全局快门CMOS直接挂在FPGA上由FPGA完成MIPI CSI-2协议的接收解析、双目数据的对齐与预处理再通过USB3.0接口把数据实时送到上位机。整块板子只有一张名片大小两颗sensor的曝光通过同一组触发信号控制做到硬件级同步帧率可以稳定跑在60fps以上取决于分辨率和USB3.0带宽余量。这套方案适合谁看如果你正在做嵌入式视觉产品需要小体积、低功耗、硬同步的双目方案或者你手上有FPGA开发经验想切入工业相机领域这篇文章里的选型逻辑、时序约束方法、带宽计算过程都可以直接拿去用。如果你只是想做双目测距玩玩用现成的双目模组更省事没必要自己画板子。为什么最终选了MIPIFPGAUSB3.0这个组合而不是其他方案这里展开说一下选型背后的逻辑。MIPI CSI-2作为sensor接口核心原因是工业CMOS传感器几乎都把MIPI作为默认高速输出接口。相比LVDSMIPI的线数少一对时钟若干对数据布线密度低在板子空间紧张的时候优势明显。而且MIPI CSI-2协议本身支持多lane聚合单lane速率可以到1Gbps以上两颗1080p60fps的sensor每颗用2 lane就完全够用。热词里提到的mipi csi-2协议、mipi dphy、mipi时钟信号示波器波形都是这个环节绕不开的东西后面会专门讲。FPGA作为中间处理核心是因为双目方案对同步的要求是硬性的。如果用两颗独立相机各自输出靠软件时间戳对齐在动态场景下误差能到几十毫秒根本没法做精确的立体匹配。FPGA的好处是它能同时接收两路MIPI用同一个时钟域去采样从物理层就保证了两路数据的相位关系确定。另外FPGA还能顺手做去马赛克、坏点校正、ROI裁剪这些预处理减轻上位机负担。热词里的fpga图像处理、fpga isp去马赛克、fpga定点数都是这个环节的实际工作内容。USB3.0作为上行接口是权衡了带宽、通用性和开发难度之后的选择。双目1080p60fps、每像素RAW10算下来总带宽大约是 1920×1080×10bit×60×2 ≈ 2.49GbpsUSB3.0的理论带宽5Gbps实际有效载荷按70%算也有3.5Gbps留有余量。相比GigEUSB3.0不需要额外的网络协议栈上位机直接用现成的驱动框架就能收数据相比PCIeUSB3.0不需要插槽线缆可以拉得更长产品形态更灵活。热词里usb3.0芯片、usb3.0脚位定义、实现usb3.0 c口 otg需要哪些芯片都是这个环节的选型要点。整体数据流是这样的两颗sensor在同一个外部触发信号驱动下同时曝光MIPI D-PHY把并行像素数据串行化输出FPGA的MIPI硬核或软核接收后解出像素写入片内FIFO做跨时钟域处理再按帧打包通过USB3.0的FX3或类似控制器送到PC。整个链路里最关键的三个约束是同步精度、带宽余量、信号完整性。后面每个章节都会围绕这三点展开。2. 核心器件选型与关键参数计算选型这一步如果拍脑袋后面调试会付出成倍代价。我第一版就是sensor和FPGA的MIPI速率没算清楚导致只能跑半速白白浪费了一个月。这一章把选型的计算过程完整写出来。2.1 图像传感器选型与MIPI速率核算工业双目方案里sensor选型主要看几个维度全局快门还是卷帘快门、分辨率、帧率、MIPI lane数和单lane速率、是否支持外部触发同步。全局快门在动态场景下不会产生果冻效应双目立体匹配对这一点非常敏感所以优先选全局快门。分辨率上1080p是当前性价比最高的档位再高的话USB3.0带宽就吃紧了。假设选定某款1080p全局快门sensor输出RAW10格式帧率目标60fpsMIPI配置为2 lane。单lane速率怎么算总像素吞吐 1920 × 1080 × 60 ≈ 124.4M pixel/s。RAW10每像素10bit加上MIPI协议本身的包头、ECC、CRC开销实际有效载荷大约占80%。所以需要的总数据率 ≈ 124.4M × 10 / 0.8 ≈ 1.555Gbps。分到2 lane每lane约778Mbps。这个速率在MIPI D-PHY的HS模式下很轻松大多数sensor的单lane能力都在1Gbps以上留了足够余量。注意算MIPI速率时一定要把blanking时间算进去。sensor手册上标的帧率通常是包含消隐期的实际有效行时间比1920像素要短所以真实lane速率会比上面算的略高。稳妥做法是按手册给出的lane速率上限的70%来配置别贴着极限跑。两颗sensor就是双倍数据量总MIPI吞吐约3.1Gbps。FPGA这边要确认MIPI接收硬核能不能同时处理两路。Xilinx 7系列及以上的FPGAMIPI D-PHY硬核通常有多个lane组可以配置成两路独立接收如果是用软核LVDS差分接收自己解协议那就要仔细算IO资源和时序余量了。热词里xilinx vivado mipi、fpga实现mipi、高云fpga对应的就是不同厂商FPGA的MIPI实现路径选型时要先确认目标器件有没有官方MIPI方案。2.2 FPGA平台选型与资源评估FPGA选型我踩过的最大坑是“资源够但IO不够”。双目MIPI接收每颗sensor至少需要1对时钟lane 2对数据lane两颗就是6对差分。加上USB3.0的接口FX3是并行GPIF II或者用FPGA内置USB硬核再加上触发、配置、调试用的普通IO一个中等规模的FPGA才够用。资源评估上MIPI CSI-2的协议解析本身不复杂主要是字节对齐、包解析、CRC校验逻辑量不大。真正吃资源的是图像预处理去马赛克demosaic如果做成3x3窗口的插值需要行缓存坏点校正需要邻域比较如果还要做双目校正rectification那就要上DDR做帧缓存了。热词里fpga定点数、fpga定点数据说的就是这些预处理算法在FPGA里要用定点运算实现浮点资源在低端FPGA上很紧张。我的经验是如果只做MIPI接收打包上传不做复杂ISP选一颗带MIPI硬核、逻辑单元在50K左右、有足够高速收发器的FPGA就够。如果要做完整ISP双目校正逻辑单元要翻倍还得外挂DDR。热词里fpga布局和布线区别是什么、fpga复位信号亚稳态、fpga的lvds接收这些都是实际开发中会反复遇到的问题后面章节会展开。2.3 USB3.0控制器选型与带宽验证USB3.0控制器这块主流方案有两类一类是独立的USB3.0外设控制器芯片比如FX3系列FPGA通过并行或串行接口把数据喂给它另一类是FPGA内置USB3.0硬核部分高端FPGA有。前者开发成熟、资料多后者集成度高但灵活性受限。带宽验证是选型的关键。前面算过双目RAW101080p60fps约2.49GbpsUSB3.0实际有效载荷按3.5Gbps算余量约40%。但如果上位机还要同时接收控制命令、做实时显示实际可用带宽会更低。我的做法是留50%余量也就是目标数据率不超过2.5Gbps这样即使遇到USB主机控制器调度抖动也不会丢帧。提示USB3.0的实际带宽和主机控制器、线缆质量、驱动实现都有关系。同一块板子换一台电脑实测带宽可能差20%。所以设计阶段一定要按最坏情况留余量别按理论值5Gbps去规划。热词里usb3.0 inf、集成usb3.0驱动的win7镜像下载反映的是上位机驱动安装的问题。实际项目中USB3.0设备在Windows上需要正确的驱动inf文件Linux下则要确认内核版本和USB3.0控制器兼容性。这些在方案设计阶段就要考虑进去别等板子回来了才发现驱动装不上。3. 硬件设计与信号完整性实操要点板级集成双目相机硬件设计占了至少一半的工作量。MIPI和USB3.0都是高速差分信号布线不当直接导致链路不通或者误码率飙升。这一章把我在实际画板和调试中总结的要点写出来。3.1 MIPI差分对布线与阻抗控制MIPI D-PHY的差分阻抗要求是100Ω差分单端50Ω对地。这个在叠层设计时就要确定好通常用四层板顶层信号、第二层地、第三层电源、底层信号。MIPI差分对走在顶层或底层参考平面必须是完整的地平面中间不能有跨分割。差分对内的等长要求很严格通常要求±5mil以内。对间等长可以放宽到±50mil。走线尽量短我一般控制在10cm以内超过的话信号衰减会明显。转角用圆弧或者45度不要用90度直角。热词里mipi时钟信号示波器波形就是调试阶段用来验证信号质量的——眼图张开度、上升时间、过冲这些指标直接反映布线质量。注意MIPI的时钟lane和数据lane之间的长度匹配也很重要。时钟采样数据如果偏差太大采样窗口会偏移。一般要求时钟和数据lane的长度差控制在±10mil以内。3.2 USB3.0高速差分对与电源设计USB3.0的差分阻抗要求是90Ω差分比MIPI略低。SuperSpeed的TX和RX是分开的差分对布线时要成对走不要和其他高速信号平行走长距离避免串扰。USB3.0的差分对通常要求等长±5mil阻抗控制±10%。电源设计上USB3.0控制器和FPGA的核电压、IO电压要分开供电用LDO或者低噪声DCDC。MIPI sensor的模拟电源对噪声很敏感一定要用LDO单独供并且在sensor电源引脚附近放足够的去耦电容。我第一版就是sensor模拟电源和数字电源共用了一个DCDC结果图像上一直有规律性的横纹换成LDO之后立刻干净了。热词里usb3.0脚位定义、实现usb3.0 c口 otg需要哪些芯片涉及的是接口形态和供电协商。如果做成Type-C接口还要考虑CC逻辑芯片和PD协商这部分如果只是做设备端device可以简化但CC下拉电阻不能省。3.3 同步触发信号的硬件实现双目同步的核心是让两颗sensor在同一时刻曝光。最可靠的做法是用FPGA输出一个硬件触发信号同时送到两颗sensor的触发引脚。这个信号要走等长保证到达两颗sensor的延迟一致。如果sensor支持外部触发模式external trigger配置成触发即曝光那同步精度可以做到微秒级甚至更高。另一种做法是用sensor的主从模式master-slave一颗做主输出同步信号给另一颗。这种方式省了FPGA的触发输出但同步精度取决于sensor内部逻辑通常不如外部统一触发。我实测下来外部统一触发的同步误差在1微秒以内主从模式在几微秒量级对于大多数工业检测场景外部触发更稳妥。提示触发信号的走线要远离高速差分对避免被耦合噪声干扰导致误触发。可以在触发线上串一个小电阻比如22Ω做阻尼减少反射。4. FPGA逻辑设计与MIPI协议解析FPGA逻辑是整个方案的大脑负责MIPI接收、数据对齐、预处理和USB3.0打包。这一章按数据流顺序把关键模块的设计思路和实操细节讲清楚。4.1 MIPI CSI-2接收层设计MIPI CSI-2协议分几层物理层D-PHY、协议层CSI-2、应用层。FPGA要处理的是物理层解串和协议层解析。如果用Xilinx的MIPI D-PHY硬核物理层基本是现成的你只需要配置lane数、速率、时钟模式。如果用软核那就要自己用LVDS接收器IDELAY/ISERDES来做解串这部分时序约束非常关键。协议层解析的核心是识别数据包的包头。CSI-2的短包包含帧起始FS、帧结束FE、行起始LS、行结束LE等同步码长包包含实际的像素数据。FPGA需要用一个状态机去跟踪当前处于哪一行、哪个包把有效像素提取出来写入FIFO。热词里mipi csi、mipi csi-2协议、mipi dphy对应的就是这一层的实现。实操中容易出问题的地方是字节对齐。MIPI是串行传输FPGA解串后得到的是并行字节流但起始字节可能不对齐。通常CSI-2包里有同步码比如0xB8开头的短包可以用它来做对齐。我的做法是先搜索同步码找到后锁定字节边界后续数据按固定偏移解析。4.2 双目数据对齐与跨时钟域处理两颗sensor各自有独立的MIPI时钟数据到达FPGA的时钟域不同。要保证双目数据对齐有两种思路一是用同一个触发信号让两颗sensor同时开始输出这样数据在时间上是对齐的二是用FPGA的FIFO做缓冲按帧同步信号对齐。我采用的是第一种思路为主、第二种为辅。触发信号同时送到两颗sensor它们在同一时刻开始曝光、同一时刻开始输出。但由于sensor内部时钟的微小差异数据到达FPGA的时刻可能有几个时钟周期的偏差。这时候用异步FIFO做跨时钟域缓冲再按帧起始信号对齐就能保证两路数据严格配对。跨时钟域处理是FPGA设计的经典难点。热词里fpga复位信号亚稳态说的就是跨时钟域时如果处理不当会导致亚稳态传播。我的经验是所有跨时钟域的信号都要用两级触发器同步数据总线用异步FIFO或者握手协议绝对不要直接跨时钟域采样。注意异步FIFO的读写指针格雷码转换是必须的否则多bit指针跨时钟域会出错。Xilinx和Intel的FIFO IP核都支持异步模式直接用IP核最稳妥自己写容易漏掉细节。4.3 图像预处理模块设计如果只是把RAW数据传给上位机FPGA逻辑相对简单。但实际项目中上位机往往希望拿到的是可显示的图像这就需要在FPGA里做预处理。常见的预处理包括去马赛克Bayer转RGB、坏点校正、自动曝光统计、ROI裁剪。去马赛克是计算量最大的。Bayer格式每个像素只有一种颜色分量要恢复全彩需要插值。常用的双线性插值需要3x3窗口FPGA里用行缓存实现。热词里fpga isp去马赛克、fpga图像处理说的就是这个。我的做法是用两个行缓存line buffer存前两行加上当前行组成3x3窗口然后按Bayer模式做插值。定点运算用移位和加法实现避免用除法器。坏点校正相对简单如果当前像素和周围像素的差值超过阈值就判定为坏点用周围像素的中值替代。阈值需要根据sensor的实际噪声水平来定太敏感会误判太迟钝没效果。4.4 USB3.0数据打包与传输FPGA把预处理后的图像数据打包成USB3.0控制器能识别的格式。如果用FX3通常是通过GPIF II接口FPGA作为masterFX3作为slaveFPGA把数据写入FX3的FIFOFX3负责USB协议封装。如果用FPGA内置USB硬核那就要自己实现USB3.0的协议栈工作量会大很多。打包格式上我通常会在每帧数据前加一个帧头包含帧号、时间戳、双目标识等信息方便上位机解析。帧头后面是像素数据按行排列。每包数据大小要匹配USB3.0的burst长度通常是1024字节的整数倍这样传输效率最高。提示USB3.0传输中如果FPGA写入速度超过FX3的读取速度FIFO会满导致丢数据。一定要在FPGA侧做流控检测FX3的FIFO满信号满了就暂停写入。这个流控逻辑如果漏了调试时会看到随机丢帧很难定位。5. 常见问题排查与调试实录这一章是我在实际调试中遇到的最典型的问题和解决方法整理成速查表方便对照排查。5.1 MIPI链路不通的排查思路MIPI链路不通是最常见的问题表现是FPGA收不到任何数据或者收到的数据全是0。排查顺序如下现象可能原因排查方法完全无数据sensor未上电或未配置测量sensor电源、检查I2C配置是否成功数据全0MIPI lane极性反了交换差分对的P/N或者检查FPGA的lane映射数据偶尔有信号完整性差用示波器看MIPI波形检查眼图数据错位字节对齐错误检查同步码搜索逻辑确认字节边界我遇到最多的是lane极性反了。MIPI的差分对P/N如果接反FPGA解串出来的数据是错的。有些FPGA的MIPI硬核支持极性反转配置可以在软件里改如果不支持就只能改板子。所以画板时一定要仔细核对sensor手册的lane定义。5.2 双目不同步的定位方法双目不同步的表现是左右图像在动态场景下有明显的位移差或者立体匹配结果不稳定。定位方法是用一个LED闪烁源同时拍两颗sensor看两幅图像里LED亮起的帧号是否一致。如果不同步先检查触发信号是否同时到达两颗sensor。用示波器同时测两颗sensor的触发引脚看延迟差。如果延迟差超过1微秒就要检查触发走线是否等长。如果触发信号没问题那就是sensor内部配置不一致比如一颗配置成了触发模式另一颗还是自由运行模式。注意有些sensor的触发模式有“触发即曝光”和“触发后等下一帧”两种配置错了会导致同步偏差一整帧。这个在sensor手册里通常写得很隐蔽要仔细看。5.3 USB3.0带宽不足与丢帧处理USB3.0丢帧的表现是上位机收到的帧率低于预期或者图像有撕裂。排查思路先用USB3.0协议分析仪抓包看实际传输速率和丢包情况。检查FPGA侧FIFO是否溢出如果溢出说明FPGA写入太快。检查上位机驱动是否用了正确的传输模式Bulk还是Isochronous。检查USB线缆质量劣质线缆会导致重传降低有效带宽。我的经验是USB3.0的Bulk传输在Windows上受主机控制器调度影响很大有时候换一个USB口不同的主机控制器就能解决。如果实在带宽不够可以考虑压缩数据比如RAW10转RAW8或者做无损压缩但会牺牲图像质量。5.4 FPGA时序不收敛的解决技巧FPGA设计中最头疼的是时序不收敛尤其是MIPI高速接收和DDR接口。热词里fpga布局和布线区别是什么、多die fpga languna约束涉及的就是时序约束和布局布线的关系。我的做法是先确保时钟约束正确MIPI的时钟频率、DDR的时钟频率都要在XDC或SDC里写清楚。然后看时序报告找到critical path分析是逻辑级数太多还是布线延迟太大。如果是逻辑级数太多就插入流水线寄存器如果是布线延迟太大就加位置约束Pblock把相关逻辑约束在同一个区域。提示MIPI接收的时序余量通常很小因为速率高。如果时序不收敛可以尝试降低MIPI速率如果应用允许或者换用带MIPI硬核的FPGA硬核的时序性能比软核好很多。6. 上位机对接与系统联调经验板子调通只是第一步上位机能不能稳定收数据、实时显示才是产品能不能用的关键。这一章讲上位机对接和系统联调的经验。6.1 驱动安装与设备识别USB3.0设备在Windows上需要正确的驱动。如果用FX3Cypress现Infineon提供了官方驱动和inf文件直接安装即可。Linux下通常用libusb或者内核自带的usb-serial驱动具体取决于设备枚举的class。热词里集成usb3.0驱动的win7镜像下载反映的是老系统兼容性问题。Win7对USB3.0的支持需要额外安装驱动而且不同主机控制器的驱动不一样。如果产品要支持Win7建议在方案阶段就确认好主机控制器型号提前准备驱动。设备识别不上的排查先看设备管理器里有没有未知设备如果有说明USB枚举成功了但驱动没装好如果连未知设备都没有说明USB物理层没通检查线缆和接口。6.2 数据接收与实时显示上位机接收数据通常用SDK提供的API比如FX3的CyAPI或者libusb。接收线程要单独开避免阻塞UI。数据收到后按帧头解析把左右图像分开然后做显示或者进一步处理。实时显示对CPU占用比较高尤其是1080p60fps双目。我的做法是用GPU做显示OpenGL或者DirectX把图像数据传到显存后由GPU渲染CPU只负责数据搬运。如果上位机还要做立体匹配那计算量更大通常要用CUDA或者OpenCL做加速。提示上位机接收数据时缓冲区要开得足够大避免因为偶尔的调度延迟导致丢数据。我一般开4-8帧的缓冲实测下来很稳。6.3 长时间运行的稳定性验证产品级方案必须做长时间运行测试。我一般会跑24小时连续采集统计丢帧率和同步误差。丢帧率要低于万分之一同步误差要稳定在微秒级。长时间运行中最容易出问题的是温度。FPGA和USB3.0控制器发热量大如果散热不好温度升高会导致时序余量下降进而丢帧。热词里fpga 温控风扇说的就是这个问题。我的做法是在FPGA和USB控制器上方加散热片如果空间允许再加一个小风扇把温度控制在60度以下。另一个问题是电源纹波。长时间运行后电源纹波可能变大影响MIPI信号质量。建议在电源输出端加足够的滤波电容并且用低ESR的电容。7. 方案扩展与个人体会这套双目方案跑通之后后续可以扩展的方向不少。比如增加第三颗sensor做多目FPGA的MIPI接收资源如果够直接加lane就行比如把USB3.0换成GigE或者万兆网适合远距离传输比如在FPGA里加深度学习加速核做端侧的目标检测。我个人在实际操作中的体会是双目方案最难的不是单点技术而是系统级的同步和带宽规划。MIPI、FPGA、USB3.0每一个单独拿出来都有成熟方案但把它们集成到一起让数据从sensor到上位机一路畅通需要在一开始就把时序、带宽、同步这三个约束想清楚。我见过太多项目是先把板子画出来调试时才发现带宽不够或者同步做不了返工成本极高。最后分享一个小技巧调试MIPI链路时如果手头没有协议分析仪可以用FPGA的ILA集成逻辑分析仪抓取解串后的数据看同步码是否正确。ILA的采样深度有限但抓包分析足够了。这个方法帮我省了不少买分析仪的钱。这个方案后续还可以这样扩展把FPGA的预处理从简单的去马赛克升级到完整的ISP流水线包括自动白平衡、伽马校正、色彩校正矩阵这样上位机拿到的就是接近成品相机的图像适合对图像质量要求高的工业检测场景。
返回列表