☰
RK3588+FPGA实现Camera Link工业相机接入与MIPI CSI-2转换方案
2026/10/5 5:57:37 网站建设 项目流程

先说一个很多人都踩过的坑:当你拿着一台Camera Link接口的工业相机,想接进RK3588嵌入式平台做实时AI检测,第一反应往往是搜“RK3588支持Camera Link吗”。答案显然不支持,因为RK3588原生只给到了MIPI CSI-2、DVP这类接口,和Camera Link的电平、协议完全不沾边。直接拿转接卡转出来的信号,CK/数据线对不齐,画面花成一团是常态,更别说在高帧率下稳定跑。这时候“RK3588+FPGA”就成了一个绕不开的经典组合:FPGA负责把Camera Link这种高速并行/串行信号接下来,做格式转换和缓冲,再通过MIPI CSI-2喂给RK3588。这篇文章就是一份基于实际项目的保姆级选型和配置指南,适合正在做机器视觉、工业缺陷检测、运动分析这类项目的工程师参考。

1. 方案怎么来的:为什么非要RK3588+FPGA

1.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对时钟LVDS)24位数据 + 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×1024@200fps的黑白相机,如果像素输出是8bit,那有效数据率是1280×1024×200≈262M像素/秒,Base在85MHz时钟下能跑到2.04Gbps即255MB/s,图像有效数据206MB/s,再加消隐区开销很容易就超了,所以这种相机通常标的是Medium或者Full配置。反过来,如果是1920×1080@60fps的RGB888相机,那是1920×1080×60×3≈373MB/s,Base就彻底带不动,就别想着省成本用单根线了。

2.2 FPGA选型:别只看逻辑量

FPGA选型是这个项目里最容易翻车的一环。很多人一看数据量,觉得随便找个中端FPGA就行,结果布局布线完发现LVDS引脚不够、或者MIPI输出引脚所在的Bank电平标准不匹配,整个方案作废。

选型我建议优先考虑这几点:

  • 是否有足够支持LVDS的IO Bank。Xilinx家的FPGA要分HR和HP Bank,LVDS电平标准一般放在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满负载大概10W+,FPGA核心板再加5W左右,整机做工业应用一般要预留20W以上的散热能力。

3. 接口配置实操:从Camera Link到MIPI CSI-2

3.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,高云里叫IDES,Lattice里有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;如果相机已经是RGB888,MIPI端就配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,像素时钟80MHz,24bit有效,那么有效数据率就是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. 个人经验与后续扩展

这个项目做完之后,最大的感受是:RK3588+FPGA这套组合,真正强的地方不在单点性能,而在“灵活补位”。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就是打不开”的坑。先写到这里,希望对正在做类似选型和调试的朋友有帮助。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询