閆夢婷,安軍社,江源源
(1.中國科學院空間科學與應(yīng)用研究中心 北京100190;2.中國科學院大學 北京100190)
實現(xiàn)流水存儲及壞塊處理的Flash控制器設(shè)計
閆夢婷1,2,安軍社1,江源源1
(1.中國科學院空間科學與應(yīng)用研究中心 北京100190;2.中國科學院大學 北京100190)
實現(xiàn)了一種適用于航天設(shè)備的大容量存儲方案。給出一個基于FPGA實現(xiàn)的Flash控制器設(shè)計,該控制器可以完成航天應(yīng)用的大容量數(shù)據(jù)存取工作。其中存儲操作中設(shè)計了流水編程機制,實現(xiàn)了疊裝芯片內(nèi)部的流水編程操作,大幅度提高系統(tǒng)的整體存儲速率,實現(xiàn)了高速存儲的目的。同時,提出了一種完備的壞塊處理機制,可以屏蔽對已知壞塊的使用,并且在新的壞塊產(chǎn)生時確保存取操作正常執(zhí)行,使得大容量存儲系統(tǒng)的存儲數(shù)據(jù)無誤差、無丟失,讀出正常有序的數(shù)據(jù)。經(jīng)板級驗證,該方案的整體可以實現(xiàn)的最高存儲速率可達100 Mbps,壞塊處理機制可保證數(shù)據(jù)的正確性、完整性和連續(xù)性。
大容量;固態(tài)存儲;NAND Flash控制器;壞塊處理;流水存儲;FPGA應(yīng)用
隨著航天領(lǐng)域?qū)虘B(tài)存儲器(Solid State Recorder)研制工作的不斷發(fā)展,NAND Flash以其高密度、大容量、高數(shù)據(jù)存儲速率以及更多的擦除次數(shù)等特點得到了大量的使用,逐步開始成為存儲介質(zhì)的主流選擇。但是,NAND Flash由于其制造工藝和航天器的特殊使用環(huán)境等因素,會在存在壞塊,并在使用過程中產(chǎn)生新的壞塊,對壞塊的處理是NAND Flash實際應(yīng)用中必須要解決的問題。大量的Flash使用實例中已經(jīng)出現(xiàn)了常見的壞塊處理方法,主要是在使用前建立壞塊信息表,根據(jù)壞塊信息表來檢索出可以使用的有效塊,避免對壞塊進行誤操作。根據(jù)壞塊信息表存儲的方式可以分為兩類:1)建立存儲區(qū),將有效塊的地址存儲在存儲區(qū)內(nèi),每次將有效塊地址從存儲器中取出后進行使用。2)建立與Flash塊地址空間大小一致的狀態(tài)寄存區(qū),在狀態(tài)寄存區(qū)里對應(yīng)的位標記出對應(yīng)的Flash塊地址是否為有效塊,提取塊地址時,對狀態(tài)寄存區(qū)里的標記進行判斷。這兩種方法的存儲區(qū)域可以使用實現(xiàn)Flash控制器的FPGA建立片內(nèi)RAM來實現(xiàn),也可以使用Flash的某一塊的指定的頁空間來作為存儲區(qū)域。后者可以節(jié)約FPGA使用資源,但讀取以及修改壞塊信息的時間周期過長,不易于高速系統(tǒng)選用[1]。另外,還有基于FAT文件系統(tǒng)處理壞塊方法,該方法在文件系統(tǒng)層解決壞塊問題,對軟件、操作等存在一定難度,以硬件系統(tǒng)作為主要實現(xiàn)平臺的系統(tǒng)一般不選用該方法[2]。
但是,上述常用的壞塊處理方法只是以塊為單位進行壞塊處理,檢測已存在的壞塊情況,并避免已確定的使用壞塊,沒有提出當壞塊產(chǎn)生時保證數(shù)據(jù)完整的處理機制。因此,文中介紹了該Flash控制器實現(xiàn)的一種壞塊處理機制,在實現(xiàn)了高速流水存儲方式的基礎(chǔ)上,能夠保證數(shù)據(jù)完整性,提高了整個固態(tài)存儲器的性能,滿足實際應(yīng)用的高速存儲、無數(shù)據(jù)丟失的要求。
本設(shè)計中的NAND Flash控制器內(nèi)部分為初始化、擦除、編程、讀取、標記以及主控制器6個模塊[3]。如圖1所示,系統(tǒng)上電后自動進入初始化模塊,F(xiàn)lash廠家將初始壞塊信息存放在每一塊首頁的第2 048和2 049字節(jié),初始化模塊的任務(wù)是讀取所有的Flash塊的壞塊標記字節(jié)以及Spare區(qū)域的用戶使用信息,生成完備的塊信息表,后續(xù)存儲系統(tǒng)的全部工作都將根據(jù)塊信息表提供的信息來執(zhí)行。本設(shè)計為達到存儲系統(tǒng)對高速率的要求,必須減少讀取塊信息表所需的時鐘周期,因此選擇在FPGA建立RAM區(qū)用來存放壞塊信息表。

