ZYNQ学习记录FPGA(六)程序固化Vivado+Vitis
一、前言
在ZYNQ的开发过程中,我们可以把程序存储在非易失性存储器中,在上电或者复位时让程序自动运行,防止掉电后程序丢失。下面通过对ZYNQ系统的启动流程及其每一步所要做的工作的介绍,来反推固化程序到非易失性存储器中所需要的文件。
1.1 非易失性存储器
非易失性存储器(Non-Volatile Memory, NVM) 是一种在断电后仍能保持其存储内容的存储器类型。与易失性存储器(如RAM)不同,非易失性存储器即使在电源关闭后,也不会丢失数据。
非易失性存储器有闪存(Flash Memory)、EEPROM(Electrically Erasable Programmable Read-Only Memory)、FRAM(Ferroelectric RAM)、MRAM(Magnetoresistive RAM)、ROM(Read-Only Memory)、SRAM(Static RAM)、硬盘(HDD)、固态硬盘(SSD)等,这些存储器在嵌入式系统、计算机、消费电子等领域中得到了广泛应用。下面对这些存储器进行简单的介绍:
① 闪存(Flash Memory):
闪存基于半导体技术,分为NAND Flash和NOR Flash。NAND Flash写入速度快读取速度慢,适用于大容量的存储,比如USB驱动器、SSD和手机存储都属于NAND Flash;NOR Flash写入速度慢,读取速度快, 适用于存储代码如嵌入式系统的启动程序。
② EEPROM(Electrially Erasable Programmable Read-Only Memory):
EEPROM是一种可以电气擦除和编程的只读存储器,支持字节级的读写,适合存储配置参数和少量的关键数据。
③ FRAM(Ferroelectric RAM)
FRAM基于铁电材料,可以像普通RAM一样高速读写,且具备非易失性。FRAM具有高速度、低功耗、耐用、无需电荷存储、快速写入的独特的优势,这些优势特别表现在速度、耐用性和低功耗方面。
优点:FRAM在读取和写入数据时消耗的功率比传统的DRAM和Flash存储器低,这使得它特别适合用于低功耗应用;FRAM的读写速度非常快,比Flash快得多,接近或超过DRAM的速度;FRAM具有较高的耐用性,能够承受比Flash存储更多的写入/擦除周期(Flash存储大约能够承受10,000到100,000次写入,而FRAM可达到数十亿次写入);FRAM不依赖于电荷的存储和读取,因此它不容易受到静电放电(ESD)或电磁干扰(EMI)的影响;
缺点:目前FRAM的存储密度较低,虽然随着技术的进步有所改善,但相比于DRAM和Flash,FRAM的存储容量仍然比较有限;由于其使用特殊材料和制造过程,FRAM的成本相对较高,尤其是在大规模生产时。这也限制了它在某些应用中的普及;生产FRAM的技术要求较高,需要精确控制铁电材料的特性,这使得它在某些领域的应用还不够广泛。
④ MRAM(Magnetoresistive RAM)
MRAM基于磁性材料,通过改变磁场方向来存储数据,通过测量电流的阻抗来判断数据位的状态。MRAM的读写速度非常快,接近于SRAM(静态随机存取存储器)的速度。在耐用性上MRAM不受擦写次数限制(耐用性最好)。
⑤ ROM(Read-Only Memory)
ROM是只读存储器,数据在制造时就已经写入,一般不允许修改,常用于存储系统启动代码。 有些ROM是不可编程的,而有些则可以通过特定的方式编程(如EPROM和EEPROM)。
1.2 ZYNQ SoC 的启动和配置过程
在 ZYNQ SoC 的启动和配置过程中,既需要 PS 的配置信息,又需要 PL 的配置信息。PS和PL的配置信息分别依赖BIT文件和ELF文件:BIT文件用于配置PL,定义PL的行为;ELF文件是运行在PS中的程序。
ZYNQ SoC的启动顺序如下:上电复位->BootROM引导ZYNQ系统的启动过程->FSBL(First Stage Boot Loader)引导加载程序->完成启动,使用ZYNQ系统。
① BootROM:
BootROM是芯片启动时执行的内置固件,位于处理器的片上存储器中。BootROM的主要作用是引导Zynq系统的启动过程,它在设备上电或复位后,首先执行并帮助系统完成初始化工作,直到操作系统或用户自定义应用程序启动。
BootROM承担以下几项重要职责:执行芯片内部的硬件初始化、检测外部存储介质、确定设备启动顺序、加载引导程序、加载操作系统和文件系统、配置FPGA逻辑(必须完成前面步骤才能执行这一步)、处理异常。
② FSBL(First Stage Boot Loader):
FSBL是BootROM加载后的第一个可执行程序(由设计者所创建),负责系统的进一步初始化和配置,最终加载更复杂的引导程序(如U-Boot)或操作系统(如Linux)。FSBL位于启动链的第一阶段,是硬件和软件之间的桥梁。
FSBL的主要功能如下:
1)硬件初始化:包含初始化系统时钟、初始化处理器外设、配置DDR等步骤;
2)加载FPGA配置:通常包含从存储介质中读取FPGA配置(bit文件),并加载到FPGA逻辑门中等步骤;
3)从存储介质加载引导程序:包含确定启动源(SD卡、QSPI闪存、NAND闪存等)、加载引导程序并传递控制权到引导程序、启动操作系统等步骤;
4)环境参数与引导参数传递:包含内存布局、通过设备树传递硬件信息到操作系统等步骤。
1.3 小结
ZYNQ Soc的启动配置过程有BootBOM和FSBL两个关键步骤,其中BootBOM由一个非易失性存储器组成,根据上电后自动加载BootBOM中的文件完成对系统启动的引导,FSBL则是由设计者所创建的用于引导加载程序到PS和PL。
二、Vivado+Vitis固化程序
1.创建ZYNQIP核:
1)点击Create Block Design直接点击OK;
2)点击+号添加ZYNQIP核:
2.配置ZYNQIP核:
双击打开IP配置界面后执行下面操作:
1)关闭无用的引脚:
①关闭时钟复位脚:PS-PL->General->Enable Clock Resets
②关闭AXI总线引脚:PS-PL->AXl Non Secure Enablement->GP Master AXl Interface
③关闭PL时钟(时钟使用开发板提供的外部晶振) :Clock Configuration->PL Fabric Clocks
2)打开和配置IO口:
①打开QSPI引脚和SD卡连接(需要使用SD卡存储程序时)的引脚:Peripheral lO Pins
②打开并配置DDR(根据开发板或ZYNQ芯片所支持的DDR型号进行配置,一般配置红线勾画的三个参数即可):DDR Configuration
3)点击OK完成配置生成IP核:
4)点击左上角Run Block Automation自动配置IP核的外部连线:
3.添加模块文件(.v)
将顶层文件以及相关的模块文件导入到工程中。
4.Generate Output Products:
右键点击新生成的IP核,选择Generate Output Products
5.Create HDL Wrapper
右键点击新生成的IP核,选择Create HDL Wrapper
注意:如果新生成的.v不是顶层,需要右键新生成的文件将其设置为顶层。
6.修改新生成的.v文件引用顶层功能模块,并添加变量:
修改部分包括模块定义的变量名,变量属性定义,顶层模块引用。
7.约束管脚,编译并生成bit流:
8.导出硬件文件(Export Hardware ...):
导出时选择include bitstream选项。
8.启动vitis新建应用
9.在新建应用中选择添加生成的.xsa文件(默认在项目工程目录下)
注意:新建工程时要勾选 Generate boot components 选项,这样会生成启动的引导文件 fsbl ,没有 fsbl 没办法进行程序烧写,其他选项默认即可。