SU200P QDMA PCIe 实验说明
配套工程:
qdma_1_ex工程环境:Vivado 2026.1目标器件:xcsu200p-sbva1024-2-e
1. 实验目的
本实验使用 SU200P 开发板完成以下内容:
- 了解 Vivado QDMA IP 的主要配置参数;
- 认识 QDMA 官方例程的组成和工作流程;
- 理解 PCIe Endpoint、H2C、C2H、AXI-MM 和 AXI-ST 的基本关系;
- 使用官方 Root Port 模型验证链路训练和 DMA 数据传输;
- 下载 PDI,并在 Linux 主机中检查 PCIe 枚举、链路状态和 DMA 功能。
2. 工程来源与实验定位
2.1 工程来源
qdma_1_ex 是在 Vivado 中完成 qdma_1 IP 配置后,通过 Open IP Example Design 导出的官方示例工程。Vivado 根据当前 IP 参数生成 PCIe Endpoint 顶层、QDMA 示例应用、AXI 存储结构、仿真 Root Port 模型和示例测试流程。

2.2 实验定位
本实验不要求重新实现 PCIe 协议栈或 QDMA 队列管理逻辑。实验重点是理解影响链路和数据通路的关键 IP 参数,掌握官方例程的仿真方法,并完成开发板与主机之间的 PCIe 和 DMA 验证。
工程目标器件为 xcsu200p-sbva1024-2-e,综合顶层为 xilinx_qdma_pcie_ep,仿真顶层为 board。
3. IP 配置
QDMA IP 的配置需要同时满足三方面要求:PCIe 链路应与 SU200P 的高速通道和参考时钟匹配;设备枚举信息和 BAR 空间应便于上位机识别与访问;用户侧接口应覆盖官方例程需要验证的 AXI-MM 和 AXI-ST 传输。下面按照这三条关系说明主要配置。
3.1 Basic:确定链路和用户接口

<kbd>QDMA Basic页面配置</kbd>
本工程将 FPGA 配置为 PCIe Endpoint,并选择器件中的 X0Y1 PCIe 硬核。SU200P 从该硬核引出四条 PCIe Lane,因此 IP 的链路宽度设置为 ×4,最高速率设置为 16.0 GT/s,即 PCIe Gen4。参考时钟选择 100 MHz,与 PCIe 插槽送入开发板的差分参考时钟一致。
用户侧同时启用 AXI-MM 和 AXI-ST with Completion,数据宽度为 256 bit,接口时钟为 250 MHz。这样,官方例程既可以用 AXI BRAM 验证存储器映射方式的 H2C/C2H 传输,也可以验证流方式的 H2C、C2H 和 Completion。512 个队列表示 QDMA 可提供的队列资源规模,例程只从中选取指定队列进行测试。
| 关键配置 | 当前值 | 选择依据 |
|---|---|---|
| Device / Port Type | PCI Express Endpoint device | FPGA 作为主机 PCIe 总线上的端点设备 |
| PCIe Block Location | X0Y1 | 与板上使用的 PCIe 硬核和 GTH 通道相匹配 |
| Link Width / Speed | ×4 / 16.0 GT/s | 对应板卡的四条 PCIe 通道和 Gen4 目标能力 |
| Reference Clock | 100 MHz | 使用 PCIe 插槽提供的差分参考时钟 |
| AXI Data Width / Clock | 256 bit / 250 MHz | 对应官方例程的用户侧数据通路 |
| DMA Interface | AXI-MM 与 AXI-ST with Completion | 覆盖例程中的四类 DMA 测试 |
这里的 Gen4 ×4 是 Endpoint 支持的最高能力。实际上电后,链路会与上位机插槽重新协商;最终速度和宽度还会受到插槽能力、通道连接和信号质量影响。板级验证时应查看系统报告的实际链路状态。
Basic 页面中的 X0Y1、×4 和 100 MHz 都有明确的板级依据。工程约束将四组收发信号连接到 GTHE4_CHANNEL_X0Y0~GTHE4_CHANNEL_X0Y3,参考时钟 PCIE_HDMI_RCLK_OUT_C_P/N 接入 FPGA 的 AC6 和 AC5。顶层使用 IBUFDS_GTE4 将该差分时钟送入 QDMA。

<kbd>Bank 221与PCIe和HDMI高速通道切换电路</kbd>
原理图还显示,Bank 221 的部分高速通道由 U45、U48 在 PCIe 和 HDMI 之间切换。因此,IP 配置正确只是链路建立的一个条件;实验前还要把 SW10 设置为 1-4 闭合、2-3 断开,使高速信号实际接到 PCIe 接口。
3.2 Capabilities:确定主机看到的设备

