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