本文主旨意在講清如何根據原理構造常用的漢明碼,鑑於本人在網路查閱資料過程翻閱大量低效/無效文章,特記錄如下內容。前篇主要表明如何簡單直接的構造漢明碼,後續在了解漢明碼具體校驗原理的情況下,將會補錄有關原理的內容。
error correcting code (ecc):糾錯碼。
漢明碼(hamming code),糾錯碼的一種,通用常用於各類memory中糾正/檢測single bit,檢測double bits錯誤。根據結果型別可分為:
需要特別注意的是,以上兩種型別的漢明碼只能針對1 bit,2 bit進行檢測或者糾正1 bit錯誤,如果資料位錯誤bit數不止兩個,最終可能無法檢測出錯誤。只不過乙個檢測資料中同時出現多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]不考慮pp7位的情況下,這種方式構造得到的漢明碼一般稱為7,4漢明碼(即:7 bit漢明碼,資料位佔4 bit,校驗位佔3 bit),只能糾正/檢查1 bit錯誤。如果需要檢測2 bit錯誤,可以增加1 bit校驗位pp7,該校驗位是前述所有資料位與計算所得校驗位異或的結果,這種構造方式得到的漢明碼一般稱為8,4漢明碼(即:8 bit漢明碼,資料位佔4 bit,校驗位佔4 bit)。同時可以從原理上看出漢明碼構造的規律——某種意義上的二分法1p2 = 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]
…
。原始資料:10101,按上表拆分後可以有,
p1p21p4
010p8
p1 = 1 ^ 0 ^ 0 ^ 1 = 0所以構造得到的漢明碼為0b001101011當接收端獲取傳送端傳來的漢明碼後,利用檢驗位與構造時對應資料位再次異或得到的結果,檢測當前獲取資料是否出現bit錯誤,並根據情況進行糾正。且當獲取的新校驗值為全0,則資料未發生錯誤,或發生多bit錯誤。p2 = 1 ^ 1 ^ 0 = 0
p4 = 0 ^ 1 ^ 0 = 1
p8 = 1 = 1
假設接收到的漢明碼為0b001100011,此時接收方並不知道該資料是否正確,所以進行漢明碼的校驗操作,資料可分割為:
p1p2
d0p4
d1d2
d3p8d40
0110
0011
p1_check = p1 ^ 1 ^ 0 ^ 0 ^ 1 = 0p8p4p2p1 =0b0110 = 6,所以是第6 bit資料位發生錯誤,如果需要糾正該bit,翻轉即可獲得正確資料:0b0011010111待補充可能有人會問,為什麼針對單bit錯誤的檢測總是要強調糾錯這個事,理論上來說發現錯誤並糾正這是很正常的流程。但是,在這裡需要考慮,不是所有場景都需要做糾錯這個操作。例如:在帶i$(instruction cache)的soc中,僅僅需要向core傳遞是否出現錯誤這個訊號,這個時候core會重新從main memory中獲取該資料並傳送,極端情況下可能會重啟操作。所以,是否糾正檢測的單bit錯誤,應該是由系統設計的場景決定。p2_check = p2 ^ 1 ^ 0 ^ 0 = 1
p4_check = p4 ^ 0 ^ 1 ^ 0 = 1
p8_check = p8 ^ 1 = 0
以p16為分界線判斷出錯資料位在其左側還是右側,p8, p4, p2, p1同理。最後根據p16p8p4p2p1二進位製碼確定錯誤bit。 ↩︎
校驗碼 漢明碼 CRC碼
資料校驗碼 任意兩個碼字之間最少變化的二進位制位數,被稱為資料校驗碼的碼距 例如用四位二進位制數表示16種狀態,此時碼距為1,即兩個碼字之間最少僅有乙個二進位制不同,這種編碼沒有檢錯能力。檢糾錯能力實現原理 在編碼中,除去合法的碼字外,再加入一些非法的碼字,當某個合法的碼字出現錯誤時,就變成為非法碼...
漢明碼詳細講解
漢明碼,是r.hamming與1940年於貝爾實驗室提出的。1.奇偶校驗碼 奇偶校驗碼。假設傳輸資訊位為k n 1位,表示為a1,an 1,加上一位奇偶校驗位 冗餘位 a0,構成乙個n位的碼字a0 an 1,在接收端校驗時,可按照關係式 s a0 a1 a2 an 1來計算。若s 0,則無錯,若s ...
計網筆記 海明碼(漢明碼)
海明碼是可以發現雙位元錯誤,並可以糾正單位元錯誤的編碼方案。一般來講,檢錯編碼不一定具有糾錯能力,但是糾錯編碼具有檢錯能力 其工作流程可以分為以下四個步驟 1 確定校驗碼位數r 2 確定校驗碼和資料的位置 3 求出校驗碼的值 4 檢錯並糾錯。在以下的工作流程中,我們要傳送的資料d 101101.我們...