FPGA 系统实战 · 01 从 AXI4-Stream 到 DMA / DDR 系统
明确平台迁移、数据契约与软硬件分工,先在本机跑通同一套控制流程。
先修知识完成 FPGA AXI4-Stream / 异步 FIFO 实战;会读 AXI 时序、C 指针和链接 map。
适用环境ZedBoard Zynq-7020 / PS DDR;Vivado、Vitis 2024.1 参考;本地 Python 3 + cc + Icarus Verilog。
验证状态13 项本地用例通过:C 主机后端与教学 FIFO / RTL 组合;Vivado、Vitis BSP、厂商 IP、DDR 和板上 ILA 尚未实测。
为什么这一章要迁移板卡
前章 Basys 3 适合验证纯 PL 流式电路,但没有本课程采用的 PS 处理器和板载 DDR。这里迁移到 ZedBoard 的 Zynq-7020,沿用 VALID/READY、TKEEP/TLAST、反压与跨域验证方法。CPU 负责缓冲区和命令;DMA 负责 DDR 与流之间搬运;PL 对每个有效字节异或 0xa5。不是在前章工程里勾选一个 DMA IP 就能直接上板。
先冻结单包与字节契约
前章发生器每八拍产生一个 TLAST;直接把它接到一次大容量 S2MM 接收会提前结束一个包。本课程让 MM2S 根据一次命令的长度生成包尾,两个 FIFO 与 XOR 原样保持 TKEEP/TLAST。4094 字节是刻意选择的边界:最后一拍只有两个有效字节,不能把物理总线拍数乘四当作有效数据量。
| 项目 | 设置 / 预期 / 处理 |
|---|---|
| 目标平台 | ZedBoard / xc7z020clg484-1;Vivado/Vitis 2024.1 参考配置 |
| 数据模式 | tx[i]=(i*17+seed)&255;rx[i]=tx[i]^0xa5 |
| 测试长度 | 64、4094、4096、65536 字节,每个长度3次 |
| 4094 字节包 | 1024 拍;尾拍 keep=0x3;只接受一次 last |
| 缓冲区 | TX/RX 各65536字节、64字节对齐、独占缓存行 |
dma_app.c 的测试矩阵;transfer 的完整实现见软件章与下载包。
const unsigned sizes[]={64,4094,4096,65536};
for(unsigned s=0;s<4;s++)
for(unsigned rep=0;rep<3;rep++)
if(transfer(sizes[s],3+rep)) return 1;先执行无需板卡的基线
解压工程后从实验根目录运行命令,不需要商业仿真器或 AMD 库。C 主机后端复用实际应用的控制顺序,并用独立数组模拟 CPU 副本和 DDR;RTL 仿真复用前章小容量 FIFO,检查变换、包边界和反压。它们没有建模厂商 DMA 的 AXI 内存突发、DDR 控制器或真实缓存替换,所以只能证明明确覆盖的逻辑。
- 安装 Python 3、cc、iverilog/vvp
预期与判定:四个命令可用,记录版本。
- 运行 tests/run.py
预期与判定:13 个用例通过,报告保存在 results/local-validation.json。
- 单独运行 C 基线
预期与判定:看到 HOST_MODEL 和12次 PASS;synthetic ticks 不作为性能。
- 注入 NO_FLUSH
预期与判定:应用非零退出并输出 DATA_MISMATCH,恢复无故障后重新通过。
在下载包根目录执行;最后一行是预期失败的教学测试。
python3 tests/run.py
cc -std=c11 -Wall -Wextra -Werror -DHOST_TEST sw/dma_app.c -o /tmp/dma-host
/tmp/dma-host
FAULT=NO_FLUSH /tmp/dma-host典型故障:流式源仍按小包结束
如果接收长度设为 4094 而上游仍沿用旧发生器的每八拍 TLAST,DMA 看到的是多个短包,而不是一个长包。优先检查第一个被接受的包尾及 S2MM_LENGTH,再看软件是否把剩余缓冲区误当成新数据。不能通过忽略末尾数据或者强制清除状态位来让校验“通过”。
完成检查
- 已记录本章配置、版本及预期结果。
- 能区分本地模型验证与实际板上证据。
- 能复现典型故障并说明修复后的复测标准。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- AMD PG021 · AXI DMA 7.1
Direct Register Mode、S2MM_LENGTH、DMA 状态位及 DRE。
- AMD embeddedsw 2024.1 · Simple Poll Example
对照先接收后发送、cache maintenance 与驱动 API;本站示例为原创实现。
- AMD PG085 · AXI4-Stream Infrastructure
AXI4-Stream Data FIFO、独立时钟与复位配置。
- AMD UG908 · Programming and Debugging 2024.1
Hardware Manager、ILA 触发、探针文件与位流匹配。
继续阅读
FPGA从 RTL 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子