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的电气层是SLVS(Scalable Low Voltage Signaling),差分摆幅大约200mV,共模电压200mV左右。Xilinx的HP bank支持LVDS和LVDS_25标准,差分摆幅约350mV,共模约1.2V。直接对接会有共模不匹配的问题,所以中间需要加一级电平转换,或者用AC耦合加偏置网络。
GT方案的优势是速率高、均衡能力强,但GT的参考时钟要求、协议层适配、功耗都更复杂。对于1Gbps以下的MIPI DPHY,SelectIO方案更划算。我实测过用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.8V,LVDS的共模是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成本和布线复杂度。我个人的经验是,如果速率不超过1Gbps,AC耦合加偏置的方案足够稳定,而且成本低。
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的共模是200mV,AC耦合后的偏置电压要由外部电阻分压产生。这个偏置电压的噪声也要控制,最好用LDO单独供,或者在分压电阻上并一个大电容。
4. 软件解析与核心逻辑实现
4.1 ISERDES与IDELAY的配置
Xilinx的ISERDESE2支持DDR模式,可以把高速串行数据解成8位或10位并行数据。对于MIPI DPHY,数据lane在时钟双沿采样,所以ISERDES要配成DDR模式,数据宽度设成8位。
IDELAY用于调整采样点。IDELAYE2的抽头数一般是31个,每个抽头的延迟约78ps(在7系列里)。对于1Gbps的数据,UI是1000ps,31个抽头覆盖约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核,方便复用。