---
title: 使用SDK固化FLASH代码固化（含工程源码）
url: "https://www.fpgalearn.com/9236.html"
kind: article
id: 9236
excerpt: ——基于 ZYNQ MINI开发板 一、文档实现功能介绍 本文档实现对设计生成的bit流，固化到FPGA启动配置的FLASH内。固化后，上电即可自动配置bit文…
published_at: 2025-05-16
author: 二牛学FPGA
tags: ECO开发板, fpga入门, FPGA工程, fpga教程
word_count: 9313
source: "https://www.fpgalearn.com"
---

# 使用SDK固化FLASH代码固化（含工程源码）

> 标签：ECO开发板、fpga入门、FPGA工程、fpga教程
> ——基于 ZYNQ MINI开发板 一、文档实现功能介绍 本文档实现对设计生成的bit流，固化到FPGA启动配置的FLASH内。固化后，上电即可自动配置bit文…

> ——基于 ZYNQ MINI开发板 一、文档实现功能介绍 本文档实现对设计生成的bit流，固化到FPGA启动配置的FLASH内。固化后，上电即可自动配置bit文…

——基于 ZYNQ MINI开发板
## 一、文档实现功能介绍
本文档实现对设计生成的bit流，固化到FPGA启动配置的FLASH内。固化后，上电即可自动配置bit文 件，掉电不丢失。本文档针对只有FPGA代码的工程，如果涉及到ARM软件代码固化下载，后面的教程会 有专门章节进行补充学习。针对SD卡启动，方法类似。后面教程单独详细说明。工程新建方法请参考 文档《开发软件安装和介绍/VIVADO简介及软件下新建ZYNQ工程教程》。
## 二、ZYNQ 工程建立
| 起始页（或file->Project->New） | 创建新工程(CreateNew Project) |
| --- | --- |
| 向导起始页面 | 点击 Next- > |
| ProjectName(工程名) | 工程名：fpga_03_fpga_flash_dowload工程路径： (自己选择，尽量不要有中文路径) 勾选Create ProjectSubdirectory,点击Next- > |
| AddSource(添加设计源文件) | 点击 Next- > |
| AddExsixtingIP(添加已有的 IP) | 点击 Next- > |
| AddConstraints(添加已有约束文件) | 点击 Next- > |
| DefaultPart(默认配置，芯片选型) | Family->Zynq-7000Package- >clg400Speed->7010选-1,7020选-27010版本选择目标器件:xc7z010clg400-17020版本选择目标器件:xc7z020clg400-2 点击 Next- > |
| NewProjectSummary(新建工程概况) | 确认工程信息，选型等，点击 Finish 完成 |
## 三、固化前准备工作-ZYNQ处理器调用
我们知道，zynq芯片内部有ARM处理器。在上电的时候，由ARM运行一段启动代码，协助配置FPGA，并且，如果有软件代码，同时配置完成可运行软件代码。所以，我们需要用到  ZYNQ芯片内的ARM处理器的模块。在ZYNQ芯片上，有一个处理器部分的模块叫做ZYNQ7  Prosessing System的模块。此模块即为ZYNQ的处理器核心。跟DSP，门电路，加法器那些  模块一样，可通过IP直接调用这个硬件。通过这个硬件的调用，我们就可以方便的使用这个处 理器，然后用XILINX的软件开发环境（ SDK）新建处理器的软件引导代码即可完成ZYNQ的FPGA配置，引导代码可通过新建工程模板实现，无需自己编写代码。最后将引导代码编译之后的可执行文件和BIT文件一起打包烧写到FLASH即可完成我们需要的功能。
首先，我们在新建完成的fpga_03_fpga_flash_dowload工程，新建一个bd文件。我们在工程管 理栏的IP INTEGRATOR下的Create Block Design 点击创建bd文件。 Bd文件可对FPGA进行图表原理图方式进行开发，更加直观方便。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-37.png)
默认bd文件名不变。点击OK：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-38.png)
新建之后我们可以看到在sources里面看到我们新建的bd文件。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-39.png)
默认新建之后会出现Diagram窗口。如果没有出现，请双击bd文件即可打开。我们在打 开的Diagram点击+号：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-40.png)
点击完+之后，弹出的IP核选项内，我们在Serach输入ZYNQ，即可看到我们需要用到的 ZYNQ片上系统：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-41.png)
然后我们双击它，即可添加到bd文件里面。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-42.png)
然后我们双击ZYNQ 模块，打开IP配置。配置界面可以看到，这个IP很复杂，有很多东西 需要设置。这里我们不详细讲解配置功能。我们只需要将其配置成一个处理器最小系统，并且对芯片的FLASH引脚存储进行设置即可，其他不需要的一律关掉。在后面我们又更详细的讲解这个ZYNQ IP核的配置及其使用。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-43.png)
首先，PS-PL configration的general，下拉找到enable clock resets，展开，将第一个勾选掉,并且AXI Non Secure Enablement下的GP Master AXI Interface的M AXI GP0 interface勾掉：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-44.png)
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片1-1.png)
然后，在peripheral I/O Pins,选中Quad SPI Flash 勾选第一项：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-47.png)
MIO Configuration ，展开Memory interfaces->Quad SPI Flash->Signle SS 4-bit IO，将speed改成fast：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-48.png)
然后，Clock Configuration 勾掉PL Fabric Clocks下的 FCLK_CLK0：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-49.png)
最后我们配置DDR3内存控制器，型号我们选择MT41J256M16 HA-125 ，位宽16位， 一定要检查位宽是16！如果是32无法运行，我们物理DDR3是16位：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片2.png)
最后，我们点击OK退出IP配置。我们可以看到， Diagram内的ZYNQ接口少了很多，只剩下DDR和FIXED_IO。然后，我们点击途中Diagram文件筐最上面的蓝色字体 Run Block Automation：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-50.png)
弹出的对话框默认点击OK：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片3.png)
最后，生成的模块图表内IP变成了将DDR和FIXED_IO引出状态。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-51.png)
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片4.png)
我们点击Diagram的右上角中间的最大化，将图标窗口最大化（上面一图右上角上有标 注） ，然后点击图表文档上面的符号工具的小方框带勾的符号，进行图表检查：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-53.png)
最后弹出检查结果对话框 ，说明设计无误，我们点击OK关闭：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-54.png)
然后，我们找到文件管理栏。点击Diagram图标左边最上方的Sources:
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片5.png)
然后在bd文件右键Generate Output Products生成输出相关文件。输出文件包括 ZYNQ的IP生成的硬件描述语言。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-55.png)
弹出生成IP输出文件对话框。我们默认，点击generate后等待生成完成：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片6.png)
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-56.png)
我们再次回到文件管理器，在bd文件右键，点击Create HDL Wrapper，生成顶层接 口的HDL文件，这个文件是我们的顶层模块HDL文件。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-57.png)
点击之后弹出的对话框默认，点击OK：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-58.png)
由于在ZYNQ处理器调用是直接调用模块，我们还需要在工程中自动生成的HDL顶层文件 中例化我们的FPGA代码。我们将fpga_02_breath_led例程中的breath_led.v添加到工程中。 我们在Sources栏的Design Sources右键Add Sources添加我们的breath_led.v文件。添加的 时候，可以选择拷贝到工程中：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-59.png)
最后点击Finish完成添加。我们看到，文件导航栏的源文件如图所示：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-60.png)
我么将breath_led.v里面的模块例化到design_1 _wrapper。首先，顶层信号接口添加 breath_led的三个信号，clk,rstn,led,然后在添加信号的类型声明。最后，在模块最后添加 breath_led模块的例化：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片7.png)
模块理化完成之后需要先综合！记得先综合 ，记得先综合！！否则不能再管脚绑定找到新 添加的接口信号！！请一定要注意！！重要的事情说三遍！！
综合第一遍之后，接着需要绑定管脚。绑定管脚在工程管理栏RTL ANALYSIS下面的Open elaborated design，进去之后切换视图为I/O planing .绑定管脚约束详细操作请参考  01 _fpga开发之led流水灯教程。管脚也保持一致，电平标准均为LVCMOS3.3。我们只需要约 束例化进来的breath_led.v的信号对外接口，其余信号，关于zynq的接口我们都不用管。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-61.png)
保存管脚约束文件：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-62.png)
综合 ，布局布线 ，生成bit文件，等待完成。完成之后点击 Cancel：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-63.png)
完成之后我们导出硬件描述文件。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-64.png)
弹出的对话框，勾选上包含bit文件。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-65.png)
## 四、新建FSBL的SDK工程及FPGA的固化
上一节我们导出一个硬件描述。这个导出的硬件描述是描述一个处理器的相关配置的   文件。接着，我们开始使用导出的硬件进行下一步。我们回到软件主界面，最上面的工具栏点 击File->Launch SDK启动VIVADO的SDK开发软件。启动之后SDK会自动导入我们刚才定制的处理器硬件描述工程代码。我们不用管它，等待SDK启动导入完成。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-66.png)
点击了启动SDK之后弹出的对话框默认点击OK：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-67.png)
启动SDK界面弹出：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片8.png)
启动之后我们可以看到一个硬件描述的代码工程。我们不用对这个工程做任何改动。硬件的描 述文件在左边的目录下，system.hdf。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-68.png)
我们在SDK新建一个启动引导工程：SDK最上方工具栏File->New->Application Project：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-69.png)
弹出的界面，我们填入工程名为fsbl，然后默认其他不改动，点击NEXT:
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片9.png)
接着，我们选则Zynq FSBL工程模板，最后点击Finish完成。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-70.png)
最后，我们可以看到SDK左边工程目录出现了三个工程，分别是硬件描述工程，fsbl启动引导 代码工程，和fsbl的板级支持包工程。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片10.png)
到此，我们开始准备制作FPGA启动配置文件和固化到FLASH。
我们点击SDK上方的工具栏中的XILINX->Create Boot Image，我们开始制作ZYNQ启 动的BIN文件（其中制作好的BIN文件包含我们的FPGA所需要固化的BIT文件）
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-71.png)
然后，弹出的界面，我们如图配置所示，Output BIF file path配置输出生成的bif文件路径。 我们点击Browse，默认保存到工程的debug路径下面:
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片11.png)
保存路径结束之后，Output path也默认在这个路径下面。 Output path即为输出的 FPGA启动配置BIN文件路径。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-72.png)
接着，我们添加文件。首先，我们添加fsbl启动引导代码生成的可执行文件，也就是我们 SDK新建的FSBL工程自动生成的arm可执行文件。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片12.png)
点击弹出对话框中的browse进行选择注意Partition type默认是bootloader：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-73.png)
选择fsbl.elf文件，点击打开：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-74.png)
然后回到的局面我们已经把fsbl文件路径添加进来了。点击OK：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-75.png)
然后相同的办法，再添加我们的比特文件。路径在本工程的：
fpga_flash_dowload_project\fpga_flash_dowload_project.runs\impl_1
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-76.png)
确认文件类型为datafile。然后点击OK。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-77.png)
一般情况下，制作启动的BIN文件，都是先添加fsbl.elf文件（ bootloader） ，然后添加    bit文件（ datafile） ，如果有软件arm的代码app应用程序 ，再添加一个app.elf（ datafile）。 本工程只有FPGA开发的FLASH固化，没有应用程序，所以只需要这两个文件。可以看到列表  里面有两个文件然后点击Create Image：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-78.png)
到此，启动用于固化的FPGA的BIN文件就制作好了。我们接下来设置拨码开关。开发板 可以设置的有三种BOOT模式，分别对应如下：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片13.png)
开发板背面有BOOT设置表 ，提供了SD和QSPI两种参考。实际上还有NAND存储器的设 置，但是我们板子没有NAND，就不写出来了 ，JTAG模式也不常用，更详细的拨码设置可参 考原理图的PS部分。
我们开始固化。设置拨码开关都为00，也就是JTAG模式。注意 ，断电状态下进行设置！ 设置完BOOT拨码开关制后再连接电脑通电。开发板插上DEBUG接口USB线到电脑 ，等待大 概十几秒 ，因为下载线连接电脑需要一段时间识别。 回到SDK，我们点击工具栏，点击XILINX- >Program Flash烧写。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-79.png)
Image 文件即刚才我们生成的BIN文件，FSBL即刚才选的FSBL.elf。然后等待FLASH操作完成。
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-80.png)
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/图片14.png)
注意 ，烧写完成之后，一定要断电重新设置BOOT拨码开关，也就是如下模式：
![图片](https://admin.shaonianxue.cn/wp-content/uploads/2025/05/image-81.png)
然后我们开发板重新通电。如果带电操作，也可以按下复位按钮。有时候JTAG连接了电 脑VIVADO软件或者SDK软件，可能导致启动失败。 大家拔下DEBUG口的数据线 ，换到其他 两个USB口供电，就可以正常复位启动了。
另外，sdk烧写很慢 ，而且不好用。大家可以参考《ZYNQ几个调试技巧扩展教程》 ，学 习使用VIVADO进行烧写。
## 五、可能存在的问题及解决方案
1、烧写无法成功。解决方法：检查拨码开关，全部置00，也就是ON状态；然后 再断电重新打开开关连接电脑。还是烧写不了 ，检查ZYNQ的PS的配置，关键部分是  QSPI引脚配置，以及DDR3的型号和位宽 ，必须和教程保持一致。
2、烧写后无法运行：请检查烧写完是否设置成QSPI之后断电重启。
3、烧写进度条停止不动。这种情况下如果没有输出烧写错误信息，即正常。由于FLASH擦除可能需要几分钟。 与下载器速度无关。请耐心等待。
4、烧写也可以使用TF启动。设置ZYNQ处理器的SD0接口，制作BIN文件，最后 直接拷贝到格式化为FAT32的内存卡，设置BOOT拨码为11（TF卡启动模式）。推荐 16G优质卡。不要使用劣质或者山寨卡 ，否则会出现无法启动现象。
