ECC校验原理以及在Nand Flash中的应用
本篇文章主要介绍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
ECC校验原理以及在Nand Flash中的应用的更多相关文章
- NAND FLASH ECC校验原理与实现
ECC简介 由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块.为了检测数据的可靠性,在应用NAND ...
- NAND Flash中常用的纠错方式(ECC算法)
Hanming,RS,BCH —— NAND Flash中常用的纠错方式 因为闪存中会有出错的可能,如果没有使用ECC模块,读出的数据和写入的数据会有不匹配的可能,也许一个文件中只有一两个bit不匹配 ...
- 说说NAND FLASH以及相关ECC校验方法
Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将 ...
- 关于NAND flash的MTD分区与uboot中分区的理解
关于NAND flash的MTD分区与uboot中分区的理解 转自:http://blog.csdn.net/yjp19871013/article/details/6933455?=40085044 ...
- Nand Flash基础知识与坏块管理机制的研究
概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...
- nand flash详解及驱动编写
https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...
- 如何编写linux下nand flash驱动-3
[读(read)操作过程详解] 以最简单的read操作为例,解释如何理解时序图,以及将时序图 中的要求,转化为代码. 解释时序图之前,让我们先要搞清楚,我们要做的事情:那就是,要从nand flash ...
- NAND FLASH的容量、特性、市场和应用
NAND Flash的容量 一直到2006年,MLC芯片的容量每年都成倍数增长:由于NAND Flash的制程升级的挑战越来越大,所以NAND Flash之后的容量成倍增长所需要的时间也在不断增加 ...
- JZ2440 裸机驱动 第8章 NAND Flash控制器
本章目标 了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用 NAND ...
随机推荐
- NHibernate教程
NHibernate教程 一.NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦.浪费时间的.NHibernate是一个面向.Net环境的对象/关系数据库 ...
- Ubuntu下安装FTP服务及使用(以VSFTPD为例)
(一)安装与配置 (1) 安装vsftpd $sudo apt-get install vsftpd 这里会提示无法创建/home/ftp目录,手动创建一个 $sudo mkdir /ho ...
- 学了这四招,你在Linux上观看Netflix视频不发愁
导读 一份崭新的Linux发行版已经安装到你的电脑上,你完全准备好使用免费开源办公软件处理长时间的工作.但是你可能会问自己:"难道除了工作,就没有乐趣可言?我就是想观看Netflix视频!& ...
- java邮件发送 qq与163邮箱互发和qq和163邮箱发送其他邮箱实例
研究了近一天的时间,通过查阅相关资料,终于对java发送邮件的机制,原理有了一点点的理解,希望能够帮到大家! 1.首先要向你的项目里导入1个jar包:mail-1.4.4.jar即可(实现qq和163 ...
- MVC3+Linq to sql 显示数据库中数据表的数据
1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...
- 重构4-Push Down Method(方法下移)
我们介绍了将方法迁移到基类以供多个子类使用的上移方法重构,今天我们来看看相反的操作.重构前的代码如下: public abstract class Animal { public void Bark( ...
- java 解析XML文档
Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...
- MyEclipse设置编码方式 转载【http://www.cnblogs.com/susuyu/archive/2012/06/27/2566062.html】
1.windows->Preferences……打开"首选项"对话框,左侧导航树,导航到general->Workspace, 右侧Text file encoding ...
- mybatis--MapperProxy事务
上篇 详细分析了org.mybatis.spring.mapper.MapperScannerConfigurer 和 org.mybatis.spring.SqlSessionFactoryBean ...
- IOS的一些尺寸
iPhone或iTouch的宽为320像素,高为480像素, 状态栏高为20像素 toobar高为44像素 tabbar高为49像素 导航栏高为44像素 iphone分辨率参数 型号 屏幕尺寸 分辨率 ...