1. 奇偶校验
奇偶校验是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶
校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校
验“1”的个数是否为奇数,从而确定传输代码的正确性。
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
1 0110,0101
0 0110,0001
偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:
1 0100,0101
0 0100,0001
奇偶校验能够检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简单,仍得到了广泛使用。有些检错方法,具有自动纠错能力。如循环冗余码(CRC)检错等。
2. CRC校验
CRC即
(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。原理网上很多。信源多项式左移R位/生成多项式所得的余项即为CRC校验值。若算出来的值为0,则数据正确,否则错误。R是代表有多少为CRC校验数据bit。生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
3. ECC校验:Hanming码,BCH循环码等。
因为闪存中会有出错的可能,如果没有使用 ECC 模块,读出的数据和写入的数据会有不匹配的可能,也许一个文件中只有一两个 bit 不匹配,这也是不能容忍的。相对来说 SLC 中出错概率比较低,所以使用一个纠错能力不强的 Hanming 码就可以了, MLC 中 Hanming 码就显得力不从心了,在需要纠错能力更强的 RS 或者 BCH纠错方式了。
Hanming 码原理算法都不算复杂,网上应该都能找到 hdl 代码。公式:2^k - 1 > m + k;确认填充校验bit数k,然后确认1,2,4,8,16,32...位上面的为0或1,这个确认方法就是和行校验,列校验,奇偶校验,可以这样去理解会很好。可以参考我转载的blog:
【转载】Nand ECC校验和纠错原理】 RS(Reed-Solomon)应用也非常广泛,按多位的组合编码,而 BCH 按位编码,比如在 NAND Flash 中某个字节应该是 0x00,但是从 NAND Flash 读出却是 0xf0; RS只认为出现了一个错误,而 BCH 却认为出现了 4 个错误。RS 方式有着不错的突发随机错误和随机错误的能力,算是两者的折中。BCH 擅长处理随机错误,由于NAND Flash 自身的特点,出现随机错误的概率更大一些,所以在 MLC 中目前应用最多的还是BCH 方式。大家知道即使是校验错误如奇偶校验或者 CRC 校验都需要在原始信息数据的基础上增加一些额外的数据。能够纠正错误的 ECC 需要额外的数据空间保存纠错码生成的校验数据。所以在 NAND Flash 中 Page 的 1K 数据并不是 1024Byte,大多数是 1024+32Byte, 有的是更多的额外空间;额外空间越多意味着可以使用纠错能力越强的 ECC,因为对于同一 ECC 算法纠错能力越强需要的额外空间越大。对于 BCH 算法目前通常以 512Byte 或者 1024Byte 为单位处理,因为 BCH 按位处理数据,所以是 4096bit 或者 8192bit,这里的 4096/8192bit 是原始数据,BCH 需要生成一定的校验数据。下面简要介绍下原理:
设最大纠错能力为 t BIT
如果选用 4096bit 的原始数据长度,则模式为 BCH(8191,8191-13×t,t,13)
如果选用 8192bit 的原始数据长度,则模式为 BCH(16383,16383-14×t,t,14)
校验数据长度就是 13×t,或者 14×tbit,所以平均 1024+32Byte 的 MLC 大多建议使用 8bit/512Byte ECC平均 1024+45Byte 的 MLC 大多建议使用 24Bit/1024Byte ECC, 此时需要14×24bit=42Byte 的检验数据空间。
阅读(6049) | 评论(0) | 转发(1) |