前言
当我们要将开发完成的程序下载到芯片上板验证的时候一般都是通过JTAG线将程序下载到FPGA芯片内部,这种情况下当板子重新上电之后,我们先前下载进去的程序便会丢失,如果想要开发板重新上电之后依旧要执行我们想要的功能时,就需要将程序固化到FLASH或者SD卡中,并将开发板启动方式进行相应的设置。
纯逻辑的FPGA开发板程序固化是没什么问题的,但是对于ZYNQ来说分成了PS和PL侧,如果工程中同时使用了PS和PL同样的也能进行固化,但是如果我们只使用PL侧的资源进行功能开发,又该如何固化程序呢?不带ARM的程序固化没问题,但是对于ZYNQ来说想要只固化PL端的程序必须要用PS打配合,本文将以按键点灯为例子实现ZYNQ PL端的程序固化。
环境准备:
软件:Vivado2020.2、Vitis2020.2
硬件:正点原子领航者开发板ZYNQ7020
下面以简单程序按键点灯为例,将要固化工程进行引脚约束、时序约束、上板验证无误后进行如下操作:
1、调用IP创建块设计(Create Block Design)
输入模块设计名称后点击ok
搜索并添加ZYNQ IP核
双击调用的IP模块进行设置
点击 Peripheral I/O Pins进入IO配置界面
勾选使能Quad SPI Flash、SD0、UART1外设
展开SD0,勾选Card Detect,点击其中引脚47使其变绿
点击左侧菜单栏MIO Configuration选项
修改 Quad SPI Flash 和SD0 speed为fast,以及bank1 IO Voltage为LVCOMS1.8V
点击DDR Configuration,进行DDR设置,memory part需要设置为对应开发板上DDR的型号或者推荐的型号
点击OK完成设置
将下图中两个引脚进行连接,否则后续编译可能会报错
在Diagram空白处点击右键选择Add Module添加工程的RTL模块
然后点击Run Connection Automation进行自动连线
勾选全部模块自动连线,时钟源选择ZYNQ FCLK端口提供的50MHz时钟
连线后如下图:
这里我添加的模块只有一个输出端口“led”,需要右键模块中的led端口,然后选择"Make External"选项,将该信号导出到外部连接到LED管脚
选中rst_n端口点击右键,选择create port,创建复位端口
同理选中key_in端口,点击右键选择create port,创建输入端口
完成后击Run Block Automation
点击OK
完成后验证设计有没有问题
弹出如下窗口表示设计无误
点击选中左侧Source栏中的BD模块(keyLedBD),右键点击选择Generate Output Products
点击Generate
Generate完成
同样选中BD模块(keyLedBD),右键点击选择Create HDL Wrapper
点击OK
完成后Source中生成如下文件
将Block Design位置为顶层,否则后续引脚约束时没有DDR和FIXED_IO的引脚,我这里已经设置成了顶层,所以Set as Top是灰色
对引脚进行约束
保存更改,然后重新编译工程,生成Bit流文件
编译完成后导出硬件,点击菜单栏File—>Export—>Export Hardware进行导出,包含Bit流文件
下图为导出的硬件设计文件.xsa,Vivado2019之前的版本导出的硬件设计文件后缀是.hdf
2、进入Vitis IDE,Launch Vitis IDE,生成配置文件并烧录
点击菜单栏Tools—>Launch Vitis IDE,打开 Vitis IDE 开发环境
选择工作区路径
点击菜单栏File—>New—>Application Project
选择之前导出的硬件文件.xsa
填写工程名称
选择Zynq FSBL模板
编译工程生成elf文件
点击菜单栏Xilinx—>Create Boot Image,生成BOOT.bin文件
点击菜单栏Xilinx—>Program Flash,选择刚刚生成的BOOT.bin和FSBL.elf文件路径,注意:此时要确保开发板启动方式为JTAG模式
程序固化中…
终端打印固化过程信息
固化完成
然后将开发板断电,并将启动模式拨码开关拨至FLASH方式启动,重新上电后将从FLASH中读取程序开始运行。