王 軒,常 亮,李 杰
(1.中國科學院上海微系統(tǒng)與信息技術研究所,上海200050;2.上海微小衛(wèi)星工程中心上海201203;3.上??萍即髮W信息學院,上海201210;4.中國科學院大學北京100049)
隨著嵌入式技術的發(fā)展,各類移動設備已廣泛應用在各個領域。在人們對高速化,續(xù)航能力,高可靠性上取得進展的同時,也對其中的存儲設備提出越來越高的要求[1]。NAND Flash設備具有的掉電非易失性,存取速度快,低功耗,抗震性等優(yōu)點[2],已廣泛取代傳統(tǒng)磁介質存儲設備,成為嵌入式設備中解決高密度存儲的主流方案[3]。
由于NAND Flash工藝無法保證數(shù)據存儲的可靠性,且考慮星載設備工作在空間環(huán)境的惡劣性,可能會導致單粒子事件造成其存儲數(shù)據在某些位發(fā)生反轉[4]。雖然出現(xiàn)這種情況的概率較低,通常只有一位或幾位。不過對于重要的數(shù)據仍需采用必要的檢錯糾錯機制來提高可靠性[5]。
基于漢明碼的ECC(Error Correction Code)校驗算法可糾正一位錯誤,檢測兩位錯誤,對多于兩位的錯誤則無法保證糾錯和檢錯[6]。由于其便于硬件實現(xiàn),計算速度快,具有實時性等優(yōu)點,非常適用于NAND Flash存儲校驗。文中將介紹ECC算法的設計及基于FPGA的硬件實現(xiàn),具有1bit/4kbits的糾錯能力,經Modelsim仿真及燒入Microsemi公司的Smartfusion2系列FPGA中調試驗證算法在系統(tǒng)中可穩(wěn)定運行,滿足設計要求。
ECC校驗由傳統(tǒng)的奇偶校驗發(fā)展而來,改進了傳統(tǒng)奇偶校驗僅能檢錯而無法糾錯的局限性。并且傳統(tǒng)的奇偶校驗冗余數(shù)據隨原始數(shù)據的增長而線性增長。而ECC校驗算法將原始數(shù)據劃分為矩陣的形式,通過對數(shù)據的組合行列校驗產生,一般將512字節(jié)分為一組,每組(521 bytes=4096 bits=2n,n=12)的原始數(shù)據需產生24bits(2n,n=12)的ECC碼,冗余編碼數(shù)據為2logm2(其中m為原始數(shù)據的位數(shù)),隨原始數(shù)據成對數(shù)形式增長。當然也可以根據需要,將較少的數(shù)據分為一組,增加組數(shù)和冗余碼來來增強糾錯能力。
本設計中采用將512字節(jié)數(shù)據劃分為一組進行ECC的編碼。當然具體編碼方式如圖1所示[7]。
其中p1-p4為列校驗碼,由這512字節(jié)的所有對應位通過異或運算產生。用數(shù)學表達式表示為:
圖1 ECC編碼方式
p8-p2048為行校驗碼,由圖1中對應字節(jié)的所有位通過異或產生??捎脭?shù)學表達式表示為:
其中rownumber為行數(shù)的二進制表示形式。其第零位可區(qū)分出奇數(shù)與偶數(shù)行,第一位可將數(shù)據的行數(shù)分為每兩行一組,對每兩行的奇偶進行區(qū)分,類似的方式可對行數(shù)進行不同的分組,從而得到其他行校驗碼。
在寫入操作時,生成的ECC將寫入NAND Flash的Spare區(qū),讀出時,根據讀出的數(shù)據再次生成的新ECC與從Spare區(qū)中讀出的舊ECC通過對應位異或運算,結果可分為以下幾種情況[8]:
1)若運算結果全為零,則兩次ECC完全相同,說明寫入的數(shù)據與讀出時的數(shù)據是相同的,即NAND Flash在存儲過程中數(shù)據未發(fā)生翻轉;
2)若運算結果為在每個校驗對(pn和′為一個校驗對)中均存在一個‘1’,則說明該512字節(jié)的數(shù)據中僅有1位發(fā)生翻轉,屬于可糾錯誤。此時運算結果中p2048 p1024 p512...p8為該錯誤位所在字節(jié)的行偏移,p4 p2 p1為該字節(jié)內錯誤位的列偏移[];
3)若運算結果僅有一個‘1’,則說明存儲的ECC中的一位出現(xiàn)了錯誤;
4)若運算結果非以上情況,則說明出現(xiàn)了一位以上的錯誤,報告出錯但無法糾正。
如圖1所示,在一組512字節(jié)的數(shù)據中,若第一個字節(jié)中的bit2在存儲過程中發(fā)生了翻轉,則讀出時生成的 ECC 對應的p2048′p1024′...p16′p8p4′p2p1′處將會受到影響,即圖中標深色的區(qū)域。使兩組ECC按位異或這些位置處結果將為‘1’,即運算結果中各校驗對中均存在一個‘1’,符合上述第二種情況。此時取運算結果中p2048 p1024 p512...p8對應的值即00...01即說明錯誤在第一個字節(jié),p4 p2 p1對應的值為010即說明錯誤位在該字節(jié)中第二個位。即可定位錯誤位并予以翻轉糾正。
本設計基于Microsemi公司Smartfusion2系列SoC型高性能FPGA完成[10-11]。該FPGA內嵌有ARM Cortex-M3硬核。CPU通過AHB總線與FPGA層進行數(shù)據傳輸。這里CPU用于命令的發(fā)送與數(shù)據的接收,來進行軟硬件協(xié)同驗證設計的正確性[12]。NAND Flash采用三星K9F1G08UOA型號芯片[13]。該型號每頁由2KB的數(shù)據區(qū)和64B的Spare區(qū)組成[14]。
本設計系統(tǒng)框架如圖2所示。主要包括AHB接口模塊,數(shù)據緩存模塊,ECC校驗模塊及NAND Flash時序接口模塊[15]。
圖2 硬件系統(tǒng)框架圖
AHB接口模塊根據AMBA協(xié)議實現(xiàn),將FPGA端作為slave掛接到AHB總線上與master CPU進行通信,而AHB總線可直接調用IP核通過配置使用。由于NAND Flash的讀寫均以頁為單位[16],所以可通過配置整頁大小的FIFO作為數(shù)據緩存。NAND Flash時序接口模塊主要根據NAND Flash接口協(xié)議,將命令與數(shù)據通過解析來控制NAND Flash操作。ECC校驗模塊主要分為ECC的生成模塊,錯誤檢測與定位模塊,和待糾錯數(shù)據緩存模塊。ECC校驗流程圖如圖3所示。
圖3 ECC校驗流程圖
當數(shù)據寫入時,ECC生成模塊根據原始數(shù)據生成ECC碼,并隨數(shù)據一起寫入到NAND Flash中數(shù)據頁所對應的Spare區(qū)。讀出時將數(shù)據與存于Spare區(qū)中的ECC一并讀出,所讀數(shù)據將再次生成ECC,與讀出的ECC一同進入錯誤檢測與定位模塊進行運算。根據運算結果將判斷數(shù)據中是否存在錯誤及錯誤類型是否可糾。若錯誤可糾,則將錯誤地址輸出到數(shù)據緩存模塊中。由于需要對錯誤數(shù)據進行隨機讀寫,所以此處采用基于SRAM的數(shù)據緩存方式。即圖四中的SRAM_wrap模塊。該模塊底層例化SRAM IP核用于待糾正數(shù)據的存儲,然后根據錯誤定位模塊發(fā)來的地址,將發(fā)生翻轉位所在字節(jié)讀出,將錯誤位糾正,再將該字節(jié)寫入底層SRAM中,最終通過AHB總線將所讀數(shù)據發(fā)送給CPU來驗證數(shù)據的正確性。
文中基于Libero SoC 11.3開發(fā)環(huán)境中采用VHDL語言對NAND Flash ECC校驗系統(tǒng)進行了設計與實現(xiàn)。該ECC校驗系統(tǒng)頂層用于仿真的模塊如圖4所示。并在ModelSim SE-6410.4環(huán)境下進行仿真。采用NAND Flash model陣列模擬真實Flash芯片行為,編寫bfm(bus function model)即總線功能模型腳本產生AHB Master端的激勵,即可進行系統(tǒng)仿真。
本設計采用的NAND Flash芯片每頁為2 K字節(jié),故將其分為4組512字節(jié)分別進行校驗。為了測試該ECC校驗系統(tǒng)具體檢錯與糾錯功能,在NAND Flash接口模塊中在讀出時故意做了數(shù)據的改動。將第零組數(shù)據中的第一個字節(jié)寫入‘x02’改為了‘x00’,即將數(shù)據二進制中的第一位翻轉。仿真結果如圖5所示。ERR_STATUS為對出錯狀態(tài)的報告,‘b00’為無錯誤,‘b01’為數(shù)據中發(fā)生一位錯誤,‘b10’為 ECC 中發(fā)生一位錯誤?!産11’為發(fā)生一位以上的錯誤。圖中顯示出第零組數(shù)據中發(fā)生一位錯誤。并且由err_loc報告出錯誤所在位置。即為第一個字節(jié)中的第一位。DATA_IN與DATA_OUT為SRAM_wrap模塊中 對錯誤數(shù)據的糾正,即將‘x00’改回為‘x02’。
圖4 ECC校驗系統(tǒng)頂層模塊圖
圖5 ECC校驗系統(tǒng)仿真時序圖
由于NAND Flash存儲設備具有掉電非易失性,存取速度快,低功耗,抗震性等優(yōu)點,在嵌入式領域已經逐漸取代磁介質存儲器,成為解決高密度存儲的主流方案。針對其工藝結構局限而可能導致低概率的位翻轉問題,本文給出了基于漢明碼ECC校驗系統(tǒng)完整的設計及實現(xiàn)方案。
基于漢明碼的ECC校驗算法具有便于硬件實現(xiàn)且占用資源較少運算速度快的特點,且可通過對冗余碼的增加來實現(xiàn)對糾錯能力的擴展。因此漢明碼可以作為SLC類型NAND Flash應用中可以采用的性價比非常高的一種糾錯方式。
基于FPGA的設計一方面可以節(jié)省由傳統(tǒng)軟件實現(xiàn)校驗而帶來CPU資源的占用與開銷,另一方面由于硬件的并行性可滿足高速存儲設備對于實時性的要求。因此,本設計具有較高的工程應用價值。