[計算機組成原理] 海明校驗碼
海明校驗碼是一種可以糾正一位差錯的編碼,采用分組奇偶校驗
編碼
1.計算校驗位的位數
假設信息位為k位,增加r位校驗位,構成n=k+r位海明碼。因為海明碼要糾正一位錯誤,n位每一位錯加上n位全對共n+1種狀態,用二進制編碼,r位校驗位可以表示2r個狀態,則r滿足:2r≥k+r+1
以下為幾種k和r的對應關系:
k | r最小值 |
---|---|
1~4 | 3 |
5~11 | 4 |
12~26 | 5 |
2.確定有效信息和校驗位的位置
設數據位為Di,校驗位為Pj,構成的海明碼的位置為Hk,海明碼要求第i組的校驗位必須位於2i-1的位置,比如1、2、4、8......
舉個例子,k=8,r=4
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
D8 | D7 | D6 | D5 | P4 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
3.分組
若Di=Hj,則Di參加那些位號之和(拆成2的冪)等於j的校驗位的分組校驗
舉幾個例子:
D1 在海明碼中的位置為H3,3=1+2,D1參加第一組和第二組的校驗
D2在海明碼中的位置為H5,5=1+4,D2參加第一組和第四組的校驗
D3在海明碼中的位置為H6,6=2+4,D3參加第二組和第四組的校驗
寫成二進制,規律更明顯:
數據位 | 海明碼位置 | 海明碼位置下標二進制 |
---|---|---|
D8 | H12 | 1100 |
D7 | H11 | 1011 |
D6 | H10 | 1010 |
D5 | H9 | 1001 |
D4 | H7 | 0111 |
D3 | H6 | 0110 |
D2 | H5 | 0101 |
D1 | H3 | 0011 |
P1校驗第一組,包含的數據的海明碼位置的二進制的第一位是1:D7D5D4D2D1
P2 校驗第二組,包含的數據的海明碼位置的二進制的第二位是1:D7D6D4D3D1
P3校驗第三組,包含的數據的海明碼位置的二進制的第三位是1:D8D4D3D2
P4:校驗第四組,包含的數據的海明碼位置的二進制的四位是1:D8D7D6D5
4.計算校驗位,得出海明碼
假設是偶校驗,加上校驗位使該組的1的個數為偶數,可以用異或計算
P1= D7⊕D5⊕D4⊕D2⊕D1
P2 =D7⊕D6⊕D4⊕D3⊕D1
P3=D8⊕D4⊕D3⊕D2
P4=D8⊕D7⊕D6⊕D5
算出校驗位后,按2中的位置填入相應數字,得到海明碼
譯碼
在接收端收到海明碼后,按上述分組檢驗每組的正確性,每組異或為0則該組沒出錯,否則該組出錯
S4=P1⊕ D7⊕D5⊕D4⊕D2⊕D1
S3=P2 ⊕D7⊕D6⊕D4⊕D3⊕D1
S2=P3⊕D8⊕D4⊕D3⊕D2
S1=P4⊕D8⊕D7⊕D6⊕D5
若S4S3S2S1=0000,則沒有出錯,將信息位提取出來使用
若S4S3S2S1不是全零,如S4S3S2S1=1010,則1010對應的十進制10,海明碼H10(數據D6)出錯,將H10取反即可
若十進制對應的位置是校驗位出錯,不需要糾正,因為我們只需要確保數據不出錯就可以
思考:為什么這樣分組

四位數據,r=3,海明碼H7H6...H1中,H1H2H4是校驗位,3=1+2,5=1+4,6=2+4,7=1+2+4
第一組:1 3 5 7
第二組:2 3 6 7
第三組:4 5 6 7
校驗時每組異或,計算S3S2S1,全0則沒出錯,001則第一組出錯,出錯的位是第一組獨有的那一位--第一位,剛好是001的十進制,101則1、3組錯,出錯的是1、3組共有,其他組沒有的那一位--5,剛好是101的10進制