焦新泉,朱振麟
(1.中北大學 儀器科學與動態測試教育部重點實驗室,山西 太原 030051;2.中北大學 電子測試技術國家重點實驗室,山西 太原 030051)
近年來伴隨著航空航天領域的不斷發展,獲取到的空間信息的種類也越來越多,數據量急劇增加,對數據存儲裝置存儲速度和可靠性帶來了更大的挑戰。NAND Flash 具有體積小、容量大、成本低、可多次擦除等優點,在數據存儲領域得到廣泛應用。近年來,大多數存儲裝置采用多片Flash 組成陣列,并采用流水線的存儲機制來實現高速大容量的數據存儲[1]。其中鎂光半導體公司Luca Nubile 等人提出了一種針對Flash 存儲陣列的多線程控制算法,該算法對系統的邏輯開銷、存儲速度和容量等性能就行了優化[2];俄羅斯的Puryga 等人研發的湯姆遜散射診斷數據采集系統同樣包含多片存儲單元,它允許以5 GHz 采樣率采集八通道數據[3];但由于NAND Flash 生產過程中工藝等問題,每片Flash 都不可避免存在無效塊,而且無效塊數量不定,地址隨機[4]。這對Flash 陣列數據存儲的可靠性帶來了一定的影響。若采用單片Flash 壞塊的管理方法,在往Flash 中存儲數據之前對每一塊進行掃描,并生成壞塊信息表,這種方法應用在Flash 陣列的壞塊檢測中時,會極大地限制存儲速度,占用過多的內部資源。
本文對于Flash 固有壞塊提出了基于整合塊的壞塊管理方法和基于EEPROM 查找表的壞塊管理方法。對于操作過程中出現的突發壞塊,提出一種基于頁跳過和頁替換的管理方法。
Flash 在存儲過程中要完成頁編程,這對持續高速存儲有很大的影響。通道內流水線循環操作,避開了Flash 頁編程對存儲速度的約束,可以實現持續存儲的目的。Flash 陣列通常為m×n架構。即m個通道并行存儲,每個通道內有n片Flash 進行流水線循環操作,理論上存儲速度是單片Flash 的m倍。如圖1 所示,本文基于該理念設計一種滿足設計要求的6×2 Flash 陣列架構。

圖1 Flash 陣列
本文選用的Flash 是鎂光MT29F256G08A,存儲容量為32 GB。每個通道內有2 片Flash,每片Flash 內部有4個Target,因此每個通道內有8 個Target,也可以認為每個通道內有8 個Flash。NAND Flash 芯片與FPGA 主控芯片之間通過高性能的異步I/O 口進行通信,通道內的8個Flash 共用命令鎖存使能、地址鎖存使能、寫使能、讀使能4 個控制使能端口,并通過CE、R/B 端口對通道內的8 個Flash 進行區分。其中WP 為寫保護端口,當端口輸入有效時,存儲的內容被寫保護,只能進行讀取。當端口輸入為無效或者懸空時,NAND Flash 允許進行正常的讀/寫操作,單通道Flash 控制接口如圖2 所示。

圖2 單通道Flash 控制接口示意圖
Flash 存儲數據的單元為胞元,每個胞元內存儲1 bit數據[5]。該Flash 芯片內部有4 個Target,每個Target 內部有2 個LUN,每個LUN 由2 個Plane 組成,一個Plane 又由2 048 個塊組成,每個塊由128 頁組成,每個頁的存儲容量為8 KB+448 B。由于芯片工藝等問題,芯片在生產出來時,就有塊中存在不能進行擦除和修復的位錯誤,這些塊就被稱為固有壞塊。這些固有壞塊的信息在芯片出廠時廠商就會標注出來,在對芯片進行使用之前,對所有的存儲塊進行遍歷掃描并建立壞塊表。但是對Flash 陣列仍采用單片Flash 遍歷掃描的方式,這勢必對存儲速度帶來影響,因此需要提出新的壞塊管理方法。
通道內8 個Flash 中每一個都由8 192 個塊組成,塊地址從0000h 到1FFFh。基于每個Flash 中相同位置塊的塊地址相同,因此可以把相同位置的塊看做一個整合塊,整合塊劃分方式如圖3 所示。只有當整合塊內的8個子塊全部為好塊時,該整合塊才被視為有效整合塊。只要整合塊內有一個子塊為壞塊,那么這個整合塊將被視為無效整合塊。

