FPGA 系统实战 · 02 搭建 PS、DMA、DDR 与跨域通路
建立可复建的 Block Design、地址图、双时钟复位和实现检查点。
先修知识完成 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 尚未实测。
分开控制面与数据面
PS 的 M_AXI_GP0 经控制互连访问 DMA AXI-Lite;DMA 的两个内存主接口经 SmartConnect 访问 PS S_AXI_HP0 对应的 DDR 地址空间。这两个方向不能接反。AXI 内存侧使用 64 位,流侧使用 32 位;DMA 与内存互连在100 MHz,变换器在75 MHz。两个独立时钟 FIFO 把变换器夹在中间,避免直接跨域连接握手线。
固定 IP 参数,避免默认为另一种模式
实验采用 Simple mode,关闭 Scatter/Gather,长度字段设为23位以容纳65536字节,两个方向都启用 DRE。DRE 能处理数据对齐,不会修复无效物理地址或错误缓存所有权。FIFO 设置普通模式与独立时钟,保留 KEEP/LAST,深度1024拍;不要把 packet mode 的整包缓存行为误当成普通队列的流控。
| 项目 | 设置 / 预期 / 处理 |
|---|---|
| DMA | c_include_sg=0;c_sg_length_width=23 |
| 宽度与 DRE | 内存64位;Stream32位;双向 DRE=1 |
| FIFO | TDATA_NUM_BYTES=4;HAS_TKEEP/HAS_TLAST=1;IS_ACLK_ASYNC=1;FIFO_MODE=1 |
| reset100 / reset75 | FCLK_RESET0_N 共同异步请求;各域同步释放 |
| 时钟 | PS FCLK0=100 MHz;FCLK1=75 MHz;保留生成时钟与 IP 自带 XDC |
完整宽度、连线和时钟配置见 hw/create_design.tcl;当前未在 Vivado 执行。
set_property -dict [list CONFIG.c_include_sg {0} \
CONFIG.c_sg_length_width {23} \
CONFIG.c_m_axis_mm2s_tdata_width {32} \
CONFIG.c_include_mm2s_dre {1} \
CONFIG.c_include_s2mm_dre {1}] [get_bd_cells dma]从板卡预设到 XSA
先在 Vivado 控制台枚举已安装的 ZedBoard board part,再把精确标识传入脚本。板卡 preset 包含 DDR 与 MIO 配置,不能替换成另一块 Zynq 板的 preset。创建 BD、实现、导出分成三步,是为了让地址、未约束路径和 CDC 报告成为真实检查点;脚本不会用全局 false path 掩盖跨域问题。
- 执行 get_board_parts *zed*
预期与判定:记录完整板卡标识;查不到先安装匹配板卡文件。
- 运行 create_design.tcl
预期与判定:得到 BD_READY 与 address-map.txt;Validate Design 无未解决错误。
- 运行 implement.tcl
预期与判定:得到 timing/cdc/drc/clock-interaction/exceptions 报告;人工复核未约束路径。
- 打开实现设计后 source hw/export.tcl
预期与判定:setup/hold 非负且报告已复核,生成同版 bit、ltx、xsa。
参考构建流程;尖括号参数必须替换为本机枚举结果。
vivado -mode batch -source hw/create_design.tcl -tclargs <完整board-part>
vivado -mode batch -source hw/implement.tcl
# Vivado GUI: Open Implemented Design 后
source hw/export.tcl典型故障:能写寄存器却不能访问 DDR
AXI-Lite 可访问只能说明控制路径工作。MM2S_DMASR 的 DMADecErr 或 S2MM_DMASR 的同类位提示数据地址译码失败,应比较软件缓冲区地址、BD 中 HP0 DDR segment 和运行时映射。另一方面,两路 FCLK 频率不同并不自动代表无相位关系;不能把所有相关时钟一概设为异步来消除时序违例。
完成检查
- 已记录本章配置、版本及预期结果。
- 能区分本地模型验证与实际板上证据。
- 能复现典型故障并说明修复后的复测标准。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- 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 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子