圖1 控制器主要工作流程圖
編程和讀取操作的基本單位為頁,每次編程讀取操作可以一次性存儲、讀取一頁容量的數(shù)據(jù)[3]。編程操作模塊中,為了提高存儲系統(tǒng)的整體編程速率,利用了流水操作的方法對編程操作進行了改進,并且嵌入了完備的壞塊處理機制用于處理編程操作中產(chǎn)生壞塊的數(shù)據(jù)丟失問題,編程模塊將在下文詳述。讀取模塊會在接收到讀取指令后,按照順序從Flash中將數(shù)據(jù)讀出發(fā)送給接收器件。Flash存儲單元在執(zhí)行數(shù)據(jù)寫入之前需要進行擦除操作,擦除模塊完成以塊為單位的擦除操作,擦除操作執(zhí)行時也會產(chǎn)生新的壞塊,此時需要啟用標記模塊對壞塊進行標記。每次執(zhí)行擦除操作實際上是將把整塊Flash的全部字節(jié)單元恢復為“FF”,即把所有的位全部恢復為“1”。編程操作則是將字節(jié)單元中相應(yīng)的位從“1”置為“0”,以此將每個字節(jié)編程為相應(yīng)的十六進制數(shù)。而壞塊的常見情況是無法將字節(jié)單元里的‘1'值置為‘0',或者無法將“0”的位恢復為“1”,因此對壞塊進行編程操作,將導致存入數(shù)據(jù)與實際編程成功的數(shù)據(jù)不一致,讀出錯誤數(shù)據(jù),故而對Flash的使用要避免使用壞塊。
初始化模塊的作用是檢索Flash所有塊的第0頁的第2 048、2 049單元,判斷該塊是否為壞塊,以及讀取本設(shè)計使用的Spare區(qū)信息存儲單元里的使用信息,并在FPGA中開辟空間作為塊信息表的存儲區(qū)。本設(shè)計為了保證Flash控制器的正常運作,將為每一個塊建立5個字節(jié)的塊信息,存儲完備的塊信息表以供后續(xù)操作使用。其中,物理塊地址表示該塊在Flash單片芯片中的實際物理地址,需要用物理地址對Flash的操作進行尋址。塊類型是將在使用過程中可能出現(xiàn)的八種塊進行了分類標記,8種塊類型圖2中所示,分別是:未寫塊、正常寫滿塊、正常寫未寫滿塊、頁寫失敗塊、替代寫滿塊、替代未寫滿塊、替代頁寫失敗塊以及初始壞塊。邏輯塊地址,表示該塊在該次數(shù)據(jù)存儲操作中的實際使用的塊計數(shù)。數(shù)據(jù)的讀取操作將根據(jù)邏輯塊地址來進行,以此保證數(shù)據(jù)的連續(xù)性。尾頁地址是該塊最后一個存儲數(shù)據(jù)的頁的地址,數(shù)據(jù)讀取時將根據(jù)尾頁地址進行讀取,對該塊的尾頁地址之后的頁將不進行讀取操作。

