• 正文
  • 相关推荐
申请入驻 产业图谱

【黑金云课堂】从 ADC 采集到波形显示:FPGA + PCIe 实战解析

15小时前
28
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

如何将 FPGA 采集到的 ADC 数据,通过 PCIe 传输到电脑,并实时显示成波形?

本节实验基于 Z7_P 开发板与 AN9238 ADC 模块,通过 FPGA 完成数据采集与缓存,利用 PCIe DMA 实现高速数据传输,最终在上位机中显示采样波形。

如果你正在跟着 ALINX 黑金云课堂学习,建议你本节课重点理解:

FPGA 如何控制 ADC 完成数据采集?

DMA WRITE、DDR 与 XDMA 在数据传输过程中分别承担什么作用?

上位机如何读取采样数据,并将其转换为可显示的波形?

一、实验介绍

1. 实验环境

本实验使用以下硬件与软件环境:

项目
说明
FPGA 开发板
Z7_P
ADC 模块
AN9238
开发环境
Vivado
上位机环境
Ubuntu、Qt Widgets、Qwt 绘图库
PCIe 驱动
XDMA

将 AN9238 ADC 模块连接至 Z7_P 开发板的 40 pin 扩展接口,外部信号源接入 ADC 模块;随后将 Z7_P 开发板插入电脑的 PCIe 插槽。在 Ubuntu 系统下安装 XDMA 驱动并运行上位机程序,即可观察 ADC 采集到的信号波形。

2. 数据传输流程

本实验主要分为三个部分:

FPGA 端程序

:负责建立 PCIe 框架、构建通信协议,并完成 ADC 采集与存储。

PCIe 驱动

:负责上位机测试程序与 PCIe 卡之间的数据交换,向上位机提供数据与寄存器访问通道。

PCIe 上位机测试程序

:读取采样数据,完成数据转换与波形显示。

理解这条数据链路,是分析后续 FPGA 控制流程和上位机程序的基础。

二、FPGA 端程序说明

FPGA 端主要完成两项任务:一是控制 DMA WRITE,将数据搬运至 DDR;二是控制 AD9238 模块完成指定长度的数据采集。

1. DMA WRITE 寄存器配置

DMA WRITE 通过寄存器配置传输长度、起始地址和启动状态。相关寄存器如下:

地址偏移
功能说明
配置方式
0x0
控制寄存器
[0] 启动 DMA传输,随后自动清除
0x4
中断清除寄存器
8 位,每一位写 1 清除对应中断
0x8
写传输长度
按数据位宽为单位配置
0xC
写起始地址
按数据位宽为单位配置
0x10
中断状态寄存器
8 位,每一位对应一个中断

这里有一个需要特别注意的地方:DMA WRITE 的传输长度和起始地址,并不是直接以字节为单位配置,而是以数据位宽为单位。本实验中,DMA 数据位宽为 256 bit,即 32 Byte。

例如,当传输长度为 0x10000000 Byte 时:

传输长度寄存器值 = 0x10000000 / 32 = 0x800000

如果位宽256位时,寄存器值为实际地址除以32。

2. AD9238 采集模块寄存器配置

AD9238 采集模块通过寄存器控制采集启动和采集长度。

地址偏移
功能说明
配置方式
0x0
控制寄存器
[0] 启动 ADC 采集并写入 FIFO
0x4
采集长度寄存器
以 16 bit,即 2 Byte 为单位配置

与 DMA WRITE 不同,AD9238 采集长度寄存器以 16 bit 数据为单位。例如,计划采集 0x10000000 Byte 数据,则采集长度寄存器的配置值为:

采集长度寄存器值 = 0x10000000 / 2 = 0x8000000

当采集达到指定长度后,采集模块会自动停止。下一轮采集需要由上位机重新触发。

3. 为什么要先启动 DMA,再启动 ADC?

本实验中,采集控制流程需要注意启动顺序。首先,配置 DMA WRITE 的传输长度和起始地址,并启动 DMA;随后配置 AD9238 的采集长度,再启动 ADC 采集。

先启动 DMA,再启动 ADC,可以让数据搬运通道提前进入工作状态,再开始产生采集数据。这样能够使采集与传输流程更好地衔接。

