喬亞飛 ,李華旺 ,常 亮 ,李 杰
(1.中國(guó)科學(xué)院上海微系統(tǒng)與信息技術(shù)研究所上海200050;2.上海微小衛(wèi)星工程中心上海201203;3.中國(guó)科學(xué)院大學(xué)北京100049)
隨著空間科學(xué)技術(shù)的進(jìn)步,在軌衛(wèi)星運(yùn)行期間產(chǎn)生海量的數(shù)據(jù)[1],對(duì)數(shù)據(jù)存儲(chǔ)設(shè)備的容量要求也越來(lái)越高。由于NAND FLASH的容量大、讀寫(xiě)速度快、易擦除、低功耗等特點(diǎn)[2],越來(lái)越多的用作航空航天領(lǐng)域的存儲(chǔ)器件。雖然市面上有很多專用的FLASH控制器的芯片,但是這類芯片往往功能較多,導(dǎo)致功耗高,兼容性較差[3]??紤]到星上CPU的資源比較寶貴,底層的控制器采用FPGA實(shí)現(xiàn),F(xiàn)PGA作為可編程邏輯門(mén)陣列,具有高度的集成性,同時(shí)又有可編程器件的靈活性。本文采用VHDL語(yǔ)言,設(shè)計(jì)了通用型的NAND FLASH控制器,并在Microsemi公司Smartfution2 090 FPGA單板上得到驗(yàn)證。
本次設(shè)計(jì)FPGA選用Microsemi公司的Smartfu?tion2 090,該芯片包含F(xiàn)PGA和ARM的Cortex-M3內(nèi)核[4]。Smartfution2系列FPGA基于FLASH架構(gòu),而一般的FPGA基于SRAM架構(gòu)[5]。與SRAM架構(gòu)FPGA相比,Smartfution2系列FPGA具備高可靠性和單事件翻轉(zhuǎn)免疫能力[6],更能適應(yīng)太空復(fù)雜環(huán)境,廣泛應(yīng)用于航空航天領(lǐng)域。
總體架構(gòu)如圖1所示,單板上的Cortex-M3內(nèi)核通過(guò)AHB總線向底層的FPGA的AHB接口模塊發(fā)送相關(guān)FLASH控制命令和將要寫(xiě)入FLASH的數(shù)據(jù);FLASH控制器模塊從AHB接口模塊的相關(guān)寄存器讀取FLASH控制命令,數(shù)據(jù)等,解析相關(guān)命令,執(zhí)行對(duì)NAND FLASH的操作。
圖1 總體架構(gòu)圖
本次NAND FLASH的片子選用Micron公司的MT29F32G08AFABA這一型號(hào)。這一FLASH容量較大,每片可以達(dá)到32G,組織也更加復(fù)雜。1片F(xiàn)LASH有2個(gè)(Logical Unit)LUN,每一個(gè)LUN包含2個(gè)plane,每個(gè)plane包含2 048個(gè)block,每個(gè)block包含128page,每個(gè)page為(4K+224bytes)。
NAND FLASH的數(shù)據(jù)、地址和指令采用復(fù)用I/O接口[7]。NAND FLASH 器件通過(guò) CE(片選)、CLE(命令鎖存)、WE(寫(xiě)使能)、RE(讀使能)、ALE(地址鎖存)使能信號(hào)的電平,來(lái)判斷寫(xiě)入I/O總線的數(shù)據(jù)是地址還是數(shù)據(jù)、指令[8]。如果是通過(guò)I/O寫(xiě)入命令,需要將CLE信號(hào)拉高,寫(xiě)完之后將CLE拉低;同理,如果寫(xiě)入的是多拍的地址,需要將ALE信號(hào)一直拉高,寫(xiě)完之后拉低。
NAND FLASH控制模塊是本次設(shè)計(jì)的核心。該模塊主要功能有:
1)支持FLASH復(fù)位,讀數(shù)據(jù),寫(xiě)數(shù)據(jù),塊擦除,讀狀態(tài),讀ID操作。
2)支持超時(shí)檢測(cè)功能。
3)支持多片F(xiàn)LASH陣列。
4)NAND FLASH控制時(shí)序參數(shù)可設(shè)置。
NAND FLASH控制模塊主要由狀態(tài)機(jī)實(shí)現(xiàn),狀態(tài)機(jī)的初始狀態(tài)為ST_IDLE,當(dāng)檢測(cè)到脈沖信號(hào)USER_CMD_EXE時(shí),啟動(dòng)狀態(tài)機(jī),狀態(tài)機(jī)跳轉(zhuǎn)等待FLASH忙狀態(tài);隨后根據(jù)命令信號(hào)USER_CMD跳轉(zhuǎn)到相應(yīng)的子狀態(tài)機(jī)去執(zhí)行,執(zhí)行完一種功能時(shí),跳回ST_IDLE初始狀態(tài)。本設(shè)計(jì)主要有6種子狀態(tài)機(jī):復(fù)位操作子狀態(tài)機(jī),對(duì)NAND FLASH進(jìn)行復(fù)位;讀ID狀態(tài)機(jī),讀出NAND FLASH的生產(chǎn)廠商、特性等[9];塊擦除狀態(tài)機(jī),寫(xiě)操作之前必須對(duì)NAND FLASH進(jìn)行擦除[10];讀操作狀態(tài)機(jī),讀數(shù)據(jù);編程操作狀態(tài)機(jī),向NAND FLASH寫(xiě)入數(shù)據(jù);讀狀態(tài)操作狀態(tài)機(jī),判斷塊擦除或者編程操作是否完成[11]。
讀操作是NAND FLASH的一個(gè)基本操作,以頁(yè)為基本單位讀出數(shù)據(jù)[12]。對(duì)于本次FLASH的讀操作設(shè)計(jì),根據(jù)需要,將一頁(yè)分為4 K大小的data區(qū),和224字節(jié)的Spare區(qū),data區(qū)主要存放有效數(shù)據(jù),例如衛(wèi)星的載荷數(shù)據(jù)、電源數(shù)據(jù)等;spare區(qū)存放片子的信息,例如壞塊、ID等。
根據(jù)NAND FLASH的數(shù)據(jù)手冊(cè)時(shí)序圖設(shè)計(jì)讀操作的狀態(tài)機(jī),讀操作分為9個(gè)狀態(tài)。檢測(cè)到US?ER_CMD_EXE脈沖信號(hào),狀態(tài)機(jī)跳轉(zhuǎn)至ST_WA IT_BUSY,隨后,解析命令信號(hào)跳轉(zhuǎn)至讀操作;向NAND FLASH發(fā)送00h指令,則使NAND FLASH進(jìn)入READ模式,隨后寫(xiě)入3個(gè)周期的PAGE地址和2個(gè)周期的列地址;寫(xiě)入30h指令則將啟動(dòng)數(shù)據(jù)讀操作,等待NAND FLASH反饋的R/B信號(hào)由‘0’變化為‘1’時(shí)[13],狀態(tài)機(jī)進(jìn)入ST_READ_WAIT_TO_READ狀態(tài),在R/B信號(hào)為低時(shí),利用rbn_time_cnt計(jì)數(shù)器進(jìn)行超時(shí)檢測(cè);等待tRR(大約為3個(gè)時(shí)鐘周期)時(shí)間即可開(kāi)始數(shù)據(jù)讀序列,依次讀完data區(qū)數(shù)據(jù)和spare區(qū)數(shù)據(jù),最終跳回ST_IDLE狀態(tài)。讀操作的狀態(tài)機(jī)如圖2所示。
圖2 讀操作狀態(tài)機(jī)轉(zhuǎn)移圖
對(duì)于NAND FLASH,在寫(xiě)入數(shù)據(jù)之前必須進(jìn)行塊擦除,塊擦除是基于塊的[14]。與讀操作和編程操作相比,塊擦除操作相對(duì)簡(jiǎn)單。首先,向NAND FLASH發(fā)送60 h指令,F(xiàn)LASH進(jìn)入塊擦除模式,寫(xiě)入3拍的塊地址,發(fā)送D0h啟動(dòng)塊擦除操作;等待R/B信號(hào)由‘0’變?yōu)椤?’,塊擦除結(jié)束,狀態(tài)機(jī)跳轉(zhuǎn)至ST_IDLE。圖3為塊擦除狀態(tài)機(jī)跳轉(zhuǎn)圖。
圖3 塊擦除狀態(tài)機(jī)跳轉(zhuǎn)圖
基于NAND Flash的結(jié)構(gòu),大數(shù)據(jù)的編程一般采用順序?qū)懭氲姆椒╗15],從當(dāng)前頁(yè)的0地址順序?qū)懲暾?yè)。根據(jù)NAND FLASH的數(shù)據(jù)手冊(cè)時(shí)序圖設(shè)計(jì)編程操作的狀態(tài)機(jī),編程操作分為10個(gè)狀態(tài)。檢測(cè)到USER_CMD_EXE脈沖信號(hào),狀態(tài)機(jī)跳轉(zhuǎn)至ST_WAIT_BUSY,隨后,解析編程命令信號(hào)跳轉(zhuǎn)至編程操作;控制器模塊向NAND FLASH發(fā)送命令80 h,片子進(jìn)入編程模式,和讀操作一樣,寫(xiě)入3個(gè)周期的PAGE地址和2個(gè)周期的列地址;等待tADL(計(jì)數(shù)器計(jì)數(shù)3個(gè)CLK)時(shí)間,控制器模塊將1 PAGE數(shù)據(jù)順序送至I/O總線上,下一周期發(fā)送命令10 h至NAND FLASH;NAND FLASH檢測(cè)到10 h之后,開(kāi)始進(jìn)行編程操作;NAND FLASH反饋的R/B信號(hào)由‘0’變?yōu)椤?’時(shí)(同讀操作,當(dāng)R/B信號(hào)為低時(shí),進(jìn)行超時(shí)檢測(cè)),說(shuō)明編程操作完成,狀態(tài)機(jī)跳轉(zhuǎn)至ST_IDLE狀態(tài);編程操作的狀態(tài)機(jī)轉(zhuǎn)移圖如圖4所示。
圖4 編程操作狀態(tài)機(jī)跳轉(zhuǎn)圖
因?yàn)樾禽d計(jì)算機(jī)是CPU+FPGA架構(gòu),所以本次設(shè)計(jì)需要將底層的FPGA掛接到AHB總線上,用來(lái)接收CPU(Cortex-M3內(nèi)核)發(fā)送過(guò)來(lái)的指令和數(shù)據(jù)。AHB總線是ARM公司提出的一種開(kāi)放性片上總線標(biāo)準(zhǔn)[16],采用AHB-Lite協(xié)議,AHB-Lite是AHB協(xié)議的子集,只支持一個(gè)總線主設(shè)備,不需要總線仲裁器,不支持Retry及Splite響應(yīng)。本次設(shè)計(jì)開(kāi)發(fā)環(huán)境選用美高森美公司的Libero SOC和Softconsole IDE,將包含Cortex-M3的MSS(微控制器子系統(tǒng))做Master,整個(gè)的FPGA代碼頂層模塊做Slave,調(diào)用Libero IP庫(kù)中的AHB-Lite Core進(jìn)行Master和Slave的互連。設(shè)計(jì)接口模塊用于FPGA和AHB-Lite Core進(jìn)行數(shù)據(jù)的交換,在該模塊中,主要設(shè)置7組寄存器用于寄存數(shù)據(jù):0x00寄存將要讀或者寫(xiě)FLASH片子地址;0x04寄存操作FLASH命令;0x08寄存片選信號(hào);0x0C寄存USER_CMD_EXE信號(hào);0x20寄存CPU發(fā)送過(guò)來(lái)的將要寫(xiě)入FLASH的數(shù)據(jù);0x24寄存從FLASH讀出的將要送入CPU的數(shù)據(jù);0x28寄存FLASH片子是否在寫(xiě)狀態(tài);0x2C寄存FLASH片子是否在讀狀態(tài)。
控制器的仿真平臺(tái)選用ModelSim 10.4。仿真時(shí)采用Micron公司編寫(xiě)的NAND FLASH仿真模型,這一仿真模型參數(shù)可配,可以模擬NAND FLASH的如各種接口,操作。仿真時(shí)對(duì)NAND FLASH仿真模型分別進(jìn)行復(fù)位、擦除塊、寫(xiě)入、讀出1 page數(shù)據(jù),進(jìn)行比對(duì),觀察控制器功能是否正常。經(jīng)仿真測(cè)試,該控制器的預(yù)期功能正常。圖5為控制器編程、讀頁(yè)操作仿真圖(上為編程操作,下為讀操作)。
上板測(cè)試時(shí),采用專用的復(fù)位模塊,時(shí)鐘頻率采用50MHz。Cortex-M3內(nèi)核向底層FPGA發(fā)送數(shù)據(jù)、指令,對(duì)NAND FLASH進(jìn)行復(fù)位、擦除、寫(xiě)、讀等操作,圖6為上板測(cè)試的工程頂層模塊。其中FLASH_AHB_TOP_MSS為上層CPU模塊,編寫(xiě)C代碼發(fā)送相關(guān)操作命令、讀取相關(guān)數(shù)據(jù)。FLASH_AHB_ONBOARD為底層控制器的FPGA部分,實(shí)現(xiàn)對(duì)NAND FLASH的具體操作。底層FPGA和上層Cortex-M3通過(guò)CoreAHBLite橋接。
圖5 控制器編程、讀頁(yè)操作仿真圖
圖6 工程頂層模塊
在上板之前先進(jìn)行可靠性測(cè)試,例如反復(fù)插拔單板,上電下電,復(fù)位等。可靠性測(cè)試工作完成之后,進(jìn)行功能測(cè)試,寫(xiě)1 page數(shù)據(jù)最長(zhǎng)耗時(shí)為760μs,讀1 page數(shù)據(jù)最長(zhǎng)耗時(shí)為280μs,擦除整個(gè)Block為3.5 ms;滿足星上毫秒級(jí)速率存儲(chǔ)要求。
本文的創(chuàng)新點(diǎn)在于設(shè)計(jì)了CPU+FPGA架構(gòu)的星上NAND FLASH控制器,與專用的星上NAND FLASH控制器芯片相比,基于FPGA的設(shè)計(jì)接口更多,更加靈活,參數(shù)可調(diào)可配,提高了控制器的兼容性,功耗降低。通過(guò)仿真和上板調(diào)試,NAND FLASH的讀寫(xiě)等功能都能實(shí)現(xiàn)。同時(shí),控制器底層硬件采用FPGA,節(jié)約了星載計(jì)算機(jī)的資源,滿足在軌衛(wèi)星的數(shù)據(jù)高效存儲(chǔ)的要求。