圖2 塊信息及塊分類示意圖
初始化的重要性在于,檢索Spare區(qū)域的使用信息建立起來的塊信息表記錄了Flash芯片所有的信息,對Flash的全部使用都將根據(jù)塊信息表來進行。編程操作所需的地址將根據(jù)塊信息表判斷一個物理地址所指向的塊是否為有效塊,是否可以執(zhí)行正常的編程操作;讀取操作根據(jù)塊信息表的邏輯塊地址和尾頁地址來檢索出需要進行讀取操作的塊和頁,并且以此來調(diào)整數(shù)據(jù)讀取的順序,保證數(shù)據(jù)的連續(xù)性。擦除操作也將根據(jù)塊信息表來決定是否要對該物理地址塊進行擦除操作,F(xiàn)lash需要避免對其壞塊進行擦除操作,一旦對壞塊執(zhí)行擦除操作,會將壞塊的第0頁的2 048和2 049字節(jié)的壞塊標記信息恢復為 “FF”,將壞塊誤標記為可操作的有效塊,在后續(xù)的使用中造成錯誤操作等現(xiàn)象。一旦在使用過程中產(chǎn)生了新的壞塊,需要立即修改塊信息表中的對應(yīng)塊信息,以保證后續(xù)操作的正確性。
3.1流水編程機制
根據(jù)Flash的工作要求,當需要對某一片F(xiàn)lash某一頁進行編程操作時,需要向Flash芯片的操作如下:1)發(fā)送起始指令和地址,2)發(fā)送2 048字節(jié)數(shù)據(jù)和Spare區(qū)的若干字節(jié)使用信息,3)發(fā)送結(jié)束指令。實際上,每一片F(xiàn)lash都有一個數(shù)據(jù)緩存區(qū)可以用于緩存一頁最大容量的數(shù)據(jù),當接收到結(jié)束指令后,F(xiàn)lash會將緩存區(qū)的數(shù)據(jù)按順序固化到當前物理地址指向的頁中。根據(jù)Flash廠家提供的數(shù)據(jù),可以得出以下數(shù)據(jù):1)從緩存區(qū)固化到頁所需時間區(qū)間為[300~700]μs。2)如果系統(tǒng)時鐘選用16 MHz的時鐘,完成一頁數(shù)據(jù)編程操作的所需時間區(qū)間為[430~800]μs。此外還需要讀取反饋狀態(tài)的時間,無法保證在實際使用中編程操作的整體速率達到100 Mbps的要求,因此本設(shè)計提出流水編程機制。
本設(shè)計利用8片F(xiàn)lash單片疊裝的特點,采取流水方式進行編程操作,每次對8個單片F(xiàn)lash的同一邏輯塊地址的同一頁進行編程操作,并將此稱為一個流水級。CE0~CE7為8個單片F(xiàn)lash對應(yīng)的片選使能信號,CE0為低電平時,IO口以及其他共用的信號對應(yīng)操作第0片F(xiàn)lash,同樣的,其他CE信號使能時各個共用信號口對應(yīng)相應(yīng)的單片F(xiàn)lash。為了敘述簡便,我們將8片F(xiàn)lash單片分別定義為CE0~CE7。流水編程的具體實現(xiàn)步驟為:1)依次對CE0到CE7加載數(shù)據(jù),CE0加載完成后,立即對CE1進行加載,直到CE7加載完成,使各個單片F(xiàn)lash的固化時間得到復用。2)一個流水級的加載工作全部完成之后,進行檢查工作。依次檢查CE0到CE7的RB信號,當RB信號為高時,意味著該單片F(xiàn)lash已經(jīng)完成之前操作處于空閑狀態(tài),此時才可以對Flash發(fā)送70 h指令去讀取編程操作狀態(tài)。如果RB信號為低,則表示該片F(xiàn)lash的固化工作仍未完成,則等待RB變低后再進行狀態(tài)讀取。
具體流程如圖3所示。實際上,當CE7開始自主固化編程時,距離CE0開始固化已經(jīng)過去的時間為910 μs(130 μs*7),即使出現(xiàn)最長固化編程時間的情況,也完全可以確保CE0已經(jīng)完成了固化工作。若Flash的固化操作都以典型值固化成功,則計算出當CE7開始固化數(shù)據(jù)時,RB0到RB3都已經(jīng)變成高電平表示CE0到CE3都已經(jīng)完成了固化工作,檢查前4片F(xiàn)lash編程操作是否成功的操作可以依次立即執(zhí)行,而CE4 到CE7則仍需要等待一段時間,直到相應(yīng)的RB信號變?yōu)楦唠娖讲拍軋?zhí)行狀態(tài)判斷的操作。如圖3所示,固化時間得到了復用,利用流水編程機制,可以大幅提高整體存儲速率。如果8個Flash單片的頁編程操作都成功,則稱這一級流水編程成功;若有某一個Flash單片的頁編程操作失敗則稱該流水級編程失敗,開始調(diào)用壞塊替代機制。

