FPGA采集:高采样率数据流与存储

做高速采集的工程师,多半都碰过这种场面:ADC选型翻来覆去看了小半个月,指标挑得漂漂亮亮,板子一上电,波形却时不时缺一块。回头查了一圈,问题不在ADC,而在数据从采集通道走到存储的那条路上。高采样率采集的瓶颈,往往就藏在这"最后一公里"里。

这条路从ADC输出开始,经过片内逻辑、片上总线、DDR缓存,最后落到SSD、eMMC或者上位机硬盘上。哪一段跟不上,前面采得再准也留不下来。

瓶颈往往不在ADC

采样率、分辨率、信噪比,这些是ADC的硬指标,选好之后它就在那儿摆着,不太会变。真正会出事的是后面:数据从ADC出来,要经过片内逻辑、总线、DDR,最后落到存储介质,任何一段跟不上,整条链路就卡住了。

打个比方,ADC是水龙头,存储是水桶。龙头出水再稳,中间的管子细了,水照样漫出来------丢点不是没采到,是没接住。

所以做高采样率方案,第一件事不是比ADC参数,而是把整条链路的带宽账先算清楚。

先算带宽,再留余量

原始数据率有个很朴素的算法:采样率 × 位深 × 通道数。但别急着选器件,还有开销要加:打包的帧头、时间戳、校验位,都会让实际数据量比理论值高一些。

工程上的习惯是留出三成左右余量。注意,带宽要按"持续"口径算,而不是峰值------接口标称的峰值带宽,和长时间稳定写入能扛住的带宽,差距可能不小。

链路的每一段------片内总线、DDR、存储------都必须能持续扛住这个数,而不是峰值能跑一下就算过关。平均值和瞬时值是两码事,后面会反复提到。

片内先做一遍:滤波、抽取、打包

聪明的做法是在数据还没出门的时候就收拾一遍。FPGA内部是并行的硬件逻辑,多路ADC可以各配一套采集逻辑同时工作,天然适合并行驱动。

数据一进来,先过数字滤波,FIR、CIC这类结构都很常见;再做抽取降采样,最后按约定格式打包。滤波和抽取能直接把数据量压下来,打包则让后级看到的是一段一段整齐的数据,而不是零散的采样点。

这一步的意义在于:总线、DDR和存储看到的是降速之后的数据流,压力小了一个量级,而关心频段内的信息还在。片内的LUT、FF、BRAM、DSP资源有限,怎么排下这些运算是设计时要权衡的。

DDR缓存:用乒乓缓冲抹平速率差

就算片内压过一轮,采集和存储的节奏也未必对得上。采集是连续的、来得均匀;存储却不总是------存储介质要处理自己的后台任务,总线要仲裁,上位机可能正忙着别的事。两边节奏一错开,中间那个瞬间就得丢数据。

DDR就是干这个的。它按位宽×频率核算带宽,容量大、速率高,能吸收掉两边的瞬时差,让采集端和存储端各自按自己的节奏跑,谁也不等谁。

乒乓缓冲是常见的做法:把缓存分成两块,一块写、一块读,写满一块就交换角色。这样写入和读取永远落在不同区域上,互不打断。配合FIFO做跨时钟域的数据交接,再用AXI总线把各模块连起来,整条链路就能平稳推进。

存储介质:SSD、eMMC还是上位机

三种去向,各有各的账。

SSD分SATA和NVMe两种接口,强项是持续写入带宽和容量,适合长时间连续记录。但要注意写入放大和掉速:盘用得越满、写得越久,后台的整理动作越频繁,持续写入能力可能明显下滑。选型时该看的是持续写入带宽和耐久指标,而不是跑分时的峰值。

eMMC胜在成本、体积和集成度,适合嵌入式设备。代价是带宽和寿命都不如SSD,长期高强度写入要留足寿命余量。

直接传给上位机也是常见选择,走PCIe、USB3或以太网。好处是存储和后续分析都在主机侧,但链路能稳住多少带宽,依赖主机和总线的状态,长时间跑要确认不会因为主机侧的任务抢占而断续。

选哪种,取决于记录时长、数据率、设备形态和成本约束,没有通吃的答案。

连续流与触发分段:两套账

这是两件不同的事,别用同一套缓存设计。

连续流要求的是持续带宽不低于平均数据率。整条链路必须长时间稳定跑在平均速率之上,缓存只是用来削峰,不能指望它兜底------缓存总有写满的时候。

触发分段正好相反。平时数据在预触发环形缓冲里循环,只保留最近一段时间;触发一到,才把缓冲区里触发前后的片段存下来。它需要的不是持续带宽,而是瞬时写入能力,数据量小得多,缓存深度直接决定了能回溯多久。

所以同一个采样率,连续流和触发分段对存储和接口的要求完全不同。先想清楚记录模式,再谈缓存深度,这个顺序不能反。

丢点了,去哪儿找

丢点不可怕,可怕的是不知道丢在哪。

排查的抓手是计数器:FIFO溢出计数、DDR仲裁冲突、存储侧的写入等待,都可以做成寄存器读出来。跑一遍,谁先报数,谁就是瓶颈。

常见的根因就那么几个:FIFO溢出、DDR仲裁冲突、存储垃圾回收掉速、总线瓶颈、跨时钟域的亚稳态、中断延迟。前几个是带宽和调度问题,后两个是时序问题,排查方向不一样。

流程上建议先算理论带宽,再做实测,中间留出余量------是给垃圾回收、总线仲裁这些"偶尔发生但一定会发生"的事情留的。

写在最后

高采样率采集本质上是一场接力。ADC只是第一棒,数据还要经过片内处理、总线、DDR、存储,哪一棒掉速,成绩都不算数。

先算带宽,再选介质,用缓存抹平节奏差,用计数器盯住丢点。这套思路本身不复杂,难的是每一环都要落到具体数字上,而不是"应该差不多"。

振动监测、声学超声采集、电力瞬态记录这类应用,长期连续和瞬时突发往往同时存在。方案能不能立住,看的就是这条数据链路有没有被认真算过。

相关推荐
狂奔蜗牛(bradley)17 小时前
拒绝SOEM黑盒!死磕EtherCAT主站:ARM+FPGA架构、DC同步与状态机修复等,50+篇实战开发文档全公开
arm开发·fpga开发·架构
XMAIPC_Robot19 小时前
CODESYS 实时控制 + RK182X 大模型算力扩展|RK3576 工业边缘控制器设计
人工智能·fpga开发·机器人·rk3588+fpga
女神下凡1 天前
芯参谋(31):SPI NOR Flash 电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
学习FPGA的电气小兴兴1 天前
基于FPGA的CORDIC旋转模式实现sin和cos运算_采用EGo1板卡上板验证【FPGA数字信号处理第5讲】
fpga开发·信号处理·数字信号处理·verilog·cordic·ego1·fpga设计入门与提高
博览鸿蒙7 天前
FPGA开发使用的语言
fpga开发·fpga
明德扬7 天前
机器人多摄像头如何做FPGA多路视频聚合?
学习·fpga开发·fpga
JoYER_cc8 天前
FPGA 调试实录:LED 闪烁程序从踩坑到仿真验证的完整经验总结
fpga开发
ktd0078 天前
复旦微开发环境搭建流程备忘录
fpga开发
ERROR:998 天前
陈工,试试Agent开发FPGA
fpga开发