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 

Technorati 标签: Nand Flash ECC

时间: 2024-10-01 06:56:34

ECC校验原理以及在Nand Flash中的应用的相关文章

MPC8313ERDB从NAND FLASH中启动系统

mpc8313erdb的linux系统,存放于Nor Flash中,而Nor Flash只有8M,最近在root目录里面加了一点东西,结果Ramdisk的尺寸暴涨啊,一下子超过了4MB(Nor Flash中划分给Ramdisk的空间就只是4M),还好板子上还有32M的NAND Flash,而且原生态的,系统中也没有使用,所以在这里的思路就是这样:把uImage,Ramdisk,dtb文件都写到NAND Flash中,在uboot启动的时候,再读到内存里面,然后从内存启动. 目前我的NAND Fl

如何利用JLINK烧写U-boot到NAND Flash中

原文:http://blog.csdn.net/yanghao23/article/details/7689534  很多同学使用笔记本作为自己的ARM开发和学习的平台,绝大多数笔记本都没有并口,也就是无法使用JTag调试和烧写程序到Nand Flash中,幸好我们还有JLINK,用JLINK烧写U-boot到Nor Flash中很简单,大部分NOR Flash都已经被JLink的软件SEGGER所支持,而新手在学习的时候经常会实验各种各样的命令,最悲剧的莫过于将NAND Flash中原有的bo

Nand Flash中的SLC和MLC区别

http://wenku.baidu.com/link?url=R9hIafNFUjL7qqQSDtJLrNcP3LTMiPoSk5p-Rk230vzff9PGhWFY6k0_Yss1eJG9rfmvtB3XI0lwlRzxR9VSkbe2SoE7dvpG9zgPjcsah4W NandFlash有SLC和MLC之分,目前MLC逐步替代了SLC. SLC:Single Level Cell.即Flash每个单元中只能存储1bit数据信息. MLC:Mutiple Level Cell.即Flas

nand Flash原理

6.1.3) Block 块 一个 Nand Flash (的 chip,芯片) 由很多个块(Block)组成,块的大小一般是 128KB, 256KB, 512KB,此处是 128KB.其他的小于 128KB 的,比如 64KB,一般都是下面将要介绍到的small block的Nand Flash. 块 Block,是Nand Flash的擦除操作的基本/最小单位. 6.1.4) Page 页 每个块里面又包含了很多页(page) .每个页的大小,对于现在常见的Nand Flash多数是2KB

【详解】如何编写Linux下Nand Flash驱动

From: http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 版本:v2.2 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了

镁光256Gb NAND Flash芯片介绍

总体概述 该芯片是一款典型的大容量NAND Flash存储颗粒,支持Open NAND Flash Interface (ONFI) 2.1的接口标准,采用ONFI NANDFlash的操作协议.该芯片采用Multiple-level Cell (MLC)技术,根据不同的容量,一个芯片内部封装了多个DIE(LUN),每个DIE由两个Plane构成,一个Plane可以分成2048个Block,每个Block由256页组成,一个页的大小为8KB+448B的组织结构方式. 在性能方面,一个Page页的

NAND FLash基础概念介绍

一.引脚介绍 引脚名称 引脚功能 CLE 命令锁存功能 ALE 地址锁存功能 /CE 芯片使能 /RE 读使能 /WE 写使能 /WP 写保护 R/B 就绪/忙输出信号 Vcc 电源 Vss 地 N.C 不接 IO0~IO7 传输数据.命令.地址 1. 命令.地址.数据都通过8个I/O口传输 2. 写命令.地址.数据时,都需要将WE.CE信号同时拉低 3. 数据在WE信号的上升沿被NAND Flash锁存 4. 命令锁存信号CLE和地址锁存信号ALE用来分辨.锁存命令或地址 5. 在CLE上升沿

NAND FLASH

一. @*********************************************************************************************************************************************************************************************************************** @ File: head.s @功能:设置SDRAM,将程序

U-BOOT 对 Nand Flash 命令的支持

U-BOOT 对 Nand Flash 命令的支持 在 U­BOOT 下对 Nand Flash 的支持主要是在命令行下实现对 nand flash 的操作.对 nand flash 实现的命令 为:nand info.nand device.nand read.nand write.nand erease.nand bad. 用到的主要数据结构有:struct nand_flash_dev.struct nand_chip.前者包括主要的芯片型号.存储容量. 设备 ID.I/O 总线宽度等信息