如何将 FPGA 采集到的 ADC 数据,通过 PCIe 传输到电脑,并实时显示成波形?
本节实验基于 Z7_P 开发板与 AN9238 ADC 模块,通过 FPGA 完成数据采集与缓存,利用 PCIe DMA 实现高速数据传输,最终在上位机中显示采样波形。
如果你正在跟着 ALINX 黑金云课堂学习,建议你本节课重点理解:
FPGA 如何控制 ADC 完成数据采集?
DMA WRITE、DDR 与 XDMA 在数据传输过程中分别承担什么作用?
上位机如何读取采样数据,并将其转换为可显示的波形?
一、实验介绍
1. 实验环境
本实验使用以下硬件与软件环境:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
将 AN9238 ADC 模块连接至 Z7_P 开发板的 40 pin 扩展接口,外部信号源接入 ADC 模块;随后将 Z7_P 开发板插入电脑的 PCIe 插槽。在 Ubuntu 系统下安装 XDMA 驱动并运行上位机程序,即可观察 ADC 采集到的信号波形。
2. 数据传输流程
本实验主要分为三个部分:
FPGA 端程序
PCIe 驱动
:负责上位机测试程序与 PCIe 卡之间的数据交换,向上位机提供数据与寄存器访问通道。
PCIe 上位机测试程序
理解这条数据链路,是分析后续 FPGA 控制流程和上位机程序的基础。
二、FPGA 端程序说明
FPGA 端主要完成两项任务:一是控制 DMA WRITE,将数据搬运至 DDR;二是控制 AD9238 模块完成指定长度的数据采集。
1. DMA WRITE 寄存器配置
DMA WRITE 通过寄存器配置传输长度、起始地址和启动状态。相关寄存器如下:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这里有一个需要特别注意的地方:DMA WRITE 的传输长度和起始地址,并不是直接以字节为单位配置,而是以数据位宽为单位。本实验中,DMA 数据位宽为 256 bit,即 32 Byte。
例如,当传输长度为 0x10000000 Byte 时:
传输长度寄存器值 = 0x10000000 / 32 = 0x800000
如果位宽256位时,寄存器值为实际地址除以32。
2. AD9238 采集模块寄存器配置
AD9238 采集模块通过寄存器控制采集启动和采集长度。
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
与 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?
本实验主要使用两个设备节点:
|
|
|
|---|---|
|
|
|
|
|
|
其中,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 开发全流程!
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
28