<kbd>QDMA Capabilities页面配置</kbd>
本实验只需要验证一个 QDMA Endpoint,因此仅启用 PF0,不创建虚拟功能。主机枚举该功能时,会从 PCIe 配置空间读取 Vendor ID、Device ID 和 Class Code。工程使用 10EE:9044,Class Code 为 0x058000;这些信息既用于确认设备是否枚举成功,也可能被驱动用于匹配设备。
| 配置项 | 当前值 | 用途 |
|---|---|---|
| Physical Functions | 1 | 只生成 PF0,保持实验结构简单 |
| Vendor ID / Device ID | 10EE:9044 | 标识 AMD/Xilinx QDMA 设备 |
| Class Code | 0x058000 | 将设备归入 Memory Controller 类 |
| SR-IOV | Disabled | 本实验不创建虚拟功能 |
如果修改 Device ID,设备仍可能正常完成 PCIe 枚举,但原有驱动未必会自动绑定,因此还需要同步检查驱动支持的设备 ID。
3.3 PCIe BARs:建立主机访问窗口

<kbd>QDMA BAR页面配置</kbd>
PCIe 设备不能让主机直接使用 FPGA 内部地址。枚举过程中,设备先通过 BAR 声明所需的地址窗口,主机再为这些窗口分配实际 MMIO 基地址。本工程保留两个窗口:一个访问 QDMA 自身寄存器,另一个访问示例用户逻辑。
| BAR | 类型与容量 | 在例程中的用途 |
|---|---|---|
| BAR0/1 | DMA,256 KB,64 bit | 访问 QDMA 配置、队列上下文和状态寄存器 |
| BAR2/3 | AXI-Lite Master,4 KB,64 bit | 访问 user_control 等示例寄存器 |
64 bit BAR 会连续占用两个 BAR 编号,所以 DMA BAR 使用 BAR0/1,AXI-Lite Master BAR 使用 BAR2/3。这里的 256 KB 和 4 KB 表示主机地址空间中预留的窗口大小,并不表示 FPGA 内部存储容量。系统完成枚举后,可以从 PCIe 设备信息中查看这些窗口最终被分配到的地址。
3.4 PCIe MISC:补充配置访问、时钟和复位

<kbd>QDMA PCIe MISC页面配置</kbd>
例程启用 Configuration Management Interface,使用户逻辑可以读取和管理 PCIe 配置空间。Slot Clock Configuration 也保持启用,用来声明 Endpoint 与主机使用插槽提供的公共参考时钟。这里的 Slot Clock 只描述 PCIe 参考时钟关系,与 250 MHz AXI 用户时钟不是同一个概念。

<kbd>PCIe连接器和PERST复位电路</kbd>
主机输出的 PERST# 经板级电平转换形成 PCIE_EP_PERST_B,连接到 FPGA D20,并在顶层作为低有效 sys_rst_n 使用。由此,链路启动需要同时满足三个条件:100 MHz 参考时钟已经到达、SW10 已选择 PCIe 通道、PERST# 已经释放。若链路始终无法进入 Link Up,应优先检查这三项,而不是先调整队列数或 BAR 容量。
3.5 PCIe DMA:采用标准描述符流程

