?

基于FPGA和NAND Flash的存儲器ECC設計與實現

2012-06-23 06:42邢開宇曹曉曼方火能
電子科技 2012年10期
關鍵詞:校驗碼存儲器校驗

邢開宇,曹曉曼,方火能

(西安電子科技大學電子工程學院,陜西 西安 710071)

近年來,得益于大規模集成電路技術的發展,以NAND Flash為代表的半導體固態存儲器發展迅速。與傳統的磁帶記錄設備相比,NAND Flash具有存儲密度高、可靠性強、體積小、重量輕、操作速度快、容量價格比高等多方面優勢,從而逐漸在各領域取代傳統的磁記錄設備,更是成為航天、軍事等對存儲質量要求較高領域中的首選。

雖然NAND Flash已具有較高的可靠性,但受其制作工藝所限,同時考慮到星載設備所面臨的復雜工作環境,在其使用過程中仍可能出現錯“位”現象,即存儲數據可能會有幾個數據位出錯。雖然這種錯誤出現的概率較低,但對于通常應用而言,無需特別注意,但在一些場合,若錯誤發生在某個重要的數據上,即可能導致嚴重后果。此時就需要為所設計的存儲系統添加必要的糾錯模塊,以確保其穩定性,常用的有奇偶校驗、循環冗余校驗和ECC校驗等[1]。

ECC(Error Correcting Code)校驗算法[2]是在奇偶校驗的基礎上發展起來的數據糾錯方法,能夠糾正1 bit錯誤并能檢測2 bit錯誤,但對于2 bit以上的錯誤不能保證檢測。與其他糾錯算法相比,ECC算法具有占用資源少、運行速度高的優點,可以方便地在FPGA中實現,同時具有較強的糾錯能力。文中根據某星載高速大容量存儲器的硬件組成和結構特點,在FPGA中設計和實現了ECC算法模塊,該算法模塊具有1 bit/4 kB的糾錯能力,為存儲器的穩定性提供有力保證。

1 存儲器的主要硬件組成

本存儲器設備是某星載存儲陣列系統的組成部分,負責對輸入的高速數據進行實時不失真的存儲和回讀。該存儲器主要由1片FPGA和40片NAND Flash芯片構成,其硬件結構如圖1所示。

如圖1所示,存儲器采用Xilinx公司的高性能FPGA XC4VLX80作為核心控制芯片,主要負責對數據的緩存變速以及對NAND Flash陣列的控制,同時負責輸入輸出數據ECC校驗碼的產生和糾錯工作。存儲器的存儲介質采用三星公司的NAND Flash芯片K9WBG08U1M[3],其單片存儲容量為 4 GB,基本結構可以按塊和頁劃分,讀寫操作均以頁為單位進行,一頁由4096 Byte的主存儲空間和128 Byte的附加存儲空間組成。

圖1 存儲器的硬件組成結構圖

2 ECC校驗模塊的整體設計思路

根據NAND Flash的組成結構和讀寫數據的操作方式,存儲器的輸入輸出數據均以4096個8位數據為單位組成數據包進行傳送,因此,ECC校驗碼也是以1頁數據為單位進行的[4]。

文中所設計的ECC校驗模塊的基本工作流程如下:

(1)在存儲數據輸入的過程中,以4096個數據為單位,實時地產生原始的ECC校驗碼,并將其與相應的數據存入同一個Flash頁中,其中,4096 Byte數據存入Flash頁的基本存儲空間中,4個8位ECC編碼存入附加存儲空間中。

(2)在進行讀出操作時,將在Flash中存儲的數據和原始ECC校驗碼同時讀出,并根據從主存儲空間中讀出的有效數據,同樣以4096個數據為單位,生成新的ECC校驗碼。

(3)將原始和新生成的ECC校驗碼按位進行異或,并根據異或結果確定數據中是否出現了錯“位”現象及進行糾錯處理。

綜上所述,ECC校驗的流程如圖2所示[5]。

3 ECC校驗碼的產生方法

ECC校驗碼由列校驗碼和行校驗碼組成,按照ECC校驗碼的基本產生方法,4096個8位數據可以生成6位列校驗碼和24位行校驗碼。為方便存儲,文中將生成的30位校驗碼封裝在4個8位的編碼數據中,如表1所示。

圖2 ECC算法流程圖

表1 ECC校驗碼結構組成表

