ECC內存校驗算法


ECC的全稱是Error Checking and Correction,是一種用於Nand的差錯檢測和修正算法。如果操作時序和電路穩定性不存在問題的話,NAND Flash出錯的時候一般不會造成整個Block或是Page不能讀取或是全部出錯,而是整個Page(例如512Bytes)中只有一個或幾個bit出錯。ECC能糾正1比特錯誤和檢測2比特錯誤,而且計算速度很快,但對1比特以上的錯誤無法糾正,對2比特以上的錯誤不保證能檢測。
校驗碼生成算法:ECC校驗每次對256字節的數據進行操作,包含列校驗和行校驗。對每個待校驗的Bit位求異或,若結果為0,則表明含有偶數個1;若結果為1,則表明含有奇數個1。列校驗規則如表1所示。256字節數據形成256行、8列的矩陣,矩陣每個元素表示一個Bit位。

其中CP0 ~ CP5 為六個Bit位,表示Column Parity(列極性),
CP0為第0246列的極性,CP1為第1357列的極性,
CP2為第0、145列的極性,CP3為第2、367列的極性,
CP4為第0123列的極性,CP5為第4567列的極性。
用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6, 表示第0列內部256Bit位異或之后再跟第2256Bit位異或,再跟第4列、第6列的每個Bit位異或,這樣,CP0其實是256*4=1024Bit位異或的結果。CP1 ~ CP5 依此類推。
行校驗如下圖所示



其中RP0 ~ RP15 為十六個Bit位,表示Row Parity(行極性),
RP0為第0246….252、254 個字節的極性
RP1-----1、357……253、255 
RP2----014589…..252、253 (處理2Byte,跳過2Byte
RP3---- 23671011…..254255 (跳過2Byte,處理2Byte
RP4---- 處理4Byte,跳過4Byte
RP5---- 跳過4Byte,處理4Byte
RP6---- 處理8Byte,跳過8Byte
RP7---- 跳過8Byte,處理8Byte
RP8---- 處理16Byte,跳過16Byte
RP9---- 跳過16Byte,處理16Byte
RP10----處理32Byte,跳過32Byte
RP11----跳過32Byte,處理32Byte
RP12----處理64Byte,跳過64Byte
RP13----跳過64Byte,處理64Byte
RP14----處理128Byte,跳過128Byte
RP15----跳過128Byte,處理128Byte
可見,RP0 ~ RP15 每個Bit位都是128個字節(也就是128行)即128*8=1024Bit位求異或的結果。
綜上所述,對256字節的數據共生成了6Bit的列校驗結果,16Bit的行校驗結果,共22Bit。在Nand中使用3個字節存放校驗結果,多余的兩個Bit位置1。存放次序如下表所示:



K9F1208為例,每個Page頁包含512字節的數據區和16字節的OOB區。前256字節數據生成3字節ECC校驗碼,后256字節數據生成3字節ECC校驗碼,共6字節ECC校驗碼存放在OOB區中,存放的位置為OOB區的第012367字節。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM