本篇文章主要介绍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