具体实施方式
本发明提出第一实施例。参照图1,存储介质在逻辑上分为多个扇区,一个扇区包括A字节的数据和B字节的冗余,其中变量A、B为自然数,A字节通常为512字节,B字节通常为16字节或者26字节。
本实施例提出ECC数据矩阵,将存储介质中一个扇区作为一行,多个扇区分别取一个字节组成一列,形成一个矩阵称为ECC数据矩阵。参照图2,将该ECC数据矩阵的每行分为N字节的行数据区和M字节的行校验区,每列也分为J字节的列数据区和K字节的列校验区。J个行数据区和N个列数据区形成的矩阵均用于存放数据,为便于说明,将这些数据称为数据矩阵;各行校验区用于存放该行的行校验码,按照列从小到大的顺序,行校验区的每一列分别存放行校验码的一个字节;各列校验区用于存放该列的列校验码,按照行从小到大的顺序,列校验区的每一行分别存放列校验码的一个字节。
本实施例根据各行数据区中的数据,分别用BCH或RS算法进行编码得到各行的行校验码,根据各列数据区中的数据,分别用BCH或RS算法进行编码得到各列的列校验码。
上述变量N、M、J、K为自然数,根据存储介质条件选择合适的取值。
本实施例在写入数据过程中,根据数据矩阵中的数据,编码得到各行的行校验码和各列的列校验码,分别存入ECC数据矩阵的各行校验区和各列校验区中。当读取或修改该数据矩阵中的数据时,分别使用各行校验码对各行数据进行校验和/或分别使用各列校验码对各列数据进行校验。
参照图3所示的写数据流程,本实施例对ECC数据矩阵写数据流程包括:
步骤S100,缓冲系统要写入存储介质的数据,将数据暂存在RAM中;
步骤S102,判断数据是否够组成一个数据矩阵,如果不够组成数据矩阵则返回步骤S100,否则将数据组成数据矩阵,进行步骤S104;
步骤S104,对数据矩阵编码产生行校验码和列校验码;
步骤S106,判断是否完成编码,产生所有行的行校验码和所有列的列校验码,如果没有完成则返回步骤S104的编码过程,否则进行步骤S108;
步骤S108,将数据矩阵与所有行校验码和列校验码组成ECC数据矩阵,将ECC数据矩阵写入存储介质,写数据流程结束。
参照图4所示的读数据流程,本实施例从ECC数据矩阵读数据流程包括:
步骤S200,从存储介质中读取ECC数据矩阵,暂存在RAM中;
步骤S202,对ECC数据矩阵中的数据进行行校验和/或列校验;
步骤S204,判断是否已完成对ECC数据矩阵中所有数据的校验,如果末完成对所有数据的校验则返回步骤S202的校验过程,否则进行步骤S206;
步骤S206,向系统返回数据或校验结果,读数据流程结束。
参照图5所示的修改数据流程,本实施例修改ECC数据矩阵的流程包括:
步骤S300,从存储介质中读取ECC数据矩阵,暂存在RAM中;
步骤S302,对ECC数据矩阵中的数据进行行校验和/或列校验;
步骤S304,判断是否已完成ECC数据矩阵中所有数据的校验,如果未完成对所有数据的校验,则返回步骤S302的校验过程,否则进行步骤S306;
步骤S306,在RAM中修改数据,产生新数据;
步骤S308,调用上述写数据流程,将修改后的新数据写入存储介质中,修改数据流程结束。
上述读数据和修改数据流程中对数据矩阵中的数据进行行校验和/或列校验的过程如图6所示,包括:
步骤S400,使用列校验码逐列校验数据矩阵;
步骤S402,判断是否完成对数据矩阵所有列的校验,若未完成则返回步骤S400,否则进行步骤S404;
步骤S404,判断是否已纠正数据矩阵中的所有错误,若已纠正所有错误则进行步骤S412,否则进行步骤S406;
步骤S406,使用行校验码逐行校验数据矩阵;
步骤S408,判断是否完成对数据矩阵所有行的校验,若未完成则返回步 骤S406,否则进行步骤S410;
步骤S410,判断是否已纠正数据矩阵中的所有错误,若已纠正所有错误则进行步骤S412,否则进行步骤S414;
步骤S412,报告纠错成功的结果,流程结束;
步骤S414,报告纠错失败的结果,流程结束。
上述校验过程中,步骤S400至步骤S404是从数据矩阵的第一列开始,读取第一列的列校验码,再根据其列数据区中的数据编码产生列校验码,将这两个列校验码比较,若发现两个列校验码不同则说明第一列的数据有错,用列校验码对其进行纠正;然后对第二列进行同样的校验,直到完成对数据矩阵的最后一列的校验。如果有某些列中数据的错误个数少于列校验码能纠正的错误个数,则将这些错误都纠正过来,校验结果为成功;如果有某列数据的错误个数超出了列校验码的纠错能力,则保持这一列数据不变。
上述校验过程中,步骤S406至步骤S410,参照上文的列校验做法,从数据矩阵的第一行进行校验,依次校验完所有行。如果有某些行中数据的错误个数少于行校验码能纠正的错误个数,则将这些错误都纠正过来,校验结果为成功;如果有某行数据的错误个数超出了行校验码的纠错能力,则这些错误无法被校验,校验结果为失败。
上文提供了存储介质中数据校验的一种实施例,本发明基于第一实施例提出第二实施例。本实施例ECC数据矩阵的结构、行校验码、列校验码、数据操作流程与第一实施例类似,故不赘述。
本实施例将ECC数据矩阵应用到NAND闪存介质中。在物理上NAND闪存介质的组织方式一般为多个字节(byte)构成一个页(page),多个页(page)构成一个块(block)。一个块通常包含32、64或128个页,一个页至少包含一个逻辑上的扇区,即包括一组、两组、四组或更多组的A字节和B字节的组合。在典型应用中,NAND闪存介质的一个页包含1024字节+32字节,即两组512字节+16字节的组合,一个块包含128个页。
本实施例设一520列、255行的ECC数据矩阵,N取值为512,M取值为8,J取值为223,K取值为22。该ECC数据矩阵块的1~233行、1~512列形成数据矩阵存放数据,各行的513~520列为行校验区,存放该行的行校验码;各列的233~255行为列校验区,存放该列的列校验码。
当本实施例的ECC数据矩阵应用在此NAND闪存介质中的时候,具体的存储方式是每一页存储ECC数据矩阵的两行,即将1024字节+32字节分为两组 512字节+16字节的组合,每一组放ECC数据矩阵的一行,每行的基本数据放在该组的1~512字节中,行校验码放在该组的513~528字节中,上述ECC数据矩阵块的行校验区占其中8个字节,剩余字节可以空置。一个块包含128个页,可以存放256行,其中第1页~第116页存放ECC数据矩阵的1~233行,第117页~第128页存放ECC数据矩阵的233~255行,这部分是列校验区,存放列校验码。由于ECC数据矩阵块的列校验区共22行,余下的一页可以空置,实现每个块存放一个ECC数据矩阵。
本实施例也可以根据不同的NAND闪存介质芯片和ECC数据矩阵的大小改变存储方式,例如多个块放一个ECC数据矩阵,也可能一个块放多个ECC数据矩阵。ECC数据矩阵的一行可以对应闪存介质的一页、一页的部分或多个页的组合。当ECC数据矩阵的大小是NAND闪存介质一个页的倍数或者约数的时候,可以充分使用NAND闪存介质的数据操作特性,应用会比较方便。
另外,通常情况下根据NAND闪存介质的特点,N选择为512的倍数或者约数,并且当A为N的P倍时,M应满足小于等于B的P分之一,以保证NAND闪存介质的冗余区能放下ECC数据矩阵的行校验码。
参照图3所示的写数据流程,本实施例对上述ECC数据矩阵写数据流程与第一实施例类似,其中步骤S104中对数据矩阵编码产生行校验码的具体做法为:对ECC数据矩阵1行的行数据区数据编码产生22字节的行校验码,将这22个字节分别依次存储在1行的513列~520列中;同理依次处理2行、3行直到223行,对所有行数据区都产生行校验码并存储在相应行校验区中。
对数据矩阵编码产生列校验码的具体做法为:对ECC数据矩阵1列的列数据区数据编码产生8字节的列校验码,将这8个字节分别依次存储在1列的224行~255行中;同理依次处理2列、3列直到512列,对所有列数据区都产生列校验码并存储在相应列校验区中。
参照图5所示的修改数据流程,本实施例修改ECC数据矩阵的流程与第一实施例类似,参照上述读取数据的校验过程完成对所有行以及所有列的校验后,根据校验的结果返回校验失败信息或返回数据矩阵中的数据,由使用本实施例的系统在其RAM中修改数据矩阵中的数据,然后将修改后的新数据写入数据矩阵中,并参照上述写数据的过程对数据矩阵产生各行校验码和各列校验码,分别记录在各行校验区和各列校验区中。
根据NAND闪存介质的特性,本实施例提出两种修改数据的做法,第一种 是将ECC数据矩阵所在的块中的原有数据全部读出保存在RAM中,将该块全部擦除,然后将修改得到的新ECC数据矩阵以及该块中的其他原有数据重新组成一个块,写入另取的一个空块中。
第二种做法是取一空块,将修改得到的新ECC数据矩阵及其所在的块中原有数据复制到该空块中,将ECC数据矩阵所在的原块标记为数据无用,等待系统后续擦除。上述两种修改数据的做法可以相互替换使用。第一种写入方式模型简单,控制方便;第二种做法更常用、速度更高,更利于对NAND闪存介质坏块的管理。
参照图6所示的对ECC数据矩阵进行行校验和/或列校验的过程中,步骤S400,使用列校验码逐列校验数据矩阵的具体做法为:依次读取该ECC数据矩阵1列的224行~255行,将读出的8个字节组合得到1列的列校验码,再根据1列的列数据区数据编码产生列校验码,将两个列校验码比较,若发现两个列校验码不同则说明1列的列数据区数据有错,用列校验码对其进行纠正;同理依次处理2列、3列直到223列,对所有列数据区都进行校验。
同理,步骤S406,使用行校验码逐行校验数据矩阵的具体做法为:依次读取该ECC数据矩阵1行的513列~520列,将读出的22字节组合得到1行的行校验码,再根据1行的行数据区数据编码产生行校验码,将两个行校验码比较,若发现两个行校验码不同则说明1行的行数据区数据有错,用行校验码对其进行纠正;同理依次处理2行、3行直到223行,对所有行数据区都进行校验。
本发明还提出第三实施例,采用二维ECC引擎对数据矩阵编码形成ECC数据矩阵,并对ECC数据矩阵进行校验。二维ECC引擎是一种数字逻辑电路,能够读取RAM中的数据矩阵,根据数据矩阵中的数据计算出行校验码和列校验码;读取RAM中的ECC数据矩阵,根据数据矩阵中的数据计算出新行校验码和新列校验码,通过对比新校验码和原来ECC数据矩阵中存储的校验码,可以检测出坏位或坏块的位置,把坏位或坏块中的数据纠正过来。
本实施例提出根据ECC数据矩阵设计相应的二维ECC引擎,二维ECC引擎对输入的数据矩阵进行ECC编码,得到相应的ECC数据矩阵。参照第二实施例中ECC数据矩阵的典型设计,本实施例设计二维ECC引擎,对存储在RAM中的数据矩阵每一行的512字节数据进行RS(520,512)编码,得到8字节的行校验码;对512列+8列,每一列223字节的数据进行RS(255,223)编码,得到22字节的列校验码;从而得到一个520列,255行的ECC数据矩阵, 保存在RAM中。
二维ECC引擎对读入RAM中的ECC数据矩阵进行校验,如图6所示,第一实施例提出了一种对数据矩阵进行行校验和/或列校验的过程。
本实施例提出改进的循环校验过程以提高校验的能力,如图7所示,具体包括:
步骤S500,使用列校验码逐列校验;
步骤S502,判断是否完成对数据矩阵的所有列的校验,若未完成则进行步骤S500,否则进行步骤S504;
步骤S504,使用行校验码逐行校验;
步骤S506,判断是否完成对数据矩阵所有行的校验,若未完成则返回步骤S504,否则进行步骤S508;
步骤S508,判断是否在本次S500到S506的步骤中纠正了任何错误,若有纠正至少一个错误则返回步骤S500进行循环纠错,若没有纠正任何错误进行步骤S510;
步骤S510,判断是否已纠正所有错误,若已纠正所有错误则进行步骤S512,否则进行步骤S514;
步骤S512,报告纠错成功的结果,流程结束;
步骤S514,报告纠错失败的结果,流程结束。
使用二维ECC引擎将数据矩阵写入NAND闪存介质中,是将需要写入的数据暂存在RAM中;如果需要写入的数据不够填满一个数据矩阵,必须等待下次需要写入的数据,与本次需要写入的数据共同填满一个数据矩阵;或者用随机数填充,使数据足够填满一个数据矩阵;然后启动二维ECC引擎,对该数据矩阵的每一行和每一列都进行BCH或者RS编码,得到校验码,与数据矩阵组成ECC数据矩阵;然后启动闪存介质控制器,将ECC数据矩阵写入NAND闪存介质中。
使用二维ECC引擎从数据矩阵中读取数据,无论要读取的数据等于还是少于ECC数据矩阵,为了保证数据的完整无误,都需要一次把整个ECC数据矩阵读到RAM中,然后启动二维ECC引擎对ECC数据矩阵进行校验,将校验后的数据保存在RAM中。如果二维ECC引擎无法完成纠错,则报告错误无法纠正,读取数据失败。
使用二维ECC引擎对数据矩阵作修改,当需要修改的数据不超过一个ECC 数据矩阵的时候,先将整个ECC数据矩阵用上述读取数据的做法读出来放在RAM完成纠错;在RAM中修改数据得到新的数据矩阵;然后启动二维ECC引擎,重新计算出数据矩阵的行校验码和列校验码,与新的数据矩阵组成新的ECC数据矩阵,写入NAND闪存介质中。
以上述二维ECC引擎及ECC数据矩阵为例,行校验码最多能纠正每行随机4个字节的错误,列校验码最多能校验每行11个字节的错误。设某数据矩阵只有第一行有5个字节错误,因为5个字节已超出行校验码4个字节的纠错能力,只作行检验就无法对这5个字节进行纠错。但是本实施例结合列校验,第一行的5个字节分布在不同的5列中,每一列都只有一个字节错误,小于11个字节,故可用列校验码将这5列中的错误全部纠正过来,说明本实施例比单独的行校验有更强的纠错能力,能纠正更多字节的错误。
上述BCH、RS编码方式是对编码方式的统称,每一种具体的编码方式对512字节的数据编码产生的校验码的字节数也不一样,校验码能纠正的错误字节数也和具体的编码方式有关。本实施例还可以采用代数几何码,卷积码等编码方式及其结合实现校验码的编码和校验。
本发明除适用于NAND闪存介质外,还适用于AG-AND等多种闪存介质,支持MLC和4LC类的存储介质,以及多种文件系统和存储介质组织形式,数据校验方法与前述实施例类似,故不赘述。
以上所述仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。