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 尚未实测。

本文目录分开控制面与数据面固定 IP 参数,避免默认为另一种模式从板卡预设到 XSA典型故障:能写寄存器却不能访问 DDR

分开控制面与数据面

PS 的 M_AXI_GP0 经控制互连访问 DMA AXI-Lite;DMA 的两个内存主接口经 SmartConnect 访问 PS S_AXI_HP0 对应的 DDR 地址空间。这两个方向不能接反。AXI 内存侧使用 64 位,流侧使用 32 位;DMA 与内存互连在100 MHz,变换器在75 MHz。两个独立时钟 FIFO 把变换器夹在中间,避免直接跨域连接握手线。

控制寄存器与数据地址分别验证,不能以 AXI-Lite 可读替代 DDR 可达PS GP0寄存器控制AXI DMAMM2S + S2MMSmartConnect两个主口共享 HP0PS DDRTX / RX 地址段一次软件命令对应一个流式包;仅 VALID && READY 时接受数据
控制寄存器与数据地址分别验证,不能以 AXI-Lite 可读替代 DDR 可达(原创示意,非器件引脚图;窄屏可横向滑动)

固定 IP 参数,避免默认为另一种模式

实验采用 Simple mode,关闭 Scatter/Gather,长度字段设为23位以容纳65536字节,两个方向都启用 DRE。DRE 能处理数据对齐,不会修复无效物理地址或错误缓存所有权。FIFO 设置普通模式与独立时钟,保留 KEEP/LAST,深度1024拍;不要把 packet mode 的整包缓存行为误当成普通队列的流控。

配置与验收依据
项目设置 / 预期 / 处理
DMAc_include_sg=0;c_sg_length_width=23
宽度与 DRE内存64位;Stream32位;双向 DRE=1
FIFOTDATA_NUM_BYTES=4;HAS_TKEEP/HAS_TLAST=1;IS_ACLK_ASYNC=1;FIFO_MODE=1
reset100 / reset75FCLK_RESET0_N 共同异步请求;各域同步释放
时钟PS FCLK0=100 MHz;FCLK1=75 MHz;保留生成时钟与 IP 自带 XDC

完整宽度、连线和时钟配置见 hw/create_design.tcl;当前未在 Vivado 执行。

tcl
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 掩盖跨域问题。

  1. 执行 get_board_parts *zed*

    预期与判定:记录完整板卡标识;查不到先安装匹配板卡文件。

  2. 运行 create_design.tcl

    预期与判定:得到 BD_READY 与 address-map.txt;Validate Design 无未解决错误。

  3. 运行 implement.tcl

    预期与判定:得到 timing/cdc/drc/clock-interaction/exceptions 报告;人工复核未约束路径。

  4. 打开实现设计后 source hw/export.tcl

    预期与判定:setup/hold 非负且报告已复核,生成同版 bit、ltx、xsa。

参考构建流程;尖括号参数必须替换为本机枚举结果。

bash
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 频率不同并不自动代表无相位关系;不能把所有相关时钟一概设为异步来消除时序违例。

完成检查

  • 已记录本章配置、版本及预期结果。
  • 能区分本地模型验证与实际板上证据。
  • 能复现典型故障并说明修复后的复测标准。

延伸阅读与来源

本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。

继续阅读

FPGA

从 RTL 到板上运行的完整流程

建立约束、实现、下载与观测的最小工程闭环。

10 分钟
FPGA

第一个工程的引脚与时钟约束

区分电气连接与时间要求,避免“能生成位流就算正确”。

11 分钟
FPGA

如何读懂时序报告

从起点、终点、时钟和裕量找出失败路径的原因。

10 分钟