ARTICLE DETAIL

资讯详情

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

RK3588+FPGA实现Camera Link工业相机接入与MIPI CSI-2转换方案

RK3588+FPGA实现Camera Link工业相机接入与MIPI CSI-2转换方案 先说一个很多人都踩过的坑当你拿着一台Camera Link接口的工业相机想接进RK3588嵌入式平台做实时AI检测第一反应往往是搜“RK3588支持Camera Link吗”。答案显然不支持因为RK3588原生只给到了MIPI CSI-2、DVP这类接口和Camera Link的电平、协议完全不沾边。直接拿转接卡转出来的信号CK/数据线对不齐画面花成一团是常态更别说在高帧率下稳定跑。这时候“RK3588FPGA”就成了一个绕不开的经典组合FPGA负责把Camera Link这种高速并行/串行信号接下来做格式转换和缓冲再通过MIPI CSI-2喂给RK3588。这篇文章就是一份基于实际项目的保姆级选型和配置指南适合正在做机器视觉、工业缺陷检测、运动分析这类项目的工程师参考。1. 方案怎么来的为什么非要RK3588FPGA1.1 一个真实的使用场景我接到的需求是给一条产线做视觉检测相机用的是某品牌500万像素Camera Link接口的CMOS工业相机目标帧率要求120 fps。如果按RGB888粗略一算500万像素 120fps 600M像素/秒一个像素按3字节算就是1.8GB/s的数据量。这个带宽用普通USB3.0相机很难稳定用GigE更是直接爆掉。工业上选Camera Link就是因为它在短距离、高帧率、高像素格式下仍然有非常充裕的带宽余量。但问题马上就来了RK3588本身是块好料8核CPU、6 TOPS NPU、4路MIPI CSI-2输入理论上做图像AI推理非常合适但它就是不认Camera Link。市面上的Camera Link采集卡大多是基于PCIe的插不到RK3588这种嵌入式主板上。所以只能用FPGA做一个“翻译官”Camera Link进来MIPI CSI-2出去中间还能顺便做一下图像预处理把后续算力压力降下来。1.2 方案选型的核心逻辑既然要让FPGA和RK3588协同工作首先要搞清楚两者各自擅长什么。FPGA适合做底层数据接入和确定性时延工作。Camera Link的LVDS串行信号恢复、数据对齐、像素组合、行场同步提取这些如果在CPU里做根本来不及但在FPGA里做就是一个标准的解串逻辑加状态机的事每像素的时钟周期都可预测。RK3588适合做算法和系统调度。图像数据通过MIPI进到RK3588后可以直接走v4l2框架进内存再分配给NPU做目标检测、分类或者用CPU侧跑视觉SLAM、工业测量。相比单独用FPGA跑算法逻辑资源消耗巨大而且开发效率低RK3588这边明显更灵活。不过选RK3588而不是更便宜的RK3568或者更老的RK3399主要看两点一是MIPI CSI-2路数和带宽RK3588给了4路组合CSI接口配置得当可以接多个相机二是NPU算力确实高FPGA做完数据预处理之后AI推理可以完全交给NPU跑整个系统负载很均衡。1.3 数据流向概览实际链路大致是Camera Link相机 → MDR26线缆 → FPGA板卡上的解串芯片或直接LVDS接收 → FPGA内部做比特对齐、像素组合、FVAL/LVAL/DVAL解析 → 转成RGB/RAW数据 → 按MIPI CSI-2协议打包 → RK3588的CIF/CSI-2控制器 → 内存 → 应用层或NPU。这个方案里最核心的两个关键点一个是物理层信号完整性另一个是FPGA到RK3588之间的协议匹配。这两块只要有一个没考虑到位后面调试就会非常痛苦所以下面的选型和接口配置部分我会写得细一些。2. 硬件选型Camera Link相机、FPGA、RK3588板卡怎么挑2.1 先说Camera Link接口本身的规格做方案之前至少要把Camera Link的基本规则搞清楚。Camera Link标准是AIA制定的底层是基于Channel Link技术用LVDS差分信号传输。根据数据位宽不同分成三种配置Base、Medium、Full。配置数据通道数有效数据位宽连接器典型应用Base1组4对数据LVDS 1对时钟LVDS24位数据 3位控制FVAL/LVAL/DVAL单个MDR26中等分辨率/帧率相机Medium2组8对数据 2对时钟48位数据 6位控制两个MDR26高分辨率/较高位深Full3组12对数据 3对时钟80位数据三个MDR26超高分辨率/高帧率Base配置里一组数据LVDS对应7位数据6位有效1位控制3组就是18位有效3位控制再加上前面说的24位数据和3位控制这里一个字一个坑实际Camera Link Base的数据线总共是28bit输入到并串芯片如DS90CR287拆成4对LVDS输出其中3对是数据1对是时钟。这28bit里24bit是像素数据3bit分别是FVAL帧有效、LVAL行有效、DVAL数据有效还有1bit保留。所以常见的“Base最大带宽容积2.04Gbps”就是这么来的时钟最高85MHz乘以24bit数据位。选相机时我不建议只看分辨率一定要把像素时钟和配置版本一起算进去。比如1280×1024200fps的黑白相机如果像素输出是8bit那有效数据率是1280×1024×200≈262M像素/秒Base在85MHz时钟下能跑到2.04Gbps即255MB/s图像有效数据206MB/s再加消隐区开销很容易就超了所以这种相机通常标的是Medium或者Full配置。反过来如果是1920×108060fps的RGB888相机那是1920×1080×60×3≈373MB/sBase就彻底带不动就别想着省成本用单根线了。2.2 FPGA选型别只看逻辑量FPGA选型是这个项目里最容易翻车的一环。很多人一看数据量觉得随便找个中端FPGA就行结果布局布线完发现LVDS引脚不够、或者MIPI输出引脚所在的Bank电平标准不匹配整个方案作废。选型我建议优先考虑这几点是否有足够支持LVDS的IO Bank。Xilinx家的FPGA要分HR和HP BankLVDS电平标准一般放在HR Bank上HP Bank虽然性能高但默认是1.2V/1.5V电平用LVDS要仔细看参考电压配置。高云GW2A/GW5A、紫光同创、易灵思这些国产FPGA也有对应的LVDS Bank需要查数据手册确认。是否有MIPI D-PHY硬核或者可靠的软核方案。MIPI CSI-2发送端不是简单拉一对LVDS就能出来的它有专门的HS高速和LP低功耗状态机还要满足建立/保持时间。有些FPGA内部集成D-PHY硬核比如Xilinx部分Zynq UltraScale系列但常用的Artix-7更多是“软核方案”自己写或者买IP。逻辑资源能装下多少缓存。Camera Link进来的数据往往和MIPI出去的时钟域不一致RAW/RGB格式转换中间要放FIFO或者行缓存。如果是黑白8bit还好只需要行缓冲如果是彩色多路数据可能要用到RAM资源较多的芯片我更倾向于选带Block RAM容量大一点的型号。综合工具链是否顺手。有人用Xilinx Vivado有人用Intel Quartus有人用国产高云云源前期就要想好。我个人在这类场合更常用Xilinx Artix-7系列比如XC7A35T/75T原因很简单资料多、LVDS时序文档清晰、MIPI软核参考设计好找。当然如果你公司对国产化有要求高云GW5A系列也很能打逻辑资源和BANK配置都比较符合这类桥接应用。2.3 RK3588板卡与核心板选择RK3588这边反而选择相对简单。市面上已经有大量成熟核心板基于瑞芯微SDK自带MIPI CSI-2接口定义和Linux BSP。重点要注意三点MIPI CSI-2通道数是否全部引出、底板对应连接器是否做阻抗匹配、内核版本是否支持官方的csi2 dphy驱动。有些核心板把MIPI CSI复用成HDMI或者别的功能了接之前一定要查原理图。另外RK3588虽然标称MIPI CSI-2但实际接入时对D-PHY的连续时钟、lane数、数据率都有范围约束一般单lane建议跑到1.0~1.5Gbps总带宽够用即可不要盲目拉到极限。功耗也不能忽视RK3588算上NPU满负载大概10WFPGA核心板再加5W左右整机做工业应用一般要预留20W以上的散热能力。3. 接口配置实操从Camera Link到MIPI CSI-23.1 第一步先解串把LVDS里的图像数据抠出来Camera Link的信号链路里相机端会用一个并转串芯片比如DS90CR287把28bit并行数据变成4对LVDS串行信号发出来采集端就需要串转并芯片比如DS90CR288A把它恢复成28bit并行。FPGA可以直接不去用解串芯片用差分IO去接LVDS信号然后在逻辑里自己恢复时钟和数据这种做法能省一个芯片但对时序约束和信号完整性要求很高新手我不太推荐一上来就这么干。更稳妥的做法是买一块带Camera Link解串接口的FPGA子板品牌很多比如基于FMC接口的Cameralink子卡或者自己画板时放上DS90CR288A它输出28bit并行数据再加上一个像素时钟直接把并行数据和时钟接进FPGA普通IO接口就非常干净。DS90CR288A后端出来的28bit信号里需要关注的是XCLK像素时钟和LVAL行有效、FVAL帧有效、DVAL数据有效。很多FPGA示例代码会把这几个信号对齐处理但其实DS90CR288A的输出时序里LVAL/FVAL是相对像素时钟对齐的直接同步采样就行不需要额外做严格对齐。我自己这边更喜欢在FPGA里自己写解串逻辑因为能省掉前端芯片而且调试时可以随时抓内部比特位。核心代码就是找到每条LVDS通道的比特窗口先用一个固定数模比如接收0xAA55之类pattern做训练然后基于IDELAY调节每个bit的采样点再用ISERDES把串行数据拼回7bit并行。不同厂商的FPGA有不同原语Xilinx叫ISERDESE2高云里叫IDESLattice里有DQS逻辑用的时候查原语手册即可。3.2 第二步FPGA内部数据处理与格式对齐拿到28bit并行数据后接下来要做的就是把一个像素一个像素的格式对准。相机输出像素格式可能是8bit灰度、10bit灰度、12bit灰度、RGB888等不同格式在28bit里的摆放位置完全不同。我的建议是先把Camera Link相机的配置表拿过来对着数据手册把每个像素的bit位置画清楚尤其要注意高位和低位的顺序。以8bit灰度为例很可能28bit里一次塞了几个像素也可能是单像素加控制位。如果一次采样对应一个像素直接把8bit赋值给输出总线如果一次对应两个像素就要做一个1×2的字拼接然后分发到后续模块。最保险的办法是先用FPGA内部逻辑把FVAL和LVAL提取成往外的行场信号参考标准视频时序来重构这样后面做MIPI打包或者做处理都统一。跨时钟域问题在这里也要关注。Camera Link像素时钟可能是85MHz或更高而MIPI CSI-2发送端的高速字节时钟往往是按lane速率分出来的。两个时钟异步中间如果没有异步FIFO丢数据就是必然的。我通常会在FPGA里开一个异步FIFO写入侧用像素时钟读出侧用MIPI发送时钟深度取2048就够一行的数据缓冲具体看行长度。3.3 第三步MIPI CSI-2发送与RK3588接收FPGA把数据处理成一行一行的像素流之后就要按照MIPI CSI-2协议把它们打包发出去。MIPI CSI-2的链路结构是D-PHY物理层Lane协议层长包、短包应用层像素格式。FPGA里要发送的数据需要用8位为单位打包并且加上数据标识符Data Type和包尾校验。RK3588的CSI-2接收端能对接的常见数据类型包括RAW8、RAW10、RAW12、YUV422-8BIT、RGB888等。选型时就要把这层对应关系想好你的相机输出如果是Bitmap/8bit那MIPI端就配RAW8如果是Bayer RGB那就是RAW10或RAW12如果相机已经是RGB888MIPI端就配RGB888。不要贪图方便随意设成RAW8后面上位机拿到图像后颜色排列不对又是一轮排查。发送端硬件上FPGA的IO要接MIPI差分对。这里要注意MIPI不是直接用LVDS标准去驱动D-PHY在高速模式下更像电流型差分驱动但很多FPGA的LVDS IO在加串接电阻后可以兼容。我的建议是查FPGA厂商关于MIPI D-PHY的应用笔记Xilinx有XAPP894/XAPPxxx等高云也有对应MIPI参考设计。如果条件允许优先选用带D-PHY硬核的FPGA能省掉大量物理层烦恼。数据率也要算好。假设Camera Link进来是Base像素时钟80MHz24bit有效那么有效数据率就是1.92Gbps。MIPI这一侧用2 lane每lane最高跑1Gbps那么总吞吐只有2Gbps理论上够用但考虑到打包开销、消隐区、lane上效率只有9成左右最好多留余量。一般我建议Lane数向上取整比如1.92Gbps至少配4 lane每lane 1Gbps这时候D-PHY在800Mbps附近跑信号完整性压力小很多。3.4 第四步RK3588侧Linux配置FPGA到RK3588的物理链路通上之后接下来就是Linux侧的软件配置。RK3588 SDK里一般有现成的MIPI CSI-2驱动常见路径是/sys/class/video4linux/v4l-subdev*。配置流程大致分四步设备树里面添加FPGA对应的camera节点。需要配置compatible、reg、时钟频率、lane数、数据类型等。注意标准RK3588的csi2 dphy节点会挂到csi2主机控制器下面链路关系是FPGA虚拟sensor → dphy → csi2 host → video node。通过media-ctl设置数据通路。命令大致是media-ctl -d /dev/media0 -l csi2 dphy:0-csi2 host:0[1]还得用media-ctl -V设置格式这一步如果漏掉或格式不匹配后面v4l2-ctl抓图就会一直超时。用v4l2-ctl抓帧测试。先v4l2-ctl --list-formats-ext看设备支持的格式是否有RAW8或RGB888然后抓单帧到文件用Python的PIL或者OpenCV验证图像是否正常。如果需要RTSP推流可以用ffmpeg读v4l2设备转成RTSP流命令大概是ffmpeg -f v4l2 -input_format mjpeg -video_size 1280x1024 -i /dev/video0 -c:v libx264 -f rtsp rtsp://xxx。当然这里具体格式要按实际v4l2节点配置来。设备树里的屏参匹配相对麻烦一点因为RK3588的csi2驱动对不同数据类型的判断很严。比如你FPGA发的是RGB888但设备树里配成了RAW8那出来的图像就是乱的。我在调试时就遇到过这种“拿通用模板改分辨率但忘了改数据类型”的坑第一次抓图出来全是灰黑色排查半天才发现是设备树里给的数据类型错了。4. 常见问题排查实录4.1 图像花屏、斜条纹这个现象大概率出在FPGA解串阶段。花屏、斜条纹、图像左右错位基本都是单个bit采错位置导致的。解决办法只有两个字对齐。相机固定输出一幅条纹图或者用白平衡图然后在FPGA里抓内部信号看有效像素数值是不是预想的方向。常见操作是把DS90CR288A输出或者自己解串后的并行数据接到ILA集成逻辑分析仪观察比对每个像素的bit变化规律。如果发现每8个像素错位一次基本就是bit滑动了需要调整ISERDES的bit slip计数。如果是整体错位那多半是通道顺序问题可以把LVDS通道的物理连接顺序在约束文件里再核对一遍。4.2 完全黑屏或者无信号先别急着怀疑FPGA逻辑先怀疑物理链路。Camera Link的MDR26接线很讲究信号线屏蔽层要接地线缆不能有受力弯折。接着检查相机的Link配置和采集端是否一致比如相机工作在Full模式但FPGA端只接了Base那肯定不出图。再检查FPGA端有没有锁定时钟很多解串芯片都有LOCK信号如果没LOCK说明LVDS输入不存在或者电平不到阈值用示波器在接收端看差分对波形是最直接的。4.3 帧率不达标、持续掉帧RK3588侧掉帧原因往往不在带宽而在软件管线阻塞。先把CPU的负载因子调低确认NPU推理没有阻塞采集线程再用v4l2-ctl --set-parm确认当前帧率设置还不行就查DMA buffer分配是否够大MIPI进来数据量大时默认buffer数量太浅会直接丢帧。FPGA侧掉帧则要看异步FIFO的写满/读空情况把FIFO状态信号引到调试引脚用示波器看如果用着用着就写满了说明后端处理没跟上要增大缓存或者降低MIPI打包开销。4.4 颜色错乱、图像移位颜色错乱基本就是像素格式配置不一致。Camera Link这头相机的像素格式如果是Bayer RG但你在FPGA里当成了RGB888出来的颜色自然不对。老老实实按相机侧给的配置表把Bayer RGB或YUV的格式转换逻辑加上。图像移位一般是LVAL边界没找对或者MIPI打包时行同步信号少打了一拍。我习惯在FPGA里加一个像素计数器同时输出到空闲GPIO再用逻辑分析仪去和相机侧实际的有效像素数对比非常快就能定位多打少打的问题。5. 个人经验与后续扩展这个项目做完之后最大的感受是RK3588FPGA这套组合真正强的地方不在单点性能而在“灵活补位”。FPGA把工业相机五花八门的接口和时序都吃掉RK3588又把AI和Linux生态都接进来中间只要协议匹配做好了后面的应用开发效率会高很多。再让我提点建议的话就是别在初期直接上Full配置的Camera Link先把Base一路调通再扩展到多路这样遇到的变量少排查问题会容易得多。后续如果再扩展我会优先做三件事一是把FPGA里加一个简单的ROI裁剪和像素格式转换进一步降低RK3588算力压力二是在RK3588上接入RKNN工具链把常用的YOLO检测模型跑起来这样整个系统就能直接变成一个边缘检测盒子三是考虑做多相机同步采集Camera Link相机本身支持外触发FPGA可以把多路同步信号统一管理对产线或者运动分析场景非常有用。最后再分享一个细节FPGA和RK3588联调时启动顺序很重要。建议FPGA先完成配置并稳定输出MIPI时钟再启动RK3588这边的media pipeline否则很可能会出现CSI-2主机设备枚举不到的状态。如果热重启RK3588最好让FPGA也重新初始化一次我踩过好多次因为只重启单侧导致的“信号明明在但v4l2就是打不开”的坑。先写到这里希望对正在做类似选型和调试的朋友有帮助。
返回列表