FPGA与RK3588的PCIe高速通信架构怎么做最稳?(全场景完整版)
导语:
在工业视觉、雷达信号处理等领域,“FPGA(负责高速采集) + RK3588(负责AI推理/后处理)”是目前非常火的异构架构。它们之间通常靠 PCIe 3.0 x4 来连接。
网上有很多教程,但真到了自己画板子、写逻辑的时候,往往会遇到丢包、死机、带宽跑不上来的问题。这篇文章不念经,我们用大白话聊聊,这套系统在工业级落地时,到底该怎么选型,怎么搭框架,有哪些坑千万别踩。
一、基础设定:谁是老大,谁是小弟?
在 PCIe 的世界里,必须有一个主设备(老大)和从设备(小弟)。
- RK3588 是老大(RC,Root Complex): 运行 Linux 系统,负责分配内存、下发指令、接收中断。
- FPGA 是小弟(EP,Endpoint): 这里以 Xilinx KU+ 系列为例,只管干活(采集数据、预处理),然后通过 PCIe 汇报。
推荐方案: FPGA 端直接使用 Xilinx 官方的 XDMA IP。不要自己手写 DMA 逻辑,那是在给自己找麻烦。XDMA 极其稳定,且 RK3588 的 Linux 内核对它的驱动支持很好。
二、架构分水岭:AXI4-MM 还是 AXI-Stream?
XDMA 给你留了两种往里塞数据的接口:AXI4-MM(内存映射) 和 AXI-Stream(数据流)。这是决定你整个 FPGA 逻辑怎么写的“分水岭”。选错接口,事倍功半。
1. AXI4-MM 接口:带地址的“精准快递”
- 大白话解释: 这是一种“指哪打哪”的传输方式。每一笔数据都带有一个明确的目标地址(比如:“把这 100 个字节,写到编号为 0x8000 的货架上”)。
- 特点: 需要地址线和数据线两次握手,稍微耗费一点时间,但极其灵活,支持随机读写。
- 适用场景: 电机控制参数下发、多传感器状态离散回读、雷达目标点云(非原始波形)等结构化数据。
2. AXI-Stream 接口:不带地址的“消防水带”
- 大白话解释: 只要接通了,数据就像水一样往里灌。没有地址的概念,水管这头只管吐数据(
Valid),那头只管收数据(Ready)。 - 特点: 极限压榨带宽,效率极高,但毫无寻址能力。
- 适用场景: 极度适合高帧率工业相机、高速 ADC 连续采样这种“大批量、连续不断”的原始数据。
三、方案 A:AXI-Stream 高速流模式(应对极限带宽)
如果你在传视频流或连续采样数据,必定选 Stream。但这套方案最大的坑在于:XDMA 不能直接把水(Stream)存到水库(DDR)里!
丢包的元凶与解法
由于 RK3588 上跑的 Linux 是非实时的系统,偶尔会因为进程调度“卡顿”几十毫秒。如果你直接把传感器连给 XDMA,Linux 一卡,水管反压,FPGA 内部可怜的 BRAM 瞬间溢出,数据当场丢失。
工业级解法:把 FPGA 外挂 DDR 当作“超级 FIFO”
你必须自己用桥接 IP(比如 S2MM / MM2S)把数据流接到 FPGA 外挂的 DDR 上。
即使 Linux 突然卡顿 50 毫秒,只要 FPGA 的 DDR 容量够大(比如 1GB),就能完美吸收这 50 毫秒积压的水量,做到绝对的零丢包。
四、方案 B:AXI4-MM 内存共享模式(应对灵活交互)
如果你在传的是离散的控制指令、或者预处理后大小不一的特征数据,选 AXI4-MM 会舒服得多。
核心玩法:把 DDR 当作“共享工作区”
在这个方案里,FPGA 外挂的 DDR 不再是单纯的先进先出(FIFO)水管,而变成了一个带货架号的大型仓库。
- FPGA 随拿随放: FPGA 的业务逻辑随时把处理好的不同数据,写到 DDR 的不同地址里(比如 A 区放温度,B 区放姿态)。
- RK3588 定点收割: RK3588 的驱动程序随时通过 XDMA 发起“块传输”(Block DMA),直接去读取 DDR 里对应地址的数据。

这个方案的代码写起来最像传统的“内存操作”,FPGA 不需要管 PCIe 什么时候空闲,只管往自己的 DDR 里写。RK3588 想什么时候拿、拿哪块区域,全由软件灵活决定。
五、上位机(RK3588)怎么接数据最稳?
无论你用 Stream 还是 MM 方案,RK3588 这边接数据,千万别用 CPU 去傻傻地轮询,太费算力了。主流的“高性能接盘”做法是“SG 模式 + MSI-X 中断”:
- 提前画好地盘: Linux 驱动在 RK3588 的 LPDDR4X 中,开辟几个连续的大内存块(比如 10 个 10MB 的 Buffer,连成一个环)。
- 下发任务单(SG 描述符): 把这 10 个 Buffer 的物理地址写成任务单(Scatter-Gather),交给 XDMA。
- 硬件自动填坑: XDMA 收到数据后,自动填入 Buffer 1。填满后,触发一次 MSI-X 中断通知 CPU,然后 XDMA 毫秒不差地无缝转去填 Buffer 2。
- CPU 收割: CPU 收到中断,把 Buffer 1 拿去给 NPU 做 AI 推理。此时 XDMA 正在后台默默填 Buffer 2,两者互不干涉,效率拉满。
六、工程师避坑总结 (Checklist)
如果你正在搭这套系统,请在脑子里过一遍这几条:
- 认清数据类型选接口: 连续大数据流无脑选
AXI-Stream,离散/结构化/随机访问数据无脑选AXI4-MM。 - 别省芯片钱: 无论哪种方案,只要涉及高速通信,FPGA 旁边最好挂 DDR。别妄图用 FPGA 内部 BRAM 硬抗 PCIe 链路抖动。
- Stream 接口必须带桥: XDMA 只是个搬运工,想把 Stream 存进 FPGA DDR,必须自己配 S2MM/MM2S 桥接 IP,它不会“自动”帮你存入内存。
- 抛弃老中断: 必须使用 MSI-X 消息中断。老式的 INTx 引脚中断延迟高,且在 ARM 平台上容易跟其他外设冲突。
- 别自己造轮子: Linux 端的驱动直接拿 Xilinx 官方开源的
dma_ip_drivers(适配 ARM64)改,重点放在 SG 描述符配置和中断处理上。
中断延迟高,且在 ARM 平台上容易跟其他外设冲突。
5. 别自己造轮子: Linux 端的驱动直接拿 Xilinx 官方开源的 dma_ip_drivers(适配 ARM64)改,重点放在 SG 描述符配置和中断处理上。
总结: 高速通信的本质,就是利用大缓存(DDR)和智能搬运工(SG DMA),把“硬实时”的硬件数据,缓冲成“非实时”操作系统能够一口口舒舒服服吃下的“软数据”。理清了这个逻辑,结合正确的接口选型,你的系统想不稳都难!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)