基于8051软核的SPI NOR FLASH验证平台的研究与实现

2014-07-28 05:43倪峰
电脑知识与技术 2014年18期

倪峰

摘要:该文是基于Verilog描述的8051 IP和Flash Behavior Model的软件平台来构建SPI NOR FLASH验证平台,旨在建立一个完全是由软件环境模拟的FLASH测试平台。该平台能开发并测试Flash驱动程序,而且实现一种快速建立验证Flash的实验环境。

关键词:M8051 IP;Verilog;Flash Behavior Model;FLASH驱动

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)18-4296-05

1 概述

随着电子技术的日新月异的发展,芯片的集成度越来越大,其复杂度越来越高。在芯片的开发过程中,测试验证的环节占据整个工作量的60%-70%,可见芯片验证平台的重要性。

在真实芯片生产之前,如果能有一个平台可以验证Flash驱动并提供给客户,对及时提供及更新Flash驱动都有十分重要的实际意义。该文正是从该目的出发,打造一个纯软件环境模拟的FLASH测试平台。该平台不仅能提供了一个低成本的FLASH验证平台的方案,而且在消除硬件环境的影响下,让驱动开发得以快速完成。

基于M8051 IP的Flash验证平台主要包括8051IP、Flash Behavior Model文件、Flash Driver以及Message组件等,如图1所示。

2 验证平台的硬件设计

本平台是由一颗开源的8051 IP与Flash Behavior Model文件为基础,加上Test Bench代码模拟的外部RAM以及调试代码所需用到的Message 产生组件构成。平台硬件连接图如2所示。硬件设计主要分成8051 GPIO与Flash Behavior Model的连接,以及Test Bench所需的top.hdl.v功能文件的实现。

2.1 M8051 IP软核

M8051 IP软核是高性能的8位微控制器(MCU),它由算术逻辑单元(ALU)、数据存储交换部分、程序存储部分、指令解码译码部分以及外围IO接口部分等组成。M8051与传统的8051单片机在MCU组成部分及指令系统是兼容的,具有Intel 8051所有的特性:

# 8-bit CPU optimized for control applications.

# 64K External Program Memory.

# 64K External Data Memory.

# 4K on-chip Program ROM.

# 128 bytes of on-chip Data RAM.

# 32 bidirectional and individually addressable I/O lines.

# Two 16-bit timer/counters.

# Fully duplex UART.

# 5-vector interrupt structure with two programmable priority levels.

在这次Flash验证平台的搭建中,主要用到M8051的GPIO口进行与SPI FLASH连接。使用M8051 GPIO 0作为64 KB外扩RAM的连接通信口, GPIO 1作为与SPI Flash PIN脚连接的通信口,GPIO 2作为程序调试信息功能的扩展口。

2.2 SPI Flash

本文采用S25FL008A 8-Megabit Flash Memory作为验证平台的测试芯片。这里我们主要要了解该Flash的管脚定义以及功能描述。

2.2.1 管脚连接图

SPI Flash管脚一般包括片选的CS脚、时钟的SCLK脚、数据口SI和SO、写保护口WP脚、中断串行通信的HOLD脚组成。如图3所示。

2.2.2 输入\输出IO描述

2.3 M8051 GPIO与Flash的连接

M8051的GPIO 1的P1_2与Flash的CS管脚、P1_3与Flash的SCLK管脚、P1_4与Flash 的SI管脚、P1_5与Flash的SO管脚、P1_6与Flash的WP管脚、P1_7与Flash的HOLD管脚进行连接,Verilog代码如下所示。

/***8051 module instantiation for testing.***/

top toplevel(

.PRT07(PRT07), .PRT06(PRT06), .PRT05(PRT05), .PRT04(PRT04),

.PRT03(PRT03), .PRT02(PRT02), .PRT01(PRT01), .PRT00(PRT00),

.PRT17(PRT17), .PRT16(PRT16), .PRT15(PRT15), .PRT14(PRT14),

.PRT13(PRT13), .PRT12(PRT12), .PRT11(PRT11), .PRT10(PRT10),

.PRT27(PRT27), .PRT26(PRT26), .PRT25(PRT25), .PRT24(PRT24),

.PRT23(PRT23), .PRT22(PRT22), .PRT21(PRT21), .PRT20(PRT20),

.PRT37(PRT37), .PRT36(PRT36), .PRT35(PRT35), .PRT34(PRT34),endprint

.PRT33(PRT33), .PRT32(PRT32), .PRT31(PRT31), .PRT30(PRT30),

.RSTPN(RSTPN), .XTAL2P(XTAL2P), .XTAL1P(XTAL1P),

.NPSENP(NPSENP), .ALEPN(ALEPN), .NEAPN(NEAPN) );

/***spi flash module instantiation for testing.***/

