ARTICLE DETAIL

资讯详情

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

FPGA接MIPI D-PHY:Xilinx 7系列电平转换与接收逻辑设计全解析

FPGA接MIPI D-PHY:Xilinx 7系列电平转换与接收逻辑设计全解析 去年接了一块图像采集板的活主控是Xilinx Artix-7摄像头模组是MIPI CSI-2接口。我一开始以为这活儿不难FPGA的IO不是支持LVDS吗MIPI DPHY也是差分信号接上不就行了结果被现实狠狠教育了一轮。MIPI DPHY接口从电平规范到总线行为都跟FPGA常见的LVDS、SSTL不是一回事7系列FPGA又不像部分Zynq UltraScale那样内置MIPI D-PHY硬核电平转换和接收逻辑全得自己解决。这篇文章就围绕这个主题把从硬件方案调研到FPGA逻辑调通的完整过程整理出来重点拆解电平转换的几种落地做法和对比以及纯IO方案里最容易卡住的细节。1. 先弄懂D-PHY的电气脾气为什么不能当LVDS一样接1.1 HS和LP一个物理层里藏着两套信号规则MIPI DPHY的物理层最有迷惑性的地方在于同一对Dp/Dn差分线上同时存在两套完全不同的信号规则。HSHigh-Speed模式用于传输真正的图像或显示数据它是一对低摆幅差分信号差分电压只有约140~270mV共模电压约150~300mV。2024年的MIPI D-PHY规范里单Lane速率可以走到1.5Gbps甚至2.5Gbps时钟通道在HS传输期间输出DDR时钟数据通道在时钟上下沿都采样。LPLow-Power模式则完全不同它是单端0~1.2V信号用于总线初始化、握手、电源管理以及各种低速率命令交互。传输速率很低一比特的周期在几十纳秒级别。重点来了LP状态和HS状态是在同一对线上顺序切换的。一次完整的HS突发传输必须先经历LP-11、LP-01、LP-00这些状态然后才进入HS-0、HS-1序列最后以EoT序列收尾。所以如果你的接收逻辑只盯着“差分信号进来”而不去管总线上那些LP状态大概率会在HS开始瞬间把数据采错。这个特性直接决定了后面的硬件方案和FPGA逻辑设计都不能走常规LVDS的老路。1.2 7系列IO为什么不能完美匹配Xilinx 7系列FPGA的HP Bank和HR Bank并没有MIPI DPHY专用输入缓冲。我们平时用IBUFDS、IBUFDS_DIFF_OUT例化出来的本质上是LVDS、LVDSEXT、HSLVDCI这类电平结构的接收器它们的输入共模范围通常以1.2V为中心比如LVDS_25标准要求共模电压大概在0.3V到2.35V之间。再看MIPI HS模式共模只有150~300mV几乎贴在地电平附近远低于LVDS接收器的最佳工作点。直接接的结果就是信号幅度本身够触发差分阈值但工作点不对接收器可能工作在线性区的边缘甚至被输入级的偏置电路或保护二极管钳位。低速时勉强能收速率一旦上去就拉胯。还有一个坑是Bank电压。MIPI本身工作在1.2V逻辑域而7系列HP Bank如果用LVDS_18VCCO必须接1.8VLP信号虽然可以用LVCMOS18接收但HS信号的共模电平重建就完全依赖外部电路了。很多第一次做MIPI采集的人在这里栽跟头以为指定个IOSTANDARD就行忽略了VCCO和共模匹配这两个隐藏条件。1.3 一个反直觉的结论直连也能跑但不代表可靠不过我也在实验里验证过一个反直觉的现象在200~400Mbps级别的信号速率下如果MIPI摄像头的走线很短、阻抗控制得当把HS差分对直接接到HP Bank的差分IO上用IOSTANDARD LVDS_18加上内部DIFF_TERMFPGA确实能解出数据。原因就是LVDS接收器本身的共模范围比数据手册写的更宽一些MIPI的200mV共模勉强落在了可识别区域内。但“能用”不等于“可靠”。温度漂移、PCB批次差异、电源纹波都会让误码率飘起来。我当时用ILA去抓解出来的字节流发现偶尔会出现错位、多bit、丢bit而且毫无规律这种状态做学习验证可以产品量产绝对不能接受。所以想做出稳定可用的板子电平转换和偏置电路还是得认真设计。2. 三种主流电平转换方案选型前先看对比表2.1 方案A专用MIPI桥接芯片稳妥但成本明显上升市场上有不少成熟MIPI桥接芯片比如TI的SN65DPHY440SSMIPI CSI-2转LVDS、东芝的TC358746AXBGMIPI CSI-2转并行、Lattice的CrossLink系列FPGA等。这类芯片会把MIPI DPHY的物理层直接吃掉SoT/EoT解析、LP状态切换、字节对齐都由桥接芯片完成FPGA侧只需要接收LVDS或并行数据逻辑压力小很多。桥接芯片方案适合量产产品尤其是摄像头和主控之间有排线连接、接口形状受机械结构限制的场景。缺点是成本高一颗芯片可能比FPGA本身还贵并且通道数固定4 Lane就得选4 Lane版本后面想升级带宽就得换芯片。板级设计上还要多一路或几路电源和配置信号PCB面积也上去了。2.2 方案B差分IO加阻容偏置网络低成本通用做法这是这篇文章要展开讲的重点方案也是很多FPGA开发板和开源项目在用的做法。核心思路分两步。第一步MIPI HS差分信号先用隔直电容耦合进FPGA引脚因为HS信号的共模是200mV而FPGA差分接收器需要更高且稳定的共模工作点直接对接两头都不舒服干脆把直流分量隔掉在FPGA引脚侧用外部电阻网络重新建立共模偏置。第二步LP信号不走差分通道而是用分压或缓冲电路送到FPGA的普通单端IO由逻辑去检测LP状态并判断HS突发何时到来。FPGA内部再用ISERDESE2做DDR采样、IO延时链调整位对齐、FIFO做时钟域转换。这方案成本几乎可以忽略几个电阻电容就搞定。代价是高速信号完整性完全靠PCB设计和调试功底兜底没有芯片帮你重定时和整形。2.3 方案C先用串行器/解串器转成其他接口如果MIPI摄像头和FPGA之间物理距离比较远比如超过十几厘米或者中间要过连接器、同轴线纯阻容方案就不太合适了。这时候可以引入FPD-Link III这类远程传输协议典型组合是DS90UB953把MIPI CSI-2转成单根同轴或双绞线信号FPGA侧再用DS90UB954解出并行或LVDS数据。这已经不只是电平转换而是把MIPI协议做了一次远程搬运。优点是抗干扰能力强、传输距离可以到几米甚至十几米对系统EMC设计也很友好缺点也很直接方案成本高芯片和同轴线都不便宜软件开发还要多调一颗配置芯片的寄存器。一般只有车载、工业检测这类对稳定性要求极高的产品才会首选它。2.4 三方案对比表对比维度方案A专用桥接芯片方案B差分IO阻容网络方案C串行器/解串器实现难度低硬件连好基本就通中高硬件和逻辑都要调低但配置流程复杂参考成本中高极低高单通道速率能力取决于芯片最高可达1.5Gbps以上实测600~800Mbps相对难保证取决于解串器1.5Gbps以上常见抗干扰能力中弱极度依赖PCB设计强适用场景量产产品、多Lane高速开发学习、原型验证、小批量长距离传输、恶劣电磁环境我心里对方案B的评价一直是它不完美但却是7系列FPGA上“一个人能搞定”的上限。后面几章我把细节展开你自己就能判断该不该选它。3. 低成本方案的核心电路交流耦合与共模偏置网络的计算3.1 电路结构三步走先给一张我能跑的电路结构做参考总共三步。MIPI源端差分对Dp/Dn分别串联两个100nF隔直电容然后进入FPGA差分IO引脚。这两个电容的作用是把HS信号的直流分量隔掉只保留交流差分信号。在FPGA引脚侧Dp和Dn之间并联一个100Ω差分终端电阻用于匹配MIPI源端的100Ω差分阻抗。终端电阻的中间抽头通过一个电阻网络连接到大约0.9V的偏置电压把FPGA输入引脚的共模电平重建到LVDS接收器的工作区。这里的关键是共模偏置不能随便接它必须是低噪声的。我当时用VCCO 1.8V经过两个等值电阻分压得到0.9V再用100nF和10μF电容并联滤波实测纹波控制在20mV以内基本满足要求。有条件的话直接用低噪声LDO给偏置网络供电更稳。3.2 阻值怎么定不能拍脑袋终端电阻标准MIPI DPHY源端差分阻抗是100Ω接收端匹配100Ω就能最大程度减少反射。这个100Ω可以直接用两个50Ω电阻串联中点抽头接偏置也可以用一个100Ω贴片电阻放差分对之间然后另用两个大电阻从Dp、Dn分别接到偏置电压。我更推荐前者因为中点抽头位置天然就是共模点交流等效阻抗正好100Ω。偏置电阻如果中点抽头用两个50Ω电阻那么交流等效下这两个电阻与100Ω终端是并联关系实际会拉低FPGA引脚上的有效终端阻抗算下来只有50Ω信号幅度直接砍半。所以更稳妥的做法是用两个1kΩ电阻串联做中点抽头不影响100Ω终端还能建立偏置。隔直电容100nF是工程上比较常用的值它和终端电阻构成的高通滤波器截止频率很低完全不影响HS信号。别选太小否则LP到HS切换的瞬间会出现基线漂移影响SoT判断。3.3 PCB走线注意事项这套电路能不能成PCB走线的分量可能比原理图还重要。我的经验是隔直电容要尽量靠近FPGA引脚MIPI源端到电容之间的走线要严格按照差分100Ω阻抗控制FPGA引脚到电容之间也要按100Ω阻抗做避免阻抗突变。整段走线不要打孔不要走直角在关键位置预留串阻位置方便调试时调整端接强度。如果只是学习验证用开发板就无所谓这些内部DIFF_TERM加隔直电容不焊接都可能直接通过。但要做正经板卡这些细节决定了你能跑300Mbps还是800Mbps。3.4 什么情况可以省掉外部电路直接用DIFF_TERM如果MIPI摄像头和FPGA的开发板硬件已经布好了不想动烙铁低速率下可以直接启用FPGA内部DIFF_TERM。这个终端电阻大约100Ω省掉外部100Ω电阻在Vivado里只需要给端口加一条约束set_property DIFF_TERM TRUE [get_ports dphy_clk_p] set_property DIFF_TERM TRUE [get_ports dphy_data_p]甚至IOSTANDARD可以直接设成LVDS_18。但你要心里有数这样做的代价是没有外部偏置网络输入共模完全靠LVDS接收器自己飘温度一变就很容易出问题。建议只用于原型验证量产板卡还是把阻容网络做上去。4. FPGA内部数据接收逻辑从IBUFDS到ISERDESE2的关键细节4.1 顶层结构与时钟通道设计MIPI DPHY接收端在FPGA内部大致分三块时钟通道、数据通道、状态检测逻辑。时钟通道相对简单差分时钟进入FPGA后经过IBUFDS转成单端时钟再接BUFG进入全局时钟网络用来驱动所有数据通道的ISERDESE2。这里有个关键点7系列FPGA内部有BUFIO和BUFG两套资源BUFIO能把IO时钟直接送到相邻的ISERDESE2延迟更短适合对时序收敛要求高的场景。我们这边速率不算特别高用BUFG也能稳定跑但真正的高速设计建议用BUFIO。ISERDESE2本身还需要一个IDELAYCTRL参考时钟一般给200MHz用于校准IDELAYE2的延迟分辨率。IDELAYCTRL的复位时序容易被人忽略它需要在外部输入时钟稳定之后才能释放复位否则延时链的tap值会完全不准。4.2 为什么非要用ISERDESE2而不是直接在寄存器里采数MIPI HS模式下数据通道是DDR传输也就是时钟的上升沿和下降沿都要采样数据。如果直接写寄存器去采综合器会生成大量查找表加触发器的逻辑路径时序收敛非常困难而且很难保证两条相邻Lane之间的偏斜控制。7系列FPGA的IOB里已经内置了ISERDESE2它天生就是干这个的能在一个IO上完成串并转换输出并行位宽可配通常用8位或10位。初学FPGA的人最容易犯的错误是试图在逻辑代码里写一个带时钟上下沿采样的always块然后抱怨时序收敛不过。正确做法是例化原语让硬件资源去做这件事。4.3 数据通道的Verilog骨架我贴一段自己调通用的数据通道例化框架。时钟通道先通过IBUFDS和BUFG后进入ISERDESE2的CLK输入数据通道经过IBUFDS后先接IDELAYE2做延迟微调再由ISERDESE2完成DDR采样。// 差分时钟输入 IBUFDS #( .DIFF_TERM(TRUE), .IOSTANDARD(LVDS_18) ) u_ibufds_clk ( .I(dphy_clk_p), .IB(dphy_clk_n), .O(clk_int) ); BUFG u_bufg_clk ( .I(clk_int), .O(clk_mipi) ); // 差分数据输入 IBUFDS #( .DIFF_TERM(TRUE), .IOSTANDARD(LVDS_18) ) u_ibufds_data ( .I(dphy_data_p), .IB(dphy_data_n), .O(data_int) ); // 可调延迟链 IDELAYE2 #( .IDELAY_TYPE(FIXED), .DELAY_SRC(IDATAIN), .IDELAY_VALUE(tap_value), .REFCLK_FREQUENCY(200.0) ) u_idelay_data ( .IDATAIN(data_int), .DATAOUT(data_delayed), .C(idelay_ref_clk), .CE(1b0), .INC(1b0), .RST(1b0), .CNTVALUEIN(5b0), .CNTVALUEOUT(), .CINVCTRL(1b0) ); // DDR 串并转换 ISERDESE2 #( .DATA_RATE(DDR), .DATA_WIDTH(8), .INTERFACE_TYPE(NETWORKING), .DYN_CLKDIV_INV_EN(FALSE), .NUM_CE(1) ) u_iserdese2_data ( .D(data_delayed), .DDLY(1b0), .CE1(1b1), .CE2(1b1), .CLK(clk_mipi), .CLKB(clk_mipi), .RST(1b0), .CLKDIV(clk_div4), .O(), .Q1(q1), .Q2(q2), .Q3(q3), .Q4(q4), .Q5(q5), .Q6(q6), .Q7(q7), .Q8(q8), .SHIFTOUT1(), .SHIFTOUT2(), .SHIFTIN1(1b0), .SHIFTIN2(1b0), .BITSLIP(bitslip) );注意几个细节。CLK和CLKB在DDR模式下通常直接接同一个时钟由ISERDESE2内部自己处理上下沿。DATA_WIDTH设成8位意味着一个时钟周期内能接收8个串行bit。BITSLIP用于字对齐当发现解出来的字节对不上协议里的同步字时通过拉高一次BITSLIP来滑动一位。IDELAYE2的IDELAY_VALUE是一个5位数值对应的延迟时间由IDELAYCTRL参考时钟决定200MHz参考时每个tap约78ps。调这个值就能微调采样窗口后面实测部分会详细展开。4.4 LP状态检测与SoT识别只靠差分通道接收HS信号是不够的你还需要知道HS突发何时开始。LP状态检测一般做法是把Dp或Dn直接接到普通单端IO用LVCMOS18或LVCMOS12标准接收。注意这里不能直连到单端IO因为MIPI DPHY总线上同时存在1.2V和200mV差分两种状态如果直接把Dp和Dn接到普通IO会破坏差分线上的阻抗匹配需要加隔离电阻或比较器缓冲。在原型阶段我加了一级施密特触发器缓冲器型号是SN74LVC1G17输出再接FPGA普通IO。逻辑上通过实时检测Dp/Dn的电平组合来判断状态LP-11是Dp和Dn都为高LP-01是Dp为高Dn为低LP-00是两个都为低。检测到LP-01和LP-00之后再过一段固定延时就可以认为HS数据马上到此时把ISERDESE2的复位释放开始正常接收。// 简化的SoT状态检测 always (posedge clk_sys) begin if (!dp_state !dn_state) // LP-00 sot_start 1b1; else if (hs_data_valid) sot_start 1b0; end实际工程里这个状态机比这要复杂一些还要考虑EoT结束、超时异常等场景。但核心逻辑就是这个LP状态判断是开启HS接收的钥匙。5. 实测踩坑记录从336Mbps调到1.2Gbps遇到的问题5.1 第一次直连成功但误码率很高我最初为了验证FPGA侧逻辑拿着手头开发板直连了一颗720p30的MIPI摄像头单LaneHS速率约336Mbps。按照之前的“直连也能跑”思路直接用IBUFDS加DIFF_TERMIOSTANDARD设LVDS_18。结果很顺利ILA抓到了看起来正常的像素数据但仔细比对后发现图像上偶尔会出现随机噪点。用ILA持续抓取格式化后的数据流发现这些噪点并不是像素本身的错误而是字节对齐偶发滑移。每过几万行数据就会出现一次的位错位导致后面的整包数据全歪。这其实就是IDELAYE2采样点没有对准数据眼图中心的典型症状高速信号在PCB上传输后产生抖动采样点一旦落在边沿附近就会采到不确定值。5.2 换成1.2Gbps后彻底翻车后来我把摄像头模组换成一个1080p60的4-Lane模组单Lane速率超过1Gbps。直连方案直接报废ILA里连稳定的同步字都找不到。这时候我不得不把外部偏置网络焊接上去。焊完后1Gbps速率仍然不太稳定后来用示波器测偏置电压发现0.9V纹波到了60mV。问题就出在VCCO 1.8V分压的偏置电路上分压电阻的噪声直接耦合进了信号通道。我重新用低噪声LDO单独给了偏置网络供电纹波压到5mV以内1Gbps才终于稳定下来。这笔学费交得值任何外部偏置网络电源质量直接决定信号质量不能省。5.3 DIFF_TERM与外部100Ω同时使用的阻抗陷阱这是最容易被疏忽的坑。一开始外部电路做上去之后我忘了关掉FPGA内部的DIFF_TERM结果等效差分阻抗是100Ω并联100Ω也就是50Ω。MIPI源端是按100Ω设计的看到50Ω负载驱动电流不变电压摆幅直接减半。信号到了FPGA引脚本来就只有约140mV再减半只剩70mV已经快要低于LVDS接收器的可靠阈值。排查过程也很费劲因为现象是“能连但偶发误码”一度怀疑是IDELAYE2没调好。后来把内部DIFF_TERM关闭误码率立刻下降了一个数量级以上。以后做板子务必记住用外部终端时内部DIFF_TERM必须设为FALSE。5.4 我的调试流程与工具组合如果你也准备走方案B我这里有一套亲测有效的调试流程。先把数据通道IDELAYE2的taps值全部设成0看能不能解出数据。能解出来说明电平转换和时钟通道基本没问题解不出来先检查IBUFDS、BUFG、IDELAYCTRL复位时序。然后通过VIO手动扫描IDELAYE2的tap值每改变一次tap用ILA抓一段数据统计同步头正确率。一般来说tap值在某个区间内正确率都高这个区间就是眼图的平顶部分选区间中心值作为最终配置。最后长时间跑数据检查是否出现偶发的同步字丢失。如果丢了优先检查偏置电源纹波其次是地平面分割。有一个小工具组合我很推荐Vivado的ILA加VIO配合使用一个用来抓数据一个用来在线改延迟值。改完tap值不用重新编译几分钟就能完成一轮扫描。6. 选型建议与扩展方向开发板实验和生产项目怎么选6.1 学习原型验证怎么选如果你的目标是先跑通MIPI摄像头采集流程验证图像算法那方案B绝对够用。不用在电平转换上花太多钱也不需要复杂的外部电路很多时候开发板现有接口直接用DIFF_TERM就能跑起来。此时重点应放在FPGA逻辑侧比如怎么解析CSI-2的包结构、怎么判断Frame Start和Line Start、怎么把提取出来的图像数据缓存到DDR。你甚至可以先用一个低速的廉价摄像头把整个处理链路跑通再决定要不要上高速多Lane的模组。6.2 批量产品方案定型怎么选批量产品我的建议是除非你对自己的PCB设计能力非常有信心而且EMC测试标准不高否则优先考虑专用桥接芯片或串行器/解串器方案。一颗桥接芯片虽然贵但能省掉大量的射频调试时间产品一致性也更容易保证。7系列FPGA的IO理论上可以做到1.25Gbps的DDR接收但MIPI DPHY的200mV低共模、LP/HS快速切换这些条件叠加在一起做产品时要留出至少20%的降额。标称1Gbps的Lane按800Mbps设计这样即使温度变化、PCB批次有波动仍然有足够余量。6.3 后续升级到Zynq UltraScale的差异如果你在规划下一代平台值得知道的是Zynq UltraScale MPSoC里部分型号集成了MIPI D-PHY硬核PL侧可以直接调用Vivado里的MIPI CSI-2和DSI IP核不再需要外部电平转换。这个硬件基础带来的体验完全是另一个等级。但如果没有条件换平台只能在7系列上做那这篇文章里的阻容偏置网络方案就是最现实的选择。即使到了1Gbps以上速率只要做好以下几点严格的差分阻抗控制、低噪声偏置电源、独立完整的电源平面、可靠的IDELAYE2校准逻辑7系列FPGA依然能跑出非常稳的结果。我在实际验证里还发现一个经验MIPI摄像头模组厂商手册里写的Vcm和Vod范围和你选用的FPGA差分IO手册里的VICR和差分阈值范围这两个数据一定要在原理图阶段就放在同一张表里对比。两者之间的差距就是外部偏置电路必须补上的余量。这个习惯帮我避掉了很多改板的麻烦做接口设计越早发现电气不匹配后面越省心。
返回列表