ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

FPGA图像采集:MIPI CSI-2 RX Subsystem系统工程搭建与调试指南

2026/9/2 5:52:08 拓冰建站 浏览量
FPGA图像采集:MIPI CSI-2 RX Subsystem系统工程搭建与调试指南 简介这是一份基于Xilinx FPGA的MIPI CSI-2接收子系统完整工程面向嵌入式视觉开发者和FPGA工程师用于在Zynq UltraScale平台zyqnmp上实现摄像头图像采集并转换为HDMI输出。工程已在实际硬件上调试通过覆盖MIPI D-PHY物理层解码与CSI-2协议层处理包含lane同步、错误检测、数据重组等关键环节标签中的Xilinx IP核与配套硬件配置参数可帮助快速移植与验证。压缩包共2000个文件约287MB。文件类型以C/H源码、VHDL/Verilog硬件描述、XDC约束、DCP网表、XCI核配置为主同时包含大量脚本与工程构建文件Tcl/Makefile以及BIT、XSA等可烧写镜像便于阅读工程结构和直接上板测试。已有2982人学习下载。通过该工程可掌握MIPI CSI-2子系统的搭建流程、IP核集成方法、Zynq平台PS-PL协同配置以及从MIPI输入到HDMI输出的完整视频通路设计思路尤其适合希望基于Xilinx平台快速入门MIPI接口开发的工程师参考。 从事FPGA图像采集开发的朋友对mipi_csi2_rx_subsystem这个Xilinx IP核应该不陌生。最近我在调试一个基于MIPI CSI-2接口的摄像头输入项目整个系统工程搭建、验证、调试一轮走下来踩了不少坑也积累了一些经验。这篇文章就把这套mipi_csi2_rx_subsystem系统工程的完整搭建思路、IP配置细节、地址映射方法以及调试技巧做一个梳理给正在做类似项目的开发者一些参考。在正式开始之前我先交代一下这套系统的目标通过MIPI CSI-2接口接收摄像头传感器输出的RAW图像数据经过协议解析、像素重组后通过AXI4-Stream接口送入DDR供后续ISP或显示模块使用。整体架构选型是Xilinx Zynq UltraScale MPSoC平台开发工具是Vivado 2020.1MIPI IP核版本为MIPI CSI-2 RX Subsystem v3.1。1. 系统整体设计与方案选型1.1 MIPI CSI-2协议基础回顾MIPI CSI-2是摄像头串行接口标准物理层采用D-PHY数据通路包含1条时钟lane和1到4条数据lane。每条lane都是差分信号对高速传输时时钟频率可达1Gbps以上。在搭建mipi_csi2_rx_subsystem系统工程之前必须先搞清楚几个关键概念Lane速率与像素时钟的关系数据吞吐量由lane数量、lane速率和像素位宽共同决定。以1080p60fps、RAW10格式为例一帧图像需要传输约1920x1080x10bit20.7Mbit数据加上blanking开销实际需要约25Mbit。在4条lane、每条1Gbps的配置下一帧传输时间约为6.25ms满足60fps的16.7ms帧周期要求。数据类型Data TypeCSI-2协议通过4字节包头标识数据类型比如RAW8对应0x2ARAW10对应0x2BRAW12对应0x2CYUV422 8bit对应0x1E。IP核内需要正确配置数据类型否则解析出来就是乱码。我不建议直接跳过协议细节直接上手配置IP因为后续调试图像花屏、数据错位时很多问题都要回溯到协议层面排查。哪怕你想快速跑通也值得花半小时把上面这几个概念过一遍。1.2 为什么选择Xilinx MIPI CSI-2 RX Subsystem IP核现在的FPGA平台选择很多但Xilinx这套IP核在MIPI接收场景下几乎是事实标准。原因有三个第一它把D-PHY物理层和CSI-2协议层封装在一起在UltraScale平台上用户只需要配置参数不需要关心底层高速串行收发器的细节。我最初用纯RTL实现过CSI-2协议解析整个过程需要自己处理lane对齐、字节拆分、ECC校验工作量相当大。用官方IP核可以节省至少三周的开发时间。第二IP核提供了完整的AXI4-Stream输出接口可以直接对接VDMA或者自定义处理逻辑时序约束也已经在IP内部处理好不太需要担心跨时钟域问题。第三官方提供了example design可以在生成的例程基础上快速跑通硬件验证然后逐步替换成自己的逻辑。当然这套IP核也有一些限制。比如只支持D-PHY v2.0协议Vivado 2020.1及以前版本不支持C-PHY在7系列平台上物理层和协议层是分开的两个IP需要额外实例化MIPI D-PHY IP。如果用的是7系列上面这些说法要相应调整。1.3 顶层架构设计视图我搭建的系统架构可以分成三层来看物理接口层包括MIPI D-PHY、I2C配置接口用于初始化摄像头传感器、GPIO控制信号。IP协议处理层mipi_csi2_rx_subsystem内部完成lane管理、协议解析、像素重组、输出AXI4-Stream。数据搬运与存储层通过AXI VDMA把数据写入DDR或者连接自定义图像处理模块。实际项目中我还加了一条旁路把IP输出同时接到ILA调试核和VDMA输入这样在调试早期可以先看波形确认数据正确后再让VDMA搬运到内存。2. 核心配置细节与参数选择2.1 IP核参数配置详解在Vivado中添加MIPI CSI-2 RX SubsystemIP后需要配置的关键参数如下表所示配置项可选值我的选择及理由Data TypeRAW8/RAW10/RAW12等RAW10具体看传感器输出Number of Lanes1/2/44满足高帧率带宽需求Max Lane Rate100Mbps-1.5Gbps1Gbps留一定裕量且时序好收敛D-PHY Reference Clock200MHz/差分或单端200MHz差分板卡上有差分参考时钟源Pixel Format与Data Type匹配RAW10Transfer TypeFrame/Line/FrameLineFrameLine便于帧内提前处理Include CRC/ECC可选开启调试时必须这里我特别说下Max Lane Rate的选择。这个参数直接决定D-PHY内部逻辑的时钟频率。我最初的配置是1.2Gbps结果综合后时序违例300多皮秒排查了半天发现是lane速率太高导致D-PHY内部的byte clock时序收敛不了。后来降到1Gbps时序问题消失。如果你的传感器支持低速模式建议从低往高调稳定后再逐步提高。还有一点容易被忽略D-PHY Reference Clock并不等于lane速率。它是D-PHY内部PLL的参考时钟通常要求在200MHz左右不同IP版本可能要求不同。如果这个时钟不干净或者频率偏差太大D-PHY的PLL可能锁不住后面章节我会专门说这个问题。2.2 核心信号的时序关系说明理解IP核内部信号间的时序关系对配置和调试都有帮助。下面这张简化的时序关系图是这类系统的基础认知ref_clk ──► PLL ──► byte_clk (用于D-PHY并行侧) │ HS_data_lane[3:0] ──► Lane Alignment ──► Protocol Decode ──► Pixel Reassemble ──► AXIS需要注意的关键信号包括rxbyteclkhsD-PHY输出的字节时钟频率与lane速率相关1Gbps时对应125MHz。这个信号必须存在且稳定IP才能接收数据。csirxss_c1_axis_aclkAXI4-Stream侧的时钟。这个时钟不一定等于字节时钟协议层内部会做跨时钟域处理。csirxss_c1_axis_tdata位宽为Lanes*Pixel_Width/4RAW10、4lanes时为40bit实际上是4个像素拼接在一起。csirxss_c1_axis_tuser帧同步信号标识SOFStart of Frame和EOFEnd of Frame接入VDMA时注意tuser和tlast的配合关系。我实测下来tuser和tlast的组合有两种情况一是在每一行的行尾由tlast标识帧首行tuser拉高二是只有帧尾才拉tlast。具体由IP的Transfer Type配置决定。如果配置不对VDMA可能永远等不到一帧数据完成DDR里就什么也写不进去。2.3 DDR数据通路的地图与DMA设计MIPI CSI-2 RX Subsystem输出的AXI4-Stream数据通常需要经过VDMA搬运到DDR。这里有一个小技巧VDMA的配置可以参考下表参数值说明Stream Data Width40bit与IP输出位宽一致Memory Map Data Width64bit走AXI HP口位宽选64bit更高效Burst Size16AXI突发长度16性能较平衡Max Frame Store Number3~8取决于DDR带宽和帧率一般3够用主要看延迟容忍度Stride与像素宽度相关行对齐4000多字节时考虑128字节对齐DMA开始搬运前需要注意一个细节MIPI输出的像素是连续排列的可能和VDMA预设的行对齐方式不一致。比如VDMA默认按StrideFrameWidth*BytesPerPixel搬运但传感器输出的有效像素后可能跟着填充字节。如果配置没对齐图像整体会倾斜或者每一行开头出现色带。这类问题特别适合做在一种稳定环境下反复对比验证时排查。我在这个工程里由于传感器和VDMA都支持带宽自动协商直接把Stride设为有效行宽乘以每像素字节数绕开了填充字节的坑。如果你的传感器带填充字节就需要在数据通路中插入一个删字节模块或者把VDMA的Stride设成含有填充的宽度。3. 实操过程与工程搭建步骤3.1 基于Vivado创建系统工程整个mipi_csi2_rx_subsystem系统工程的搭建我建议按以下步骤推进每个步骤都验证通过后再进入下一步创建空工程选择目标芯片型号添加Zynq UltraScale MPSoCIP核。配置PS侧DDR、UART、I2C用于MIPI传感器配置确认PL侧FCLK_CLK0输出100MHz供IP核使用。添加MIPI CSI-2 RX SubsystemIP核按上文表格配置参数。添加AXI VDMAIP核连接MIPI IP的输出到VDMA的S_AXIS_S2MM端口。添加AXI Interconnect管理PS、MIPI IP寄存器接口、VDMA IP之间的连接。添加Processor System ResetIP核确保所有外设复位同步。创建顶层Wrapper文件手动把MIPI的物理引脚约束到对应的BANK。添加约束文件包括create_clock、set_input_delay等然后综合、实现、生成bitstream。这里有个经验第4步的VDMA连接时地址分配要避开PS侧的保留地址区域。我在第一次做的时候把VDMA寄存器接口分配在PS保留地址区域导致VDMA寄存器读写异常启动后就挂死排查花了一整天。3.2 约束和时钟管理方法MIPI接口的约束是整个工程最容易出问题的地方。物理引脚的约束相对简单关键在时钟约束。推荐的做法是# MIPI D-PHY参考时钟 create_clock -period 5.000 -name mipi_ref_clk [get_ports mipi_ref_clk_p] # 如果使用差分时钟直接用IP内部生成不需要额外约束重点说一下set_input_delay。MIPI是源同步接口数据信号相对时钟的时序关系由D-PHY spec决定。对高速lane来说数据有效窗口很小直接指定set_input_delay不是个好方法因为D-PHY IP内部已经做了眼图对齐外部约束只需要关注D-PHY参考时钟。另一个重点是复位顺序。mipi_csi2_rx_subsystem的复位需要满足至少16个时钟周期的低电平脉冲且复位释放需要和axis_aclk同步。我踩过一个坑上电后D-PHY还没初始化完成就给IP核复位导致IP内部的寄存器状态一直不对。后来在复位模块中加了延时逻辑确保D-PHY稳定后再释放复位。3.3 逻辑搭建与ILA调试流程在Vivado Block Design中完成连接后需要实例化一个ILA核监控关键信号。我的ILA接入信号是// 关键监控信号列表 csirxss_c1_axis_tvalid csirxss_c1_axis_tready csirxrss_c1_axis_tdata[39:0] csirxss_c1_axis_tuser csirxss_c1_axis_tlast csirxss_c1_axis_aclk mipi_phy_if_rxbyteclkhsILA深度设置成32768这样至少能捕获一行的数据。在调试阶段先抓波形确认4条lane是否对齐、数据类型是否正确、行同步信号是否正常再开始写软件初始化序列。这是一个又快又稳的顺序。硬件执行顺序上先把摄像头传感器配置好等待其输出MIPI信号然后观察ILA中的波形。如果rxbyteclkhs没有翻转说明D-PHY没有锁定到高速数据那大概率是物理连接或参考时钟问题。如果rxbyteclkhs有信号但tdata是0则需要检查数据lane是否对齐或者数据类型是否配置正确。4. 常见问题与调试技巧实录4.1 高频问题排查速查表现象可能原因排查方向D-PHY PLL锁定失败参考时钟频率不对或信号质量差用示波器确认参考时钟波形检查PLL配置是否匹配lane速率无HS数据输出lane速率配置太高D-PHY未锁定确认rxbyteclkhs是否存在调低lane速率测试图像花屏数据类型配置错误或lane对齐失败检查Data Type是否与实际传感器输出一致观察lane对齐状态寄存器只有首帧正常后续无数据VDMA描述符耗尽或中断处理异常检查VDMA中断设置、帧完成标志、缓冲描述符循环图像倾斜或颜色错乱Stride配置错误或像素位宽不匹配核对像素格式检查传感器输出填充字节情况时序不收敛lane速率过高或约束不完整调低lane速率检查D-PHY参考时钟约束尝试PR_TARGET_TABLE放置策略上面表格里第二行是我实际遇到最多的情形。有一次怎么调都不出数据最后发现是传感器出来的MIPI信号没有加端接电阻信号质量太差导致D-PHY无法锁定。FPGA和传感器之间的差分线最好加上100欧姆端接电阻这个细节特别容易被忽略。4.2 调试经历从无输出到图像稳定我再分享一次完整的调试经历可能对你的排查有参考价值。第一阶段硬件刚焊完上电后ILA中完全没数据rxbyteclkhs始终为0。排查顺序是先用示波器测ref_clk发现频率正常测差分数据lane发现传感器没有输出。最后定位到传感器没初始化MIPI接口在LP状态。所以MIPI调试前先确认传感器配置I2C是否正常回读寄存器这是最基础的一步。第二阶段传感器初始化为HS模式后rxbyteclkhs出现但ILA中数据全为0。分析后发现是4条lane的问题传感器默认只配置了1条lane而IP核配置了4条lane导致另外3条lane无法对齐。把传感器寄存器配置改为4 lane后数据开始正常输出。第三阶段数据有了但图像花屏。这个阶段最痛苦排查方向主要在像素重组和Stride配置。通过ILA抓取一整行数据逐字节分析发现数据中多了一些填充字节没有删掉就送进VDMA。加入删字节逻辑后图像正常显示。这是典型的三段式调试经历每次定位解决一个问题后面再遇到类似问题就能快速定位了。4.3 仿真与FPGA验证的衔接在修改IP配置、调整参数时建议先做仿真验证再上板。Xilinx提供example testbench,可以直接用于验证MIPI IP是否按预期工作。仿真时报文里重点看这几点mipi_phy_if_rxbyteclkhs是否有周期变化csirxss_c1_axis_tvalid是否拉高tuser和tlast是否与配置的行/帧模式匹配在仿真时把数据类型、lane数、帧格式参数确认清楚上板调试就能省掉大量时间。尤其是lane对齐逻辑仿真时看得非常清楚真实硬件上反而更难观察。另外还想说一个直接经验仿真和上板的现象并不同步。可能仿真完全正常上板却有各种信号质量问题这时候就需要按照时序分析、物理连接、信号质量的层次逐一排查不要盲目改RTL逻辑。5. 最终可复用的工程建议整个mipi_csi2_rx_subsystem系统工程做下来我最大的体会是这个IP核虽然封装好了协议解析但真正决定项目成败的往往是IP外围的设计包括摄像头初始化、时钟复位管理、DMA控制以及高速信号的物理完整性。如果你打算在新项目中使用这套方案我给出几个方向上的建议原理图阶段就考虑MIPI差分对的阻抗匹配和端接电阻BANK电压要和传感器IO电压匹配这个搞错了后面根本锁不定。软件层面先做一个最简的传感器寄存器读写测试确保I2C通路可靠再开始拉数据流。如果你没有用Xilinx平台而是准备自己在纯RTL里实现CSI-2接收大概可以按时钟数据恢复 - lane对齐/去偏斜 - 包头解析(ECC) - 像素重组 - AXI-Stream输出的结构划分模块这样每个模块独立验证最后系统联调时问题范围会小很多。如果你用的是已有传感器建议先去拿厂商的初始化序列配置寄存器不要自己盲目配很多寄存器的默认值本身就有问题。调试MIPI这类高速接口心态很重要链路里任何一个环节出问题都可能表现为没数据或花屏。我在实际项目中习惯把整个系统拆成若干可观测的小段每段用ILA或寄存器状态去验证这样排查问题时不用靠猜比频繁改代码盲试高效得多。这套工程本身不算复杂但要把线上环境、配置细节和异常场景都考虑到位确实需要些耐心。希望这篇文章能帮你少走一些弯路。本文还有配套的精品资源点击获取