微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 并行NOR Flash在SOPC开发中的应用

并行NOR Flash在SOPC开发中的应用

时间:02-16 来源:互联网 点击:

到系统比特流system.bit,从而生成dowload.bit。dowload.bit经iMPCT转为MCS文件后下载到配置PROM中(若使用同一片J3D,注意不能与Bootable.elf发生地址空间冲突)。这样,系统上电后,首先对FPGA进行配置,然后引导加载J3D中的代码至相应的BRAM或SDRAM中(具体映射位置已在Generate Linker Script对话框中设定)。

图3 Program Flash Memory对话框

3 存储可直接执行的软处理器代码

这里仍然使用上面创建的EDK工程,由于J3D具有类似SRAM的接口,上电后可以直接像SRAM一样进行读操作,但却不能直接进行写操作。因此,应将只读段.code、.rodata、.sdata2、.sbss2指定到J3D中,其余段指定到BRAM中,这可以在Generate Linker Script对话框中完成。重新编译后生成新的Bootable.elf文件。此时,Bootable.elf仍是一个整体,需要将其在物理上分为2个文件: 一个存放只读段,另一个存放其余段。具体可以通过下面的操作实现。

  ① 创建存储在BRAM中的镜像volatile.elf。在XPS中,选择Project → Launch EDK Shell,并执行下列命令:

  $ mbobjcopy

  --set-section-flags .text=alloc,readonly,code

  --set-section-flags .init=alloc,readonly,code

  --set-section-flags .fini=alloc,readonly,code

  --set-section-flags .rodata=alloc

  --set-section-flags .sdata2=contents

  --set-section-flags .sbss2=contents

  ./TestApp_Memory/Bootable.elf

  ./TestApp_Memory/volatile.elf

  ② 创建存储在Flash中的镜像J3D.bin。在XPS中,选择Project → Launch EDK Shell,并执行下列命令:

  $ mbobjcopy O binary

  -j .text

  -j .init

  -j .fini

  -j .rodata

  -j .sdata2

  -j .sbss2

  ./TestApp_Memory/Bootable.elf

  ./TestApp_Memory/J3D.bin

将volatile.elf合并到系统配置比特流system.bit,生成dowload.bit,再经iMPCT转为MCS格式后下载到配置PROM中。再将J3D.bin通过Program Flash Memory对话框下载到J3D中。这样系统上电并完成配置后,J3D中的代码无需引导便可以直接执行。

4 存储非易失数据或参数

有时候系统需要存储非易失的数据或参数,这就需要通过编写程序直接对J3D进行读/写操作。当然,前提是先要在EDK中为J3D添加一个XPS MCH EMC接口。这个接口对并行NOR Flash和SRAM来说都是适用的,如果用于SRAM则可以直接读/写,不需要驱动,而用于并行Flash则需要自己编写相应的驱动程序。下面为自行编写的一个执行块擦除、单字写、单字读操作的程序。需要注意的是: 写操作前一定要先进行擦除操作,写命令或写数据之后一定要对状态寄存器进行判断是否完成相应操作;读操作则很简单,像SRAM的读/写一样。

  Xuint16 data=0xF0F0;

  Xuint16 Status,ReadData;

  /*块擦除程序*/

  XIo_Out16(XPAR_FLASH_16MX8_MEM0_BASEADDR,0x2020 );//指定地址块的擦除设置

  XIo_Out16(XPAR_FLASH_16MX8_MEM0_BASEADDR,0xD0D0 );//指定地址块的擦除确认

  do{

  Status = XIo_In16(XPAR_GENERIC_EXTERNAL_MEMORY_MEM0_BASEADDR);

  }while ((Status  0x0080) != 0x0080);//读状态寄存器直至块擦除完成

  /*单字写程序*/

  XIo_Out16(XPAR_FLASH_16MX8_MEM0_BASEADDR,0x4040 );//指定地址处单字写操作设置

  XIo_Out16(XPAR_FLASH_16MX8_MEM0_BASEADDR,data );//向指定地址处写入一个字长的数据

  do{

  Status = XIo_In16(XPAR_GENERIC_EXTERNAL_MEMORY_MEM0_BASEADDR);

  }while ((Status  0x0080) != 0x0080);//读状态寄存器直至写操作完成

  /*单字读程序*/

  ReadData=XIo_In16(XPAR_FLASH_16MX8_MEM0_BASEADDR );//读相应地址处的数据

还有一种情况是在系统运行前就把数据写入Flash中。首先,把数据写入一个二进制文件中。注意,MicroBlaze的存储格式是BigEndian(即高字节数据保存在低地址,低字节数据保存在高地址),PC机的存储格式则是LittleEndian(即高字节数据保存在高地址,低字节数据保存在低地址),因此如果是用VC++产生的二进制文件,一定要进行高、低字节交换。在Matlab中生成数据文件则可以在相应的文件操作函数中添加参数’b’(表示以BigEndian格式存储),如FileID=fopen(’data.bin’,’w+’,’b’)。产生的二进制文件可以通过Program Flash Memory对话框下载到J3D中,注意不要选中AutoMconvert file to SREC format when programming flash和Create Flash Bootloader Application选项。

结语

本文讨论了在以Xilinx Spartan XC3S1600E为基础的SOPC设计中,Intel J3D并行NOR Flash的4种不同用途及其使用方法与技巧,尤其对一些技术关键问题予以详细的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top