舒文麗,吳云峰 ,孫長(zhǎng)勝,吳華君,唐 斌
(電子科技大學(xué)光電信息學(xué)院,成都610051)
數(shù)據(jù)采集存儲(chǔ)系統(tǒng)是現(xiàn)代電子系統(tǒng)的重要組成部分,在通信、雷達(dá)、航天等領(lǐng)域都有著廣泛的應(yīng)用[1]。由于圖像的分辨率和采樣率大幅提升[2],高速海量數(shù)據(jù)的存儲(chǔ)問題成為研究的熱點(diǎn)。隨著半導(dǎo)體技術(shù)的發(fā)展,固態(tài)存儲(chǔ)器以其優(yōu)異的性能逐漸成為數(shù)據(jù)存儲(chǔ)系統(tǒng)的首選存儲(chǔ)介質(zhì)[1],其中以閃速存儲(chǔ)器(Flash Memory)發(fā)展的最快。Flash 根據(jù)芯片內(nèi)部邏輯架構(gòu)設(shè)計(jì)上的差異主要分為NOR Flash 和NAND Flash 兩種[3]。相比于NOR Flash,NAND Flash 具有訪問速度快、成本低、容量大、功耗低等諸多的優(yōu)勢(shì),在大容量存儲(chǔ)系統(tǒng)中得到廣泛應(yīng)用,本文的海量存儲(chǔ)板就是基于NAND Flash 設(shè)計(jì)的。但是NAND Flash的讀寫速度不快,讀帶寬為17 Mbyte/s,寫帶寬為6.8 Mbyte/s[4],考慮到存儲(chǔ)系統(tǒng)對(duì)帶寬的要求,本文采用FPGA 同時(shí)控制多片NAND Flash 的讀寫操作以增加帶寬。
本存儲(chǔ)器的設(shè)計(jì)指標(biāo)是:Camera Link 高級(jí)模式的數(shù)據(jù)輸入;600 Mbyte/s 數(shù)據(jù)存儲(chǔ)速度;30 min 的連續(xù)存儲(chǔ)時(shí)間;掉電數(shù)據(jù)不丟失;抗震性;容量可擴(kuò)展性。NAND Flash 存儲(chǔ)系統(tǒng)要完成存儲(chǔ)數(shù)據(jù)操作需要實(shí)現(xiàn)兩個(gè)方面的功能:一是實(shí)現(xiàn)具體的存儲(chǔ)器接口與存儲(chǔ)系統(tǒng)的數(shù)據(jù)交換;二是實(shí)現(xiàn)存儲(chǔ)系統(tǒng)的數(shù)據(jù)管理[5]。基于以上指標(biāo),本存儲(chǔ)器分為接口板和存儲(chǔ)板。
接口板完成的任務(wù)是將Camera Link 數(shù)據(jù)信號(hào)接收進(jìn)來(lái),然后通過(guò)FPGA 分配數(shù)據(jù)信號(hào)。分配數(shù)據(jù)信號(hào)主要是要選擇可用的存儲(chǔ)板,將數(shù)據(jù)信號(hào)傳輸進(jìn)去。在讀取數(shù)據(jù)信號(hào)時(shí),接收相機(jī)控制信號(hào)選擇需要讀取的存儲(chǔ)板,并將里面的數(shù)據(jù)讀出。
輸入部分首先是Camera Link 接口部分三片DS90CR286 接收數(shù)據(jù)信號(hào)、一片DS90LV047A 作為相機(jī)控制信號(hào)(Camera Control 1 ~4)的發(fā)送端、一個(gè)MDR-26 接頭、一個(gè)MDR-20 接頭。采用I/O 口最多的XC4VLX100-FF1513 型號(hào)的Virtex-4 FPGA芯片作為數(shù)據(jù)輸入分配模塊,同時(shí)控制Camera Link接收芯片。
操作過(guò)程描述:
首先Camera Link 數(shù)據(jù)接口模塊接收到接口傳輸過(guò)來(lái)的LVDS 信號(hào),將其轉(zhuǎn)換為64 bit 數(shù)據(jù)信號(hào)和相機(jī)控制信號(hào)。然后在Virtex-4 FPGA 里面做一個(gè)雙口RAM 將存儲(chǔ)進(jìn)來(lái)的數(shù)據(jù)寫入RAM。接下來(lái),按照Virtex-4 FPGA 里面存儲(chǔ)的信息選擇可用的存儲(chǔ)板,將數(shù)據(jù)從RAM 的另一口讀出,存入存儲(chǔ)板。接口板的框圖如圖1 所示。