4. Vivado 中的 XDMA 地址配置

在 Vivado 中配置 XDMA IP 时,需要设置 PCIe to AXI Lite Master Interface 的偏移地址。本实验使用的偏移地址为:0xA0000000

上位机通过 /dev/xdmaN_user 设备节点访问该地址窗口,从而读写 FPGA 端自定义寄存器。

这里需要区分两类访问:

寄存器访问

:通过 /dev/xdmaN_user 配置 FPGA 控制寄存器。

数据访问

:通过 /dev/xdmaN_c2h_0 读取 FPGA DDR 中的采样数据。

两者分别承担控制和数据读取任务,是理解上位机程序的关键。

三、上位机程序说明

上位机基于 Qt Widgets 构建界面,使用 Qwt 绘图库显示采集波形。程序通过 XDMA 驱动经 PCIe 总线读取 FPGA DDR 中的采样数据。界面以示波器形式实时显示采集波形。

1. 上位机如何访问 FPGA?

本实验主要使用两个设备节点:

设备节点
主要用途
/dev/xdmaN_user
读写 FPGA 自定义寄存器,控制采集与传输流程
/dev/xdmaN_c2h_0
从 FPGA DDR 读回采样数据

其中,N 表示系统中对应的 XDMA 设备编号,实际名称以目标系统识别结果为准。

2. 单轮采集流程

上位机每轮采集需要完成寄存器配置、采集触发、中断检测和数据读取。具体流程如下:

当一轮采集完成后,上位机再发起下一轮采集,由此实现连续更新的波形显示。

3. 数据处理与显示

读取到的原始数据还不能直接用于波形显示,需要先按照数据格式进行解析,再转换为对应的电压值。

本实验中,每个采样点占用 2 Byte,采用小端方式组合数据,并从中提取 12 bit 采样值:

完成数据组合后,根据实验程序中的换算公式,将采样值转换为对应的电压数值:

V = (d - 2048) * 625 / 256换算±5v量程

完成数据处理后,程序通过 Qwt 绘制采样波形,并结合双缓冲和 Qt 信号槽机制刷新界面,显示实时的信号波形。

最后,注意设置停止标志并等待采集线程当前轮 DMA 正常完成后退出,避免残留数据导致波形开头跳变。

四、实验现象

完成 FPGA 端程序配置、XDMA 驱动安装和上位机程序运行后,可以观察到以下实验现象:

上位机能够实时显示 1 路 ADC 采集波形。

调整信号源的频率或幅值,界面中的波形随之变化。

波形数据能够正常保存,并支持重新打开。

正常关闭程序后再次运行,波形无残留跳变现象。

本实验打通了「ADC 采集 → FPGA 缓存 → PCIe DMA 传输 → 上位机显示」的完整链路。掌握这条链路后,可以进一步扩展到多通道采集、更高采样率以及更复杂的触发与存储策略。

💡 完整视频讲解可前往 ALINX 视频号进行直播回看

更多细节欢迎关注我们黑金云课堂全年免费直播课,黑金云课堂十月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!

系列
内容定位
Verilog开发
硬件描述语言基础、逻辑设计、仿真调试
Vitis开发
Zynq软硬件协同、外设驱动、网络协议栈
Linux开发
嵌入式Linux系统移植、驱动编写、应用开发

相关推荐

芯驿电子自 2012 年成立以来,旗下 AUMO 与 ALINX 两大品牌,在智能车载与 FPGA 行业解决方案领域持续深耕。 ALINX 聚焦 FPGA 解决方案高端产品市场,并积极参与 FPGA 国产化应用发展。至今已推出 100 多款 FPGA SoM 模组和配套板卡,基本完成对 AMD FPGA 产品、紫光同创 FPGA 产品的全系列覆盖,产品远销海外 40 多个国家。 AUMO 专注智能车载,为自动驾驶技术开发破题。至今已推出车载仿真测试系统、视频数据采集、视频数据旁路采集分流、视频数据注入、车载摄像头、车载后视镜等产品线,满足车企和汽车产业链的车载产品开发需求。

微信公众号