ZYNQ7020 FPGA从Flash启动的实战指南与常见问题解析

张开发
2026/4/15 21:24:51 15 分钟阅读

分享文章

ZYNQ7020 FPGA从Flash启动的实战指南与常见问题解析
1. ZYNQ7020 FPGA从Flash启动的核心原理第一次接触ZYNQ7020的Flash启动功能时我也被这个双核大脑的工作机制搞得一头雾水。后来在调试了十几个开发板后才发现理解它的启动流程就像拆解一个精密的瑞士手表 - 每个齿轮的咬合都必须分毫不差。ZYNQ7020的启动过程本质上是个三段式接力赛首先PS处理器系统端的ARM核从Flash中读取初始引导程序FSBL然后FSBL负责配置PL可编程逻辑端的FPGA最后才轮到我们的主程序上场。这个过程中最关键的BOOT.bin文件就像接力棒包含了FSBL、硬件比特流和应用程序三个关键部分。实际开发中最容易栽跟头的是QSPI Flash的时钟配置。有次我死活无法从Flash启动排查三天才发现是时钟频率设成了200MHz手册明确要求不超过125MHz。后来养成习惯每次新建工程都先检查这几个参数PS时钟频率通常33.33MHzDDR控制器配置必须与开发板内存颗粒匹配QSPI Flash时钟建议100MHz以下2. 创建BOOT.bin的完整流程2.1 Vivado工程配置实战在Vivado 2017.4里创建工程时有个细节90%的新手会忽略 - Block Design里的ZYNQ IP核配置。我建议按这个顺序操作先配置MIO接口时记得勾选QSPI Flash和SD卡接口即使不用SD启动也建议保留方便调试时钟设置要特别注意set_property CONFIG.PCW_QSPI_PERIPHERAL_FREQMHZ {100} [get_bd_cells processing_system7_0]DDR配置必须与开发板完全一致比如我用的是MT41K256M16TW-107就需要选择DDR3-1600型号2.2 生成比特流的常见坑点生成bit文件时最常遇到两个问题一是时序不收敛二是管脚约束冲突。我的经验是先运行Report Timing Summary确保所有路径都有余量检查约束文件中是否正确定义了QSPI的IO标准通常是LVCMOS33如果使用非标准Flash芯片需要手动添加SPI总线约束有个取巧的方法直接复制开发板厂商提供的约束文件再根据自己需求修改。比如米联客的板子通常都有现成的XDC文件。3. SDK环境下的关键操作3.1 创建FSBL工程的注意事项在SDK中创建FSBL工程时Vivado版本差异会导致很多诡异问题。2017.4版本有个隐藏坑默认生成的FSBL可能不包含ps7_init()函数。解决办法是新建FSBL工程时选择Zynq FSBL模板手动修改main.c在main()函数里添加ps7_init(); while(1); // 防止程序退出编译前检查linker脚本是否包含ps7_init相关代码段3.2 制作BOOT.bin的图形化技巧SDK的Create Boot Image工具其实有更高效的使用方式将.bit文件放在首位某些版本有顺序要求勾选Create BIN file for flash选项在Advanced页面设置QSPI Flash的分区偏移量通常0x00000000遇到生成失败时可以尝试命令行方式bootgen -image boot.bif -arch zynq -o BOOT.bin -w on配合编辑bif文件能解决大部分兼容性问题。4. Flash烧录的实战技巧4.1 环境变量配置的玄机那个让人又爱又恨的XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ环境变量其实控制的是JTAG编程时的通信速率。实测发现低于5MHz可能导致编程超时高于20MHz容易导致数据丢失10MHz是最稳妥的选择对应变量值10000000设置后一定要重启电脑我有次忘记重启浪费半天时间排查为什么配置不生效。4.2 硬件连接检查清单烧录前建议按这个顺序检查硬件确认开发板供电充足QSPI编程时电流会突增检查JTAG接口接触良好可尝试重新插拔测量QSPI的CLK信号是否正常用示波器看波形是否干净确认Flash芯片的写保护引脚已禁用有个很实用的技巧先用SD卡启动验证系统基本功能正常再尝试Flash烧录能排除大部分硬件问题。5. 高频问题解决方案5.1 启动失败的诊断方法当开发板卡在启动阶段时可以这样排查通过UART查看启动日志波特率通常115200检查BOOT.bin的文件结构bootgen -arch zynq -dump BOOT.bin测量QSPI的CS信号是否正常激活最近遇到个典型案例客户反馈板子偶尔启动失败最后发现是PCB布局导致QSPI信号完整性差。解决办法是在约束文件里添加set_property DRIVE 8 [get_ports qspi_io*] set_property SLEW SLOW [get_ports qspi_clk]5.2 性能优化建议要让Flash启动更快可以尝试启用QSPI的DMA模式修改FSBL源码配置PL端比特流为压缩格式set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]将不必要的外设初始化移到应用程序中实测这些优化能让启动时间缩短30%以上。对于需要快速响应的应用场景特别有用。

更多文章