基于RK3568J+FPGA的国产多通道实时数据采集系统设计与实现
1. 项目概述与核心价值在工业自动化、电力监控、精密仪器测试这些领域数据采集是系统的“眼睛”和“耳朵”。我们经常需要同时监测多个物理量比如一个电机控制柜里的三相电压、电流、温度、振动信号或者一个环境监测站里的多个传感器的输出。这些信号往往变化很快要求采集系统不仅要“看得准”高精度还要“跟得上”高实时性最后还得“说得出”实时显示与分析。传统的方案要么用高性能工控机加一堆PCIe采集卡成本高、体积大要么用低端MCU通道数和实时性又捉襟见肘。今天要拆解的是一个我个人认为在当下非常有代表性的国产化高性价比方案基于瑞芯微RK3568J处理器和紫光同创Logos-2系列FPGA构建的多通道AD实时采集显示系统。这个组合巧妙地将ARM处理器的丰富生态与灵活计算能力与FPGA的并行处理、精确时序控制能力结合起来形成了一种“软硬协同”的架构。我最近在一个工业设备预测性维护的项目中实际应用了这套平台它成功替代了原先使用的X86工控机进口采集卡的方案在成本降低近40%的同时实现了16通道、1MSPS采样率的同步采集与毫秒级延迟的波形显示稳定性超出了预期。简单来说这个方案的核心价值在于用全国产的芯片和硬件实现了一套性能强劲、可靠且易于二次开发的工业级数据采集与显示系统。它特别适合那些对数据实时性、通道数量有要求同时又面临供应链安全、成本控制压力的项目比如新能源电池测试、智能电网监测、高端医疗设备等。2. 硬件平台深度解析为什么是RK3568JFPGA2.1 核心处理器瑞芯微RK3568J的选型考量RK3568J是一款面向工业与物联网应用的通用型SoC。选择它而不是更常见的消费级RK3568主要基于以下几点工业级考量工业级可靠性RK3568J的工作温度范围通常更宽长期运行稳定性和抗干扰能力经过强化更适合7x24小时不间断运行的工业现场。其采用的28nm制程在性能、功耗和可靠性之间取得了很好的平衡。强大的多媒体与显示能力它集成了ARM Mali-G52 GPU支持OpenGL ES 3.2/2.0这对于后续的Qt界面流畅渲染至关重要。同时它原生支持多种显示接口HDMI, LVDS, MIPI-DSI方便适配各种工业显示屏省去了额外的显示转换芯片。丰富的互联接口拥有多个USB、PCIe、千兆以太网、CAN、UART等接口。其中的PCIe 2.1单通道接口是本方案的数据传输“大动脉”它连接ARM端与FPGA端为高速AD数据流提供了高带宽、低延迟的传输通道。四核Cortex-A55架构主频最高2.0GHz提供了足够的通用计算能力来运行Linux系统、复杂的业务逻辑和Qt应用程序无需外挂额外的应用处理器。注意在项目选型时务必确认芯片型号后缀。RK3568J是工业级版本在长期供货稳定性和质量管控上通常优于消费级版本虽然价格可能略高但对于工业项目来说是值得的投资。2.2 协处理器紫光同创Logos-2 FPGA的角色与优势FPGA在这里扮演着“前端数据采集与预处理引擎”的角色。为什么不用ARM直接控制ADC芯片或者用专用的AFE模拟前端芯片原因如下精确的时序与控制像AD7606/AD7616这类高速、高精度ADC对采样时钟、转换启动信号、数据读取的时序要求极为严格抖动要小。FPGA的硬件并行性和可编程逻辑能够产生纳秒级精度的控制信号确保采样时刻的准确性这是软件模拟时序的ARM难以企及的。多通道同步采集这是FPGA的天然优势。它可以同时控制多个ADC芯片的采样保持S/H信号确保所有通道在同一时刻进行采样消除了因分时采样带来的通道间相位差。对于需要分析通道间相对关系的应用如三相功率分析至关重要。实时数据预处理与缓存ADC转换完成的数据FPGA可以立即进行初步处理比如数字滤波、求均值、量程转换甚至简单的FFT运算。处理后的数据通过FIFO先入先出存储器缓存等待通过PCIe接口被ARM读取。这大大减轻了ARM的实时中断负担。灵活性与可扩展性FPGA的逻辑可以随时重构。如果未来需要更换ADC型号、增加传感器接口如SPI传感器、或者实现特定的编码协议如Encoder接口只需要修改FPGA代码无需改动硬件PCB极大提升了平台的复用性和生命周期。我们使用的紫光同创Logos-2系列如PG2L50H是一款国产FPGA其逻辑资源、存储块和DSP模块足以应对多通道AD采集、FIFO缓存以及PCIe端点控制器的逻辑实现。2.3 载板与模块化设计创龙科技TL3568F-EVM评估板评估板将核心板的潜力充分释放出来。它的几个设计亮点对项目开发非常友好FMC高速扩展接口评估板提供了标准的FMCFPGA Mezzanine Card接口。我们使用的TL7606P/TL7616P模块就是通过这个接口连接的。FMC定义了高速差分对、单端信号、时钟和电源的规范保证了信号完整性。这意味着你可以像插拔显卡一样更换不同的采集模块比如更高采样率的ADC、DAC模块、数字IO模块而主系统架构不变。齐全的工业通信接口3路独立CAN、3路千兆网、RS485/422等方便将本设备作为数据采集节点接入更大的工业网络如PROFINET, EtherCAT网关需额外芯片。双系统支持的基础设施通过精心的电源设计和信号隔离该平台可以稳定地支持AMP非对称多处理模式即一部分CPU核心跑Linux另一部分独立核心跑实时操作系统如RT-Thread这为硬实时任务提供了可能。硬件连接实拍心得 在实际接线时CON26FPGA EXPORT接口针脚密集一定要使用配套的压接式排线并确保锁紧。我曾因排线虚接导致采样数据出现周期性毛刺排查了很久。另外为信号发生器和评估板使用同一个接地良好的插排能有效减少共模干扰。3. 系统架构与软件栈设计思路整个系统的设计哲学是“分工明确异构协同”。下图清晰地展示了数据流与控制流[信号发生器] -- [TL7606P/7616P ADC模块] -- [FPGA (紫光同创)] | | (PCIe总线高速数据流) V [ARM Core3 (RT-Thread)] | | (RPMSG 虚拟总线进程间通信) V [ARM Core0/1/2 (Linux Qt Application)] | V [HDMI 显示器 (波形显示)]3.1 双核异构与AMP模式详解这是本方案的精髓所在。RK3568J的四个Cortex-A55核心被划分为两个“域”Linux域 (CPU0, CPU1, CPU2)运行完整的Linux操作系统内核版本4.19。负责资源管理、文件系统、网络服务、以及最终的Qt图形应用程序。Linux生态丰富开发调试方便适合处理上层复杂业务逻辑和人机交互。RTOS域 (CPU3)独立运行RT-Thread这个实时操作系统。它通过PCIe驱动直接与FPGA通信负责以硬实时的方式读取FPGA FIFO中的数据。RT-Thread的实时性保证了数据读取的延迟是确定性的通常在微秒级避免了Linux系统因任务调度、内存管理等原因带来的不可预测延迟。两个域之间的数据交换没有采用传统的共享内存加复杂同步机制而是使用了RPMSG (Remote Processor Messaging)。这是一个基于virtio机制的轻量级IPC进程间通信框架在AMP架构下它就像在两个核心之间虚拟出了一条“串口”或“消息队列”Linux端的应用和RT-Thread端的任务可以通过简单的读写API进行通信内核帮我们处理了底层的复杂性。这样设计的好处将最苛刻的实时任务高速数据搬运隔离在专用的实时核上确保其不被其他非实时任务干扰。而图形显示、数据存储、网络上传这些对实时性要求相对宽松的任务则放在资源丰富的Linux核上享受其生态便利。这是一种非常务实且高效的软硬件划分。3.2 关键软件组件选型说明Linux Kernel 4.19这是一个长期支持LTS版本在工业领域经过充分验证稳定性和社区支持都很好。项目中使用的Linux-RT-4.19.232是打了PREEMPT-RT实时补丁的内核虽然主要服务于Linux域但这也为Linux域内任务的调度延迟提供了一定优化。U-Boot 2017.09作为bootloader负责初始化最基础的硬件并从存储设备加载内核。版本选择较旧但稳定对于功能固定的工业产品足够用。RT-Thread一款优秀的国产实时操作系统内核小巧实时性强对国产芯片支持好。它的PCIe驱动框架和RPMSG组件已经比较成熟大大降低了在CPU3上开发实时数据接收任务的难度。Qt 5.12用于开发Linux上的图形界面。Qt的图形性能优异跨平台并且有强大的图表库如QCustomPlot或Qt Charts能够轻松实现波形的实时绘制、缩放、游标测量等功能。4. FPGA逻辑设计数据采集的“硬核”引擎FPGA端的代码使用Pango Design Suite开发是整个数据采集链的起点其稳定性和效率直接决定数据质量。4.1 ADC接口控制器设计以AD7606为例它是一个8通道、200kSPS、16位同步采样的ADC。FPGA需要实现其完整的并行接口时序采样时钟生成内部通过锁相环PLL产生一个精确的200kHz或更低时钟作为ADC的CONVST A/B信号。这个时钟的抖动要尽可能小。时序状态机在CONVST信号的下降沿ADC开始对所有选中通道进行同步采样和转换。转换期间BUSY信号变高。FPGA需要监测BUSY的下落沿。BUSY变低后FPGA依次产生片选CS和读信号RD将8个通道的16位数据从并行数据总线DB[15:0]上读取出来。数据拼接与缓存读取的8个通道数据每个16位FPGA会将其拼接成一个128位的数据包。然后这个数据包被写入一个异步FIFO。这个FIFO的一侧是ADC的采样时钟域比如200kHz另一侧是PCIe接口的时钟域比如125MHz。异步FIFO解决了不同时钟域之间的数据安全传递问题。关键参数计算 对于AD76068通道16位2字节采样率200kSPS。数据吞吐率 8通道 * 2字节/通道 * 200,000 次/秒 3.2 MB/s这个速率对于PCIe 2.1 x1理论带宽约500MB/s单向来说绰绰有余留有大量余量用于其他传输或未来升级。4.2 PCIe端点控制器与DMA传输FPGA作为PCIe总线的一个端点Endpoint设备。我们需要在FPGA内部实现一个简单的PCIe EP控制器逻辑通常使用芯片厂商提供的IP核如紫光同创的PCIe IP。配置空间FPGA需要正确配置自己的PCIe设备ID、厂商ID、类代码等以便ARM端的驱动程序能正确识别它。BAR空间映射FPGA内部的一些寄存器如控制寄存器、状态寄存器、FIFO状态寄存器会通过PCIe BAR基址寄存器映射到ARM的物理内存地址空间。Linux驱动可以通过读写这些内存地址来配置FPGA、查询状态。DMA传输这是高性能传输的关键。ARM端的驱动程序在RT-Thread里会配置FPGA内的DMA控制器告诉它源地址FIFO的数据端口和传输长度。然后FPGA的DMA控制器会主动通过PCIe总线将FIFO中的数据“推送”到ARM端预先分配好的内存缓冲区中。这种方式不占用CPU资源效率极高。FPGA设计注意事项时序约束必须严谨对ADC接口、PCIe接口的输入输出信号必须施加正确的时序约束确保在高温、低温等极端环境下仍能稳定工作。FIFO深度要合理FIFO深度需要根据ADC数据产生速率和PCIe传输可能出现的短暂延迟来计算。深度太浅容易溢出丢数太深浪费资源。一个经验公式FIFO深度 ≥ (PCIe最大延迟时间) * (ADC数据速率)。通常设计为1024或2048个数据包深度。添加状态诊断寄存器在FPGA中设计一些可通过BAR访问的寄存器用于报告FIFO空满状态、溢出错误计数、ADC报警信号等这对后期调试和现场故障诊断无比重要。5. 嵌入式软件实现从驱动到应用5.1 RT-Thread实时域任务开发在CPU3上运行的RT-Thread任务是连接FPGA和Linux的桥梁。PCIe驱动初始化任务启动后首先初始化RT-Thread下的PCIe控制器驱动扫描总线找到FPGA设备并映射其BAR空间。DMA缓冲区管理在RT-Thread端申请一段连续的、非缓存Cache的内存区域作为DMA缓冲区。因为DMA传输不经过CPU缓存如果使用缓存内存需要频繁进行缓存无效化invalidate或写回flush操作增加延迟和复杂性。实时数据搬运循环while (1) { // 1. 检查FPGA端FIFO是否有足够数据通过读状态寄存器 if (fpga_fifo_data_ready()) { // 2. 配置FPGA的DMA引擎启动一次传输到指定缓冲区 start_fpga_dma_transfer(dma_buffer); // 3. 等待DMA传输完成中断或轮询完成标志 wait_for_dma_completion(); // 4. 将填满数据的缓冲区通过RPMSG发送给Linux域 rpmsg_send_to_linux(dma_buffer, data_length); // 5. 切换至下一个缓冲区实现“乒乓操作”避免等待 switch_to_next_buffer(); } // 可加入rt_thread_mdelay(1)等让出CPU但延迟需远小于缓冲区填满时间 }这个循环必须保证其执行周期是稳定的并且处理速度要快于数据产生的速度。5.2 Linux域Qt应用程序开发Linux上的Qt应用是数据的最终消费者和展示者。RPMSG数据接收线程创建一个高优先级的线程阻塞式地读取RPMSG设备文件例如/dev/rpmsg0。一旦收到RT-Thread发来的数据包立刻将其放入一个线程安全的环形缓冲区中。这个环形缓冲区是连接高速数据接收和相对较慢的图形渲染之间的“减压阀”。数据处理与转换从环形缓冲区中取出原始数据通常是16位有符号整数根据ADC的参考电压例如AD7606是±10V量程进行换算实际电压值 (原始码值 / 32768) * 参考电压如果需要可以在这里进行软件滤波、校准系数补偿等。Qt图形界面与波形绘制使用QCustomPlot库进行波形显示。它性能好功能强大。在主UI线程中设置一个定时器例如50ms触发一次每次触发时从环形缓冲区中取出最近一段时间的数据点更新到QCustomPlot的数据序列中。调用replot()函数重绘图表。为了更流畅可以只更新数据并设置QCustomPlot为setOpenGl(true)利用GPU加速。界面还应包含通道选择、时基缩放、触发控制、文件保存等功能按钮。一个关键的优化点避免在RPMSG接收线程中直接进行UI更新或复杂运算这可能导致接收阻塞。务必使用“生产者-消费者”模型通过环形缓冲区解耦。6. 系统集成、测试与性能验证6.1 开发环境搭建与镜像构建Linux SDK编译在Ubuntu开发机上获取瑞芯微提供的Linux SDK。按照文档配置编译工具链通常需要编译U-Boot、Kernel和Rootfs。重点是在内核配置中启用RPMSG、PCIe相关驱动以及VIRTIO相关支持。# 示例编译命令 ./build.sh uboot # 编译U-Boot ./build.sh kernel # 编译内核 ./build.sh rootfs # 构建根文件系统 ./mkimage.sh # 打包成统一固件AMP SDK编译这是为CPU3编译RT-Thread系统的SDK。需要配置RT-Thread的BSP为RK3568并添加PCIe驱动包和RPMSG组件。编译后会生成一个rtthread.bin文件。镜像打包使用瑞芯微提供的工具将Linux的固件和RT-Thread的二进制文件打包成一个最终的amp.img镜像。这个镜像在启动时由ARM的Trusted FirmwareTF-A和U-Boot负责将Linux加载到CPU0-2将RT-Thread加载到CPU3并启动。6.2 功能测试与性能实测按照文章所述步骤进行测试硬件连接正确连接ADC模块、HDMI显示器、串口线。程序固化与运行# 在评估板Linux终端中 ./pcie_ad_display -d ad7606 -m 2参数-d ad7606指定设备类型-m 2可能代表连续采集模式。性能观测波形响应在HDMI显示器上应能看到光滑、无卡顿的正弦波形。改变信号发生器频率波形应能实时跟随变化。系统负载在Linux终端运行top或htop命令观察CPU占用率。理想情况下CPU3运行RT-Thread的占用率可能较高且稳定而CPU0-2运行Linux和Qt的占用率应相对平稳不会因波形刷新而飙高。延迟测量一种粗略测量系统延迟的方法用信号发生器产生一个阶跃信号如从0V跳变到5V同时在程序中打时间戳记录收到数据跳变的时间。计算两者时间差即可得到从信号输入到软件收到数据的整体延迟。这个延迟应主要由ADC转换时间、FPGA处理时间和PCIe/DMA传输时间构成理论上应在百微秒级别。6.3 常见问题排查与调试技巧在实际部署中你可能会遇到以下问题问题现象可能原因排查步骤与解决方案Qt界面无波形显示1. RPMSG通信未建立。2. Qt程序未收到数据。3. 图形绘制代码有误。1. 检查/dev/下是否存在rpmsg*设备节点。2. 在Qt程序中加入调试输出打印环形缓冲区中的数据包计数。3. 先用一个简单的静态数据测试Qt绘图功能是否正常。波形显示严重卡顿或丢数1. Linux域图形渲染耗时过长。2. 环形缓冲区大小不足被覆盖。3. RT-Thread域数据发送不及时。1. 优化Qt绘图减少单次刷新点数启用OpenGL加速。2. 增大环形缓冲区大小并监控其使用率。3. 在RT-Thread端打印DMA传输周期检查是否稳定。采样数据噪声大、不准1. 模拟信号输入受到干扰。2. ADC参考电压不稳。3. FPGA时序约束不满足。1. 检查接线使用屏蔽线确保信号地良好共地。2. 测量ADC模块的基准电压源输出是否稳定。3. 使用示波器测量ADC的CONVST和RD等关键时序看是否符合芯片手册要求。系统运行一段时间后死机1. 内存泄漏。2. 中断冲突或丢失。3. 散热问题。1. 检查RT-Thread和Linux应用的内存分配与释放。2. 检查PCIe MSI中断是否正常注册和响应。3. 触摸主芯片温度考虑增加散热片。调试心得善用串口日志为RT-Thread和Linux驱动添加详细的日志输出通过不同的串口如CPU3用UART2Linux用UART0同时查看是定位跨核问题的利器。逻辑分析仪是FPGA开发的必备用它来抓取ADC接口和FPGA内部关键信号的时序比仿真更真实。性能剖析工具在Linux端可以使用perf或ftrace工具分析Qt应用和内核的性能热点找到拖慢系统的主因。7. 方案总结与扩展思考经过从硬件选型到软件调试的完整流程这个基于RK3568JFPGA的国产平台展现出了其在多通道实时采集领域的强大实力。它不仅仅是一个演示案例更是一个可落地的产品原型框架。我个人在实际项目中的体会是这套架构最大的优势在于“平衡”。它在性能、成本、开发难度和国产化要求之间找到了一个很好的平衡点。FPGA负责最底层的实时性保障RT-Thread核负责可靠的数据搬运Linux核负责友好的交互和联网各司其职。相比于纯FPGA方案它降低了算法开发的难度相比于纯ARM方案它提供了无与伦比的实时性和接口灵活性。这个方案的扩展潜力巨大通道与性能扩展当前使用的是8通道200kSPS或16通道1MSPS的ADC模块。如果需要更高采样率如10MSPS可以选用更高速的ADC芯片FPGA的逻辑资源足以应对更高速的数据流。PCIe 2.1 x1的带宽也还有很大余量。功能扩展在FPGA中不仅可以做数据采集还可以集成数字滤波器FIR/IIR、FFT频谱分析甚至简单的控制算法如PID。处理后的结果再传给ARM可以极大减轻ARM的计算压力实现更复杂的边缘计算功能。网络化与云端集成Linux域强大的网络能力可以轻松地将采集到的数据通过MQTT、HTTP等协议上传到云端服务器或者通过WebSocket提供实时数据查看界面实现远程监控。多设备同步对于更大规模的系统可以通过FPGA的IO口输出同步脉冲或者利用PTP等精密网络时钟协议实现多个采集设备之间的采样时钟同步构建分布式采集系统。最后一个小技巧在量产版本中可以考虑将RT-Thread部分的程序与FPGA的比特流文件合并并通过统一的升级工具进行更新这样可以简化现场维护的流程。国产化平台的生态正在飞速完善围绕RK3568这类芯片的软硬件资源也越来越丰富为工程师提供了坚实的创新基础。