将8 Byte数据包扩展到512 Byte数据包,虽然数据量大大增加,但仅添加了数据分割的情况,算法仍然一样。计算所得奇偶ECC数据均为12 bit长,其中,3个低有效位代表bit地址(7~0),9个高有效位代表512Byte的地址(255~0)。
3 实验分析
本实验处理对像为256 Byte的数据包,对其进行ECC校验共生成22 bit校验数据。为方便读取,可以在末尾添加两位,形成完整的3Byte校验数据。这3 Byte共24 bit,分成两部分:6 bit的比特校验和16 bit的字节校验,多余的两个比特置1并置于校验码的最低位,在进行异或操作时此两比特忽略。
当往NAND Flash页中写人数据时,每256 bit生成一个ECC校验,称之为原ECC校验和,并保存到页的OOB数据区中;当从NAND Flash中读取数据的时,每256 bit又生成一个新ECC校验,称之为新的ECC校验和。校验时,将从OOB区中读出的原ECC校验和与新ECC校验和并执行按位异或操作,若计算结果为全“0”,则表示不存在出错,并将出错状态变量errSTATUS赋值为“00”;若结果为全“1”,表示出现1个比特错误,将errSTATUS赋值为"01”并进行纠正;除全“0”和全“1”外的其他情况将errSTATUS赋值为“10”表示出现了无法纠正的2 bit错误,如表1所示。
实验仿真环境为ALTEra Quartus II 7.0,编程语言为VHDL。VHDL语言为硬件编程语言,具有并行处理的特点,而原程序中有大量的需要并行处理的异或操作,因此程序执行效率高,非常有利于硬件实现。
图9给出了数据包发生1 bit错误的校验情况。其中,DATAin表示待读取的数据,HammingCALC表示在写入NAND Flash页时计算好的原始ECC,HAMMINGout表示后面在读取DATAin数据时计算的新的ECC,errSTATUS为出错状态,ERRIoc为计算所得出错的位置。为满足1 bit错误的条件且易于观察,将256 Byte数据(0~255)的最后一个Byte由“11110110”变为“11111110”,如图9中阴影部分所示。此时,errSTATUS结果为"01”,表明程序检测出了该1 bit错误,且ERRLOC输出为“111111111O11”,即出错位置为第255 Byte的比特3发生了错误。为纠正该错误,此时,只要将该位置的比特取反输出即可。
在原来1 bit错误的情况下,将其相邻的第254 bit的数据由“11110101”变为“01110101”,如图10阴影部分所示,整个数据包有2 bit发生了变化。此时,errSTATUS结果显示为“10”,即检测出了有2 bit错误。但此时的ERRloe无效,不能表征出两个出错的位置,也就是为什么ECC校验只能检测出2 bit错误而不能对其进行更正的原因。
当然,如果数据包没有发生任何错误,也就是若读出的数据与先前写入的数据完全一致,ECC校验也是能够保证检测出来的。如图11所示,当未发生任何错误时,errSTATUS为“00”,验证了数据的一致性。此时,ERPloe无意义。
值得说明的是,如果数据包发生的错误多于2 bit,该算法并不适宜。测定了更多比特(≥3)出错的情况,结果证明,errSTATUS的结果可能为“00”、“01”、“10”中的任何一个,也就是说在这种情况下,该算法很可能出现误检。因此,在这里,可以得出与ECC校验原理相符的结论:ECC能够保证纠正1 bit错误和检测2 bit错误,但对于1 bit以上的错误无法纠正,对2 bit以上的错误不保证能检测。
4 结束语
本文将ECC校验算法通过硬件编程语言VHDL在Ahera QuanusⅡ7.0开发环境下进行了后仿真测试,实现了NAND Flash的ECC校验功能。本程序可实现每256 Byte数据生成3 Byte ECC校验数据,且通过与原始ECC数据对比,能够保证检测出1 bit的错误及其出错位置,进一步结合对此错误的纠正,可应用于NAND Flash读写控制器的FPGA设计,实现对数据的ECC校验,确保数据准备有效地传输。经硬件实验结果反馈,该算法硬件适应性良好。
ECC是一种在NAND Flash处理中比较专用的校验,其原理简便、易于执行、计算速度快并且数据量越大,其算法越有效。但这样一个高效的算法仍存在缺陷,那就是其有限的纠错能力。本文也验证了其对于2 bit以上错误是无效的,尽管这种情况在Flash中发生的几率很低,但就校验原理来说,是否存在一种改进的算法可用于多比特错误的纠正还有待进一步研究和验证。