焦新泉,朱振麟
(1.中北大學(xué) 儀器科學(xué)與動(dòng)態(tài)測(cè)試教育部重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051;2.中北大學(xué) 電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051)
近年來(lái)伴隨著航空航天領(lǐng)域的不斷發(fā)展,獲取到的空間信息的種類也越來(lái)越多,數(shù)據(jù)量急劇增加,對(duì)數(shù)據(jù)存儲(chǔ)裝置存儲(chǔ)速度和可靠性帶來(lái)了更大的挑戰(zhàn)。NAND Flash 具有體積小、容量大、成本低、可多次擦除等優(yōu)點(diǎn),在數(shù)據(jù)存儲(chǔ)領(lǐng)域得到廣泛應(yīng)用。近年來(lái),大多數(shù)存儲(chǔ)裝置采用多片F(xiàn)lash 組成陣列,并采用流水線的存儲(chǔ)機(jī)制來(lái)實(shí)現(xiàn)高速大容量的數(shù)據(jù)存儲(chǔ)[1]。其中鎂光半導(dǎo)體公司Luca Nubile 等人提出了一種針對(duì)Flash 存儲(chǔ)陣列的多線程控制算法,該算法對(duì)系統(tǒng)的邏輯開(kāi)銷、存儲(chǔ)速度和容量等性能就行了優(yōu)化[2];俄羅斯的Puryga 等人研發(fā)的湯姆遜散射診斷數(shù)據(jù)采集系統(tǒng)同樣包含多片存儲(chǔ)單元,它允許以5 GHz 采樣率采集八通道數(shù)據(jù)[3];但由于NAND Flash 生產(chǎn)過(guò)程中工藝等問(wèn)題,每片F(xiàn)lash 都不可避免存在無(wú)效塊,而且無(wú)效塊數(shù)量不定,地址隨機(jī)[4]。這對(duì)Flash 陣列數(shù)據(jù)存儲(chǔ)的可靠性帶來(lái)了一定的影響。若采用單片F(xiàn)lash 壞塊的管理方法,在往Flash 中存儲(chǔ)數(shù)據(jù)之前對(duì)每一塊進(jìn)行掃描,并生成壞塊信息表,這種方法應(yīng)用在Flash 陣列的壞塊檢測(cè)中時(shí),會(huì)極大地限制存儲(chǔ)速度,占用過(guò)多的內(nèi)部資源。
本文對(duì)于Flash 固有壞塊提出了基于整合塊的壞塊管理方法和基于EEPROM 查找表的壞塊管理方法。對(duì)于操作過(guò)程中出現(xiàn)的突發(fā)壞塊,提出一種基于頁(yè)跳過(guò)和頁(yè)替換的管理方法。
Flash 在存儲(chǔ)過(guò)程中要完成頁(yè)編程,這對(duì)持續(xù)高速存儲(chǔ)有很大的影響。通道內(nèi)流水線循環(huán)操作,避開(kāi)了Flash 頁(yè)編程對(duì)存儲(chǔ)速度的約束,可以實(shí)現(xiàn)持續(xù)存儲(chǔ)的目的。Flash 陣列通常為m×n架構(gòu)。即m個(gè)通道并行存儲(chǔ),每個(gè)通道內(nèi)有n片F(xiàn)lash 進(jìn)行流水線循環(huán)操作,理論上存儲(chǔ)速度是單片F(xiàn)lash 的m倍。如圖1 所示,本文基于該理念設(shè)計(jì)一種滿足設(shè)計(jì)要求的6×2 Flash 陣列架構(gòu)。
圖1 Flash 陣列
本文選用的Flash 是鎂光MT29F256G08A,存儲(chǔ)容量為32 GB。每個(gè)通道內(nèi)有2 片F(xiàn)lash,每片F(xiàn)lash 內(nèi)部有4個(gè)Target,因此每個(gè)通道內(nèi)有8 個(gè)Target,也可以認(rèn)為每個(gè)通道內(nèi)有8 個(gè)Flash。NAND Flash 芯片與FPGA 主控芯片之間通過(guò)高性能的異步I/O 口進(jìn)行通信,通道內(nèi)的8個(gè)Flash 共用命令鎖存使能、地址鎖存使能、寫(xiě)使能、讀使能4 個(gè)控制使能端口,并通過(guò)CE、R/B 端口對(duì)通道內(nèi)的8 個(gè)Flash 進(jìn)行區(qū)分。其中WP 為寫(xiě)保護(hù)端口,當(dāng)端口輸入有效時(shí),存儲(chǔ)的內(nèi)容被寫(xiě)保護(hù),只能進(jìn)行讀取。當(dāng)端口輸入為無(wú)效或者懸空時(shí),NAND Flash 允許進(jìn)行正常的讀/寫(xiě)操作,單通道Flash 控制接口如圖2 所示。
圖2 單通道Flash 控制接口示意圖
Flash 存儲(chǔ)數(shù)據(jù)的單元為胞元,每個(gè)胞元內(nèi)存儲(chǔ)1 bit數(shù)據(jù)[5]。該Flash 芯片內(nèi)部有4 個(gè)Target,每個(gè)Target 內(nèi)部有2 個(gè)LUN,每個(gè)LUN 由2 個(gè)Plane 組成,一個(gè)Plane 又由2 048 個(gè)塊組成,每個(gè)塊由128 頁(yè)組成,每個(gè)頁(yè)的存儲(chǔ)容量為8 KB+448 B。由于芯片工藝等問(wèn)題,芯片在生產(chǎn)出來(lái)時(shí),就有塊中存在不能進(jìn)行擦除和修復(fù)的位錯(cuò)誤,這些塊就被稱為固有壞塊。這些固有壞塊的信息在芯片出廠時(shí)廠商就會(huì)標(biāo)注出來(lái),在對(duì)芯片進(jìn)行使用之前,對(duì)所有的存儲(chǔ)塊進(jìn)行遍歷掃描并建立壞塊表。但是對(duì)Flash 陣列仍采用單片F(xiàn)lash 遍歷掃描的方式,這勢(shì)必對(duì)存儲(chǔ)速度帶來(lái)影響,因此需要提出新的壞塊管理方法。
通道內(nèi)8 個(gè)Flash 中每一個(gè)都由8 192 個(gè)塊組成,塊地址從0000h 到1FFFh。基于每個(gè)Flash 中相同位置塊的塊地址相同,因此可以把相同位置的塊看做一個(gè)整合塊,整合塊劃分方式如圖3 所示。只有當(dāng)整合塊內(nèi)的8個(gè)子塊全部為好塊時(shí),該整合塊才被視為有效整合塊。只要整合塊內(nèi)有一個(gè)子塊為壞塊,那么這個(gè)整合塊將被視為無(wú)效整合塊。
圖3 整合塊劃分方式
在FPGA 內(nèi)部開(kāi)辟RAM 空間用來(lái)存放無(wú)效整合塊的地址,通過(guò)查閱Flash 的芯片手冊(cè),每個(gè)Flash 內(nèi)部最多有80 個(gè)無(wú)效塊,無(wú)效整合塊最大數(shù)量就是當(dāng)每個(gè)Flash 內(nèi)80 個(gè)無(wú)效塊地址都不一樣,這時(shí)最大無(wú)效整合塊數(shù)量就是640 個(gè)。介于每個(gè)Flash 內(nèi)部的塊地址是從0000h 到1FFFh,為了節(jié)省FPGA 內(nèi)部資源,選取地址位寬為13。因此需要在FPGA 內(nèi)開(kāi)辟的RAM 空間為最大無(wú)效塊數(shù)量×地址位寬×通道數(shù)量=(640×13×6)/8=6.1 KB。
將無(wú)效整合塊的塊地址存儲(chǔ)在RAM 空間內(nèi),每一次讀寫(xiě)操作前都要將操作的整合塊地址與RAM 空間內(nèi)無(wú)效整合塊地址進(jìn)行預(yù)匹配,預(yù)匹配流程如圖4 所示。如果要操作地址小于RAM 空間內(nèi)第一個(gè)無(wú)效整合塊的地址,那么就可以對(duì)該整合塊內(nèi)的所有子塊進(jìn)行讀寫(xiě)操作,操作整合塊地址加1。當(dāng)要操作的整合塊地址和RAM 空間內(nèi)存儲(chǔ)的無(wú)效整合塊地址相同時(shí),表示該操作整合塊為無(wú)效整合塊,不能對(duì)其進(jìn)行讀寫(xiě)操作,操作整合塊地址加1,并從RAM 空間中讀取下一個(gè)無(wú)效整合塊的地址。重復(fù)上述的操作,直至對(duì)所有的整合塊操作完成。
圖4 無(wú)效整合塊預(yù)匹配流程圖
該方法是建立在對(duì)單個(gè)通道的無(wú)效塊管理基礎(chǔ)上,便于對(duì)Flash 陣列的并行擴(kuò)展。一個(gè)整合塊上的8 個(gè)子塊進(jìn)行流水線循環(huán)操作,通過(guò)通道內(nèi)的片選端口對(duì)8 個(gè)子塊進(jìn)行區(qū)分,在程序上實(shí)現(xiàn)簡(jiǎn)單。但是該方法不足之處就在于當(dāng)一個(gè)無(wú)效整合塊中只有一個(gè)壞塊時(shí),其余7個(gè)好塊也不能進(jìn)行正常的讀寫(xiě)操作,降低了存儲(chǔ)空間的利用率。
上述方法對(duì)Flash 內(nèi)部存儲(chǔ)空間的利用率不高,為了減少空間的浪費(fèi),本文提出在每一通道后加一片EEPROM 芯片。在上述整合塊的基礎(chǔ)上,以整合塊的地址作為EEPROM 查找表的地址,存儲(chǔ)每個(gè)子塊的具體信息。對(duì)通道內(nèi)的每個(gè)子塊進(jìn)行遍歷掃描,并將相應(yīng)塊的狀態(tài)信息寫(xiě)入對(duì)應(yīng)EEPROM 表中,每一子塊用8 位二進(jìn)制對(duì)其進(jìn)行編碼,F(xiàn)Fh 表示該塊為好塊,80h 表示該塊為壞塊。如圖5 所示,F(xiàn)lash 邏輯塊的地址一一對(duì)應(yīng)在EEPROM 地址中,這樣就可以確保EEPROM 中存放的信息就是相應(yīng)地址塊的信息。
圖5 子塊狀態(tài)映射表
無(wú)效塊檢測(cè)以單個(gè)通道為單位,檢測(cè)流程如圖6 所示。在EEPROM 內(nèi)開(kāi)辟一個(gè)容量大小為(8K×8×8)/8=64 KB 的空間。在第一次編程時(shí),通過(guò)對(duì)每一子塊第一頁(yè)和第二頁(yè)的最后一個(gè)字節(jié)進(jìn)行讀取,若讀取到的數(shù)據(jù)為00h,則在該塊對(duì)應(yīng)的EEPROM 表中寫(xiě)入80h,否則就在EEPROM 對(duì)應(yīng)表中寫(xiě)入FFh,子塊地址加1。重復(fù)上述操作,將整合塊內(nèi)所有的子塊檢測(cè)完畢后,整合塊地址加1,進(jìn)行下一個(gè)整合塊的檢測(cè),直至最后一個(gè)整合塊。在EEPROM 表創(chuàng)建完成之后,需要設(shè)計(jì)讀寫(xiě)操作與壞塊地址的預(yù)匹配機(jī)制。對(duì)于數(shù)據(jù)寫(xiě)入來(lái)說(shuō),首先從EEPROM 表中讀取整合塊地址對(duì)應(yīng)的8 個(gè)子塊狀態(tài)信息,如果為80h 則跳過(guò)該塊,將數(shù)據(jù)寫(xiě)入下一個(gè)好塊。通過(guò)這種方法可以實(shí)現(xiàn)對(duì)Flash 存儲(chǔ)空間的最大化利用,基于EEPROM 掉電非易失性,在第一次編程操作時(shí),就將所有塊的狀態(tài)信息存儲(chǔ)在EEPROM 表中,避免了每次上電后對(duì)整合塊中子塊的遍歷掃描。但是由于每一個(gè)Flash 內(nèi)部的壞塊數(shù)量和位置不同,實(shí)現(xiàn)一個(gè)整合塊內(nèi)8 個(gè)子塊流水線寫(xiě)入操作就變得復(fù)雜,且由于EEPROM 的操作速度不如FPGA 內(nèi)部RAM 資源操作速度快,對(duì)存儲(chǔ)速度有一定的影響。
圖6 檢測(cè)流程
Flash 的擦除次數(shù)也是有限的,NAND Flash 在編程和操作過(guò)程中也會(huì)出現(xiàn)一些壞塊,這種壞塊被稱為突發(fā)壞塊。對(duì)于突發(fā)壞塊,傳統(tǒng)方法是將已經(jīng)寫(xiě)入壞塊的數(shù)據(jù)重新讀出來(lái)存儲(chǔ)在緩存區(qū),然后再寫(xiě)入下一個(gè)好塊中。然而當(dāng)遇到突發(fā)壞塊時(shí),只有最后一頁(yè)數(shù)據(jù)寫(xiě)入失敗,之前頁(yè)寫(xiě)入的數(shù)據(jù)也會(huì)被舍棄掉。這種方法會(huì)降低數(shù)據(jù)的寫(xiě)入速度,且對(duì)Flash 存儲(chǔ)資源造成浪費(fèi),傳統(tǒng)方法流程如圖7 所示。
本文提出在EEPROM 表基礎(chǔ)上設(shè)計(jì)基于頁(yè)跳過(guò)和頁(yè)替換的管理方法,在擦除過(guò)程中出現(xiàn)壞塊時(shí),F(xiàn)PGA 就將該塊對(duì)應(yīng)EEPROM 位置寫(xiě)入80h。在寫(xiě)入數(shù)據(jù)過(guò)程中出現(xiàn)壞塊,就將壞掉頁(yè)的頁(yè)地址(00h~7Fh)寫(xiě)入該頁(yè)所屬塊對(duì)應(yīng)EEPROM 位置,并將壞掉頁(yè)的數(shù)據(jù)重新寫(xiě)入下一好塊中,保留了已經(jīng)成功寫(xiě)入的數(shù)據(jù)。基于頁(yè)跳過(guò)和頁(yè)替換管理方法寫(xiě)入數(shù)據(jù)流程如圖8 所示。
圖8 寫(xiě)入數(shù)據(jù)流程
在讀取數(shù)據(jù)時(shí),F(xiàn)PGA 首先讀取EEPROM 表中對(duì)應(yīng)塊的狀態(tài)信息。如果為FFh,則表示該塊已成功寫(xiě)入數(shù)據(jù),可以將數(shù)據(jù)讀出;如果為80h,則表示該塊為全部壞塊,不能對(duì)該塊進(jìn)行讀取操作;如果為頁(yè)地址(00h~7Fh),則讀取該頁(yè)地址之前的所有數(shù)據(jù)。讀取數(shù)據(jù)流程如圖9 所示。
圖9 讀取數(shù)據(jù)流程
基于整合塊的壞塊管理方法對(duì)Flash 存儲(chǔ)空間的利用率取決于單片F(xiàn)lash 內(nèi)部最大無(wú)效塊數(shù)量和通道內(nèi)Flash 的數(shù)量。每個(gè)Flash 內(nèi)部有8 192 個(gè)塊,每個(gè)Flash最大無(wú)效塊數(shù)量為80。整合塊內(nèi)由8 個(gè)Flash 構(gòu)成,則通道內(nèi)最大無(wú)效整合塊數(shù)量為640 塊。浪費(fèi)的存儲(chǔ)空間為640 MB×7=4.375 GB,本設(shè)計(jì)單通的存儲(chǔ)容量為4 GB×8=32 GB,最大損失容量比例為13.67%。
基于EEPROM 表的壞塊管理方法由于是對(duì)通道內(nèi)Flash 中每一塊狀態(tài)信息的存儲(chǔ),因此對(duì)Flash 存儲(chǔ)空間的利用率最大可以達(dá)到100%。
本次測(cè)試選用的主控芯片是由Xilinx 公司生產(chǎn)的XC7K325T-2FFG900I,基于NAND Flash 陣列存儲(chǔ),通過(guò)上位機(jī)不斷地寫(xiě)入32 GB的遞增數(shù)??刂祁l率為125 MHz,為了驗(yàn)證突發(fā)壞塊的管理機(jī)制,通過(guò)修改EEPROM 表中存儲(chǔ)塊的狀態(tài)信息,人為在塊中加入不同位置的壞掉頁(yè)。通過(guò)比較傳統(tǒng)方法和改進(jìn)方法寫(xiě)入一塊數(shù)據(jù)的時(shí)間和平均寫(xiě)入速度,來(lái)驗(yàn)證改進(jìn)方法是否可行,經(jīng)過(guò)多次測(cè)試后的結(jié)果如表1、表2 所示。
表1 寫(xiě)入1 塊數(shù)據(jù)所用時(shí)間
表2 平均寫(xiě)入速度測(cè)試結(jié)果
從表1、表2 的數(shù)據(jù)對(duì)比中可以看出,當(dāng)塊中無(wú)壞掉頁(yè)時(shí),改進(jìn)方法與傳統(tǒng)方法寫(xiě)入速度沒(méi)有提升。當(dāng)壞掉頁(yè)的位置越靠后時(shí),改進(jìn)方法與傳統(tǒng)方法相比提升就越大。原因是對(duì)于傳統(tǒng)方法來(lái)說(shuō),當(dāng)出現(xiàn)壞掉頁(yè)時(shí),就要將該頁(yè)之前所有頁(yè)重新寫(xiě)入下一塊,壞掉頁(yè)位置越靠后,需要重新寫(xiě)入的數(shù)據(jù)就越多。而對(duì)于改進(jìn)方法只需要將壞掉頁(yè)的數(shù)據(jù)重新寫(xiě)入下一塊,保留了之前成功寫(xiě)入的數(shù)據(jù),因此對(duì)寫(xiě)入速度無(wú)明顯影響。
通過(guò)上位機(jī)對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行回讀,回讀的數(shù)據(jù)經(jīng)過(guò)校驗(yàn)后無(wú)誤碼、無(wú)丟幀,數(shù)據(jù)校驗(yàn)結(jié)果如圖10 所示,經(jīng)過(guò)多次測(cè)試表明數(shù)據(jù)的可靠性得到了保證。
圖10 回讀數(shù)據(jù)校驗(yàn)結(jié)果
本文提出兩種固有壞塊檢測(cè)和識(shí)別的方法,在實(shí)際的工程應(yīng)用中有一定的參考價(jià)值。兩種方法在存儲(chǔ)速度和存儲(chǔ)空間利用方面各有考量?;谡蠅K的壞塊管理方法適合于對(duì)存儲(chǔ)速度要求較高,F(xiàn)PGA 內(nèi)部資源豐富的場(chǎng)合。而對(duì)于基于EEPROM 表的壞塊管理方法適用于對(duì)存儲(chǔ)速度要求不高、內(nèi)部資源緊缺的場(chǎng)合。針對(duì)突發(fā)壞塊提出的基于頁(yè)跳過(guò)和頁(yè)替換的管理方法,保證了在出現(xiàn)壞頁(yè)時(shí)寫(xiě)入速度不會(huì)大幅度下降,且成功應(yīng)用在具體實(shí)踐中。