ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Hello World跑飞?Zynq DDR Board Preset 这坑

Hello World跑飞?Zynq DDR Board Preset 这坑 Hello World跑飞Zynq DDR Board Preset 这坑系列风中月隐学软件无线电作者FPGA加速者平台Xilinx Zynq-7000 XC7Z045-2FFG900Vivado/Vitis 2021.1问题自定义载板跑 Hello World 飞掉同一板子精简工程却正常一、问题场景自定义载板Zynq-7000 XC7Z045DDR 型号和位宽都没问题。但 Vitis 里跑个Hello Worlddownload 成功CPU 显示 Running断点却不停在 main()串口无任何输出。程序在启动阶段就飞掉了。更诡异的是同一个板子另一个纯 PS 的精简工程Hello World完全正常。硬件没问题DDR 芯片也没问题。问题在软件配置。二、根因ZC706 Board Preset 污染了 DDR 参数主工程基于 ADI ADRV9009 ZC706 参考设计演化而来Zynq PS 配置中 originally 包含CONFIG.PCW_PERIPHERAL_BOARD_PRESET {part0}part0对应ZC706 官方开发板的板级预设。Vivado 一旦检测到这个 preset会自动根据 ZC706 的 PCB 走线填充 DDR 高级参数。这些参数包括参数类别示例参数ZC706 典型值DQS to Clock DelayPCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_*0.226, 0.278, 0.184, 0.309 nsBoard DelayPCW_UIPARAM_DDR_BOARD_DELAY_*0.521, 0.636, 0.54, 0.621 nsPackage DelayPCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_*-0.017, -0.039, -0.040, -0.016 nsPackage LengthPCW_UIPARAM_DDR_DQS_*_PACKAGE_LENGTH108.9255, 131.286 mm 等这些参数是board-specific的取决于具体 PCB 的 DDR 走线长度和拓扑。自定义载板不是 ZC706使用 ZC706 的走线参数必然导致 DDR 控制器初始化与实际硬件不匹配。三、为什么 Hello World 也会跑飞Hello World 虽然代码简单但代码段、数据段、堆栈都位于DDR。Vitis 调试时会根据 XSA 中的ps7_init.c初始化 DDR 控制器。DDR 走线参数错误会导致DDR Training 失败或训练结果错误写入 DDR 的数据无法正确读出CPU 一访问 DDR 就产生异常/总线错误程序在启动阶段ps7_init之后、main之前就飞掉四、参考工程为什么能跑参考工程是一个精简的纯 PS 工程没有设置 board preset也没有这些 DDR 走线延迟参数。Vivado 使用默认/中性值进行 DDR 初始化恰好与当前自定义载板匹配。实测参考工程的 DDR 配置为DQS to Clock Delay0.0 nsBoard Delay0.25 ns五、解决步骤Step 1修改 Zynq PS Preset在main_cfg.tcl中将 board preset 从part0改为NoneCONFIG.PCW_PERIPHERAL_BOARD_PRESET {None}Step 2在 Vivado 中重新应用 Preset打开 Block Design双击sys_ps7ZYNQ7 Processing SystemPresets → Default先恢复默认清除残留参数Presets → Apply Configuration…选择更新后的main_cfg.tcl点击ApplyStep 3清除残留 DDR 高级参数Vivado 应用 preset 时只会覆盖 preset 中存在的参数不会删除 IP 中已经存在的参数。如果旧 IP 被 ZC706 preset 污染过残留参数可能仍然存在。运行自动化脚本清除source D:/ad9009/hdl_2021_r1/projects/adrv9009/zc706/clear_ddr_board_delays.tcl脚本核心逻辑# Board preset 设为 None set_property CONFIG.PCW_PERIPHERAL_BOARD_PRESET {None} $ps7 # DQS to Clock Delay 设为 0 set_property CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0 0 $ps7 ... # Board Delay 参考 ref 工程设为 0.25 set_property CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY0 0.25 $ps7 ...Step 4重新生成并导出 XSAGenerate Output ProductsFile → Export → Export Hardware勾选 Include bitstreamStep 5Vitis 中更新 Platform右键socplatform →Update Hardware Specification选择新的 XSA重新生成 platform重新跑 Hello World 验证六、验证方法1. 检查 Preset 文件确认main_cfg.tcl中没有PCW_PERIPHERAL_BOARD_PRESET {part0}应为None。2. 检查 Vivado DDR 配置页面双击sys_ps7→ DDR ConfigurationTraining/Board DetailsUser InputDQS to Clock Delay全部为0.0Board Delay全部为0.25不应再出现 ZC706 特有的 0.521/0.636 等值3. 对比 XSA 的 ps7_init.c解压两个 XSA对比ps7_init.c中 DDR 控制器寄存器0xF80060xx区域的配置应基本一致。七、经验教训1. 自定义载板不要使用官方开发板的 board presetZC702、ZC706、ZedBoard 等 preset 都会带入板级 DDR 走线参数。自定义板应选择None或Custom并根据实际 DDR 手动配置。2. DDR 走线延迟参数是 board-specific 的DQS to Clock Delay、Board Delay、Package Delay 等必须匹配实际 PCB。这些参数错误不会导致综合/实现报错但会导致运行时 DDR 不稳定。3. 应用 preset 不会删除已有参数如果 IP 曾经被错误 preset 污染需要 Reset to Default 或删除重建。仅修改 preset 文件并重新 Apply 可能无法清除残留参数。4. Hello World 也能暴露 DDR 问题不要轻视简单例程的跑飞现象。只要程序访问 DDRDDR 参数错误就一定会暴露。八、附录完整清除脚本以下 Tcl 脚本可一键清除 ZC706 board-specific DDR 走线延迟参数。在 Vivado Tcl Console 中运行# 获取 Zynq PS 实例 set ps7 [lindex [get_bd_cells -filter {VLNV ~ xilinx.com:ip:processing_system7:*}] 0] # 1. 关闭 board preset防止 Vivado 再次自动填充 set_property CONFIG.PCW_PERIPHERAL_BOARD_PRESET {None} $ps7 # 2. 清零 DQS to Clock Delay4 组 set_property CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0 0 $ps7 set_property CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_1 0 $ps7 set_property CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2 0 $ps7 set_property CONFIG.PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_3 0 $ps7 # 3. Board Delay 设为 0.25参考精简工程实测值 set_property CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY0 0.25 $ps7 set_property CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY1 0.25 $ps7 set_property CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY2 0.25 $ps7 set_property CONFIG.PCW_UIPARAM_DDR_BOARD_DELAY3 0.25 $ps7 # 4. 保存并重新生成 save_bd_design generate_target all [get_files system.bd]若需看完整的 tcl请在评论区留言:tcl_clear_ddr。
返回列表