圖1 接口板框圖
存儲(chǔ)板完成的任務(wù)是接收接口板的數(shù)據(jù)信號(hào)和控制信號(hào),將數(shù)據(jù)存入NAND Flash 芯片中。在讀取數(shù)據(jù)時(shí),按照順序讀取板上NAND Flash 里面的數(shù)據(jù)信號(hào),并通過(guò)主FPGA 芯片傳入接口板。
接收到存儲(chǔ)板傳來(lái)的數(shù)據(jù)和控制信號(hào),每塊存儲(chǔ)板采用4 片F(xiàn)PGA(1 片Virtex-4 和3 片Spartan- 3)的設(shè)計(jì)結(jié)構(gòu)。首先使用型號(hào)為XC4VLX25-FF668 速度較快的Virtex-4 FPGA 芯片接收,其指標(biāo)為:448 個(gè)可用IO、1296 kbit 的內(nèi)部Block RAM。然后使用型號(hào)為XC3S4000 -FG900 的Spartan-3 芯片直接控制NAND Flash 芯片,其可用管腳數(shù)為633。NAND Flash 芯片是三星公司的K9WBG08U1M,單片大小為4 Gbyte,單片速度為15 Mbyte/s。每片Spartan-3 可以控制48 片4 Gbyte 的NAND Flash,這樣一款存儲(chǔ)板就有4 G×48×3=576 GBytes 的存儲(chǔ)容量,兩塊存儲(chǔ)板就可以完成30 min 的數(shù)據(jù)存儲(chǔ)。48 片NAND Flash 芯片并行存儲(chǔ),分擔(dān)600 Mbyte/s 的數(shù)據(jù)速度,每片所需的存儲(chǔ)速度為12.5 Mbyte/s,該芯片完全能夠完成這個(gè)指標(biāo),具體連接方式如圖2 所示。

圖2 FPGA 與一組Flash 的連接方式
操作過(guò)程描述:
首先接受接口板的選擇傳輸信號(hào)后,使能板上NAND Flash 芯片的寫入模式,接收64 bit 數(shù)據(jù)信號(hào),存入接口板主FPGA Virtex-4 芯片,再按順序存入3 片從FPGA Spartan-3 芯片。在接收到接口板的讀取數(shù)據(jù)信號(hào)時(shí),使能使能板上NAND Flash 芯片的讀取模式,按順序從3 片從FPGA 芯片中讀取數(shù)據(jù)信號(hào),傳入主FPGA 芯片,再傳入接口板。存儲(chǔ)板的框圖如圖3 所示。

