章宇杰,沈小波
(中國電子科技集團(tuán)公司第58研究所,江蘇 無錫 214035)
評(píng)價(jià)存儲(chǔ)器的一個(gè)重要指標(biāo)就是它的可靠性。在一般的數(shù)據(jù)存儲(chǔ)中,幾個(gè)位的錯(cuò)誤可能不是很關(guān)鍵的問題,但是如果發(fā)生在某個(gè)敏感的數(shù)據(jù)上,這個(gè)小小的故障可能會(huì)導(dǎo)致嚴(yán)重的后果。因此,必須采取一些措施來及時(shí)檢出并糾正出錯(cuò)的數(shù)據(jù)。目前常用的方法有:奇偶校驗(yàn)、CRC校驗(yàn)、重復(fù)碼校驗(yàn)等。
ECC校驗(yàn)是在奇偶校驗(yàn)的基礎(chǔ)上發(fā)展而來的,它將數(shù)據(jù)塊看作一個(gè)矩陣,利用矩陣的行、列奇偶信息生成ECC校驗(yàn)碼。它能夠檢測(cè)并糾正單比特錯(cuò)誤和檢測(cè)雙比特錯(cuò)誤,但對(duì)雙比特以上的錯(cuò)誤不能保證檢測(cè)。它克服了傳統(tǒng)奇偶校驗(yàn)只能檢出奇數(shù)位出錯(cuò)、校驗(yàn)碼冗長、不能糾錯(cuò)的局限性。文中在介紹高速大容量固態(tài)存儲(chǔ)器的硬件結(jié)構(gòu)基礎(chǔ)上,詳細(xì)介紹了ECC校驗(yàn)碼的生成規(guī)則以及ECC校驗(yàn)流程,并通過FPGA實(shí)現(xiàn)了該算法。
本文中的存儲(chǔ)器是以ARM為SSD控制器,用16片F(xiàn)lash芯片構(gòu)成存儲(chǔ)陣列,采用SATA接口實(shí)現(xiàn)數(shù)據(jù)的高速率存儲(chǔ)。Flash存儲(chǔ)陣列分為8組,每組2片,每組Flash芯片共用數(shù)據(jù)和控制總線。該存儲(chǔ)器的硬件結(jié)構(gòu)如圖1所示。
圖1 SSD構(gòu)架圖
存儲(chǔ)板上的存儲(chǔ)芯片用的是Micron公司的高速大容量固態(tài)存儲(chǔ)芯片Nand Flash Memory,其容量為1 G×8 bit,分為8192個(gè)塊,每個(gè)塊又分為64頁,1頁有(2 k+64)Byte,其中一頁有64 bit的空閑區(qū)。存儲(chǔ)板上的SSD控制器是由ARM 926為核心的控制芯片,它負(fù)責(zé)數(shù)據(jù)的緩沖和整個(gè)存儲(chǔ)器的時(shí)序控制,并負(fù)責(zé)以頁為單位生成校驗(yàn)碼,并把校驗(yàn)碼存入到頁的空閑區(qū)內(nèi)。下面以2 048 bit為單位介紹校驗(yàn)碼的生成以及校驗(yàn)流程。
Flash在讀寫數(shù)據(jù)的時(shí)候是以頁為單位進(jìn)行的,可以以2 048 bit為單位生成校驗(yàn)碼。每個(gè)數(shù)據(jù)有8位信息組成,可以把這2 048個(gè)數(shù)據(jù)看成256×8的矩陣,這樣就可以分別生成行校驗(yàn)碼和列校驗(yàn)碼來分別校驗(yàn)。ECC校驗(yàn)中,每256個(gè)數(shù)據(jù)生成3個(gè)字節(jié)的校驗(yàn)碼,這24位的校驗(yàn)碼分成3個(gè)部分:6位的列校驗(yàn)信息,16位的行校驗(yàn)信息,其余的2位置1,ECC校驗(yàn)碼組成,如圖2所示。其中CP0、CP1、CP2、CP3、CP4、CP5是列校驗(yàn)碼,而LP0、LP1、LP2、LP3、LP4、LP5、LP6、LP7、LP8、LP9、LP10、LP11、LP12、LP13、LP14、LP15是行校驗(yàn)碼。行列校驗(yàn)碼生成表,如圖2所示。
圖2 列和行奇偶的框圖
處理每個(gè)數(shù)據(jù)字節(jié)在整個(gè)數(shù)據(jù)模塊上計(jì)算列奇偶。
列奇偶位的計(jì)算方法為:
行奇偶位的計(jì)算方法為:
ECC校驗(yàn)可以檢測(cè)1 bit或2 bit錯(cuò)誤,并糾正1 bit錯(cuò)誤。
(1)無錯(cuò)誤
由于flash中存儲(chǔ)的代碼和讀操作所產(chǎn)生的代碼沒有不同,因此這種情況下沒有錯(cuò)誤。
(2)可校準(zhǔn)的錯(cuò)誤
在計(jì)算完所有數(shù)據(jù)的ECC后和flash中所儲(chǔ)存的原來的ECC后產(chǎn)生位比較后,所有奇偶位對(duì)(CP0和CP1)…(LP14和LP15)自身有一個(gè)錯(cuò)誤和一個(gè)匹配。這種情況下可以校準(zhǔn)錯(cuò)誤。
(3)不可校準(zhǔn)的錯(cuò)誤
在計(jì)算完所有數(shù)據(jù)的ECC后和flash中所儲(chǔ)存的原來的ECC后產(chǎn)生位比較后,只要有奇偶對(duì)都有錯(cuò)誤,如CP0和CP1都有錯(cuò)誤這表示多個(gè)位錯(cuò)誤并不可校準(zhǔn)。
(4)可校錯(cuò)誤的位置
通過存儲(chǔ)在flash中的ECC和從數(shù)據(jù)中計(jì)算出的ECC相異或后,找到錯(cuò)誤的位置。(LP15、LP13、LP11、LP9、LP7、LP5、LP3、LP1)這一組數(shù)據(jù)給出了出錯(cuò)的字節(jié)地址。(CP5、CP3、CP1)給出了出錯(cuò)的位的地址。
該ECC算法在FPGA中實(shí)現(xiàn),ECC碼生成工程實(shí)現(xiàn)按照ECC的生成的算法。
算法實(shí)現(xiàn)流程圖如圖3所示。
圖3 算法流程
本實(shí)驗(yàn)處理對(duì)象為256 Byte的數(shù)據(jù)包,對(duì)其進(jìn)行ECC校驗(yàn)共生成22 bit校驗(yàn)數(shù)據(jù)。為方便讀取,可以在末尾添加兩位,形成完整的3 Byte 校驗(yàn)數(shù)據(jù)。這3 Byte共24 bit,分成兩部分:6 bit的比特校驗(yàn)和16 bit的字節(jié)校驗(yàn),多余的2 bit置1,并置于校驗(yàn)碼的最低位,在進(jìn)行異或操作時(shí)此2 bit忽略。ECC生成實(shí)驗(yàn)結(jié)果如圖4所示。
圖4 ECC計(jì)算結(jié)果
圖4中等待256個(gè)字節(jié)的數(shù)據(jù)輸入后,最后生成校驗(yàn)碼4401E9,也就是3個(gè)字節(jié)的校驗(yàn)碼。其中out1、out2和out3為中間數(shù)據(jù),EOF高電平出現(xiàn)代表數(shù)據(jù)運(yùn)算結(jié)束。運(yùn)算結(jié)束,輸出4401E9,其中最后兩位為無效數(shù)據(jù)。數(shù)據(jù)輸入為串行輸入,256個(gè)字節(jié)需要256個(gè)時(shí)鐘周期后才能完成輸入。由此從輸入開始到得出計(jì)算結(jié)果至少需等待256個(gè)時(shí)鐘周期。在實(shí)際使用過程中可以將串行輸入改為并行輸入,或流水線結(jié)構(gòu),以減少等待時(shí)間。
ECC校驗(yàn)的結(jié)果如圖5所示,其中錯(cuò)誤指示由兩個(gè)bit表示。00表示沒有錯(cuò)誤,01表示有1位錯(cuò)誤,10表示有2位及2位以上錯(cuò)誤,11表示ECC區(qū)出錯(cuò)。當(dāng)出錯(cuò)位為1位時(shí),由錯(cuò)誤位置指出可糾錯(cuò)的位。
圖5 ECC檢驗(yàn)
為了實(shí)現(xiàn)數(shù)據(jù)的可靠傳輸,在固態(tài)盤中需要使用ECC校驗(yàn)。文中介紹了ECC算法的一種實(shí)現(xiàn)方法,說明了ECC的校驗(yàn)流程,最后用xilinx FPGA XC3S500E實(shí)現(xiàn)ECC校驗(yàn)算法。ECC校驗(yàn)算法簡單,軟硬件均能實(shí)現(xiàn),ECC能夠檢測(cè)并糾正單比特錯(cuò)誤和檢測(cè)雙比特錯(cuò)誤,所以可以為數(shù)據(jù)存儲(chǔ)和通信系統(tǒng)提供一種強(qiáng)有力的差錯(cuò)檢測(cè)手段。使用本文提供的ECC算法可以糾錯(cuò)1 bit,檢錯(cuò)2 bit。
[1]李璐,周海燕.一種含BCH編解碼器的SLC/MLC-Nand flash控制器的VLSI設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2009.7.
[2]Toru Tanzawa etc.A Compact On-Chip ECC for Low Cost Flash Memories [J].IEEE Journal of solid-state circuits,1997,32(5).