基于 Zynq UltraScale+ MPSoC 的 PL DDR4 直写 NVMe 与 exFAT 文件系统方案
面向宽带 ADC、雷达、通信、工业检测和高速仪器的数据采集存储平台项目代号PL-Direct NVMe Acquisition Storage PlatformPDNS 单盘版摘要高速采集系统真正困难的地方往往不是“把数据采进 FPGA”而是如何持续、可靠地把海量数据写入 SSD并且让采集文件能够被 Linux 和 Windows 直接管理。本项目基于 Zynq UltraScale MPSoC构建了一条“采集数据进入 PL DDR4再由 PL 侧 NVMe Host Core 直接写入 SSD”的高速数据通路。PS 侧运行 PetaLinux负责 exFAT 文件系统、文件预分配、物理区间映射、任务调度和状态监控但不再搬运大流量采集数据。这种软硬件分工避免了传统方案中 PL DDR、PS DDR、Linux 页缓存之间的多次复制在保留标准文件系统易用性的同时降低了 CPU 和 PS 内存带宽压力。目前工程已经完成单盘直写、PRP List、QD32 并发、多文件连续采集、文件池复用、全文件数据序列校验以及环形缓冲区满保护等功能。关键词Zynq MPSoC、FPGA、NVMe、PL DDR4、exFAT、高速采集、零拷贝、PetaLinux、ADC一、传统高速采集方案的瓶颈常见的 FPGA Linux 采集系统通常采用下面的数据路径ADC → FPGA → PL/PS DDR → Linux 驱动 → 页缓存 → 文件系统 → SSD这种架构容易实现但在数据率达到 GB/s 级别后会逐渐暴露出几个问题采集数据需要在 PL DDR、PS DDR和内核缓冲区之间多次搬移CPU 参与 DMA 管理、数据复制和文件写入系统负载较高Linux 调度、回写和页缓存抖动可能造成瞬时堵塞文件系统写入速度和实时采集速度互相耦合当 SSD 出现垃圾回收或介质写入抖动时采集链路容易丢点。本项目的核心思路是把“大数据通路”和“文件管理通路”分开PL 负责高速实时数据和 NVMe 命令数据通路PS Linux 负责文件系统、元数据、任务控制和异常处理采集数据不经过 PS DDR 和 Linux 页缓存。二、产品总体架构系统的数据通路如下控制LBA映射命令与完成队列ADC或测试数据源AXI4-Stream FIFODataMover S2MM8 GiB PL DDR4环形缓冲区PL侧NVMe Host CoreNVMe SSDPS侧PetaLinux采集控制与状态监控exFAT文件预分配与物理映射NVMe命令调度与中断处理对应的物理数据路径为采集源 → AXI4-Stream FIFO → PL DDR4 → NVMe SSDPS 侧 Linux 只参与控制面创建文件 → 分配exFAT簇 → 获取物理LBA → 下发直写任务 → 更新文件状态与元数据 → 监控采集结果因此这里的“PL 侧直写”并不是绕过文件系统裸写整块 SSD而是在 Linux 预先维护好文件和物理区间后由 PL DDR4 直接向这些已保留的 LBA 写入数据。这样既保留了 exFAT 文件的兼容性又避免了采集载荷进入 PS 数据通路。三、当前工程配置当前版本的主要配置如下。项目当前配置FPGA 平台Zynq UltraScale MPSoC开发工具Vivado 2022.2Linux 构建环境PetaLinux 2022.2测试数据源adc_gen虚拟 ADC 通道数4 通道单通道位宽16 bit当前采样配置300 MSPS理论源数据率2.4 GB/s约 2288.8 MiB/sPL DDR4 环形缓冲区8 GiB缓冲块数量8192单缓冲块大小1 MiBNVMe 逻辑块大小512 byte单条 NVMe 命令数据量最大 128 KiB硬件命令队列深度QD32目标文件系统exFAT当前存储形态单 NVMe SSD300 MSPS 是当前工程中测试数据源的配置并不代表接口只能工作在这一采样率。真实 ADC 接入时可以根据通道数、位宽、采样时钟和 AXI4-Stream 数据宽度重新计算和配置但持续平均输入速率不能超过存储链路的稳定写入能力。四、核心功能与技术特点1. PL DDR4 到 NVMe 的直接数据路径采集数据首先由 DataMover 写入 PL 侧 DDR4 环形缓冲区。NVMe 写命令随后直接引用 PL DDR4 中的物理数据地址SSD 从该地址读取数据。整个采集载荷不需要复制到 PS DDR也不进入 Linux 页缓存。PS 只负责准备目标 LBA、提交命令并处理完成事件适合持续大吞吐采集场景。2. 8 GiB 环形缓冲与生产者/消费者模型PL DDR4 被划分为 8192 个 1 MiB 缓冲块通过单调递增的producer和consumer计数器管理producer表示 PL 已经完成写入的数据块consumer表示已经成功落盘并释放的数据块ready producer - consumer表示等待落盘的缓冲数量backpressure用于观察存储侧不能及时消费数据的情况。这套模型能够吸收 SSD 的短时延迟抖动并为驱动提供清晰的缓冲区所有权边界。3. 环形缓冲区满自动停机保护高速采集系统不能在缓冲区满后继续覆盖尚未落盘的数据。当前版本已加入跨层保护PL 检测环形缓冲区满后停止继续生产数据锁存buffer_full和写入错误状态控制模块撤销持续启动状态Linux 驱动停止采集任务用户态工具报告producer、consumer、ready和错误原因未完成文件保留为.partial避免被误认为有效采集文件。发生环满说明采集源的长期平均数据率已经超过 SSD 的可持续写入能力或存储设备出现了异常长尾延迟。系统会明确停机而不是静默覆盖旧数据。4. NVMe 多命令并发项目配套的iprop_nvme_block驱动已实现Linux blk-mq 块设备接口PRP1、PRP2 和 PRP List多个 DMA 缓冲和并发请求CID 与完成队列匹配QD32 硬件队列中断完成避免同步轮询长期占用 CPU普通块设备访问和 PL DDR4 直写接口。对于 1 MiB PL 缓冲块驱动会拆分为多条 NVMe 命令并保持命令队列处于工作状态从而减少单命令同步路径带来的空闲间隙。5. exFAT 文件池与物理区间映射exFAT 具有 Windows、Linux 间交换方便的优势但部分 PetaLinux 2022.2 内核实现不支持常规fallocate()。项目因此实现了专用的文件池管理流程标准顺序零填充预分配快速预分配模式--fast-prepareFIEMAP 不可用时的 FIBMAP/簇级映射64 位物理块号映射支持一个文件由多个连续物理区间组成保存.partial.map物理映射缓存后续采集快速加载并校验缓存已准备文件池可通过capture --overwrite重复使用可通过precondition对保留区间进行首次写入预热。文件池把耗时的空间分配和映射工作移到正式采集之前使采集阶段只执行必要的 NVMe 数据写入和文件切换操作。6. 多文件无间断采集系统支持将长时间采集任务切分成多个固定容量文件。当前文件完成后确认全部数据已经写入将文件从.partial转为.bin切换到下一个已准备好的文件保持 PL 缓冲和 NVMe 命令流水线继续运行。这种方式兼顾了超大容量连续记录和后处理便利性也避免单个超大文件损坏后影响整段数据。7. 可验证的数据完整性当前adc_gen支持多通道模拟和 64 位单调帧序列。4 个 16 位通道共同组成一个 64 位帧号CH0 sequence[15:0] CH1 sequence[31:16] CH2 sequence[47:32] CH3 sequence[63:48]每次显式复位后可从新的伪随机初始值开始校验程序自动读取首帧作为基准并逐帧检查是否丢帧是否重复是否倒退或乱序文件内部是否连续多文件边界是否连续。相比简单的递增 16 位计数这种模式可以覆盖更长时间的连续采集并准确定位错误发生的字节偏移和帧位置。接入真实 ADC 后也建议在数据帧中保留硬件帧号和时间戳。五、软件与设备接口Linux 启动后主要设备节点为/dev/pl_capture0 PL采集控制设备 /dev/ipropnvme0 PL侧NVMe块设备配套工具包括工具作用pl_capture_ctl配置、启动、停止、复位和读取采集状态pl_direct_writer单文件 PL DDR4 直写pl_direct_pool.sh文件池准备、预热、测速、连续采集和校验pl_capture_verifyADC 序列及完整性校验pl_direct_test.sh单文件端到端测试一个典型的使用流程如下# 1. 快速准备文件池sudopl_direct_pool.sh prepare --fast-prepare\-b/dev/ipropnvme0-m/mnt/nvme0\-n4096-c400-C4-pad_data# 2. 可选首次触达目标LBA使SSD进入稳定写入状态sudopl_direct_pool.sh precondition\-b/dev/ipropnvme0-m/mnt/nvme0\-n4096-c400-C4-pad_data# 3. 执行连续采集sudopl_direct_pool.sh capture\-b/dev/ipropnvme0-m/mnt/nvme0\-n4096-c400-C4-pad_data# 4. 全文件数据完整性校验sudopl_direct_pool.sh verify\-b/dev/ipropnvme0-m/mnt/nvme0\-n4096-c400-C4-pad_data-f# 5. 后续任务可直接覆盖并复用同一文件池sudopl_direct_pool.sh capture--overwrite\-b/dev/ipropnvme0-m/mnt/nvme0\-n4096-c400-C4-pad_data其中-n 4096表示每个文件包含 4096 个 1 MiB 缓冲块即单文件容量为 4 GiB。具体参数应根据 SSD 容量、采集时长和文件管理策略调整。六、实测表现在当前工程和测试平台上多文件长时间直写测试已经完成多个 4 GiB 文件连续切换overflow0error0完成文件连续生成测试界面观察到约 1907 MiB/s 的持续直写速度其他工程测试记录中在不同采样率、SSD状态和预热条件下观察到约 1.92.2 GiB/s 的采集写入水平。这些数值是特定 FPGA 时序、SSD 型号、盘内温度、剩余空间、SLC 缓存和文件池状态下的工程测试结果不应直接视为所有 SSD 的保证指标。产品交付时应使用目标 SSD 完成稳态满盘、温升、掉电恢复和全文件序列校验。需要特别区分三类带宽fio对已有文件或块设备的峰值并发写入带宽文件池首次分配、簇映射和预热速度真实采集链路从 PL DDR4 到 SSD 的持续直写带宽。三者经过的软件路径和硬件数据源不同不能只用一次短时间fio峰值推断持续采集能力。七、与传统 Linux 写文件方案对比对比项传统 PL→PS DDR→文件写入本项目 PL DDR4→NVMe 直写采集数据是否进入 PS DDR是否是否经过 Linux 页缓存通常是采集载荷不经过CPU 数据搬运压力较高较低文件系统兼容性好保留 exFAT 文件兼容SSD 抖动吸收能力依赖软件缓冲8 GiB PL 环形缓冲长时间文件切换需要应用层处理文件池自动切换数据完整性验证通常需自行开发内置 64 位帧序列校验环满行为可能丢数据或阻塞自动停止并锁存错误八、适用场景该平台适合持续数据率高、CPU 不宜参与数据搬运、同时又需要标准文件输出的场景例如多通道高速 ADC 原始数据记录雷达回波、电子侦察和电子对抗软件无线电及宽带 IQ 数据采集高速相机、线阵成像和光电探测超声、振动、瞬态和工业无损检测高能物理及科研仪器网络数据记录和协议分析设备便携式或边缘侧高速数据记录仪。九、工程可靠性设计高速写入只是基础能力真正可用的采集产品还必须能明确识别异常。本项目已经覆盖以下保护和诊断机制PL DDR4 地址和描述符边界检查producer/consumer/ready 实时监控环满停止避免覆盖未落盘数据NVMe 命令状态和 CID 完成匹配中断超时和异常退出处理.partial与.bin文件状态区分多物理区间文件映射物理映射缓存边界校验多通道 64 位序列的全文件校验文件切换时的尾部缓冲释放用户态状态和错误码输出。当前生成的 bitstream 已通过 Vivado 2022.2 布线后静态时序检查报告显示建立时间和保持时间均满足约束。上板应用仍建议结合 ILA、寄存器状态、长时间温升和目标 SSD 做系统级验证。十、当前版本边界为了准确理解产品能力当前单盘版本有以下边界当前工程实现一个 NVMe Host Core 和一个 SSD尚未实现多盘 RAID0exFAT 主要用于 Linux 与 Windows 间方便交换快速预分配依赖项目配套驱动和工具8 GiB 环形缓冲可以吸收短时抖动但不能弥补 SSD 长期平均速度低于采集源的问题当前数据源为adc_gen真实 ADC 需要接入标准 AXI4-Stream 采集接口当前工程验证采用流式 DMA 一致性维护设备树不应在硬件不支持一致性时随意加入dma-coherent活动中的.partial文件在异常掉电后可能需要恢复或丢弃严苛场景应增加掉电保持和文件系统恢复策略SSD 的持续写入能力与型号、温度、容量占用、固件和 NAND 类型密切相关。多盘扩展在架构上可行但需要为每块 SSD 配置独立 NVMe 控制通路、队列和中断并在文件映射层增加条带化调度属于下一阶段的 RAID0/多盘并行版本。十一、项目价值本项目并不是简单地给 FPGA 增加一个 NVMe 接口而是把采集、缓存、块设备、文件系统和数据校验组成了一套完整链路可验证数据源 ↓ PL高速采集与DDR4环形缓存 ↓ NVMe并发命令与中断完成 ↓ exFAT文件池和物理映射 ↓ 多文件连续记录与完整性校验它兼顾了 FPGA 实时数据通路和 Linux 文件管理的优势为 GB/s 级高速数据记录设备提供了一种可工程化、可验证、可扩展的实现方式。

相关新闻

最新新闻

日新闻

周新闻

月新闻