倪峰
摘要:該文是基于Verilog描述的8051 IP和Flash Behavior Model的軟件平臺(tái)來(lái)構(gòu)建SPI NOR FLASH驗(yàn)證平臺(tái),旨在建立一個(gè)完全是由軟件環(huán)境模擬的FLASH測(cè)試平臺(tái)。該平臺(tái)能開(kāi)發(fā)并測(cè)試Flash驅(qū)動(dòng)程序,而且實(shí)現(xiàn)一種快速建立驗(yàn)證Flash的實(shí)驗(yàn)環(huán)境。
關(guān)鍵詞:M8051 IP;Verilog;Flash Behavior Model;FLASH驅(qū)動(dòng)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)18-4296-05
1 概述
隨著電子技術(shù)的日新月異的發(fā)展,芯片的集成度越來(lái)越大,其復(fù)雜度越來(lái)越高。在芯片的開(kāi)發(fā)過(guò)程中,測(cè)試驗(yàn)證的環(huán)節(jié)占據(jù)整個(gè)工作量的60%-70%,可見(jiàn)芯片驗(yàn)證平臺(tái)的重要性。
在真實(shí)芯片生產(chǎn)之前,如果能有一個(gè)平臺(tái)可以驗(yàn)證Flash驅(qū)動(dòng)并提供給客戶,對(duì)及時(shí)提供及更新Flash驅(qū)動(dòng)都有十分重要的實(shí)際意義。該文正是從該目的出發(fā),打造一個(gè)純軟件環(huán)境模擬的FLASH測(cè)試平臺(tái)。該平臺(tái)不僅能提供了一個(gè)低成本的FLASH驗(yàn)證平臺(tái)的方案,而且在消除硬件環(huán)境的影響下,讓驅(qū)動(dòng)開(kāi)發(fā)得以快速完成。
基于M8051 IP的Flash驗(yàn)證平臺(tái)主要包括8051IP、Flash Behavior Model文件、Flash Driver以及Message組件等,如圖1所示。
2 驗(yàn)證平臺(tái)的硬件設(shè)計(jì)
本平臺(tái)是由一顆開(kāi)源的8051 IP與Flash Behavior Model文件為基礎(chǔ),加上Test Bench代碼模擬的外部RAM以及調(diào)試代碼所需用到的Message 產(chǎn)生組件構(gòu)成。平臺(tái)硬件連接圖如2所示。硬件設(shè)計(jì)主要分成8051 GPIO與Flash Behavior Model的連接,以及Test Bench所需的top.hdl.v功能文件的實(shí)現(xiàn)。
2.1 M8051 IP軟核
M8051 IP軟核是高性能的8位微控制器(MCU),它由算術(shù)邏輯單元(ALU)、數(shù)據(jù)存儲(chǔ)交換部分、程序存儲(chǔ)部分、指令解碼譯碼部分以及外圍IO接口部分等組成。M8051與傳統(tǒng)的8051單片機(jī)在MCU組成部分及指令系統(tǒng)是兼容的,具有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驗(yàn)證平臺(tái)的搭建中,主要用到M8051的GPIO口進(jìn)行與SPI FLASH連接。使用M8051 GPIO 0作為64 KB外擴(kuò)RAM的連接通信口, GPIO 1作為與SPI Flash PIN腳連接的通信口,GPIO 2作為程序調(diào)試信息功能的擴(kuò)展口。
2.2 SPI Flash
本文采用S25FL008A 8-Megabit Flash Memory作為驗(yàn)證平臺(tái)的測(cè)試芯片。這里我們主要要了解該Flash的管腳定義以及功能描述。
2.2.1 管腳連接圖
SPI Flash管腳一般包括片選的CS腳、時(shí)鐘的SCLK腳、數(shù)據(jù)口SI和SO、寫(xiě)保護(hù)口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管腳進(jìn)行連接,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口作為數(shù)據(jù)口,進(jìn)行接收字符數(shù)據(jù)。同時(shí),加入特殊字符串加以判斷是否當(dāng)前字符串已經(jīng)結(jié)束,并把需要輸出的數(shù)據(jù)以十六進(jìn)制輸出。
3 驗(yàn)證平臺(tái)的軟件設(shè)計(jì)
3.1 添加M8051與Flash連接的管腳配置
根據(jù)硬件設(shè)計(jì)部分中提到的M8051與Flash的連接設(shè)定,在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 添加讀寫(xiě)SPI命令的底層接口
在norflash_cmd.c中加入底層的讀SPI命令及寫(xiě)SPI命令的接口函數(shù):
讀SPI命令函數(shù):
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;
}
寫(xiě)SPI命令函數(shù):
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支援的功能函數(shù)
根據(jù)Flash S25FL008A Datasheet上的描述,添加相應(yīng)的ReadID、Flash_Read、Flash_Erase以及Flash_PP四個(gè)功能演示函數(shù)。
3.4 添加Test Bench程序
最后添加Test Bench主程序,在main函數(shù)里加入對(duì)M8051的UART、軟件模擬SPI功能、Timer以及中斷的初始化程序。同時(shí)也要添加調(diào)用Read Flash ID以及擦寫(xiě)Nor Flash的功能的程序代碼。
4 測(cè)試Flash Driver的運(yùn)行
測(cè)試Flash Driver主要分兩個(gè)步驟進(jìn)行,首先是將8051的Firmware編譯成編匯代碼,將其轉(zhuǎn)換成Verilog仿真格式。其次是將轉(zhuǎn)換后的代碼放入ncverilog工具中進(jìn)行仿真運(yùn)行,查看程序打印出的系統(tǒng)信息是否有誤。同時(shí)還可以利用波形Debug工具進(jìn)行調(diào)試程序代碼,這將極大地提高我們檢測(cè)Flash Driver的效率以及準(zhǔn)確性。
4.1 編譯程序并生成所需燒錄的romcode
這里我們選擇sdcc作為編譯工具,將8051 firmware進(jìn)行編譯成匯編代碼。SDCC ( Small Device C Compiler) 是一個(gè)優(yōu)化的 ANSI - C交叉編譯器,目標(biāo)CPU基于Intel 8051,是一款免費(fèi)的開(kāi)放源代碼軟件。
利用以下命令將我們的編寫(xiě)好的Flash Driver的測(cè)試代碼編譯成8051目標(biāo)代碼:
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格式轉(zhuǎn)換工具,將hex文件轉(zhuǎn)換成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 運(yùn)行ncverilog工具進(jìn)行仿真
查閱相關(guān)ncverilog文檔后,在測(cè)試腳本中鍵入如下命令啟動(dòng)verilog仿真動(dòng)作:
ncverilog toptst.v -f top.run +access+r +nctimescale+10ns/1ns +ncoverride_precision
4.3 Flash Driver測(cè)試結(jié)果
運(yùn)行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
從結(jié)果可以看出,這次仿真的過(guò)程中沒(méi)有錯(cuò)誤,讀S25FL008A Flash ID正確,以及讀寫(xiě)Flash Address 0x200和0x300都正確。
5 結(jié)束語(yǔ)
本文通過(guò)針基于M8051軟核,對(duì)SPI NOR Flash Driver驗(yàn)證平臺(tái)的硬件模塊及軟件模塊的進(jìn)行較詳細(xì)的設(shè)計(jì)與實(shí)現(xiàn),完整地闡述了一種較為快捷以及低成本的方法開(kāi)發(fā)、測(cè)試Flash Driver。它不僅可以提供一種有別與常規(guī)硬件測(cè)試平臺(tái)的實(shí)現(xiàn)方法,還為我們通過(guò)軟件模擬的方式來(lái)代替硬件平臺(tái)提供一種全新的思路。
參考文獻(xiàn):
[1] J.BHASKER. Verilog HDL入門[M].3版.北京:北京航空航天大學(xué)出版社,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 運(yùn)行ncverilog工具進(jìn)行仿真
查閱相關(guān)ncverilog文檔后,在測(cè)試腳本中鍵入如下命令啟動(dòng)verilog仿真動(dòng)作:
ncverilog toptst.v -f top.run +access+r +nctimescale+10ns/1ns +ncoverride_precision
4.3 Flash Driver測(cè)試結(jié)果
運(yùn)行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
從結(jié)果可以看出,這次仿真的過(guò)程中沒(méi)有錯(cuò)誤,讀S25FL008A Flash ID正確,以及讀寫(xiě)Flash Address 0x200和0x300都正確。
5 結(jié)束語(yǔ)
本文通過(guò)針基于M8051軟核,對(duì)SPI NOR Flash Driver驗(yàn)證平臺(tái)的硬件模塊及軟件模塊的進(jìn)行較詳細(xì)的設(shè)計(jì)與實(shí)現(xiàn),完整地闡述了一種較為快捷以及低成本的方法開(kāi)發(fā)、測(cè)試Flash Driver。它不僅可以提供一種有別與常規(guī)硬件測(cè)試平臺(tái)的實(shí)現(xiàn)方法,還為我們通過(guò)軟件模擬的方式來(lái)代替硬件平臺(tái)提供一種全新的思路。
參考文獻(xiàn):
[1] J.BHASKER. Verilog HDL入門[M].3版.北京:北京航空航天大學(xué)出版社,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 運(yùn)行ncverilog工具進(jìn)行仿真
查閱相關(guān)ncverilog文檔后,在測(cè)試腳本中鍵入如下命令啟動(dòng)verilog仿真動(dòng)作:
ncverilog toptst.v -f top.run +access+r +nctimescale+10ns/1ns +ncoverride_precision
4.3 Flash Driver測(cè)試結(jié)果
運(yùn)行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
從結(jié)果可以看出,這次仿真的過(guò)程中沒(méi)有錯(cuò)誤,讀S25FL008A Flash ID正確,以及讀寫(xiě)Flash Address 0x200和0x300都正確。
5 結(jié)束語(yǔ)
本文通過(guò)針基于M8051軟核,對(duì)SPI NOR Flash Driver驗(yàn)證平臺(tái)的硬件模塊及軟件模塊的進(jìn)行較詳細(xì)的設(shè)計(jì)與實(shí)現(xiàn),完整地闡述了一種較為快捷以及低成本的方法開(kāi)發(fā)、測(cè)試Flash Driver。它不僅可以提供一種有別與常規(guī)硬件測(cè)試平臺(tái)的實(shí)現(xiàn)方法,還為我們通過(guò)軟件模擬的方式來(lái)代替硬件平臺(tái)提供一種全新的思路。
參考文獻(xiàn):
[1] J.BHASKER. Verilog HDL入門[M].3版.北京:北京航空航天大學(xué)出版社,2008.
[2] S25FL800A_00_B3 Data Sheet. Spansion, 2009.
[3] Technical Specifications M8051.Virtual IP Group.endprint