ECC校验——汉明码(Hamming Code)

本文参考板块与链接:
https://en.wikipedia.org/wiki/Hamming_code #wiki英文版
https://zh.wikipedia.org/wiki/%E6%B1%89%E6%98%8E%E7%A0%81 #wiki中文版

前言

  本文主旨意在讲清如何根据原理构造常用的汉明码,鉴于本人在网络查阅资料过程翻阅大量低效/无效文章,特记录如下内容。前篇主要表明如何简单直接的构造汉明码,后续在了解汉明码具体校验原理的情况下,将会补录有关原理的内容。

1. 概念性解释

  Error Correcting Code (ECC):纠错码。

  汉明码(Hamming Code),纠错码的一种,通用常用于各类Memory中纠正/检测single bit,检测double bits错误。根据结果类型可分为:

  • DED (Double Error Dection):可检测双bit错误
  • SECDED (Single Error Correct Double Error Dection):可检测单bit错误(并纠正),检测双bits错误(不可纠正)

  需要特别注意的是,以上两种类型的汉明码只能针对1 bit,2 bit进行检测或者纠正1 bit错误,如果数据位错误bit数不止两个,最终可能无法检测出错误。只不过一个检测数据中同时出现多bit数据错误发生的概率特别小1,所以这种汉明码检测方式仍然是主流。

2. 汉明码构造方式

  汉明码构造可以分为两块:

  • 校验码(Parity Bit)
  • 数据位(Data Bit)

  汉明码实际是由校验码与数据位穿插而成,校验码穿插形式如下图所示(举例32bit长度数据):
汉明码构造
  可以直接看出(暂时忽略第39bit),P1, P2, P4, …等校验位依次代表0b1, 0b10, 0b100, …等特殊二进制数换算得到的位置。而数据位则根据长度依次填入序号3, 5, 7, …等位置。
 数据位D0~D31依次表明32-bit数据的每一位,校验位P1, P2, P4, …等则由已填充的数据位计算获取,直观视图如下:
汉明码逐验证码构造
  根据这张表提供的规律,可以直接构造任意数据长度的汉明码。其中:

P1 = D[0] ^ D[1] ^ D[3] ^ … ^ D[30]
P2 = D[0] ^ D[2] ^ D[3] ^ … ^ D[31]
P4 = D[1] ^ D[2] ^ D[3] ^ … ^ D[31]
P8 = D[4] ^ D[5] ^ D[6] ^ … ^ D[25]
P16 = D[11] ^ D[12] ^ D[13] ^ … ^ D[25]
P32 = D[26] ^ D[27] ^ D[28] ^ … ^ D[31]

  不考虑PP7位的情况下,这种方式构造得到的汉明码一般称为7,4汉明码(即:7 bit汉明码,数据位占4 bit,校验位占3 bit),只能纠正/检查1 bit错误。如果需要检测2 bit错误,可以增加1 bit校验位PP7,该校验位是前述所有数据位与计算所得校验位异或的结果,这种构造方式得到的汉明码一般称为8,4汉明码(即:8 bit汉明码,数据位占4 bit,校验位占4 bit)。同时可以从原理上看出汉明码构造的规律——某种意义上的二分法2

2.1 单bit检测/纠正构造举例

  原始数据:10101,按上表拆分后可以有,

P1P21P4010P8

P1 = 1 ^ 0 ^ 0 ^ 1 = 0
P2 = 1 ^ 1 ^ 0 = 0
P4 = 0 ^ 1 ^ 0 = 1
P8 = 1 = 1

  所以构造得到的汉明码为 0b001101011

3. 汉明码纠错

  当接收端获取发送端传来的汉明码后,利用检验位与构造时对应数据位再次异或得到的结果,检测当前获取数据是否出现bit错误,并根据情况进行纠正。且当获取的新校验值为全0,则数据未发生错误,或发生多bit错误。

3.1 单bit检测/纠正举例

  假设接收到的汉明码为0b001100011,此时接收方并不知道该数据是否正确,所以进行汉明码的校验操作,数据可分割为:

P1P2D0P4D1D2D3P8D4
001100011

P1_check = P1 ^ 1 ^ 0 ^ 0 ^ 1 = 0
P2_check = P2 ^ 1 ^ 0 ^ 0 = 1
P4_check = P4 ^ 0 ^ 1 ^ 0 = 1
P8_check = P8 ^ 1 = 0

  P8P4P2P1 = 0b0110 = 6,所以是第6 bit数据位发生错误,如果需要纠正该bit,翻转即可获得正确数据:0b0011010111

4. 汉明码纠错原理

  待补充

5. 补充说明

5.1 单bit错误纠正

  可能有人会问,为什么针对单bit错误的检测总是要强调纠错这个事,理论上来说发现错误并纠正这是很正常的流程。但是,在这里需要考虑,不是所有场景都需要做纠错这个操作。例如:在带I$(instruction cache)的SoC中,仅仅需要向core传递是否出现错误这个信号,这个时候core会重新从main memory中获取该数据并发送,极端情况下可能会重启操作。所以,是否纠正检测的单bit错误,应该是由系统设计的场景决定。


  1. 车规某工艺下,Memory单bit失效概率为90%,双bit失效概率为9%,剩余为多bit失效概率及decode error; ↩︎

  2. 以P16为分界线判断出错数据位在其左侧还是右侧,P8, P4, P2, P1同理。最后根据P16P8P4P2P1二进制码确定错误bit。 ↩︎

  • 38
    点赞
  • 219
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值