圖3 整合塊劃分方式
在FPGA 內部開辟RAM 空間用來存放無效整合塊的地址,通過查閱Flash 的芯片手冊,每個Flash 內部最多有80 個無效塊,無效整合塊最大數量就是當每個Flash 內80 個無效塊地址都不一樣,這時最大無效整合塊數量就是640 個。介于每個Flash 內部的塊地址是從0000h 到1FFFh,為了節省FPGA 內部資源,選取地址位寬為13。因此需要在FPGA 內開辟的RAM 空間為最大無效塊數量×地址位寬×通道數量=(640×13×6)/8=6.1 KB。
將無效整合塊的塊地址存儲在RAM 空間內,每一次讀寫操作前都要將操作的整合塊地址與RAM 空間內無效整合塊地址進行預匹配,預匹配流程如圖4 所示。如果要操作地址小于RAM 空間內第一個無效整合塊的地址,那么就可以對該整合塊內的所有子塊進行讀寫操作,操作整合塊地址加1。當要操作的整合塊地址和RAM 空間內存儲的無效整合塊地址相同時,表示該操作整合塊為無效整合塊,不能對其進行讀寫操作,操作整合塊地址加1,并從RAM 空間中讀取下一個無效整合塊的地址。重復上述的操作,直至對所有的整合塊操作完成。

圖4 無效整合塊預匹配流程圖
該方法是建立在對單個通道的無效塊管理基礎上,便于對Flash 陣列的并行擴展。一個整合塊上的8 個子塊進行流水線循環操作,通過通道內的片選端口對8 個子塊進行區分,在程序上實現簡單。但是該方法不足之處就在于當一個無效整合塊中只有一個壞塊時,其余7個好塊也不能進行正常的讀寫操作,降低了存儲空間的利用率。
上述方法對Flash 內部存儲空間的利用率不高,為了減少空間的浪費,本文提出在每一通道后加一片EEPROM 芯片。在上述整合塊的基礎上,以整合塊的地址作為EEPROM 查找表的地址,存儲每個子塊的具體信息。對通道內的每個子塊進行遍歷掃描,并將相應塊的狀態信息寫入對應EEPROM 表中,每一子塊用8 位二進制對其進行編碼,FFh 表示該塊為好塊,80h 表示該塊為壞塊。如圖5 所示,Flash 邏輯塊的地址一一對應在EEPROM 地址中,這樣就可以確保EEPROM 中存放的信息就是相應地址塊的信息。

圖5 子塊狀態映射表
無效塊檢測以單個通道為單位,檢測流程如圖6 所示。在EEPROM 內開辟一個容量大小為(8K×8×8)/8=64 KB 的空間。在第一次編程時,通過對每一子塊第一頁和第二頁的最后一個字節進行讀取,若讀取到的數據為00h,則在該塊對應的EEPROM 表中寫入80h,否則就在EEPROM 對應表中寫入FFh,子塊地址加1。重復上述操作,將整合塊內所有的子塊檢測完畢后,整合塊地址加1,進行下一個整合塊的檢測,直至最后一個整合塊。在EEPROM 表創建完成之后,需要設計讀寫操作與壞塊地址的預匹配機制。對于數據寫入來說,首先從EEPROM 表中讀取整合塊地址對應的8 個子塊狀態信息,如果為80h 則跳過該塊,將數據寫入下一個好塊。通過這種方法可以實現對Flash 存儲空間的最大化利用,基于EEPROM 掉電非易失性,在第一次編程操作時,就將所有塊的狀態信息存儲在EEPROM 表中,避免了每次上電后對整合塊中子塊的遍歷掃描。但是由于每一個Flash 內部的壞塊數量和位置不同,實現一個整合塊內8 個子塊流水線寫入操作就變得復雜,且由于EEPROM 的操作速度不如FPGA 內部RAM 資源操作速度快,對存儲速度有一定的影響。