圖3 存儲(chǔ)板框圖
在搭建好硬件平臺(tái)以后,需要編寫相應(yīng)的程序代碼實(shí)現(xiàn)系統(tǒng)的邏輯功能,主要包括兩個(gè)部分:一是根據(jù)具體的存儲(chǔ)器接口編寫合適的程序?qū)崿F(xiàn)從存儲(chǔ)器接口讀取當(dāng)前的操作命令和實(shí)現(xiàn)NAND Flash 閃存系統(tǒng)與存儲(chǔ)器接口之間的數(shù)據(jù)交換,二是存儲(chǔ)系統(tǒng)的數(shù)據(jù)管理,主要指NAND Flash 閃存數(shù)據(jù)管理[5]。NAND Flash閃存數(shù)據(jù)管理是閃存存儲(chǔ)系統(tǒng)的關(guān)鍵,主要包括壞塊管理,損耗均衡和ECC 校驗(yàn)[6-8]。
壞塊是指一個(gè)塊內(nèi)含有一位或多位數(shù)據(jù)單元無(wú)法進(jìn)行操作的塊單元,分為固有壞塊和使用壞塊。由于生產(chǎn)工藝的限制,NAND Flash 在出廠的時(shí)候允許存在一定量的壞塊,稱為固有壞塊。在芯片的長(zhǎng)期使用過(guò)程中也會(huì)產(chǎn)生新的壞塊,稱為使用壞塊。如果信息存儲(chǔ)在壞塊中,會(huì)導(dǎo)致信息的丟失,所以在對(duì)NAND Flash 操作過(guò)程中要編寫程序?qū)膲K進(jìn)行管理,保證信息的準(zhǔn)確性。壞塊管理包括壞塊識(shí)別,壞塊存儲(chǔ),壞塊跳過(guò)和壞塊替換。
2.1.1 壞塊識(shí)別和存儲(chǔ)
要對(duì)NAND Flash 的壞塊進(jìn)行管理,首先要識(shí)別并存儲(chǔ)壞塊的位置。第一次上電的時(shí)候,通過(guò)壞塊識(shí)別函數(shù),檢測(cè)NAND Flash 的固有壞塊,建立壞塊信息表,存儲(chǔ)壞塊的位置。
2.1.2 壞塊跳過(guò)
以后每次對(duì)NAND Flash 進(jìn)行操作時(shí),先調(diào)用有效塊檢測(cè)函數(shù),也就是和壞塊信息表的內(nèi)容做比較。如果檢測(cè)到該塊是壞塊就直接加1 跳過(guò),否則就把該塊的地址存儲(chǔ)在建好的RAM 中,用來(lái)存儲(chǔ)數(shù)據(jù)。這樣在對(duì)NAND Flash 進(jìn)行操作的過(guò)程中,RAM 中始終存儲(chǔ)著下一個(gè)待用的有效塊地址。
2.1.3 壞塊替換
當(dāng)對(duì)NAND Flash 進(jìn)行寫操作或擦除操作時(shí),可以根據(jù)狀態(tài)寄存器判斷Flash 的運(yùn)行是否成功,當(dāng)狀態(tài)寄存器接收到錯(cuò)誤信息時(shí),這個(gè)塊就會(huì)被認(rèn)為是壞塊,寫操作或擦除操作就是無(wú)效的,這時(shí)就要用好塊替換壞塊。由于在同一塊中某一頁(yè)的操作失敗不會(huì)影響其他頁(yè)數(shù)據(jù)的正確性,所以可以重新寫入無(wú)效頁(yè)的正確數(shù)據(jù),通過(guò)控制器緩存,連同塊中的其它頁(yè)的數(shù)據(jù)一起拷貝到下一個(gè)有效塊中,避免信息丟失。

圖4 壞塊替換
考慮到本設(shè)計(jì)中采用48 片NAND Flash 并行操作,F(xiàn)PGA 同時(shí)控制48 片NAND Flash。如果采用傳統(tǒng)的壞塊跳過(guò)方法,將48 塊Flash 的所有有效塊的地址全部存儲(chǔ)在建好的RAM 中,會(huì)占用FPGA 大量的資源。本文提到的壞塊跳過(guò)方法,通過(guò)不斷地調(diào)用有效塊檢測(cè)函數(shù),每次只存儲(chǔ)48 個(gè)有效塊地址即每片NAND Flash 只需存儲(chǔ)一個(gè)有效塊地址,這樣避免占用太多的FPGA 資源。
盡管NAND Flash 的每個(gè)單元塊相互獨(dú)立,且每塊一般可擦除次數(shù)高達(dá)100×104次,但是隨著擦寫次數(shù)增加,會(huì)有一些單元塊逐漸變得不穩(wěn)定或失效從而形成永久性壞塊。損耗均衡的原理是在數(shù)據(jù)需要更新時(shí),不是在原來(lái)的數(shù)據(jù)塊上重寫,而是直接把新數(shù)據(jù)寫入一個(gè)空塊中,再把原來(lái)的塊擦除[10],損耗均衡原理如圖5 所示。因此,要避免對(duì)某些塊的頻繁操作,盡量做到操作次數(shù)均衡,以達(dá)到NAND Flash 的最長(zhǎng)使用壽命。