3.2壞塊替代機制
Flash在使用過程中有可能會產(chǎn)生新的壞塊,編程操作和擦除操作都會導致壞塊產(chǎn)生,其中擦除操作產(chǎn)生的壞塊只需要對該壞塊進行標記,并及時更新塊信息表即可,因此本設(shè)計的控制器將擦除產(chǎn)生的壞塊處理操作設(shè)計在擦除模塊中。但是編程操作產(chǎn)生的壞塊涉及到數(shù)據(jù)的完整性,在一級流水編程操作完成后,對某一頁發(fā)送狀態(tài)檢測指令檢測到編程失敗,表示當前頁的數(shù)據(jù)沒有正常寫入Flash,我們稱該頁為編程失敗頁。當出現(xiàn)編程失敗頁的時候,無法確保該頁的數(shù)據(jù)編程完成,不能作為有效數(shù)據(jù)頁供后續(xù)的讀取操作直接訪問,即加載到該頁的2 048字節(jié)的數(shù)據(jù)因頁編程失敗而丟失。編程失敗頁所在的塊就是新產(chǎn)生的壞塊,該頁物理地址之后的頁也不能再執(zhí)行編程操作。為了保證已寫入的數(shù)據(jù)正常讀出,編程失敗頁的數(shù)據(jù)不丟失,同時實現(xiàn)讀取數(shù)據(jù)的連續(xù)性和完整性,需要做更多復雜的處理,針對Flash工作特點和本設(shè)計的流水編程機制,下面介紹本設(shè)計采用的壞塊處理機制。
壞塊處理機制涉及到數(shù)據(jù)備份、Flash編程操作地址以及數(shù)據(jù)讀取順序3個方面,下面將對這3方面進行詳述。為了保證在任何一次壞塊產(chǎn)生時都不丟失數(shù)據(jù),則需要進行數(shù)據(jù)備份,即在FPGA實現(xiàn)的控制器內(nèi)部例化出一級流水數(shù)據(jù)量的存儲空間用于數(shù)據(jù)備份,這8個2 048字節(jié)的SRAM地址空間由CE0~CE7信號組合進行片選。當執(zhí)行某一級流水級的數(shù)據(jù)寫入工作時,同時將2 048字節(jié)的數(shù)據(jù)寫入到對應(yīng)的數(shù)據(jù)備份存儲空間中,一旦檢測到頁編程失敗,立即在替代塊中的同一頁地址作為替代頁的物理地址,將發(fā)生頁編程失敗的第n片F(xiàn)lash對應(yīng)的數(shù)據(jù)備份空間里的數(shù)據(jù)寫入到替代塊的替代頁中。

圖4 壞塊產(chǎn)生存儲示意圖
8片疊裝式的芯片在編程操作時執(zhí)行并行拓展式操作。一旦編程操作中產(chǎn)生了新的壞塊,要從緩存的地址中提取新的可以使用的替代塊,對替代塊標記的仍然是當前使用的邏輯塊地址。讀取數(shù)據(jù)時,根據(jù)初始化信息表中的塊類型,當開始讀取的一個流水級的邏輯塊含有壞塊時,正常讀取壞塊中的已寫成功的頁中的數(shù)據(jù),當讀取完已寫尾頁地址指向的頁,下一輪將開始讀取緊接著壞塊地址的替代塊的替代頁中的數(shù)據(jù),未發(fā)生壞塊的其他塊按正常讀取進行操作。如圖4所示,為方便說明,將一頁的2 048字節(jié)數(shù)據(jù)作為一個包來表示,物理塊地址n之前都未發(fā)生頁編程失敗,直到物理塊地址n的CE3單片F(xiàn)lash的第n頁發(fā)生了頁編程失敗,于是將第n+3包數(shù)據(jù)再次編程到替代塊中,可見替代塊的物理塊地址為n+1(假設(shè)該塊為有效塊),邏輯塊地址仍為n,并且后續(xù)的編程操作將用替代塊代替壞塊繼續(xù)進行,這樣設(shè)計可以保證數(shù)據(jù)的連續(xù)性和完整性。
為了便于觀察,圖5給出了一個流水級編程的仿真波形,并且模擬了檢測出壞塊后的替代編程的波形。如圖5所示,CE從“00000001”開始選中第一片F(xiàn)lash,對某個地址進行頁編程工作,完成之后CE變?yōu)椤?0000010”,開始對第二片F(xiàn)lash進行頁編程,直到最后一片F(xiàn)lash頁編程完成,開始發(fā)送檢測指令。測試平臺將第二片設(shè)定為編程失敗頁,圖5中可以看出,檢測到第二片的頁編程失敗后,error_w信號變?yōu)楦撸ο乱粋€可用塊該頁地址進行替代編程,可以看出替代編程的數(shù)據(jù)仍是之前頁編程的數(shù)據(jù)。