圖6 檢測流程
Flash 的擦除次數也是有限的,NAND Flash 在編程和操作過程中也會出現一些壞塊,這種壞塊被稱為突發壞塊。對于突發壞塊,傳統方法是將已經寫入壞塊的數據重新讀出來存儲在緩存區,然后再寫入下一個好塊中。然而當遇到突發壞塊時,只有最后一頁數據寫入失敗,之前頁寫入的數據也會被舍棄掉。這種方法會降低數據的寫入速度,且對Flash 存儲資源造成浪費,傳統方法流程如圖7 所示。
本文提出在EEPROM 表基礎上設計基于頁跳過和頁替換的管理方法,在擦除過程中出現壞塊時,FPGA 就將該塊對應EEPROM 位置寫入80h。在寫入數據過程中出現壞塊,就將壞掉頁的頁地址(00h~7Fh)寫入該頁所屬塊對應EEPROM 位置,并將壞掉頁的數據重新寫入下一好塊中,保留了已經成功寫入的數據。基于頁跳過和頁替換管理方法寫入數據流程如圖8 所示。

圖8 寫入數據流程
在讀取數據時,FPGA 首先讀取EEPROM 表中對應塊的狀態信息。如果為FFh,則表示該塊已成功寫入數據,可以將數據讀出;如果為80h,則表示該塊為全部壞塊,不能對該塊進行讀取操作;如果為頁地址(00h~7Fh),則讀取該頁地址之前的所有數據。讀取數據流程如圖9 所示。

圖9 讀取數據流程
基于整合塊的壞塊管理方法對Flash 存儲空間的利用率取決于單片Flash 內部最大無效塊數量和通道內Flash 的數量。每個Flash 內部有8 192 個塊,每個Flash最大無效塊數量為80。整合塊內由8 個Flash 構成,則通道內最大無效整合塊數量為640 塊。浪費的存儲空間為640 MB×7=4.375 GB,本設計單通的存儲容量為4 GB×8=32 GB,最大損失容量比例為13.67%。
基于EEPROM 表的壞塊管理方法由于是對通道內Flash 中每一塊狀態信息的存儲,因此對Flash 存儲空間的利用率最大可以達到100%。
本次測試選用的主控芯片是由Xilinx 公司生產的XC7K325T-2FFG900I,基于NAND Flash 陣列存儲,通過上位機不斷地寫入32 GB的遞增數??刂祁l率為125 MHz,為了驗證突發壞塊的管理機制,通過修改EEPROM 表中存儲塊的狀態信息,人為在塊中加入不同位置的壞掉頁。通過比較傳統方法和改進方法寫入一塊數據的時間和平均寫入速度,來驗證改進方法是否可行,經過多次測試后的結果如表1、表2 所示。

表1 寫入1 塊數據所用時間

表2 平均寫入速度測試結果
從表1、表2 的數據對比中可以看出,當塊中無壞掉頁時,改進方法與傳統方法寫入速度沒有提升。當壞掉頁的位置越靠后時,改進方法與傳統方法相比提升就越大。原因是對于傳統方法來說,當出現壞掉頁時,就要將該頁之前所有頁重新寫入下一塊,壞掉頁位置越靠后,需要重新寫入的數據就越多。而對于改進方法只需要將壞掉頁的數據重新寫入下一塊,保留了之前成功寫入的數據,因此對寫入速度無明顯影響。
通過上位機對存儲的數據進行回讀,回讀的數據經過校驗后無誤碼、無丟幀,數據校驗結果如圖10 所示,經過多次測試表明數據的可靠性得到了保證。

圖10 回讀數據校驗結果
本文提出兩種固有壞塊檢測和識別的方法,在實際的工程應用中有一定的參考價值。兩種方法在存儲速度和存儲空間利用方面各有考量?;谡蠅K的壞塊管理方法適合于對存儲速度要求較高,FPGA 內部資源豐富的場合。而對于基于EEPROM 表的壞塊管理方法適用于對存儲速度要求不高、內部資源緊缺的場合。針對突發壞塊提出的基于頁跳過和頁替換的管理方法,保證了在出現壞頁時寫入速度不會大幅度下降,且成功應用在具體實踐中。