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