<kbd>QDMA PCIe DMA页面配置</kbd>
本工程没有启用 Descriptor Bypass,而是让 QDMA 内部描述符引擎按照标准队列流程获取和处理描述符。这与官方例程及常规 QDMA 驱动的工作方式一致,用户逻辑不需要另外实现描述符旁路接口。
Prefetch Cache Depth 和 Completion 缓冲保持例程配置,用于减少描述符等待并容纳 C2H 完成信息。PF0 同时启用 MSI-X,中断可用于通知队列完成和异常事件。设备能够被系统枚举,只能说明 PCIe 链路和配置空间基本正常;要确认 DMA 可用,还需要驱动成功初始化队列并完成 H2C/C2H 数据传输。
3.6 配置与官方例程的对应关系
完成配置并执行 Open IP Example Design 后,Vivado 会根据所选接口自动生成外围测试模块。前面的配置决定“QDMA 提供什么能力”,官方例程则把这些能力连接成可仿真、可上板的验证设计。
| IP 配置 | 例程中的对应内容 |
|---|---|
| Endpoint、Gen4 ×4、X0Y1、100 MHz | 四组 PCIe 收发端口、参考时钟、复位以及相应管脚约束 |
| AXI-MM | AXI BRAM Controller 和片上存储器,用于 H2C 写入及 C2H 读回 |
| AXI-ST with Completion | st_h2c、st_c2h 和 qdma_lpbk 流数据测试模块 |
| AXI-Lite Master BAR | BAR2/3 连接的 user_control 控制和状态寄存器 |
| 队列与 MSI-X | 提供给驱动的队列和中断资源 |
理解这些对应关系后,下一节可以直接沿着 PCIe、AXI-MM、AXI-ST 和 AXI-Lite 通路分析官方例程,不需要再逐项解释 IP 界面中的其他开关。
4. 官方例程结构与工作原理
第 3 节配置的 QDMA IP 只是核心模块,不能单独完成板级实验。Open IP Example Design 会在其外围加入顶层时钟与复位处理、板级 PCIe 端口、AXI 存储器、流数据测试模块、控制寄存器以及 Root Port 仿真环境。本节说明这些自动生成的模块如何承接前述 IP 参数。
4.1 主要文件
| 文件 | 来源 | 作用 |
|---|---|---|
qdma_1_ex.xpr | Vivado 例程工程 | 工程入口 |
imports/xilinx_qdma_pcie_ep.sv | 官方例程 | 综合顶层,连接 PCIe、QDMA 和用户逻辑 |
imports/qdma_app.sv | 官方例程 | 连接 AXI-MM、AXI-ST 和控制模块 |
imports/user_control.sv | 官方例程 | AXI-Lite 控制寄存器和状态逻辑 |
imports/qdma_lpbk.sv | 官方例程 | AXI-ST 回环处理 |
imports/st_h2c.sv、st_c2h.sv | 官方例程 | 流数据检查和生成 |
imports/board.v | 官方仿真环境 | 连接 Endpoint 与 Root Port 模型 |
imports/sample_tests.vh | 官方仿真环境 | 定义 QDMA 示例测试流程 |
imports/xilinx_qdma_pcie_x0y1.xdc | 工程约束 | PCIe 时钟、复位和高速收发器约束 |
qdma_1_ex.srcs/sources_1/ip/qdma_1/qdma_1.xci | IP 配置 | 保存 QDMA 参数 |
bit/xilinx_qdma_pcie_ep.pdi | 工程发布文件 | 板级验证使用的 PDI |
自动生成的例程和 IP 文件不宜直接修改。更改链路速率、接口或队列参数时,应返回 QDMA IP 配置界面并重新生成 Output Products 和 Example Design。
4.2 总体结构

4.3 PCIe 接口与板级通道
100 MHz 差分参考时钟通过 sys_clk_p/sys_clk_n 输入,sys_rst_n 为主机提供的低有效 PCIe 复位信号。
| 顶层端口 | FPGA 管脚 | 板级网络 | 作用 |
|---|---|---|---|
sys_clk_p | AC6 | PCIE_HDMI_RCLK_OUT_C_P | 参考时钟正端 |
sys_clk_n | AC5 | PCIE_HDMI_RCLK_OUT_C_N | 参考时钟负端 |
sys_rst_n | D20 | PCIE_EP_PERST_B | PCIe 低有效复位 |
PCIe 与 HDMI 共用一组高速通道选择电路。进行本实验时,SW10 应设置为:1–4 闭合,2–3 断开。调整开关前应关闭开发板和主机电源。
相关原理图已在第 3.1 节和第 3.4 节给出。本节中的端口和约束正是对这些板级连接的 HDL 实现:pci_exp_rx/tx[3:0] 对应四条高速通道,sys_clk_p/n 对应 PCIe 参考时钟,sys_rst_n 对应主机提供的 PERST#。
4.4 QDMA 数据通路
- H2C(Host to Card):数据从主机内存传向 FPGA;
- C2H(Card to Host):数据从 FPGA 传回主机内存;
- AXI-MM:QDMA 通过地址读写片上存储器;
- AXI-ST:QDMA 与用户逻辑通过
valid/ready流接口传输数据。
官方例程使用 AXI BRAM 验证 AXI-MM H2C/C2H,使用 st_h2c、st_c2h 和回环逻辑验证 AXI-ST H2C/C2H。user_control.sv 通过 BAR2 对应的 AXI-Lite 接口提供示例控制和状态寄存器。
5. 仿真验证
5.1 仿真环境
仿真顶层 board.v 同时实例化 QDMA Endpoint 和 PCIe Root Port 模型,不需要连接真实开发板。测试平台先产生参考时钟和复位,再完成链路训练、配置空间访问、BAR 初始化和 DMA 测试。
5.2 运行步骤
- 打开
qdma_1_ex.xpr; - 选择 Run Simulation → Run Behavioral Simulation;
- 等待 QDMA、Endpoint、Root Port 和测试模块完成编译;
- XSim 打开后选择 Run All,使测试运行到
$finish; - 在波形和日志中检查链路及数据比较结果。
自动生成的仿真脚本默认只运行 1000 ns,该时间通常只能看到复位初期,无法完成 PCIe 链路训练和 DMA 测试。仿真停在 1000 ns 时应继续执行 Run All。
5.3 默认测试内容
未另外指定 TESTNAME 时,测试平台使用 qdma_mm_st_test0 和队列 3,依次执行:
- AXI-MM H2C;
- AXI-MM C2H;
- AXI-ST H2C;
- AXI-ST C2H。
正常完成时,日志应出现四个阶段的 Completed 信息,并出现 TEST PASSED 或 Test Completed Successfully。
5.4 PCIe 链路训练

