本篇文章主要介紹ECC基本原理以及在Nand Flash中的應用,本文記錄自己對ECC校驗原理的理解和學習。
ECC介紹
ECC,全稱為Error Correcting Code,錯誤糾正碼,這是一種編碼方式,用於在於可以在一定程度上自行發現和糾正傳輸過程中發生的錯誤。
香農在1948年發表的《通信的數學理論》中的信道編碼定理指出:主要采取適當的糾錯碼,就可以在多類信道上傳輸消息,其誤碼率可以任意小。經過歷代人們的持續努力,找出了許多好的信道編碼方法,滿足許多實用要求。
在構造糾錯碼時,將輸入信息分為k位一組進行編碼。若編出的校驗位僅與本組的信息位有關,這樣的碼成為分組碼。若不僅與本組的K個信息位有關,而且與前若干組的信息位有關,則成為卷積碼。
糾錯碼能夠檢錯或者糾錯,主要靠碼字之間的差別。這可以用漢明距離d(x,y)來衡量。一種糾錯碼的最小距離d定義為該種碼中任意兩個碼字之間的距離的最小值。
一種碼要能發現n個錯誤,它的最小距離d應不小於(n+1),
一種碼要能糾正n個錯誤,它的最下距離d應不小於(2n+1)
漢明碼介紹
它是一種可以發現並且糾正一個獨立錯誤的線性分組碼,使用多余的奇偶校驗位來識別一位的錯誤。
1、把所有2的冪次方的數據位標記為奇偶校驗位(編號為1, 2, 4, 8, 16, 32, 64等的位置)
2、其他數據位用於待編碼數據. (編號為3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17等的位置)
3、每個奇偶校驗位的值代表了代碼字中部分數據位的奇偶性,其所在位置決定了要校驗和跳過的比特位順序。
位置1:校驗1位,跳過1位,校驗位數編號為:1,3,5,7,9,11,13,15,…
位置2:校驗2位,跳過2位, 校驗位數編號為:2,3,6,7,10,11,14,15,…
位置4:校驗4位,跳過4位, 校驗位數編號為:4,5,6,7,12,13,14,15,20,21,22,23,…
位置8:校驗8位,跳過8位,校驗位數編號為: 8-15,24-31,40-47,…
如果全部校驗的位置中有奇數個1,把該奇偶校驗位置為1;如果全部校驗的位置中有偶數個1,把該奇偶校驗位置為0
如下圖所示:
舉例說明:一個字節的數據 1001_1010,按照上圖所示,D[0]~D[7]填寫對應數值,D[0]寫1,D[1]寫0….,需要計算得出4個校驗位,根據上述原理可知:
C[0] = D[0] xor D[1] xor D[3] xor D[4] xor D[6] = 0
C[1] = D[0] xor D[2] xor D[3] xor D[5] xor D[6] = 1
C[2] = D[1] xor D[2] xor D[3] xor D[7] = 1
C[3] = D[4] xor D[5] xor D[6] xor D[7] = 0
最終排列出來的結果為: 011100101010 ,這個碼字代表了8位真實碼加上4位冗余碼,可以自糾正一位錯誤。也就是說,在傳輸過程中,這列碼字,無論哪一位出現位翻轉,在接收端都可以被檢測並且糾正回來。
在接收端收到此列數據,還是按照上述方法來計算,看M[0] 和 M[2] xor M[4] xor M[5] xor M[6] xor M[10] 是否相等,如果相等,則設置對於M[0]位設為0,不等則設置對應位為1.
通過這樣來計算四次,得到M[7] M[3] M[2] M[0],如果傳輸沒錯,則這四位均為0.如果某一位發生翻轉,比如M[4]發生錯誤,從0變為1,那么M[0]和M[3]的奇偶性就會計算錯誤,那么
M[7] M[3] M[1] M[0]
正確 0 0 0 0
M[4]錯誤 0 1 0 1 ==>對於接受序列中第五個數,也就是M[4]
M[7]錯誤 1 0 0 0 ==> 對於接受序列中第八個數,也就是M[7]
適用范圍
糾錯碼傳輸的都是數字信號。這既可用硬件實現,也可用軟件實現。前者主要用各種數字電路,主要是采用大規模集成電路。軟件實現特別適合計算機通信網等場合。因為這時可以直接利用網中的計算機進行編碼和譯碼,不需要另加專用設備。硬件實現的速度較高,比軟件可快幾數量級。
在傳信率一定的情況下,如果采用糾錯碼提高可靠性,要求信道的傳輸率增加,帶寬加大。因此,糾錯碼主要用於功率受限制而帶寬較大的信道,如衛星、散射等系統中。糾錯碼還用在一些可靠性要求較高,但設備或器件的可靠性較差,而余量較大的場合,如磁帶、磁盤和半導體存儲器等。
Nand Flash中的應用
由於Nand Flash工藝,不能保證Nand中Memory Array在生命周期中保持可靠性能,因此,在使用過程中,會產生壞塊,為了保證數據的可靠性,Nand Flash控制器中一般都內置了壞快管理策略。如果操作時序和電路穩定性不存在問題的前提下,Nand Flash出錯一般不會造成整個Block或Page出錯、而是整個Page中某一個或者某幾個bit出錯。
在Nand Flash的處理中,使用專用的校驗方法,ECC,它能夠糾正單比特錯誤和檢測雙比特錯誤,而且計算速度很快。以三星Flash為例子,一片Nand flash為一個設備(device),1 (Device) = xxxx (Blocks),1 (Block) = xxxx (Pages),1(Page) =528 (Bytes) = 數據塊大小(512Bytes) + OOB 塊大小(16Bytes,除OOB第六字節外,通常至少把OOB的前3個字節存放Nand Flash硬件ECC碼。
ECC一般每256個字節原始數據生成3字節ECC校驗數據,這24位的校驗數據分為6位的列校驗數據和16位的行校驗數據,剩余2位置為1,具體分布如下:
ECC行列校驗生成規則如下,和漢明碼差不多的思想:
其中,行校驗生成規則:
P8 = bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0 對所有偶數行字節的所有位進行異或操作的結果。
P8`= bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0 對所有奇數行字節的所有位進行異或操作的結果。
列校驗生成規則:
P1=D7(+)D5(+)D3(+)D1 P1`=D6(+)D4(+)D2(+)D0
P2=D7(+)D6(+)D3(+)D2 P2`=D5(+)D4(+)D1(+)D0 P4=D7(+)D6(+)D5(+)D4 P4`=D3(+)D2(+)D1(+)D0
這里面的D6,D4為所有保存的字節上對於的Bit位值。比如P4是對所有字節的Bit 4 5 6 7 進行異或操作的結果。P2是對所有字節的Bit2 3 6 7進行異或操作的結果。
經過上述計算結果的基礎上,匯總成ECC三個字節的保存布局:
當往NAND Flash的page中寫入數據的時候,每256字節我們生成一個ECC校驗和,稱之為原ECC校驗和,保存到PAGE的OOB(out-of-band)數據區中。
當從NAND Flash中讀取數據的時候,每256字節我們生成一個ECC校驗和,稱之為新ECC校驗和。
校驗的時候,根據上述ECC生成原理不難推斷:將從OOB區中讀出的原ECC校驗和新ECC校驗和按位異或,若結果為0,則表示不存在錯(或是出現了ECC無法檢測的錯誤);若3個字節異或結果中存在11個比特位為1,表示存在一個比特錯誤,且可糾正;若3個字節異或結果中只存在1個比特位為1,表示OOB區出錯;其他情況均表示出現了無法糾正的錯誤。
參考文獻:
http://blog.csdn.net/noodies/article/details/4335320
http://czhjchina.blog.163.com/blog/static/20027904720126203271790/
http://blog.csdn.net/nhczp/article/details/1700031