孔令振,穆建文
(北京環(huán)境特性研究所,北京 100859)
圖像數(shù)據(jù)存儲(chǔ)系統(tǒng)是現(xiàn)代電子系統(tǒng)的重要組成部分,在航天、國(guó)防、通信等領(lǐng)域有著廣泛的應(yīng)用[1]。隨著圖像分辨率及采樣頻率的不斷提升,高速海量數(shù)據(jù)的存儲(chǔ)問(wèn)題成為日益緊迫的研究課題。Flash作為一種新型的半導(dǎo)體器件,由于其非易失性、低功耗、體積小和可靠性高等優(yōu)點(diǎn),已逐漸取代磁盤(pán)成為嵌入式系統(tǒng)中首選的存儲(chǔ)器件。Flash根據(jù)其內(nèi)部邏輯架構(gòu)上的差異主要分為NOR Flash和NAND Flash兩種[2]。 相比NOR Flash,NAND Flash最大優(yōu)勢(shì)就在于其容量大,單片容量已達(dá)8 GB,但其最主要的缺點(diǎn)是讀寫(xiě)速度慢。綜合考慮存儲(chǔ)系統(tǒng)對(duì)帶寬的要求,本設(shè)計(jì)采用FPGA同時(shí)控制多片NAND Flash并行讀取的方式來(lái)控制帶寬。
NAND Flash是采用NAND結(jié)構(gòu)技術(shù)的非易失性存儲(chǔ)器,內(nèi)存有8位和16位兩種形式,其I/O接口為地址與命令復(fù)用接口。以三星公司生產(chǎn)的K9NCG08U5M芯片為例,該芯片內(nèi)分為4個(gè)器件(Device),每個(gè)器件由 8 192個(gè)塊(Block)組成,每塊又由 64個(gè)頁(yè)(Page)組成,每一頁(yè)的存儲(chǔ)容量為4 KB+128 B[3]。NAND Flash主要以頁(yè)為單位進(jìn)行讀寫(xiě),以塊為單位進(jìn)行擦除,其內(nèi)部有與頁(yè)大小相同的頁(yè)寄存器,用于數(shù)據(jù)緩存。該芯片讀寫(xiě)操作典型時(shí)間為 25 ns/B,寫(xiě)編程典型時(shí)間為 200 μs/Page,擦除操作時(shí)間為1.5 ms/Block,塊擦除次數(shù)可達(dá) 100萬(wàn)次,其結(jié)構(gòu)如圖1所示。
圖1 NAND Flash內(nèi)部結(jié)構(gòu)示意圖
大容量存儲(chǔ)系統(tǒng)要實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)操作需要實(shí)現(xiàn)兩個(gè)方面功能:一是實(shí)現(xiàn)具體的存儲(chǔ)接口與存儲(chǔ)系統(tǒng)的數(shù)據(jù)交換;二是實(shí)現(xiàn)存儲(chǔ)系統(tǒng)的數(shù)據(jù)管理[4]。
接口板主要負(fù)責(zé)對(duì)CCD圖像數(shù)據(jù)進(jìn)行采集及預(yù)處理,將Camera Link數(shù)據(jù)信號(hào)接收進(jìn)來(lái),按原有行、場(chǎng)及數(shù)據(jù)有效標(biāo)志信號(hào)從LVDS接口接收通信圖像數(shù)據(jù)。由于原始數(shù)據(jù)是隨機(jī)的,需要FPGA將數(shù)據(jù)整合成有一定規(guī)律的數(shù)據(jù)格式。
輸入部分首先是Camera Link接口,LVDS圖像數(shù)據(jù)輸入包含4組數(shù)據(jù)線和1組時(shí)鐘信號(hào),采用一片DS90CR286(將 LVDS信號(hào)轉(zhuǎn)換為T(mén)TL信號(hào))進(jìn)行數(shù)據(jù)接收,一個(gè)MDR26插頭。具體操作過(guò)程為:首先Camera Link數(shù)據(jù)接口模塊接收LVDS信號(hào)將其轉(zhuǎn)化成TTL電平,在FPGA內(nèi)部整合成64 bit數(shù)據(jù)信號(hào)和相機(jī)控制信號(hào),然后將圖像數(shù)據(jù)暫存到雙口RAM中,采取乒乓讀取的方式將數(shù)據(jù)存入到存儲(chǔ)板中。接口板電路結(jié)構(gòu)如圖2所示。
圖2 接口板電路結(jié)構(gòu)框圖
存儲(chǔ)板完成的任務(wù)主要是接收接口板的數(shù)據(jù)信號(hào)和控制信號(hào),將數(shù)據(jù)存入NAND Flash芯片中,讀取NAND Flash中的數(shù)據(jù)信號(hào)并傳送給接口板。
存儲(chǔ)板采用型號(hào)XC2V3000FF1152的Virtex II FPGA芯片直接控制NAND Flash芯片,其指標(biāo)為:720個(gè)可用I/O,1 728 KB的內(nèi)部塊 RAM[5]。NAND Flash芯片采用三星公司的K9NCG08U5M,單片大小為8 GB。存儲(chǔ)板載有32片NAND Flash,這樣存儲(chǔ)板可實(shí)現(xiàn)256 GB的存儲(chǔ)容量。32片NAND Flash并行存儲(chǔ),單片速度為15 MB/s,并行存儲(chǔ)速度可達(dá)480 MB/s。具體連接方式如圖3所示。
圖3 NAND Flash存儲(chǔ)陣列結(jié)構(gòu)圖
在搭建好存儲(chǔ)器硬件平臺(tái)后,需要進(jìn)行相應(yīng)的軟件設(shè)計(jì)以實(shí)現(xiàn)系統(tǒng)邏輯功能。主要包括兩個(gè)部分:一是根據(jù)具體的接口編寫(xiě)合適的程序?qū)崿F(xiàn)圖像數(shù)據(jù)的輸入與輸出控制,實(shí)現(xiàn)存儲(chǔ)板與外部接口的數(shù)據(jù)交換;二是NAND Flash邏輯控制器的設(shè)計(jì)[6]。NAND Flash邏輯控制器是大容量存儲(chǔ)器設(shè)計(jì)的關(guān)鍵。
NAND Flash邏輯控制器主要由主狀態(tài)機(jī)和中間狀態(tài)機(jī)兩個(gè)狀態(tài)機(jī)構(gòu)成[7]。主狀態(tài)機(jī)主要用于產(chǎn)生對(duì)NAND Flash進(jìn)行各種操作時(shí)所需的控制時(shí)序,中間狀態(tài)機(jī)主要用于控制主狀態(tài)機(jī)內(nèi)各個(gè)狀態(tài)之間的跳轉(zhuǎn)。
NAND Flash邏輯控制器主狀態(tài)機(jī)內(nèi)的狀態(tài)分為6類:空閑狀態(tài)、存儲(chǔ)操作狀態(tài)、讀取操作狀態(tài)、擦除操作狀態(tài)、壞塊檢測(cè)操作狀態(tài)和ID讀取操作狀態(tài),如圖4所示。
圖4 NAND Flash邏輯控制器主狀態(tài)機(jī)
系統(tǒng)上電后,主狀態(tài)機(jī)進(jìn)入空閑狀態(tài),并在program_start、read_start、erase_start、check_start信 號(hào) 的 驅(qū) 動(dòng) 下 進(jìn) 入 相 應(yīng)的存儲(chǔ)操作狀態(tài)、讀取操作狀態(tài)、擦除操作狀態(tài)和壞塊查詢操作狀態(tài)。在完成主控模塊訪問(wèn)請(qǐng)求的操作狀態(tài)后,主狀態(tài)機(jī)會(huì)自動(dòng)跳回到空閑狀態(tài)。NAND Flash存儲(chǔ)以頁(yè)為單位進(jìn)行,在對(duì)Flash某一塊進(jìn)行寫(xiě)操作前,需要對(duì)其進(jìn)行擦除操作。先往Flash中寫(xiě)命令0x60,然后往Flash里寫(xiě)要擦除的塊地址,再往Flash里寫(xiě)命令0xD0,最后等待。當(dāng)往Flash里面寫(xiě)命令0x70后讀出來(lái)的數(shù)據(jù)是0xC0時(shí),說(shuō)明擦除操作完畢。擦除操作完成后才可以向Flash里寫(xiě)數(shù)據(jù)。寫(xiě)數(shù)據(jù)的操作過(guò)程為:先往Flash中寫(xiě)命令0x80,然后往Flash里寫(xiě)要操作的地址,再向Flash搬數(shù)據(jù),搬完后,如果要對(duì)本片F(xiàn)lash進(jìn)行操作,一定要等一段時(shí)間,使得Flash有足夠的時(shí)間把數(shù)據(jù)從Flash的緩存區(qū)域搬移到存儲(chǔ)區(qū)域內(nèi)。需要從Flash里讀取數(shù)據(jù)時(shí),主狀態(tài)機(jī)進(jìn)入讀取操作狀態(tài),數(shù)據(jù)讀取操作也是以頁(yè)為單位進(jìn)行。讀取數(shù)據(jù)的過(guò)程為:先往Flash里寫(xiě)入0x00控制字,然后往Flash里寫(xiě)要操作的地址,再往Flash寫(xiě)命令0x30,等待一段時(shí)間,使得Flash有足夠的時(shí)間把要讀的數(shù)據(jù)從存儲(chǔ)區(qū)搬到Flash緩存區(qū)內(nèi)。NAND Flash讀寫(xiě)與擦除操作流程如圖5所示。
當(dāng)Flash存儲(chǔ)區(qū)域讀寫(xiě)操作完畢,需要對(duì)下一塊存儲(chǔ)區(qū)域進(jìn)行操作時(shí),主狀態(tài)機(jī)進(jìn)入壞塊查詢控制模塊,產(chǎn)生壞塊查詢所需的塊地址信息和激勵(lì)信號(hào),狀態(tài)機(jī)先進(jìn)行塊擦除操作,讀取芯片狀態(tài)寄存器來(lái)檢測(cè)塊擦除是否成功,如果不成功則認(rèn)為該數(shù)據(jù)塊為無(wú)效塊,并將數(shù)據(jù)塊地址寫(xiě)入緩存中。狀態(tài)位讀取操作由指令控制字70H控制,在I/O數(shù)據(jù)總線寫(xiě)入70H后的一個(gè)讀時(shí)鐘周期內(nèi)可以將狀態(tài)信息通過(guò)I/O總線讀出。擦除結(jié)束后讀取狀態(tài)寄存器即可判斷此塊是否為壞塊,如果為壞塊則將當(dāng)前塊地址寫(xiě)入壞塊緩存內(nèi)。
圖5 NAND Flash讀寫(xiě)與擦除操作流程圖
主狀態(tài)機(jī)內(nèi)各個(gè)狀態(tài)實(shí)現(xiàn)的功能各不相同,在狀態(tài)機(jī)的循環(huán)過(guò)程中,每個(gè)子狀態(tài)并不是在內(nèi)部操作執(zhí)行完之后就可以跳到下一個(gè)狀態(tài)中去。主狀態(tài)機(jī)內(nèi)各個(gè)子狀態(tài)之間的跳轉(zhuǎn)需要中間狀態(tài)機(jī)進(jìn)行控制實(shí)現(xiàn)。
中間狀態(tài)機(jī)的主要功能有兩個(gè):計(jì)數(shù)主狀態(tài)機(jī)內(nèi)各個(gè)子狀態(tài)的內(nèi)部操作執(zhí)行次數(shù),并與實(shí)現(xiàn)相應(yīng)的存儲(chǔ)器控制操作時(shí)需要執(zhí)行的次數(shù)進(jìn)行比較,從而控制各個(gè)子狀態(tài)之間的跳轉(zhuǎn);通過(guò)內(nèi)部狀態(tài)之間的跳轉(zhuǎn),產(chǎn)生符合Flash建立保持時(shí)間要求的各種讀寫(xiě)使能信號(hào)。此設(shè)計(jì)中,中間狀態(tài)機(jī)包括4個(gè)狀態(tài),分別為觸發(fā)開(kāi)始、中間狀態(tài)一、中間狀態(tài)二和觸發(fā)結(jié)束。中間狀態(tài)機(jī)轉(zhuǎn)換流程如圖6所示,在中間狀態(tài)機(jī)一次跳轉(zhuǎn)循環(huán)中,主狀態(tài)機(jī)的狀態(tài)不發(fā)生變化。
圖6 NAND Flash邏輯控制器中間狀態(tài)機(jī)
針對(duì)本文設(shè)計(jì)的大容量存儲(chǔ)板進(jìn)行了存儲(chǔ)功能測(cè)試和數(shù)據(jù)采集功能測(cè)試。在FPGA內(nèi)部產(chǎn)生測(cè)試數(shù)據(jù),將測(cè)試數(shù)據(jù)存儲(chǔ)到NAND Flash中再啟動(dòng)讀操作。數(shù)據(jù)源采用順序數(shù)、隨機(jī)數(shù)、驅(qū)動(dòng)能力數(shù),順序數(shù)為按從小到大排列的數(shù)據(jù),隨機(jī)數(shù)為采用一定算法生成的隨機(jī)數(shù)據(jù),驅(qū)動(dòng)數(shù)為采用0與1交替變換的數(shù)據(jù)。經(jīng)測(cè)試,存儲(chǔ)板存儲(chǔ)帶寬約為465 MB/s,讀取帶寬約為590 MB/s,滿足設(shè)計(jì)要求。
NAND Flash訪問(wèn)速度快、成本低,而且存儲(chǔ)密度越來(lái)越大,在不同領(lǐng)域都得到了廣泛的應(yīng)用。本文針對(duì)單片F(xiàn)lash存儲(chǔ)速度慢的缺點(diǎn),提出了一種多片NAND Flash并行讀取的方式來(lái)提高讀取帶寬。通過(guò)NAND Flash邏輯控制器來(lái)實(shí)現(xiàn)Flash文件的讀寫(xiě)及擦除操作;并且針對(duì)NAND Flash的壞塊問(wèn)題提出了一種壞塊檢測(cè)方法,通過(guò)不斷調(diào)用壞塊查詢函數(shù),可以跳過(guò)壞塊并將壞塊地址存儲(chǔ)在已建立好的RAM中,增加壞塊管理,保證了數(shù)據(jù)存儲(chǔ)的可靠性。
[1]雷磊.NAND型Flash海量存儲(chǔ)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京理工大學(xué),2008.
[2]趙軍偉,李宏穆,莊阿龍,等.NandFLASH和NorFLASH接口設(shè)計(jì)和驅(qū)動(dòng)開(kāi)發(fā)[J].現(xiàn)代電子技術(shù),2009(14):40-43.
[3]Samsung Electronics.K9NCG08U5M data sheet[Z].
[4]晏敏,龍小奇,章兢,等.開(kāi)放式大容量 NAND Flash數(shù)據(jù)存儲(chǔ)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].微電子學(xué)與計(jì)算機(jī),2009,26(11):13-16.
[5]Xilinx.Virtex-II user guide[EB/OL].http://www.xilinx.com.
[6]HO L S,HO P L K.An efficient NAND Flash files system for Flash memory storage[J].IEEE Transaction on Computers, 2006,55(7):906-912.
[7]劉衛(wèi).NAND Flash控制器的設(shè)計(jì)與驗(yàn)證[D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)大型,2008.