II在Microblaze上的移植与使用专题(续3)
六、扩展NOR FLASH
赛灵思的Spartan-3E Starter Kit开发板板上载有Intel的16 MByte (128 Mbit) 并行NOR Flash,FLASH的型号为28F128J3,详细地DATA SHEET网上可以找到来参考。在EDK的硬件上我们使用XILINX的XPS MulTI-CHannel External Memory Controller(XPS MCH EMC)接口IP来连接FLASH。 如果我们用BSB建立工程的话,选择了Spartan-3E Starter Kit开发板后在下面的步骤里直接钩选FLASH就可以了,这样比较方便。如果是在已有工程的IP Catalog里添加IP,还必须指定引脚的连接情况和PAD位置,具体的PAD位置参考赛灵思的文档UG230:Spartan-3E FPGA Starter Kit Board User Guide的第11章。在XPS界面左边的Project栏下面的Project file的UCF文件内指定管脚,稍为麻烦一下,推荐由第一种方法直接通过BSB建立工程。具体IP核的使用请参考赛灵思文档:XPS MulTI-CHannel External Memory Controller Product SpecificaTIon.pdf。
赛灵思的Spartan-3E Starter Kit开发板上的XC3S500E FPGA支持BPI(Byte Peripheral Interface)配置模式。要实现BPI方式配置,首先要对Spartan-3E Starter Kit开发板J30进行跳线,具体可以参考赛灵思文档UG230:Spartan-3E FPGA Starter Kit Board User Guide第89页的表11-4。选用BPI UP(BPI DOWN)模式,FPGA配置数据应该放在FLASH的低(高)地址空间,这里注意下28F128J3 FLASH有&TImes;8(数据总线宽度为8位,这时数据总线高8位没有用,数据放在总线低8位)和×16(数据总线宽度为16位)两种工作模式。配置时应工作在×8模式,配置完成后,我们把它设置为×16模式,这是通过FLASH的BYTE#引脚选择,BYTE#引脚为低电平时为选择×8工作模式,为高电平时为选择×16工作模式。BYTE#引脚是连接到FPGA的LDC2(C17)脚位。配置比特流文件首先通过iMPCT工具转换成MCS文件,具体步骤为:选择Prepare a PROM File后按NEXT,选择Generic Parallel PROM和MCS文件格式,指定生成文件的名字和保存位置按NEXT,在按NEXT后进入选择PROM器件界面,选择PROM大小为16M和Create BPI-Mode PROM后按NEXT选择要转换的BIT文件就可以了。然后我们可以通过赛灵思的PicoBlaze NOR Flash Programmer()下载到FLASH中,当然我们也可以自己用MicroBlaze处理器编写一个烧写FLASH的工程来下载MCS文件到FLASH,但都不如直接使用来的方便,有兴趣的朋友也可以研究或修改PicoBlaze NOR Flash Programmer工程,里面有PicoBlaze的汇编源程序。
介绍下MicroBlaze工程编译后的目标代码段的组成:
.text: 存放指令代码。
.rodata: 存放只读的变量。
.data:存放带初始值的全局与静态变量
.sdata::存放小的带初始值的全局与静态变量
.sdata2: 存放小的带初始值的全局与静态变量
.bss: 存放无初始值的全局与静态变量
.sbss: 存放小的无初始值的全局与静态变量
.sbss2: 存放小的带初始值的全局与静态变量
我们准备在NOR FLASH上面直接执行程序,所以要把只读的段(包括.text、.rodata、.sdata2、.sbss2)定义到FLASH地址空间,把其它的段都定义到FPGA片内的BRAM。
下面以一个实际例子来介绍具体步骤:
1.首先按上节的步骤建立一个XPS工程和应用程序,在BSP阶段的外设选择时把FLASH加上,这时系统自动添加了XPS MCH EMC接口IP。
2.我们先把所有段还是放在BRAM内,编译下载后可以看到LED在跑流水灯。
3.配置XPS MCH EMC接口IP用PLB连接到MicroBlaze处理器,无MCH通道,其它为默认。
4.点击XPS界面左边的工程名,在右键弹出菜单里选择Generate Linker Script,在弹出对话框中可以选择段的存放空间,把只读的段.text、.rodata、.sdata2、.sbss2选择到FLASH_C_MEM0_BASEADDR, 其它段选择到ilmb_cntlr_dlmb_ cntlr,然后重新编译工程,产生可执行的链接文件(ELF文件)。
5.把第4步生成的executable.elf拷到工程目录,然后在XPS界面选择Project → Launch EDK Shell,在命令行输入下面命令:
mb-objcopy \
--set-section-flags .text=alloc,readonly,code \
--set-section-flags .init=alloc,readonly,code \
--set-section-flags .fini=alloc,readonly,code \
--set-section-flags .text=alloc,readonly,code \
--set-section-flags .rodata=alloc \
--set-section-flags .sdata=contents \
--set-section-flags .sbbs=contents executable.elf volatile.elf
这可以把在BRAM中的内容存储volatile.elf文件。
再在命令行输入下面命令:
mb-objcopy –O binary -j .text –j .fini –j .init –j rodata –j sdata2 –j .sbss2 executable.elf flash.bin
这可以把在FLASH中的内容存储flash.bin文件。
6.把flash.bin文件烧到FLASH中,这可以通过上面的PicoBlaze NOR Flash Programmer工程用串口下载,也可以用XPS界面选择Device Configuration → Program Flash Memory下载, 注意不用XPS生成BootLoad。
7.把第五步生成的volatile.elf改名为executable.elf覆盖第4步生成的executable.elf文件。
然后用XPS界面选择Device Configuration → Updata Bitstream和Device Configuration → Download Bitstream把BRAM中的内容与FPGA配置数据下载到FPGA。
现在又可以看到LED在跑流水灯了,但明显可以看到速度要慢多了,说明程序是在NOR FLASH上执行的。如果速度要求不高的话,扩展一块NOR FLASH来存储代码与数据已经足够了,否则我们需要再扩展一块RAM,把代码与数据存储在RAM上速度比较快,同时需要一个BOOTLAOD工程用作上电时实现把代码与数据从FLASH上搬移到RAM的功能。
最后提一下,如果BRAM的内容与FPGA配置数据要存储到FLASH上供上电时用BPI方式下载,要注意存储配置数据的地址空间和应用程序的地址空间不能重叠,一个简单的方法是选用BPI DOWN模式,把配置数据放在FLASH最后面的空间,当然我们也可以用分页的方法解决。
- 使用Vivado HLS创建一个EDK PCore(02-09)
- 4G LTE技术很成功,对5G设计有何意义?(05-05)
- 物联网的承诺:下一个重大应用(02-16)
- Xilinx在2017嵌入式世界大会上展示响应最快且可重配置的视觉导向智能系统(02-17)
- 基于赛灵思FPGA的端到端广播平台解决方案的实现(10-27)
- 基于赛灵思(Xilinx) FPGA的DisplayPort设计与实现(10-23)