1、引导文件的介绍
打开相对应的目录会看见bootloader.ld和default.ld文件,这两个文件就是软核的引导文件。
2、bootloader工程介绍
bootloader.ld专用于bootloader工程,default.ld用于其他工程,bootloader工程及其他工程路径如下:
打开bootloadeConfig.h文件,看看参数就知道bootloader工程的作用
USER_SOFTWARE_MEMORY 是软核程序搬运到ddr的起始地址,USER_SOFTWARE_FLASH是软核程序在flash中的起始地址,USER_SOFTWARE_SIZE是软核程序的大小。bootloader工程的作用就是从flash中搬运软核程序到ddr中。
注:由于软核生成ram太大,会占用资源;ram太小,程序跑不起来。很多项目会使用ddr代替软核生成的ram,程序保存在flash中掉电不丢失,但是上电后就需要把flash中的程序搬运到ddr中运行,这就需要bootloader工程。首先,要定位软核程序在的flash的位置,这就需要知道软核程序在flash中的起始位置和程序的大小,也是bootloadeConfig.h文件中的USER_SOFTWARE_FLASH和USER_SOFTWARE_SIZE。搬运到ddr后,我们也要定位到软核程序的位置,所以还需要知道软核在ddr中的起始位置,这对应USER_SOFTWARE_MEMORY参数。
3、不需要ddr运行软核程序的工程,软核程序烧录
当我们不需要把程序放在ddr上运行时,自然就不需要用到bootloader工程。
需要通过cmd指令生成4个ram初始化文件,打开README-binGen.txt文件
可以看到如下内容:
这是生成ram初始化文件的步骤。
把编译软核工程生成的.bin文件复制粘贴到tool文件夹下
在cmd中运行Efinity软件安装路径下的Efinity\2021.2\bin>setup.bat脚本,再运行python3 binGen.py -b <application.bin> -f <fpu> -s <ram size>指令。
注:-s <RAM size>为设置的片上ram的大小,-f <FPU>为是否打开浮点,FPU设置为1打开生成8个bin;FPU设置为0不打开生成4个bin。如下:
The RAM memory initialization files have been successfully generated!初始化文件成功生成。
打开tool文件夹下的rom可以看到4个文件。
把4个文件复制贴到工程的根目录下,再次编译工程
编译成功后把outflow中的.bin或.hex文件下载到FPGA中即可。
4、需要ddr运行软核程序的工程,软核程序烧录
软核的程序太大,需要用ddr来跑软核的程序时,就是bootloader工程大显身手的时候。
首先编译bootloader工程,不出意外的话编译会失败,原因是ram太小。这时就需要改动引导文件。打开bootloader.ld文件
可以看到如下信息:
我们需要注意origin和length,origin要等于bootloaderConfig.h头文件中USER_SOFTWARE_MEMORY的值,改大两个length值,两个length加起来要小于等于软核生成的ram。软核生成的ram有多大,可以重配置软核IP看到。
如上所示,on-chip RAM Size是8K。
之后,重新编译bootloader工程
编译成功后,把生成的.bin文件bootloader.bin复制到tool文件夹下
然后运行cmd指令生成初始化文件。
在cmd中运行Efinity软件安装路径下的Efinity\2021.2\bin>setup.bat脚本,再运行python3 binGen.py -b <application.bin> -f <fpu> -s <ram size>指令
注意: <application.bin>是改成bootloader.bin。
初始化文件成功生成。打开tool文件夹下的rom可以看到4个文件。把4个文件复制贴到工程的根目录下,再次编译工程。接下来就是合并逻辑端的.hex文件和软核的应用程序。
然后把生成.hex文件烧进FPGA就行。