ABB PM866K02 3BSE050199R1
评价存储器的一个重要指标就是它的可靠性,在一般的数据存储中,几个位的错误可能不是很关键的问题,如果但是发生在某个敏感的数据上,这个小小的故障可能会导致严重的后果。因此,必须采取一些措施来及时检出并纠正出错的数据。目前常用的方法有:奇偶校验、CRC校验、重复码校验等。
ECC校验是在奇偶校验的基础上发展而来的,它将数据块看作一个矩阵,利用矩阵的行、列奇偶信息生成ECC校验码。它能够检测并纠正单比特错误和检测双比特错误,但对双比特以上的错误不能保证检测。它克服了传统奇偶校验只能检出奇数位出错、校验码冗长、不能纠错的局限性。文中在高速大容量固态存储器的硬件结构基础上,详细介绍了ECC校验码的生成规则以及ECC校验流程,并用C语言和VHDL语言两种方法实现了该算法。
1 存储器的硬件结构及芯片介绍
本存储器是以FPGA为控制核心,用64片Flash芯片构成存储阵列,采用CPCI接口实现数据的高速率存储。Flash存储阵列分为16组,每组4片,每组Flash芯片共用数据和控制总线。该存储器的硬件结构图,如图1所示。
存储器的硬件结构图
存储板上的存储芯片用的是Samsung公司的高速大容量固态存储芯片K9W8G08U1 M Nand Flash Memory,其容量为1 G×8 bit,分为8 192个块,每个块又分为64页,1页有(2 k+64)Byte,其中一页有64 bit的空闲区。存储板上的控制芯片是Ahera公司的***FPGA芯片EP3SE110F1152***,它负责数据的缓冲和整个存储器的时序控制,并负责以页为单位生成校验码,并把校验码存人到页的空闲区内。下面以1页2 048 bit为单位介绍校验码的生成以及校验流程。
2 EGG算法分析及校验流程
2.1 EGG校验码生成规则
Flash在读写数据的时候是以页为单位进行的,一页有2 048个数据,所以可以以2 048 bit为单位生成校验码。每个数据有8位信息组成,可以把这2 048个数据看成2 048×8的矩阵,这样就可以分别生成行校验码和列校验码来分别校验。ECC校验中,每2 048个数据生成4个字节的校验码,这32位的校验码分成3个部分:6位的列校验信息,22位的行校验信息,其余的4位置1,ECC校验码组成,如表1所示。
ECC校验码组成
其中P4_l,P4_2,P2_1,P2_2,P1_1,P1_2是列校验码,而P8_1,P8_2,P16_1,P16_2,P32_1,P32_2,P64_1,P64_2,P128_1,P128_2,P256_1,P256_2, P512_1,P512_2,P1024_1,P1 024_2, P2 048_1, P2 048_2, P4 096_1,P4096_2,P8192_1,P8192_2是行校验码。行列校验码生成表,
这里xor表示异或操作。
因为发生错误的数据位在该数据块中的字节的偏移量为
程序
发生错误的数据位在所处的字节中的位偏移量为P4_1,P2_1,P1_1
所以根据字节的偏移量和字节中的位的偏移量即可确定该页数据中哪一位发生了变化。
2.2 ECC校验流程
当向NAND Flash的页中写入数据的时候,每2 048 bit生成4 bit的ECC校验码,称之为写ECC校验码,保存到每一页的空闲数据区中。
当从NAND Flash中读取数据的时候,每2 048 bit生成4 bit的ECC校验码,称之为读ECC校验码。校验的时候,根据上述ECC生成原理不难推断:将从页空闲区中读出的写ECC校验码和读ECC校验码按位异或,若结果为0,则表示不存在错;若4 bit的异或结果中存在14 bit为1,表示存在1 bit错误,且可纠正;若4个bit的异或结果中只存在1 bit为1,表示空闲区中的校验码出错;其他情况均表示出现了无法纠正的错误,校验流程图,如图2所示。
3 ECC算法的实现
3.1 C语言实现ECC算法
以一页数据2 048个字节作为测试数据产生ECC校验码,数据是000~0FF,循环8次产生2048个数据,数据序列,如图3所示。
按前面的ECC校验码生成规则,2 048个数据应该生成4个校验码,生成的校验码,如图4所示,其中ecccode1,ecccode2,ecccode3,ecccode4是生成的4个校验码。
2 048个数据应该生成4个校验码
现在假设读出的数据中有一位数据发生了翻转,出现了一位数据错误的情况,即假设数据的第2 bit的***低位发生了翻转,0×0l变成了O×00,此时读出的数据序列,如图5所示。
读出的数据序列
读出数据生成的ECC校验码
3.2 利用VHDL语言实现EGG算法
文中以000~OxFF循环8次产生2 048个数据,利用VHDL语言编程,在QuartusII7.2下进行了仿真,得到了如图7所示的校验码。其中ecccodel =00000000,ecccode2=00000000,ecccode3=11000000,ecccode4=000000ll是生成的4个校验码,从图中可以看到利用VHDL语言得到的校验码和用C语言得到的ECC校验码是相同的。
VHDL语言生成的ECC校验码
4 结束语
文中介绍了ECC算法的一种实现方法,说明了ECC的校验流程,***后用两种方法实现ECC校验算法。ECC校验算法简单,软硬件均能实现,它能够检测并纠正单比特错误和检测双比特错误,所以可以为数据存储和通信系统提供一种强有力的差错检测手段。
SKF LTA2350400TN2505BL
SKF 332168
***AC LAR35-025-55MVS
SKF 7030BGM
SKF NU1048
SKF 6048MC3
HIWIN LMH1L-S27-1-0600-D100
SKF 23038CCW33
THK SHS65-1700LK
***AC LAC-25
TIMKENJHH221413
SNFA E295A7CE3
RHP B7016X2TADULEP7
SKF 7024BGM
TIMKEN JM738249
***C LXFH5SA-25S-Q
SKF 23126CCC3W33
Rexroth R036437004
Rollway 23032CAW33
TIMKEN JHM534149-99401-0
SCHUNK OSE-C57-830024638
Bosch PSK60-10-115-MPL-B1520U
PI M-2355DGX
FAG 22224EAS-M-***
SNR 6330MJ30
SKF 29320E
INA DKLFA25902RS
NSK W1505FA-7PG-C5Z20
SKF 6228
FAG NU221 E-M1-C3
SKF 22318E
Fafnir 2MM205WI
RHP 7013ETSULP4
FAG NUP2220E-TVP2
INA RWU45-E-L-G2-V3
SKF 22317E
INA NKI14032
FAG B7018
STAR 0612-080-10
APB NCF2926V
SKF 21315E/***
SKF 22314E
TIMKEN 2768920061122
NSK 50BER10STYNV1VS-01
Rexroth R153040629
INA G3V1031456901
INA G3V2034315020
FAG B7011CTP4SUL
APB NCF2924VX
Rexroth R153040629
Rexroth R151002152
NSK 7315BWG
NSK H68060730000
Bosch R162432420
Bosch R162252310
Festo DGPL-8-200-PAKFB
Thomson 511P35B1
INA KWVE25-B-L-V1-G3
FAG 22217-E1
INA KWVE35BLUG
INA KWVE35BSL
NSK LAH30GMCYKCZKKNA
NSK LAH35GMCYKCZKKNA
SKF 6222
SKF 6318C3
Rollon DEF22530130109
Nadellager NA6915-ZW-XL
SKF BB1-3508
Bosch 3841051230
RHP 7908CTSULP4
RHP 7908ETSULP5
IBC 6207TBP4A2H
Garlock 24130-030-1-5947
afag DM16 SD
SKF BS2-2212-2CS
FAG 22213ESK-TVPB
SKF 30218 J2
SKF SNL 513-611
NACHI E32022J
INA KGNOS-25B-PP-AS
FAG NU2213E-TVP2
FAG B71903E.T.P4S.UL
Rexroth R162381320
SKF NU1012MA
Schrägkugellager 7213BTVPUL
Schrägkugellager 7210BTVPP5UO
STC 21308CCW33
Bosch R162222222891
SKF 6020-2RS1
Nadellager NA4914R
SKF 731BECBPOVP
SLF 7210BTVPP5UO
INA IR110X125X40
Nadella GC30EE
STAR 1067-625-40
Nippon FK92520
INA NATV20-PP-A
SKF 618112RS1
INA RNA6912
FAG 33009
SKF E-2RS1TN9
MISUMI LHMSW16
SKF LBCR30A-2LS
SKF LBCD30A-2LS
SKF 61907-2RZ
IBC 6013
SKF 61807-2RZ
Rexroth 0611-040-10
INA RAE35-NPP-FA106
INA KR30PP
NSK 6907VVCM***2S003
SKF NATV20PPXA
ASKUBAL GE30UK2RS
Hydac 0060D003BNHC2
MISUMI LMUMF13
Tretter NB01-010
Nadella CP6100135
SKF 6211ZC3
SKF 7202BEP
SKF SY20TF
IBC 3203E2ZJHC2
Tretter NB00-012
IBC 60102RS
SKF 62092Z
IBC 6208P5
IBC 6304
STC 6011
INA RLBSR710100
FAG 7202B2RSTVP
FAG 7201BTVP109694
SKF TSN511G
SKF 61805-2RZ
SKF 6007-2
STC 6306
SKF 6006-2RS1
SKF 6206-2Z
INA HK4512B
SKF FRB10120
SKF 6006-2RS1
IBC 6004Z
SKF 6004-2RSH
IBC 6200Z