表1中,P8~P16384是行校驗碼,P1~P4是列校驗碼,同時在列校驗碼的低兩位補1,從而組成8位的列校驗編碼數據。ECC列校驗碼的產生方法如表2所示。

表2 ECC列校驗碼的產生方式表

表2中列校驗碼的產生方法可以用如下數學表達式表示,其中“(+)”符號代表異或運算。P1=bit7(+)bit5(+)bit3(+)bit1(+)P1;P1'=bit6(+)bit4(+)bit2(+)bit0(+)P1';P2=bit7(+)bit6(+)bit3(+)bit2(+)P2;P2'=bit5(+)bit4(+)bit1(+)bit0(+)P2';P4=bit7(+)bit6(+)bit5(+)bit4(+)P4;P4'=bit3(+)bit2(+)bit1(+)bit0(+)P4'。

ECC行校驗碼的產生方法如表3所示。

表3 ECC行校驗碼的產生式表

其中P8和P8′的產生方法的數學表達式如下,其余行校驗碼的產生方法類似。P8=bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0(+)P8(偶數Byte);P8'=bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0(+)P8'(奇數Byte)。

由以上ECC校驗碼的產生方法可知,列校驗碼與行校驗碼的生成沒有本質的區別。ECC校驗碼可以看成是由不同的ECC校驗碼組組成,每個ECC校驗碼組包括兩位ECC校驗碼,如P1和P1′即為一個ECC校驗碼組。在進行ECC編碼時,可以將4096個8位數據看成是4096×8個順序的1位數據,各ECC校驗碼組在生成時首先根據各自不同的分類方法,將參與ECC編碼的數據以位為最小單位,均分為兩組。如列校驗碼組P1和P1′是將數據每隔1位進行抽取而分成兩組,而行校驗碼組P8和P8′則是將數據每隔1 Byte進行抽取而分成兩組,因此,PN中的數據N也同時代表了分組時連續抽取的數據位數。之后將兩組中的數據位分別進行異或,從而得到兩個ECC校驗碼位。最后將所有的ECC校驗碼位組合就得到了最終的ECC校驗碼。

4 ECC算法對錯誤的檢測和處理

根據文中所述ECC校驗碼的產生方法,以4096 Byte為單位,分別在存儲和讀取操作中對數據進行ECC編碼,并將兩次產生的ECC校驗碼中的有效數據按位進行異或,得到30位的異或結果,其不同情況所代表的實際意義如下:

(1)異或結果所有位均為0,即新舊ECC編碼相同,表示數據完全正確。

(2)異或結果中,每組ECC編碼均是一位為1,另一位為0,表示數據有一位出錯,且該錯誤可以糾正。其中,出錯數據的位置由不帶“'”標的ECC編碼的異或結果給出,其中行編碼 P16384、P8192、P4096、P2048、P1024、P512、P256、P128、P64、P32、P16、P8 的異或結果表示出錯數據的偏移地址,列編碼P4、P2、P1的異或結果表示出錯位在8位數據中的位置。

(3)異或結果中只有一位是1,表示ECC校驗碼錯誤。

(4)異或結果為上述結果以外的其他結果,表示數據有2位以上的錯誤,但該錯誤無法糾正。

當4096 Byte數據中產生了1位的錯誤時,可根據ECC校驗碼異或結果中所包含的位置信息和輸出數據的序數,將出錯數據的相應數據位與1異或,從而對錯誤進行糾正。

5 ECC算法實現結果的采樣和分析

文中在ISE10.1開發環境中對所設計的ECC算法模塊進行了搭建和實現,并下載至存儲器FPGA中,通過ChipScope Pro在線邏輯分析儀對相關信號進行采樣,以驗證設計的正確性[6]。

存儲器的寫入數據以4096個8位數據為單位組成數據包,速率為200 MB/s,有效數據的平均速率為150 MB/s。為方便測試,文中通過外部的模擬數據源,以循環順序數0x00~0xFF組成數據包,因而4096個數據中含有16組0x00~0xFF。在FPGA對輸入數據進行接收和緩存的同時,存入數據的ECC校驗碼產生模塊以數據包為單位實時的計算ECC校驗碼,在進行Flash頁編程時,FPGA將有效數據和相應的ECC校驗碼寫入同一個Flash頁中。其中,輸入數據ECC校驗碼的產生效果采樣如圖3所示。

圖3 輸入數據ECC校驗碼產生效果采樣

