六、扩展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有×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最后面的空间,当然我们也可以用分页的方法解决。
海力士不排除与Rambus和解
安全光幕的光轴间距如何区分
F-OP300倾斜模块上线——支持免像控倾斜模式
孢子捕捉仪的作用原理及其配置的介绍
ADI精密窄带宽信号链平台的详细介绍
II在Microblaze上的移植与使用专题(续3)
高通领头,抱团合作让5G照明全球
芯科科技与艾睿电子共同探讨新型智能农业照明控制平台
民用建筑电气设计中消防应急照明系统的应用
苹果申请车载VR专利:在无人车内尽情“抓僵尸”
NVIDIA宣布开放DRIVE Constellation模拟平台
dfrobot摄像头模块 500万像素介绍
穿戴设备容易坏?可能是“OVP保护IC”没选好
爱立信已在全球签署了78个5G商用协议及合同
即将上市的五款旗舰:魅族PRO7、小米Note3、华为Mate10、三星Note8、iPhone8总有一款是你的菜
侧面机身厚度仅6.9毫米,TCL X3超薄曲面电视图赏
柔性驱动器领域科学家们有了新的突破
Semtech:群登科技(AcSiP利用Semtech的LoRa技术和开放LoRaWANTM标准
关于手机中UV胶水的应用,它的主要应用点是什么
手机芯片带宽性能的影响因素有哪些,优化测试方向方法详解