<kbd>PCIe复位释放与链路训练波形</kbd>
sys_rst_n 在约 4.995 µs 解除复位,随后 cfg_ltssm_state 随 PCIe 链路训练过程改变。波形中 user_lnk_up 在约 142.089 µs 拉高,表示 Endpoint 已报告链路建立;测试平台在约 142.468 µs 输出 Transaction Link Is Up。日志随后确认协商速率为 16.0 GT/s、链路宽度为 ×4,链路检查通过。
5.5 AXI-MM 数据传输


<kbd>AXI-MM H2C和C2H接口波形</kbd>
上半部分为 AXI-MM H2C 写传输。地址通道的 AWVALID/AWREADY、数据通道的 WVALID/WREADY 在同一周期为高时,相应地址或数据拍被接收;WLAST 标记最后一拍,BVALID/BREADY 完成写响应握手。下半部分为 AXI-MM C2H 读传输,ARVALID/ARREADY 完成读地址握手,RVALID/RREADY 完成数据传输,RLAST 标记最后一拍。仿真日志分别在约 222.426 µs 和 258.102 µs 报告 H2C、C2H 测试完成。
5.6 AXI-ST 数据传输与完成通知


<kbd>AXI-ST H2C和C2H接口波形</kbd>
AXI-ST 接口同样只在 TVALID 与 TREADY 同时为高时完成一拍数据传输,TLAST 指示当前包的末拍。H2C 波形中的 QID 为 3,与测试平台选择的队列一致;C2H 数据发送完成后,Completion 接口通过 CMPT_VALID/CMPT_READY 完成通知握手。日志在约 284.764 µs 和 316.670 µs 分别确认 AXI-ST H2C、C2H 测试通过。
5.7 仿真结论
本次仿真运行至 $finish,结束时间约为 317.298 µs。PCIe 链路速率与宽度检查通过,AXI-MM H2C、AXI-MM C2H、AXI-ST H2C 和 AXI-ST C2H 四项测试均完成,日志出现 TEST PASSED,未出现数据不匹配或测试失败信息。
6. 板级验证
6.1 硬件连接
所有开关调整和 PCIe 插拔均应在主机与开发板断电时进行。
- 将 SW10 设置为 1–4 闭合、2–3 断开;
- 将开发板插入支持 PCIe ×4 或更宽的插槽并固定;
- 连接开发板配套电源;
- 将 JTAG 下载器连接到板上 P17;
- 检查连接无误后再上电。