圖5 損耗均衡原理圖
ECC(Error Checking & Correction)校驗(yàn),又叫錯(cuò)誤檢查校正。對(duì)NAND Flash 進(jìn)行操作時(shí),為了保證數(shù)據(jù)的準(zhǔn)確性,本文采用ECC 校驗(yàn)操作。ECC 校驗(yàn)碼存放在NAND Flash 的備用空間內(nèi),通過(guò)ECC 校驗(yàn),可以有效地糾正或檢測(cè)出誤碼,從而保護(hù)用戶存放的數(shù)據(jù)[9]。
本存儲(chǔ)系統(tǒng)以Xilinx 公司的Virtex-4 FPGA 作為控制核心,NAND Flash 采用48 行3 列的陣列式,每一列的48 片F(xiàn)lash 并行操作以增加位寬,3 列之間采用流水線技術(shù)進(jìn)行操作。每一行的Flash 共用I/O,每一列共用片選信號(hào),每一列的R/B 信號(hào)相與后送給FPGA,其他信號(hào)共用。
為了便于觀察,圖6 只設(shè)置了第1 列和第2 列Flash 交替操作,并將第1 列的第4 塊假設(shè)為壞塊,valid_addr 為調(diào)用有效塊檢測(cè)函數(shù)后得到的有效塊地址,valid_chip 為流水線操作的Falsh 芯片地址,page_addr 為頁(yè)地址,m 和n 為中間變量。上電時(shí)先將第4 塊存到壞塊表中,然后對(duì)第3 塊進(jìn)行操作的過(guò)程中調(diào)用有效塊檢測(cè)函數(shù)確定下一有效塊地址。對(duì)第3 塊的64 頁(yè)操作完成后,第一列Flash 直接從第3 塊跳過(guò)第5 塊,跳過(guò)壞塊4,而第2 列Flash 繼續(xù)對(duì)第4 塊進(jìn)行操作。

圖6 仿真波形
隨著NAND Flash 的存儲(chǔ)密度越來(lái)越大,體積、功耗和成本卻越來(lái)越小,NAND Flash 在不同的領(lǐng)域都得到了廣泛的應(yīng)用。本文針對(duì)單片F(xiàn)lash 存儲(chǔ)速度慢的缺點(diǎn),將多片F(xiàn)lash 并行起來(lái)工作,使得存儲(chǔ)速度大大提高。針對(duì)壞塊管理問題,本文提出了一種新的壞塊跳過(guò)方法,通過(guò)不斷調(diào)用有效塊檢測(cè)函數(shù),可以跳過(guò)壞塊,將有效塊地址存儲(chǔ)在已建好的RAM 中,對(duì)NAND Flash 操作時(shí)直接讀取有效塊地址,對(duì)壞塊進(jìn)行了管理,保證了存儲(chǔ)器數(shù)據(jù)的可靠性。
[1] 雷磊.NAND 型Flash 海量存儲(chǔ)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].碩士論文.北京理工大學(xué),2008.
[2] 朱知博.基于NAND Flash 的高速大容量存儲(chǔ)系統(tǒng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2011,34(8):170-173.
[3] 陳國(guó),高楊. NAND Flash 在大容量存儲(chǔ)技術(shù)中的應(yīng)用[J]. 航天計(jì)算技術(shù),2009,39(2):113-116.
[4] 雷磊,謝民,李先楚.基于NAND 型Flash 海量存儲(chǔ)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].測(cè)控技術(shù),2007,26:196-202.
[5] 晏敏,龍小奇,章兢,等.開放式大容量NAND Flash 數(shù)據(jù)存儲(chǔ)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].微電子學(xué)與計(jì)算機(jī),2009,26(11):13-16.
[6] Li Seung Ho,Park Lim Kyu Ho. An Efficient NAND Flash Files System for Flash Memory Storage[J]. IEEE Transaction on Computers,2006,55(7):906-912.
[7] 陶翼,晏軻,曹國(guó)梁.JFFS2 文件系統(tǒng)的閃存管理策略改進(jìn)[J].計(jì)算機(jī)與數(shù)字工程,2008,36(6):64-66.
[8] 羅曉,劉昊.一種基FAT 文件系統(tǒng)的NAND Flash 壞塊處理方法[J].電子器件,2008,31(2):716-719.
[9] 劉恕. NAND Flash 的ECC 分級(jí)及ATE 設(shè)備中的測(cè)試方法[C]//第五屆中國(guó)測(cè)試學(xué)術(shù)會(huì)議論文集.2008:401-403.
[10] 林剛.NAND Flash 壞塊管理算法及邏輯層驅(qū)動(dòng)設(shè)計(jì)[D].碩士論文.西安電子科技大學(xué),2009.