尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

FPGA实现多路MIPI视频聚合:架构设计与实操要点

发布时间:2026/9/30 1:27:59

资讯中心
01
ARTICLE

FPGA实现多路MIPI视频聚合:架构设计与实操要点

FPGA实现多路MIPI视频聚合:架构设计与实操要点
1. 项目缘起与整体设计思路1.1 为什么需要多路MIPI视频聚合做视频采集项目的朋友大概率都遇到过这样的场景手头有好几路MIPI摄像头或者MIPI屏幕想同时接入一个处理平台结果发现主控芯片的MIPI CSI接口数量根本不够用。比如常见的SoC方案一般也就两路MIPI CSI输入想接四路、八路摄像头要么换更贵的芯片要么加桥接芯片成本和功耗都上去了。我最早接触这个需求是在一个工业检测项目里客户要求同时采集四路MIPI摄像头画面做实时拼接后输出到一块MIPI显示屏上。当时评估了几种方案用多颗SoC做分布式采集再汇总成本高且同步困难用专用视频聚合芯片灵活性差、参数改不了最后选定了FPGA方案原因很简单——FPGA的IO资源丰富MIPI D-PHY的Lane可以灵活分配而且能在片内做帧同步、格式转换、拼接等处理一颗芯片就能把多路视频聚合这件事从头包到尾。这个方案的核心价值在于把原本需要多颗芯片或者高端SoC才能完成的多路MIPI视频采集、聚合、输出任务用一颗FPGA搞定。适合做嵌入式视觉、工业相机、医疗内窥镜、车载多路环视等方向的开发者参考。1.2 整体架构怎么搭整个方案从信号流向上分三层输入层、处理层、输出层。输入层负责对接多路MIPI CSI-2信号。每一路MIPI包含1对时钟Lane和1到4对数据LaneFPGA这边需要用SelectIO或者专用的MIPI D-PHY硬核来接收。如果FPGA本身没有MIPI硬核就得用LVDS差分IO配合外部电阻网络来模拟D-PHY的电气特性这个后面会详细讲。处理层是FPGA内部逻辑核心模块包括D-PHY接收解析、CSI-2协议解码、像素格式转换、多路帧同步、DDR帧缓存读写仲裁、视频拼接或叠加。这里最关键的是DDR带宽分配和帧同步机制多路视频同时写入DDR如果仲裁没做好就会出现某一路丢帧或者画面撕裂。输出层根据实际需求可以是MIPI DSI输出到屏幕也可以是HDMI、LVDS或者通过USB/Ethernet传到上位机。如果输出也是MIPI那就需要D-PHY发送模块把聚合后的视频流按照DSI或CSI-2的格式发出去。选型上我建议优先考虑带有MIPI D-PHY硬核的FPGA比如Lattice CrossLink系列、紫光同创的某些型号或者Xilinx Zynq UltraScale里集成的D-PHY。如果没有硬核用普通FPGA的LVDS IO也能做但速率会受限通常单Lane能跑到800Mbps到1Gbps左右再高就吃力了。1.3 方案选型背后的取舍为什么不用现成的视频聚合芯片因为灵活性。专用芯片的输入路数、分辨率、帧率都是固定的项目一变就得换芯片。FPGA方案虽然开发周期长一些但一旦调通改几行参数就能适配新的摄像头和屏幕长期来看更划算。为什么不用多颗SoC同步问题。多颗芯片各自采集帧同步只能靠外部触发信号布线复杂且容易受干扰。FPGA内部所有逻辑跑在同一个时钟域下帧同步精度可以做到像素级。为什么DDR缓存是必须的因为多路视频的像素时钟和输出时钟通常不同源而且拼接处理需要缓冲几行甚至几帧的数据。没有DDR做帧缓存跨时钟域和帧率匹配根本做不了。这里DDR的带宽计算很关键后面会专门讲。2. 核心细节解析与实操要点2.1 MIPI D-PHY接收端的电气设计MIPI D-PHY的物理层是差分信号典型摆幅在200mV左右共模电压200mV。FPGA的普通LVDS IO通常支持差分输入但共模电压范围可能不匹配。我实测过几款FPGAXilinx 7系列的LVDS输入共模范围大概在0.3V到1.2V而MIPI的共模是0.2V直接接可能会识别不稳定。解决办法有两种一是用AC耦合电容加偏置电阻网络把共模抬到FPGA能接受的范围二是用专用的MIPI D-PHY电平转换芯片比如MC20901或者类似型号。前者成本低但调试麻烦后者省事但增加BOM成本。我个人的经验是如果Lane速率在800Mbps以下用AC耦合加电阻分压网络基本能稳定工作。具体电路是每对差分线串联100nF电容然后在FPGA输入端用两个10k电阻分压到0.6V左右的共模。这个参数不是固定的需要根据实际FPGA的IO特性微调。注意MIPI的时钟Lane是差分时钟但很多FPGA的LVDS输入需要时钟走专用的时钟引脚不能随便用普通IO。布线时一定要查手册确认哪些引脚支持高速差分时钟输入。2.2 CSI-2协议解码的关键点MIPI CSI-2协议分三层物理层、协议层、应用层。FPGA要处理的是协议层核心是解析数据包。CSI-2的数据包有短包和长包两种短包用于帧同步和行同步长包携带实际像素数据。短包格式是4字节包头加4字节数据包头里包含数据类型和虚拟通道号。长包格式是4字节包头加2字节字数加有效载荷加2字节CRC。FPGA解码时首先要从D-PHY的字节流里找到包边界这通常靠检测同步码来实现。同步码是0xB8开头的特定序列连续出现多次表示帧开始或行开始。我一般会在FPGA里做一个状态机先搜索同步码锁定后开始按包格式解析。这里有个坑不同摄像头的同步码重复次数可能不同有的发8次有的发4次代码里要做兼容。虚拟通道号是多路聚合的关键。CSI-2协议支持4个虚拟通道每路摄像头可以分配不同的通道号。FPGA解析时根据通道号把数据分发到不同的缓存区。如果摄像头不支持虚拟通道配置那就只能靠物理接口来区分每路单独接一组Lane。2.3 DDR帧缓存与带宽计算多路视频聚合最吃资源的就是DDR带宽。假设四路1080p60的视频每路像素时钟148.5MHzRGB888格式那么单路带宽是148.5M × 24bit 3.564Gbps。四路就是14.256Gbps。这还只是写入带宽加上读出带宽DDR实际需要承担28.5Gbps左右的数据吞吐。DDR3-1600的 theoretical 带宽是12.8GB/s也就是102.4Gbps看起来够用。但实际有效带宽通常只有60%到70%也就是60到70Gbps。所以四路1080p60用DDR3是够的但如果路数再多或者分辨率再高就得考虑DDR4或者用多片DDR。带宽计算有个经验公式总带宽 路数 × 分辨率宽 × 分辨率高 × 帧率 × 像素位宽 × 2读写各一次。这个结果再除以0.65的DDR效率系数就是实际需要的DDR带宽。选型时留30%余量比较稳妥。帧缓存的组织方式我习惯用乒乓缓冲每路视频分配两个帧缓冲区写入当前帧时读出上一帧。这样读写不会冲突但DDR占用翻倍。如果DDR容量紧张可以用行缓冲加仲裁的方式只缓存几行数据但逻辑复杂度会上升。2.4 多路帧同步的实现多路视频聚合最怕的就是画面撕裂或者不同步。如果四路摄像头各自为政拼接出来的画面就会有的快有的慢。帧同步的目标是让所有路的数据在同一帧周期内对齐。硬件上如果摄像头支持外部触发可以用FPGA发一个统一的帧同步信号给所有摄像头让它们同时开始曝光。但很多MIPI摄像头不支持外部触发那就只能靠软件同步。软件同步的做法是FPGA检测每路视频的帧起始信号记录时间戳然后在DDR缓存里做对齐。具体来说选一路作为主路其他路的数据写入DDR后读出时根据主路的帧号来调度。如果某一路慢了就重复上一帧或者丢帧保证输出画面的连续性。这个机制需要FIFO来做跨时钟域缓冲每路视频的像素时钟可能不同写入DDR前要先转到统一的DDR时钟域。FIFO深度至少要能缓冲一行数据1080p一行是1920像素RGB888就是5760字节FIFO深度选8192比较安全。3. 实操过程与核心环节实现3.1 硬件选型与连接我这次用的平台是Xilinx Zynq-7020PL端有足够的LVDS IOPS端可以跑Linux做上层控制。四路MIPI摄像头通过FMC接口接入每路用2对数据Lane加1对时钟Lane速率配置在800Mbps。摄像头选的是OV5640支持MIPI CSI-2输出分辨率1080p30。四路同时工作每路像素时钟74.25MHzRGB565格式单路带宽74.25M × 16bit 1.188Gbps四路合计4.752Gbps。DDR3-1066的带宽是8.5GB/s也就是68Gbps余量充足。连接上要注意MIPI差分线必须等长误差控制在5mil以内。我见过因为差分线不等长导致眼图闭合、误码率飙升的案例。PCB叠层要保证差分阻抗100欧姆通常用4层板的话差分线走在顶层或底层参考层完整。电源方面MIPI D-PHY的1.2V和1.8V要干净纹波控制在50mV以内。我一般会在每路MIPI连接器旁边放一颗LDO专门供电避免数字噪声串扰。3.2 FPGA逻辑设计与关键代码整个FPGA工程分几个模块D-PHY接收、CSI-2解码、帧缓存控制、视频拼接、D-PHY发送。这里重点讲D-PHY接收和CSI-2解码。D-PHY接收用SelectIO的ISERDESE2原语把串行差分数据转成并行字节。Xilinx有现成的MIPI D-PHY接收IP但需要License。如果不想买IP可以自己写。核心是IDELAY和ISERDES的配合IDELAY用来做位对齐ISERDES做串并转换。位对齐是个细致活。MIPI的D-PHY没有单独的同步时钟接收端要靠训练序列来对齐。我一般用伪随机序列做训练FPGA发一个已知模式接收端调整IDELAY的tap值直到误码率最低。这个过程可以手动也可以自动自动的话写个状态机扫描所有tap值选误码最少的。CSI-2解码的状态机大概长这样// 简化的CSI-2包解析状态机 localparam IDLE 0, SYNC 1, HEADER 2, PAYLOAD 3, CRC 4; reg [2:0] state; reg [7:0] byte_cnt; reg [7:0] packet_type; reg [1:0] virtual_ch; always (posedge clk) begin case(state) IDLE: if (sync_detected) state SYNC; SYNC: if (byte_cnt 3) begin packet_type data_in; state HEADER; end HEADER: begin virtual_ch data_in[7:6]; byte_cnt byte_cnt 1; if (byte_cnt 7) state PAYLOAD; end PAYLOAD: begin // 根据packet_type分发数据 if (byte_cnt word_count) state CRC; end CRC: state IDLE; endcase end这段代码只是框架实际还要处理字节序、CRC校验、错误恢复等。虚拟通道号在包头的高2位根据这个把数据写到不同的FIFO。3.3 DDR读写仲裁与帧缓存管理DDR控制器我用的是Xilinx的MIG IP配置成64位位宽1066Mbps。用户接口是AXI4需要自己写一个仲裁器把四路视频的写请求和一路读请求调度到AXI总线上。仲裁策略我用的是加权轮询每路视频分配一个权重权重根据帧率动态调整。比如某一路帧率高就多给它一些带宽。具体实现是一个令牌桶每路有独立的计数器计数器到阈值就发起一次突发写。突发长度选64比较合适因为DDR的页大小通常是1KB到2KB64个64位数据正好是512字节不会跨页太频繁。实测下来64突发比16突发的效率高20%左右。帧缓存的地址分配要规划好。我习惯把DDR分成几个区域每路视频两个帧缓冲区加上一个输出帧缓冲区。地址按2MB对齐方便计算。比如四路视频每路两个1080p RGB565帧一帧是1920×1080×2 4.147MB取整到4MB。那么每路占8MB四路32MB输出帧再占4MB总共36MB。DDR3容量512MB绰绰有余。3.4 视频拼接与输出拼接逻辑相对简单就是把四路视频按2×2排列输出分辨率3840×2160。每路视频从DDR读出后根据输出像素坐标判断属于哪一路然后从对应的FIFO取数据。输出时序要重新生成。3840×216030的像素时钟是297MHzDDR读出带宽要跟上。我算了一下输出带宽是297M × 16bit 4.752Gbps和输入总带宽一样。DDR读写加起来9.5GbpsDDR3-1066的68Gbps带宽完全够用。MIPI DSI发送端用硬核或者自己写。我用的是Zynq的DSI硬核配置成4 Lane每Lane 800Mbps总带宽3.2Gbps够传1080p60。如果要传4K就得用更多Lane或者提高速率。提示MIPI DSI的初始化序列很长不同屏幕的初始化参数不一样。我一般先用厂家提供的初始化代码然后在FPGA里用ROM存起来上电后通过DSI的通用写命令发出去。4. 常见问题与排查技巧实录4.1 MIPI接收不稳定怎么办这是最常见的问题表现是画面花屏、闪烁或者完全没信号。排查思路从物理层往上走。先看眼图。如果有示波器直接测MIPI差分线的眼图看张开度。眼图闭合通常是阻抗不匹配或者线太长。我遇到过因为FPC排线太长导致信号衰减的案例换了短排线就好了。再看IDELAY的tap值。如果tap值在边界附近说明位对齐不稳定。可以写个简单的误码测试发已知模式统计误码率。误码率高于1e-6就要重新调tap。还有可能是共模电压不对。用万用表测FPGA输入端的共模电压应该在0.5V到1V之间。如果偏低调整偏置电阻。4.2 DDR带宽不够导致丢帧丢帧的表现是画面卡顿或者某一路视频不同步。先算带宽确认理论值够不够。如果理论值够但实际丢帧那就是仲裁没做好。我一般用Xilinx的Vivado ILA抓AXI总线的握手信号看是否有长时间的空闲。如果某一路的写请求一直被压制说明权重分配不合理。调整令牌桶的阈值给那一路更多带宽。还有一种可能是DDR的刷新周期太频繁。DDR3的刷新间隔是7.8us刷新时总线会被占用。如果视频带宽接近DDR极限刷新就会导致丢帧。解决办法是提高DDR速率或者降低视频分辨率。4.3 画面撕裂与同步问题画面撕裂通常是帧同步没做好。检查每路视频的帧起始信号是否对齐。如果摄像头不支持外部触发就在FPGA里做软同步。软同步的做法是每路视频写入DDR时带上帧号读出时比较帧号。如果某一路的帧号落后超过1就重复上一帧。这个逻辑用一个小状态机就能实现。还有一种可能是FIFO深度不够。如果FIFO满了数据就会丢。用ILA抓FIFO的满信号如果频繁拉高就加大深度。4.4 常见问题速查表问题现象可能原因排查方法解决措施画面花屏位对齐错误测误码率调整IDELAY tap无信号共模电压不对测输入端电压调整偏置电阻丢帧DDR带宽不足抓AXI总线调整仲裁权重画面撕裂帧同步失败比较帧号加软同步逻辑颜色不对像素格式错查CSI-2数据类型修改解码逻辑屏幕不亮DSI初始化失败抓DSI命令检查初始化序列4.5 实操心得与避坑技巧第一个坑MIPI的Lane极性。有些摄像头的Lane是反的P和N接反了。虽然差分信号理论上反接也能工作但眼图会变差。布线时一定要确认极性。第二个坑CSI-2的虚拟通道号。不是所有摄像头都支持虚拟通道有的固定为0。如果多路摄像头都用通道0FPGA就分不清是哪一路。这时候只能靠物理接口区分每路单独接一组Lane。第三个坑DDR的地址映射。MIG IP的地址映射方式有几种选错了会导致带宽下降。我一般用Bank-Row-Column的映射这样连续地址访问效率最高。第四个坑时钟域 crossing。多路视频的像素时钟和DDR时钟不同源跨时钟域时一定要用异步FIFO。我见过用同步FIFO导致数据丢失的案例查了好久才发现是时钟域问题。第五个坑MIPI DSI的时序参数。不同屏幕的时序参数不一样HSYNC、HYSYNC、HBP、HFP这些值要按屏幕手册来。填错了屏幕就不亮或者偏移。最后分享一个小技巧调试MIPI的时候先用低速率跑通再逐步提高。比如先跑200Mbps确认链路稳定后再提到800Mbps。这样出了问题容易定位是逻辑问题还是信号完整性问题。这个方案后续还可以扩展比如加入图像处理算法做实时美颜或者目标检测或者用多颗FPGA级联支持更多路视频。DDR带宽如果不够可以换成DDR4或者用HBM。输出接口也可以换成HDMI或者DisplayPort适配不同的显示设备。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。