`DEVICE flash_model (

.SCLK(PRT13_reg),

.CS(PRT12),

.SI(PRT14),

.SO(PRT15),

.WP(PRT16),

.HOLD(PRT17) );

2.4 topt.hdl.v下添加消息输出功能模块

利用P1_0口作为消息输出模块的中断口。GPIO 2口作为数据口,进行接收字符数据。同时,加入特殊字符串加以判断是否当前字符串已经结束,并把需要输出的数据以十六进制输出。

3 验证平台的软件设计

3.1 添加M8051与Flash连接的管脚配置

根据硬件设计部分中提到的M8051与Flash的连接设定,在norflash_define.h中添加:

#ifdef GPIO_SPI

#define HOLD P1_7

#define WPn P1_6

#define SO P1_5

#define SI P1_4

#define SCLK P1_3

#define CSn P1_2

#endif //end GPIO_SPI

3.2 添加读写SPI命令的底层接口

在norflash_cmd.c中加入底层的读SPI命令及写SPI命令的接口函数:

读SPI命令函数:

uint8 GetByte( ) {

uint16 i;

uint8 data_buf=0;

// Set VIP 8051 GPIO as input ( need pull to high )

SO = 1;

for( i= 0; i < 8; i++ ) {

SCLK = 0;

if ( SO == 1 ) {

data_buf = (data_buf | (0x80 >> i));

}

SCLK = 1;

}

return data_buf;

}

写SPI命令函数:

void SendByte( uint8 byte_value ) {

uint16 i;

for( i= 0; i < 8; i++ ) {

if ( (byte_value & IO_MASK) == 0x80 ){

SI = 1;

}

else{

SI = 0;

}

SCLK = 0;

byte_value = byte_value << 1;

SCLK = 1;

}

}

3.3 添加Flash支援的功能函数

根据Flash S25FL008A Datasheet上的描述,添加相应的ReadID、Flash_Read、Flash_Erase以及Flash_PP四个功能演示函数。

3.4 添加Test Bench程序

最后添加Test Bench主程序,在main函数里加入对M8051的UART、软件模拟SPI功能、Timer以及中断的初始化程序。同时也要添加调用Read Flash ID以及擦写Nor Flash的功能的程序代码。

4 测试Flash Driver的运行

测试Flash Driver主要分两个步骤进行,首先是将8051的Firmware编译成编汇代码,将其转换成Verilog仿真格式。其次是将转换后的代码放入ncverilog工具中进行仿真运行,查看程序打印出的系统信息是否有误。同时还可以利用波形Debug工具进行调试程序代码,这将极大地提高我们检测Flash Driver的效率以及准确性。

4.1 编译程序并生成所需烧录的romcode

这里我们选择sdcc作为编译工具,将8051 firmware进行编译成汇编代码。SDCC ( Small Device C Compiler) 是一个优化的 ANSI - C交叉编译器,目标CPU基于Intel 8051,是一款免费的开放源代码软件。

利用以下命令将我们的编写好的Flash Driver的测试代码编译成8051目标代码:

sdcc —model-large -c S25FL_CMD.c

sdcc —model-large -c testbench.c

sdcc —model-large tb.rel $S25FL_CMD.rel

cp -f tb.ihx $ROM_DIR/S25FL_APP.ihx

再使用hex to dat格式转换工具,将hex文件转换成dat文件。endprint

./hex2v.exe S25FL_APP.ihx > S25FL_APP.dat

最后连接生成romcode.com文件:

rm romcode.rom

ln -s $ROM_DIR/S25FL_APP.dat romcode.rom

4.2 运行ncverilog工具进行仿真

查阅相关ncverilog文档后,在测试脚本中键入如下命令启动verilog仿真动作:

ncverilog toptst.v -f top.run +access+r +nctimescale+10ns/1ns +ncoverride_precision

4.3 Flash Driver测试结果

运行ncverilog仿真后,可以在终端得到如下信息:

/**Start Testbench of S25FL008A Flash Driver**/

#Test Read ID cmd:

RDID output=>00010213

expected=>00010213

#Test READ cmd:

>>>Start Page Program page address: 0x200

Read Address=>00000200

data=>00000047

expected=>00000047

Read Address=>00000201

data=>000000fc

expected=>000000fc

Read Address=>00000202

data=>0000006d

expected=>0000006d

Read Address=>00000203

data=>00000084

expected=>00000084

Read Address=>00000204

data=>00000028

expected=>00000028

#Test PP cmd:

>>>Start Page Program page address: 0x300

Read Address=>00000300

data=>000000c9

expected=>000000c9

Read Address=>00000301

data=>0000004a

expected=>0000004a

Read Address=>00000302

data=>0000001d

expected=>0000001d

Read Address=>00000303

data=>000000ae

expected=>000000ae

Read Address=>00000304

data=>000000a5

expected=>000000a5

/**End Testbench of S25FL008A Flash Driver**/

**Total Error: 0

从结果可以看出,这次仿真的过程中没有错误,读S25FL008A Flash ID正确,以及读写Flash Address 0x200和0x300都正确。

5 结束语

本文通过针基于M8051软核,对SPI NOR Flash Driver验证平台的硬件模块及软件模块的进行较详细的设计与实现,完整地阐述了一种较为快捷以及低成本的方法开发、测试Flash Driver。它不仅可以提供一种有别与常规硬件测试平台的实现方法,还为我们通过软件模拟的方式来代替硬件平台提供一种全新的思路。

参考文献:

[1] J.BHASKER. Verilog HDL入门[M].3版.北京:北京航空航天大学出版社,2008.

[2] S25FL800A_00_B3 Data Sheet. Spansion, 2009.

[3] Technical Specifications M8051.Virtual IP Group.endprint

./hex2v.exe S25FL_APP.ihx > S25FL_APP.dat

最后连接生成romcode.com文件:

rm romcode.rom

ln -s $ROM_DIR/S25FL_APP.dat romcode.rom

4.2 运行ncverilog工具进行仿真

查阅相关ncverilog文档后,在测试脚本中键入如下命令启动verilog仿真动作:

ncverilog toptst.v -f top.run +access+r +nctimescale+10ns/1ns +ncoverride_precision

4.3 Flash Driver测试结果

运行ncverilog仿真后,可以在终端得到如下信息:

/**Start Testbench of S25FL008A Flash Driver**/

#Test Read ID cmd:

RDID output=>00010213

expected=>00010213

#Test READ cmd:

>>>Start Page Program page address: 0x200

Read Address=>00000200

data=>00000047

expected=>00000047

Read Address=>00000201

data=>000000fc

expected=>000000fc

Read Address=>00000202

data=>0000006d

expected=>0000006d

Read Address=>00000203

data=>00000084

expected=>00000084

Read Address=>00000204

data=>00000028

expected=>00000028

#Test PP cmd:

>>>Start Page Program page address: 0x300

Read Address=>00000300

data=>000000c9

expected=>000000c9

Read Address=>00000301

data=>0000004a

expected=>0000004a

Read Address=>00000302

data=>0000001d

expected=>0000001d

Read Address=>00000303

data=>000000ae

expected=>000000ae

Read Address=>00000304

data=>000000a5

expected=>000000a5

/**End Testbench of S25FL008A Flash Driver**/

**Total Error: 0

从结果可以看出,这次仿真的过程中没有错误,读S25FL008A Flash ID正确,以及读写Flash Address 0x200和0x300都正确。

5 结束语

本文通过针基于M8051软核,对SPI NOR Flash Driver验证平台的硬件模块及软件模块的进行较详细的设计与实现,完整地阐述了一种较为快捷以及低成本的方法开发、测试Flash Driver。它不仅可以提供一种有别与常规硬件测试平台的实现方法,还为我们通过软件模拟的方式来代替硬件平台提供一种全新的思路。

参考文献:

[1] J.BHASKER. Verilog HDL入门[M].3版.北京:北京航空航天大学出版社,2008.

[2] S25FL800A_00_B3 Data Sheet. Spansion, 2009.

[3] Technical Specifications M8051.Virtual IP Group.endprint

./hex2v.exe S25FL_APP.ihx > S25FL_APP.dat

最后连接生成romcode.com文件:

rm romcode.rom

ln -s $ROM_DIR/S25FL_APP.dat romcode.rom

4.2 运行ncverilog工具进行仿真

查阅相关ncverilog文档后,在测试脚本中键入如下命令启动verilog仿真动作:

ncverilog toptst.v -f top.run +access+r +nctimescale+10ns/1ns +ncoverride_precision

4.3 Flash Driver测试结果

运行ncverilog仿真后,可以在终端得到如下信息:

/**Start Testbench of S25FL008A Flash Driver**/

#Test Read ID cmd:

RDID output=>00010213

expected=>00010213

#Test READ cmd:

>>>Start Page Program page address: 0x200

Read Address=>00000200

data=>00000047

expected=>00000047

Read Address=>00000201

data=>000000fc

expected=>000000fc

Read Address=>00000202

data=>0000006d

expected=>0000006d

Read Address=>00000203

data=>00000084

expected=>00000084

Read Address=>00000204

data=>00000028

expected=>00000028

#Test PP cmd:

>>>Start Page Program page address: 0x300

Read Address=>00000300

data=>000000c9

expected=>000000c9

Read Address=>00000301

data=>0000004a

expected=>0000004a

Read Address=>00000302

data=>0000001d

expected=>0000001d

Read Address=>00000303

data=>000000ae

expected=>000000ae

Read Address=>00000304

data=>000000a5

expected=>000000a5

/**End Testbench of S25FL008A Flash Driver**/

**Total Error: 0

从结果可以看出,这次仿真的过程中没有错误,读S25FL008A Flash ID正确,以及读写Flash Address 0x200和0x300都正确。

5 结束语

本文通过针基于M8051软核,对SPI NOR Flash Driver验证平台的硬件模块及软件模块的进行较详细的设计与实现,完整地阐述了一种较为快捷以及低成本的方法开发、测试Flash Driver。它不仅可以提供一种有别与常规硬件测试平台的实现方法,还为我们通过软件模拟的方式来代替硬件平台提供一种全新的思路。

参考文献:

[1] J.BHASKER. Verilog HDL入门[M].3版.北京:北京航空航天大学出版社,2008.

[2] S25FL800A_00_B3 Data Sheet. Spansion, 2009.

[3] Technical Specifications M8051.Virtual IP Group.endprint