<kbd>SU200P 通过 PCIe 延长线连接主机</kbd>
SU200P 板卡尺寸较大,主机内部空间不足时,可以像图中一样使用 PCIe 延长线连接。延长线应至少完整连接四条 Lane,并具备 PCIe Gen4 所需的信号质量;插头方向、金手指和锁扣位置应在断电状态下确认,不能带电插拔。开发板仍需连接配套电源和 JTAG 下载器,延长线只负责 PCIe 高速通道、参考时钟和复位等插槽信号。
PCIe Gen4 对线缆长度和质量较敏感。如果设备无法枚举、链路只协商到较低速率或压力测试不稳定,应先重新插接并更换更短、质量更好的全通道延长线;条件允许时可将开发板直接插入主板插槽进行对照测试。
6.2 下载已有 PDI
工程已提前生成好可用 PDI,位于工程的 bit 文件夹中。以下路径以 qdma_1_ex 工程根目录为基准:
bit/xilinx_qdma_pcie_ep.pdi
在 Vivado 中进入 Hardware Manager,执行 Open Target → Auto Connect,选择识别出的 FPGA 后执行 Program Device。JTAG 下载属于易失性配置,断电后需要重新下载。
PCIe 设备应在主机枚举前完成 FPGA 配置。若在 Linux 启动后才下载 PDI,可以重启主机,或执行总线重新扫描。
6.3 DMA 功能验证
工程目录不包含主机端 QDMA 驱动。本次验证在 Linux 主机中使用 AMD/Xilinx dma_ip_drivers 提供的驱动与测试程序,测试对象为 qdma01000,即 BDF 地址为 01:00.0 的 QDMA 设备。驱动加载后,测试程序可自动创建、启动、停止并删除 AXI-MM 队列。
6.3.1 数据一致性验证
先生成 4096 字节随机数据,并建立接收文件:
dd if=/dev/urandom of=qdma_input.bin bs=4096 count=1
touch qdma_output.bin
使用测试配置执行一次 AXI-MM H2C 写入和 C2H 读回:
sudo ./bin/dma-xfer -c qdma_mm_test.conf
随后检查两个文件的长度并逐字节比较:
wc -c qdma_input.bin qdma_output.bin
sudo cmp qdma_input.bin qdma_output.bin && echo "PASS:写入和读回完全一致"

<kbd>QDMA AXI-MM数据写入与读回一致性验证</kbd>
实测中,H2C 和 C2H 同步传输均返回 success,输入文件和输出文件的长度均为 4096 字节,cmp 最终输出“PASS:写入和读回完全一致”。这说明主机数据能够经 QDMA 写入例程中的 AXI-MM 存储空间,并从同一通路正确读回。
6.3.2 吞吐率验证
在驱动源码的 QDMA/linux-kernel 目录下,分别执行 H2C 单向、C2H 单向和双向并发测试:
sudo env PATH="$PWD/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
./bin/dma-perf -c qdma_mm_h2c_perf.conf
sudo env PATH="$PWD/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
./bin/dma-perf -c qdma_mm_c2h_perf.conf
sudo env PATH="$PWD/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
./bin/dma-perf -c qdma_mm_bi_perf.conf
实测结果如下:
| 测试方式 | 方向 | PPS | 带宽 |
|---|---|---|---|
| 单向传输 | H2C 写入 | 201898 | 6.615816 GB/s |
| 单向传输 | C2H 读取 | 200859 | 6.581772 GB/s |
| 双向并发 | H2C 写入 | 192474 | 6.307010 GB/s |
| 双向并发 | C2H 读取 | 181316 | 5.941371 GB/s |
| 双向并发合计 | H2C + C2H | 373790 | 12.248381 GB/s |

<kbd>QDMA AXI-MM双向并发传输性能</kbd>
双向测试中,H2C 的 req_submitted 与 req_completed 均为 5774272,C2H 两项均为 5439521;两个方向的请求都已完成,日志中没有出现超时或完成错误。双向同时工作时,写入和读取带宽合计约为 12.25 GB/s。单向测试的 H2C 和 C2H 带宽均超过 6.5 GB/s,说明 PCIe、QDMA 队列和 AXI-MM 数据通路能够稳定进行持续传输。
以上结果同时覆盖了短数据正确性和持续传输性能。板级验证成功的判断依据是:设备能够正常枚举,驱动能够管理队列,H2C/C2H 传输无错误,写入数据与读回数据一致,并能够获得稳定带宽。当前综合顶层未将这些状态连接到板载 LED,因此下载后没有对应的 LED 成功现象。
7. 总结与扩展
本实验以 Vivado QDMA IP 官方例程为基础,完成了 PCIe Gen4 ×4 Endpoint 的配置识别、例程结构分析、仿真验证和板级测试。仿真覆盖 AXI-MM 与 AXI-ST 的 H2C/C2H 数据通路;板级测试进一步确认 4096 字节随机数据写入和读回完全一致,AXI-MM 单向带宽超过 6.5 GB/s,双向并发总带宽约为 12.25 GB/s。由此可以确认当前 PDI、PCIe 链路、QDMA 驱动、队列管理和例程数据通路能够协同工作。
后续可以在 AXI-ST 通路中加入实际的数据采集或加速算法,增加板载状态指示、自动化 DMA 测试脚本和吞吐率统计,并进一步比较不同队列数量、传输长度和接口模式下的性能。

