ARTICLE DETAIL

资讯详情

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

FPGA实现MIPI DPHY:从硬件设计到软件解析的完整指南

FPGA实现MIPI DPHY:从硬件设计到软件解析的完整指南 1. 为什么MIPI DPHY在FPGA上值得认真做一遍MIPI DPHY这个接口做图像和显示方向的人基本绕不开。手机屏、车载摄像头、工业相机模组大量都在用MIPI DPHY做物理层传输。它的特点是速率高、引脚少、功耗低但协议层和电气层都比较讲究。很多做FPGA的朋友第一次接触MIPI DPHY往往卡在两个地方一是硬件上差分对怎么接、终端电阻怎么放、参考时钟怎么给二是软件上怎么把高速串行数据恢复成字节流再解析出图像。Xilinx FPGA做MIPI DPHY主流方案有两种。一种是利用HP bank的ISERDES和IDELAY做源同步接收配合SelectIO的LVDS差分标准速率一般能跑到800Mbps到1.2Gbps每lane。另一种是用GTP/GTX这类高速收发器配合MIPI DPHY的电气规范做转换速率可以更高但需要额外的电平转换和协议适配。对于大多数摄像头和显示屏应用第一种方案已经够用而且资源占用小、调试直观。这篇文章面向的是有一定FPGA基础、想自己动手把MIPI DPHY跑通的工程师。我会从硬件设计讲到软件解析把每一步的考量、参数计算、踩过的坑都摊开来说。你不需要有MIPI协议栈的完整背景但至少要熟悉Vivado的基本流程、SelectIO原语的使用以及Verilog的时序逻辑写法。2. 整体方案设计与关键选型考量2.1 为什么选SelectIO方案而不是GT方案MIPI DPHY的电气层是SLVSScalable Low Voltage Signaling差分摆幅大约200mV共模电压200mV左右。Xilinx的HP bank支持LVDS和LVDS_25标准差分摆幅约350mV共模约1.2V。直接对接会有共模不匹配的问题所以中间需要加一级电平转换或者用AC耦合加偏置网络。GT方案的优势是速率高、均衡能力强但GT的参考时钟要求、协议层适配、功耗都更复杂。对于1Gbps以下的MIPI DPHYSelectIO方案更划算。我实测过用Kintex-7的HP bank接收1.2Gbps的MIPI数据配合IDELAY做眼图扫描误码率可以做到1e-12以下。选SelectIO方案还有一个好处时钟和数据的关系是源同步的MIPI DPHY的时钟lane是DDR时钟数据lane在时钟双沿采样。用ISERDES的DDR模式配合BUFIO和BUFR可以比较自然地恢复出并行数据。2.2 硬件通道规划与Bank选择MIPI DPHY一般有1个时钟lane加1到4个数据lane。以4 lane为例需要5对差分线。Xilinx FPGA的HP bank里差分对是成对分配的每个bank有若干个差分对。选bank的时候要注意几点时钟lane必须接到能驱动BUFIO的时钟 capable 引脚上否则没法用ISERDES的源同步模式。数据lane尽量和时钟lane在同一个bank减少跨bank的时序偏差。如果bank的VCCO是1.8VLVDS的共模是1.2V左右和MIPI的200mV共模差得比较远需要外部电路做偏置。我一般会先画一个bank的引脚分配表把时钟lane放在MRCC或SRCC引脚上数据lane按差分对顺序排。这样布局布线的时候IDELAY和ISERDES的约束比较好写。2.3 电平转换与终端匹配的取舍MIPI DPHY的发送端是SLVS接收端需要100欧姆差分终端。Xilinx FPGA的HP bank内部有可配置的终端电阻可以设成100欧姆差分。但共模电压不匹配的问题还是存在。常见的做法是AC耦合加偏置。在差分对之间串0.1uF电容然后在FPGA侧用电阻分压把共模抬到1.2V左右。这样MIPI的200mV共模被隔掉FPGA侧看到的是以1.2V为中心的差分信号。电容的选择要注意0.1uF在1Gbps下阻抗大约1.6欧姆对信号影响不大但太小了会导致低频分量衰减太大了体积和寄生参数不好控制。另一种做法是用专用的电平转换芯片比如把SLVS转成LVDS。这种芯片一般会集成终端和偏置用起来省事但会增加BOM成本和布线复杂度。我个人的经验是如果速率不超过1GbpsAC耦合加偏置的方案足够稳定而且成本低。3. 硬件设计细节与实操要点3.1 差分对布线与阻抗控制MIPI DPHY的差分阻抗要求是100欧姆。PCB走线的时候差分对要等长、等距尽量少打过孔。如果必须换层要在过孔附近加回流地过孔。差分对的间距要均匀避免出现stub。我踩过的一个坑是差分对走线经过一个连接器连接器的引脚定义把P和N分到了两边导致差分对在连接器处不得不分开走。结果眼图闭合得很厉害速率降到800Mbps才能勉强工作。后来换了一个连接器把差分对放在相邻引脚上问题就解决了。所以画原理图的时候一定要确认连接器的引脚排列尽量让差分对在物理上相邻。如果连接器是自定义的最好在引脚定义阶段就把差分对安排好。3.2 参考时钟与复位设计MIPI DPHY的时钟lane是DDR时钟频率等于数据速率的一半。比如1Gbps每lane时钟lane就是500MHz。这个时钟进FPGA后要经过BUFIO和BUFR分别给ISERDES和区域时钟用。参考时钟的抖动要求比较高一般建议用差分晶振抖动在1ps RMS以下。如果时钟抖动太大ISERDES的采样窗口会变窄误码率上升。复位方面MIPI DPHY的复位一般由协议层控制但FPGA内部的IDELAY和ISERDES需要在上电后做一次校准。我一般会用一个复位状态机先复位IDELAY然后做眼图扫描找到最佳采样点再释放ISERDES。3.3 电源与去耦FPGA的HP bank电源VCCO和VCCAUX要干净。MIPI DPHY的速率高电源噪声会直接耦合到差分信号上。我一般会在每个bank的电源引脚附近放0.1uF和0.01uF的电容再并一个10uF的钽电容。如果bank的VCCO是1.8V而MIPI的共模是200mVAC耦合后的偏置电压要由外部电阻分压产生。这个偏置电压的噪声也要控制最好用LDO单独供或者在分压电阻上并一个大电容。4. 软件解析与核心逻辑实现4.1 ISERDES与IDELAY的配置Xilinx的ISERDESE2支持DDR模式可以把高速串行数据解成8位或10位并行数据。对于MIPI DPHY数据lane在时钟双沿采样所以ISERDES要配成DDR模式数据宽度设成8位。IDELAY用于调整采样点。IDELAYE2的抽头数一般是31个每个抽头的延迟约78ps在7系列里。对于1Gbps的数据UI是1000ps31个抽头覆盖约2.4个UI足够做眼图扫描。配置的时候要注意IDELAYCTRL要提供一个200MHz的参考时钟这个时钟的精度直接影响IDELAY的延迟精度。我一般用FPGA的MMCM产生200MHz精度控制在100ppm以内。4.2 时钟lane的恢复与BUFIO/BUFR使用时钟lane进FPGA后先经过IBUFDS转成单端然后进BUFIO和BUFR。BUFIO给ISERDES提供高速采样时钟BUFR给区域逻辑提供分频后的时钟。这里有一个细节BUFIO的时钟只能驱动同一个bank里的ISERDES不能跨bank。所以时钟lane和数据lane必须在同一个bank或者用BUFR把时钟分频后跨bank传递。但BUFR的抖动比BUFIO大跨bank传递会恶化采样窗口。我一般会把时钟lane和数据lane放在同一个bank这样BUFIO直接驱动ISERDES时序最干净。如果bank资源不够必须跨bank那就用BUFR但速率要降一点。4.3 数据对齐与字对齐ISERDES输出的并行数据是8位但MIPI DPHY的字节边界不一定和ISERDES的边界对齐。所以需要一个字对齐逻辑找到同步头或者特定的训练序列。MIPI DPHY的协议层有同步码比如HS同步序列是00011101。我一般会在FPGA里做一个状态机搜索这个序列找到后把字节边界调整过来。字对齐的逻辑可以用移位寄存器实现把ISERDES的输出不断移位每移一位就和同步码比较匹配上了就锁定。这个逻辑要放在BUFR的时钟域里速率不高时序容易满足。4.4 协议层解析与图像恢复MIPI DPHY的协议层有几种包短包、长包、帧起始、帧结束。短包用于同步和命令长包用于传图像数据。解析的时候先根据包头的数据类型判断是短包还是长包然后按长度字段读取数据。图像恢复的关键是知道像素格式。比如RAW10、RAW8、RGB888每种格式的字节排列不一样。RAW10是4个像素用5个字节传需要做位拼接。RGB888是3个字节一个像素直接按顺序取就行。我一般会用一个FIFO把解析后的像素数据缓存起来然后按视频时序输出。FIFO的深度要够至少能缓存一行像素避免因为协议层的突发传输导致视频时序断流。5. 常见问题与排查技巧实录5.1 眼图闭合与误码率高眼图闭合是最常见的问题。原因可能有几个差分对阻抗不匹配、终端电阻不对、参考时钟抖动大、IDELAY采样点没对准。排查的时候先用示波器看差分信号的眼图。如果眼图本身就闭合那是硬件问题。如果眼图还行但误码率高那是采样点的问题。用IDELAY做眼图扫描把误码率对IDELAY抽头画出来找到误码率最低的抽头。我遇到过一种情况眼图看起来还行但误码率就是下不去。后来发现是参考时钟的抖动太大换了一个低抖动的晶振就好了。所以参考时钟的质量不能省。5.2 字对齐失败字对齐失败一般是同步码没搜到。可能的原因有ISERDES的位序反了、字节边界不对、同步码的极性反了。排查的时候先把ISERDES的输出打印出来看看有没有固定的模式。如果数据看起来是乱的可能是位序反了把ISERDES的BITSLIP或者位序配置改一下。如果数据有规律但同步码对不上可能是极性反了把差分对的P/N交换一下试试。5.3 视频输出花屏视频花屏一般是协议层解析的问题。可能的原因有包长度读错了、像素格式搞错了、FIFO溢出或下溢。排查的时候先把解析后的像素数据存到RAM里用ILA抓出来看。如果数据看起来是对的但视频花屏那是视频时序的问题。如果数据本身就是乱的那是协议层解析的问题。我踩过的一个坑是RAW10的位拼接搞错了导致像素值偏移。后来仔细看了MIPI的规范发现RAW10的5个字节里前4个字节是高8位第5个字节是4个像素的低2位拼在一起。按这个规则重新拼图像就正常了。5.4 常见问题速查表问题现象可能原因排查方法解决措施眼图闭合阻抗不匹配、终端不对示波器看眼图调整差分对阻抗、检查终端电阻误码率高采样点不对、时钟抖动大IDELAY扫描、测时钟抖动找最佳采样点、换低抖动晶振字对齐失败位序反、极性反打印ISERDES输出改BITSLIP、交换P/N视频花屏像素格式错、FIFO溢出ILA抓像素数据核对像素格式、加大FIFO深度时钟不锁定参考时钟不对、BUFIO配置错测时钟频率检查MMCM配置、确认BUFIO连接6. 实操心得与经验总结做MIPI DPHY这几年我最大的体会是硬件和软件要一起调不能分开搞。硬件上差分对走不好软件再怎么调IDELAY也救不回来。软件上字对齐逻辑写错了硬件眼图再好也解不出图像。另一个体会是参考时钟和电源的质量比想象中重要得多。我见过太多案例眼图看起来还行但误码率就是下不去最后发现是电源噪声或者时钟抖动的问题。所以在PCB设计阶段就要把电源和时钟当回事不要等到调试的时候再补。还有一点MIPI DPHY的规范要仔细看尤其是包格式和像素格式的部分。很多花屏问题根源都是像素格式搞错了。RAW10、RAW12、RGB888、YUV422每种格式的字节排列都不一样搞错一个位图像就偏了。最后分享一个小技巧调试的时候先用一个固定的测试图案比如彩条或者渐变这样出了问题容易定位。等测试图案正常了再换成真实的摄像头数据。这样可以把协议层的问题和图像处理的问题分开排查起来快很多。这个方案后续还可以扩展比如加一个MIPI CSI-2的协议层支持多lane聚合或者加一个MIPI DSI的发送端做显示输出。硬件上如果速率不够可以换成GT方案用Aurora或者自定义协议做高速传输。软件上可以把解析逻辑做成IP核方便复用。
返回列表