圖3中,line信號和data信號分別是有效數據的使能信號和輸入的8位數據;middle信號是根據當前輸入數據產生的7位中間值,其最高位是當前輸入的8位數據各位異或的結果,用于行校驗碼的計算,其余6位是按照不同的方式抽取當前輸入數據的1/2進行異或的結果,用于列校驗碼的產生;code16384_2048、code1024_128、code64_8是實時計算的 ECC行校驗碼,linecode是ECC列校驗碼;cnt_data是ECC校驗碼計算過程的指令計數器,編碼模塊根據其取值的不同進行相應的操作。從圖中可以看出,ECC校驗碼的計算模塊工作正常,最終生成的校驗碼code16384_2048、code1024_128、code64_8和 linecode分別為 0x00、0x00、0x00和0x03,計算結果正確。

由于NAND Flash的錯“位”概率較低,因此,為了對ECC模塊的功能進行驗證,在進行Flash頁編程時,將數據包中最后一個0xFC改為0xEC進行存儲,由于0xFC和0xEC的二進制形式分別為0b1111_1100和0b1110_1100,因而這一改變是對1 bit錯誤的模擬。其僅發生在Flash的頁編程過程中,輸入數據的ECC編碼不受影響,依然按照改變前的數據計算。讀出數據的ECC校驗碼的產生方法與存入數據相同,且同樣是在數據緩存的過程中進行,其結果如圖4所示。圖中,wren用于指示從Flash讀出的有效數據的范圍;data是從Flash中讀出的數據和ECC校驗碼,有效數據后面緊跟的4個數據是存入數據的ECC校驗碼;cnt_read是校驗碼計算過程的指令計數器。從圖中可以看出,由于存儲數據的改變,讀出數據的 ECC校驗碼new16384_2048,new1024_128,new64_8 和 newline分別變為0xAA、0xAA、0xA5 和0x25。

圖4 讀出數據ECC校驗碼產生效果采樣

將新舊ECC校驗碼按位進行異或,并根據結果對輸出數據進行檢錯和糾錯,其采樣效果如圖5所示。

圖5 ECC算法模塊糾錯效果采樣圖

如圖5所示,data_t和data分別是糾錯前和糾錯后的輸出數據;line_rd信號是輸出數據的有效數據指示信號;ecc_addr和ecc_data分別是由ECC校驗碼計算出的出錯數據的偏移地址和用于與出錯數據進行異或運算的糾錯數據;num_data是糾錯前數據的實時偏移地址。從圖中可以看出,ECC算法模塊正確計算出了出錯數據的地址4092,并且當輸出數據到達該地址時,利用糾錯數據0x10,成功將出錯數據0xEC更正為0xFC,正確地實現了功能。

6 結束語

對ECC算法的原理及其實現的方法和流程進了分析和介紹,并在某高速大容量存儲器的FPGA中設計和實現了ECC算法模塊,根據實際采樣結果,文中設計的ECC模塊正確地實現了其功能。ECC算法具有糾錯能力強、占用資源少、運行速度高,易于實現等優點,有效的保證了存儲器的可靠性。

[1]Samsung Electronics Corpration.NAND Flash ECC Algorithm[M].Korea:Samsung Electronics Corpration,2004.

[2]賈紅恩,劉瑞竹,羅豐.基于固態存儲器的ECC算法分析及實現[J].電子科技,2009,22(10):43 -46.

[3]Samsung Electronics Corpration.K9WBG08U1M Flash Memory[M].Korea:Samsung Electronics Corpration,2007.

[4]Xilinx Corporation.Virtex-4 FPGA User Guide[M].USA:Xilinx Corporation,2008.

[5]夏宇聞.Verilog數字系統設計教程[M].北京:北京航空航天大學出版社,2003.

[6]王誠,薛小剛,鐘信潮.FPGA/CPLD設計工具——Xilinx ISE使用詳解[M].北京:人民郵電出版社,2005.

猜你喜歡
校驗碼存儲器校驗
Basic UDI校驗碼算法
靜態隨機存儲器在軌自檢算法
爐溫均勻性校驗在鑄鍛企業的應用
結合抓包實例分析校驗和的計算
基于Excel實現書號校驗碼的驗證
基于FPGA的循環冗余校驗碼設計
身份證號碼中的數學
大型電動機高阻抗差動保護穩定校驗研究
基于加窗插值FFT的PMU校驗方法
存儲器——安格爾(墨西哥)▲
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合