圖5 壞塊處理機制仿真波形
通過包含CPU和數(shù)據(jù)源等配合的板級測試,在頻率為16 MHz的系統(tǒng)時鐘下,驗證本設(shè)計的數(shù)據(jù)存儲速率最高可達100 Mbps,數(shù)據(jù)讀取速率最大達到13 Mbps,產(chǎn)生壞塊時能夠執(zhí)行替代機制保證數(shù)據(jù)的完整性和連續(xù)性,已成功在某航天型號任務(wù)中的作為大容量數(shù)據(jù)存儲器使用。
文中在常用的壞塊處理機制的基礎(chǔ)上,提出了恢復數(shù)據(jù)精確到頁的壞塊處理機制,并且利用流水操作機制,大幅提高了Flash的寫入速率,利用邏輯塊計數(shù)索引讀取操作的頁,以此保證了數(shù)據(jù)的連續(xù)性。流水編程機制和壞塊替代機制的提出和使用,使得本設(shè)計的Flash控制器成功滿足某航天型號任務(wù)的實際使用需求,并且對Flash的實際使用中性能的改善,提供了參考機制。
[1]張勝勇,高世杰.基于FPGA的NAND Flash壞塊處理方法[J].計算機工程,2010,36(6):239-243.
[2]王立峰,胡善清.基于閃存的高速海量存儲模塊設(shè)計[J].計算機工程.2011,37(7):255-257.
[3]NAND Flash Applications Design Guide.[EB/OL].(2004-05-19).[2013-10-21].http://pdf1.alldatasheet.com/datasheet-pdf/ view/85039/SAMSUNG/K9W4G08U1M.html.
[4]Takeuchi K.Novel co-design of NAND Flash memory and high-speed solid-state drives[J].VLSI circuit,2009,44(4): 1224-1227.
[5]Nguyen Q,Yuknis W,Pursley S,et al.A high performance command and data handling system for NASA's Lunar Reconnaissance Orbiter[C].//AIAA Space 2008 Conference& Exposition.Washington:AIAA 2008.
[6]Shibata N,Maejima H,Isobe K,et al.70nm 16Gb 16-Level-Cell NAND Flash Memory[J].IEEE Journal of Solid-State Circuits,2008,43(4):929-937.
[7]Takeuchi K.Novel co-design of NAND Flash memory and high-speed solid-state drives[J].VLSI circuit,2009,44(4): 1224-1227.
[8]邢開宇,曹曉曼,方火能.基于FPGA和NAND FLASH的存儲器ECC設(shè)計與實現(xiàn)[J].電子科技,2012,25(10):69-73.
[9]潘立陽,朱鈞 .FLASH存儲器技術(shù)與發(fā)展[J].微電子學. 2002,32(1):1-6.
[10]Virtex-5 FPGA Configuration User Guide[EB/OL].(2012-10-19)[2013-10-21]http://www.xilinx.com/support/ documentation/user_guides/ug191.pdf.
Design of a NAND Flash controller with high-speed pipelining program and invalid block handle method
YAN Meng-ting1,2,AN Jun-she1,JIANG Yuan-yuan1
(1.Center for Space science and Applied Research Chinese Academy of Science,Beijing 100190,China;2.University of Chinese Academy Sciences,Beijing 100190,China)
A design about Solid State Recorder used in aerospace field is presented.A Flash controller based on FPGA is designed.The controller can finish regular recording work in aerospace field.In storage operation,a pipelining-programming method is presented.It is operated inside of the chip to improve the overall system storage speed,and it can achieve a highspeed storage purpose.A complete bad block handling mechanism is presented.It can shield using known bad blocks.And it ensures storage operation is executed and the data is correct and complete when new bad blocks occur.The result show that the maximum storage rate of the program can achieve up to 100 Mbps.The bad block handling mechanism can ensure accuracy,completeness and continuity of data.
large capacity;solid state recorder;NAND flash controller;invalid block handle;pipelining program;FPGA application
TN431
A
1674-6236(2016)16-0050-04
2015-08-21稿件編號:201508117
閆夢婷(1989—),女,廣西桂林人,博士研究生。研究方向:星載高速總線的系統(tǒng)架構(gòu)研究及性能分析,高性能星載存儲系統(tǒng)。