Circuit pentru corectia erorilor cu coduri Hamming by nzecheru

VIEWS: 880 PAGES: 7

More Info
									Corecţia erorilor cu coduri Hamming
Nicu Zecheru

Coduri perfecte pentru corecţia erorilor
Un cod liniar (n – k) este compus din 2k cuvinte de lungime n. Numărul total de cuvinte care pot fi alcătuite din n biţi este 2n dintre care numai 2k sunt cuvinte de cod, celelalte 2 n  2 k nu apartin codului. Dacă acel cod corectează cel mult t erori atunci cuvintele din categoria ultimă pot fi:  cuvinte la distanţă de t sau mai puţin de un anumit cuvânt de cod, ceea ce înseamnă că se pot corecta t sau mai puţin biţi în acel cuvânt;  cuvinte la distanţă mai mare decât t faţă de două sau mai multe cuvinte ceea ce înseamnă că erorile pot fi numai detectate . Dacă toate cuvintele din afara codului sunt de primul tip, atunci codul este perfect. Codurile perfecte sunt capabile a corecta cele mai probabile erori din orice cuvânt recepţionat (totdeauna există un singur lider de codomeniu). Codurile perfecte garantează viteza informaţională maximă pentru corectarea a t biţi (în aceste condiţii, cuvinte de tipul al doilea nu există, de aici mai puţine cuvinte şi mai scurte). Un cod perfect care corectează t erori are cea mai mică distanţă îngăduită şi anume 2t+1. O definiţie conceptuală a unui cod perfect: un cod liniar de lungime n este perfect dacă pentru fiecare cuvânt r de lungime n există un singur cuvânt de cod la distanţă Hamming t sau mai mică faţă de r. O definiţie operaţională a unui cod perfect: numai cu cuvinte r care nu aparţin codului de tipul prim pot fi corectate t erori; astfel cei 2 nk vectori sindrom s = Hr trebuie să fie în acelaşi număr ca şi posibilele combinaţii de 1, 2, …, t – 1, t biţi eronaţi într-un cuvânt de lungime n. Aşadar, un cod liniar (n, k) este perfect dacă:
i 2 n k   Cn . i 0 t

Coduri Hamming
Codurile Hamming alcătuiesc o clasă importantă de coduri perfecte pentru corectarea unei erori. Pentru corectarea unei singure erori, t = 1, un cod perfect trebuie să îndeplinească condiţia:
i 2 n k   Cn  1  n  n  2 m  1 , i 0 t

în care s-a notat cu m diferenţa n – k. Înlocuirea duce la relaţia k  2m  m  1 .

Un cod Hamming (n, k) are lungimea cuvântului/blocului n  2 m  1 cu m  3 , are partea informaţională de lungimea k  2m  m  1 , distanţa minimă d(K) = 3 şi este capabil a corecta o eroare, adică un bit eronat. Pentru corectarea unei erori, matricea de control H trebuie să aibă toate coloanele nenule şi diferite două câte două. Pentru m linii nu pot exista mai mult de 2 m  1 coloane distincte, aşadar, n  2 m  1 . Deoarece R = k/n = (n – m)/n pentru m fixat, cu cât n este mai mare cu atât viteza este mai mare. Cazul egalităţii, n  2 m  1 , produce cea mai bună viteză de transmitere. Aşadar, un cod Hamming are matricea de control H cu m linii şi cu n  2 m  1 coloane, fiecare număr binar nenul de m cifre regăsindu-se printre coloanle matricei H. Decodarea prin sindrom a codurilor Hamming este mijlocul cel mai simplu şi mai direct de a extrage informaţia din cuvintele recepţionate. Deoarece codurile Hamming sunt coduri perfecte pentru corectarea unui bit per cuvânt, cele 2n cuvinte sunt fie cuvinte de cod, fie cuvinte care nu aparţin codului, dar care sunt cuvinte de cod cu unul din biţi corupt, modificat. În mod necesar, pentru fiecare sindrom s liderul oricărui codomeniu este unic. Procedura de decodare pentru cuvântul generic r este următoarea: 1. se calculează sindromul s = Hr ; 2. dacă s este nul atunci nu este nici o eroare, r = c este un cuvânt de cod ; 3. Dacă s este nenul atunci el coincide cu una din coloanele matricei H, de pildă cea de a i-a; se corectează bitul din poziţia i a cuvântului r şi se obtine cuvântul de cod c ; 4. se renunţă la (n – k) biţi atasaţi biţilor informaţionali în cuvântul c şi se obţine informaţia m . Se propune ca exemplu cazul codului Hamming (7, 4). Matricea lui de control are m  (n  k )  3 linii şi n = 7 coloane, izomorfe cu cele 23 - 1 numere binare nenule de trei cifre. Cuvintele care trebuie codate au k = 4 biţi. În varianta nesistematică, matricea H are înfăţişarea:

După sistematizare ea devine :

cu relaţiile de calcul al biţilor de control alături (tab. 1). Tabelul 1. Structura codului Hamming (7, 4)
Mesaje Coduri Mesaje Coduri Mesaje Coduri Mesaje Coduri 0000 00000000 0100 0100101 1000 1000011 1100 1100110 0001 0001111 0101 0101010 1001 1001100 1101 1101001 0010 0010110 0110 0110011 1010 1010101 1110 1110000 0011 0011001 0111 0111100 1011 1011010 1111 1111111

Codul (7, 4) prezentat în detaliu aici nu este singurul cod Hamming. Primele trei coduri Hamming (tab. 2), sunt capabile a detecta un bit eronat. Tabelul 2. Primele trei coduri Hamming
k 4 11 26 n 7 15 31 m 3 4 5 R 4/7 11/15 26/31

Se observă că viteza R = k/n = (n – m)/n = 1 – m/(2m – 1) tinde rapid către 1 dar cu o protecţie din ce în ce mai slabă la erori (codurile pot corecta un singur bit din 7, din 15, din 31). Probabilitatea erorii într-un bloc/cuvânt este:
0 1 Pe  1  C2m 1 p 2 1  C2m 1qp 2 2 , cu notaţiile p şi q pentru un canal binar simetric, reprezentând probabilitatea unui bit corect, respectiv probabilitatea unui bit eronat. Principiul fundamental al codurilor lui Hamming este paritatea. Codurile Hamming pot corecta o eroare sau detecta două erori, dar nu sunt capabile de a le realiza simultan. Se poate folosi ca un mecanism de detecţie al erorilor pentru depistarea erorilor singulare şi a erorilor duble, sau pentru corecţia erorilor singulare. Aceasta se poate realiza folosind mai multi biţi de paritate, fiecare compus în diferite combinaţii de biţi de date.
m m

Implementarea codurilor Hamming
Implementarea codurilor Hamming se face folosind un bloc combinaţional responsabil cu codificarea datelor numit bloc codificator, din biţi adiţionali care indică paritatea şi un al doilea bloc combinaţional responsabil cu decodificarea datelor, numit bloc decodor. Blocul codificator calculează biţii de paritate (sau de control). După caz, implementarea hard utilizează circuite SAU exclusiv, implementarea soft recurge la instructiunile XOR prezente în orice limbaj de asamblare dar şi în limbajele evoluate. Pentru a crea un cuvânt de cod se aleg poziţiile biţilor care sunt puteri ale lui 2 ca biţi de paritate (1, 2, 4, 8, 16 etc.). Fiecare bit redundant P este paritatea unui set de biţi din cuvântul de cod. Celelalte poziţii ale biţilor reprezintă data ce urmează a fi codificată (3, 5, 6, 7, 9 etc.). Fiecare bit de paritate calculează paritatea pentru anumiţi biţi din cuvântul de date. Poziţia bitului de paritate determină secvenţa biţilor care verifică şi sare alternativ. Poziţia 1 verifică 1 bit şi sare 1 bit (1, 3, 5, 7, 9, 11 etc.). Poziţia 2 verifică 2 biţi şi sare 2 biţi (2, 3, 6, 7, 10, 11 etc.). Poziţia 4 verifică 4 biţi şi sare 4 biţi (4, 5, 6, 7, 12, 13 etc.). Poziţia 8 verifică 8 biţi şi sare 8 biţi (8-15, 24-31 etc.). În cazul unui sistem FEC (Forward Error Control) decodarea necesită stabilirea şi memorarea prealabilă, pentru fiecare sindrom s, a liderului de codomeniu ec. Decodarea este apoi o căutare după indicele s într-un tabel care are 2 nk intrări. Extragerea sindromului se implementează cu circuite sau instructiuni XOR. Operaţia de căutare în tabel se implementează prin decodoare (n – k) - 2 nk şi invertoare, care fac corectarea.

Blocul decodor poate fi implementat printr-un set de porţi cu două intrări SAU EXCLUSIV. Pentru un cuvânt de 8 biţi, sunt necesare 14 porţi SAU EXCLUSIV cu două intrări pentru generarea a 4 biţi de paritate, în timp ce pentru un cuvânt de 4 biţi sunt necesare doar 3 porţi SAU EXCLUSIV pentru a genera 3 biţi de paritate (fig. 1).

Fig. 1. Arhitectura blocului decodor

Blocul decodor este mai complex decât blocul codificator, deoarece trebuie să detecteze eroarea şi să o poată corecta. În principiu este compus din acelaşi circuit logic folosit pentru compunerea biţilor de paritate plus un decodor care va indica adresa bitului eronat. Blocul decodor poate fi deasemenea compus dintr-un set de porţi SAU EXCLUSIV cu două intrări, invertoare şi porţi ŞI. Dacă toţi biţii de paritate sunt 0 cuvântul este transmis corect. Dacă cel puţin o paritate este 1 înseamnă că a apărut o inversare de biţi. Poziţia bitului inversat este calculată prin concatenare de la P3P2P1 şi citirea ca şi un număr binar unic. Codurile Hamming sunt utilizate pentru protecţia unor structuri precum registrele, seturi de registre şi memoriile. Fiecare registru protejat trebuie să aibe intrările conectate la un bloc codificator şi ieşirile conectate la un bloc decodor. Principalul avantaj al setului de registre este acela că numai un singur codificator şi un singur decodor sunt multiplexaţi pentru un set de registre, suprafaţa circuitului fiind astfel mai mică. Utilizarea blocurilor codificator şi decodor implică apariţia unor întârzieri, care sunt adăugate drumului critic. Întârzierile devin critice odată cu creşterea numărului de biţi al cuvântului ce urmează a fi transmis, ceea ce implică şi creşterea direct proporţională a numărului porţilor SAU EXCLUSIV.

Modelarea VHDL
VHDL (VHSIC Hardware Definition Language) este un limbaj de nivel înalt ce dispune de unelte de simulare şi sinteză. Pentru obţinerea schemelor logice a fost folosită familia de dispozitive Spartan2 – xc2s15, iar ca sintetizator a fost folosit XST (VHDL/Verilog). Codul Hamming pentru corecţia erorilor a fost scris folosind pachetul de programe Xilinx ISE 6 – Project Navigator 6.1i al firmei Xilinx Inc.

Descrierea codificatorul Hamming
Acest codificator Hamming este pe 4 biţi şi foloseşte alocări asemănătoare. Vectorul de ieşire este conectat la bitul individual de paritate având aceleaşi alocări.
ENTITY hamenc IS PORT(datain : IN BIT_VECTOR(0 TO 3); --d0 d1 d2 d3 hamout : OUT BIT_VECTOR(0 TO 7)); --d0 d1 d2 d3 p0 p1 p2 p4 END hamenc; ARCHITECTURE enc OF hamenc IS SIGNAL p0, p1, p2, p4 : BIT; --verificare biţi BEGIN --generare verificare biţi p0 <= (datain(0) XOR datain(1)) XOR datain(2); p1 <= (datain(0) XOR datain(1)) XOR datain(3); p2 <= (datain(0) XOR datain(2)) XOR datain(3); p4 <= (datain(1) XOR datain(2)) XOR datain(3); --conectare iesiri hamout(4 TO 7) <= (p0, p1, p2, p4); hamout(0 TO 3) <= datain(0 TO 3); END enc;

Descrierea decodorul Hamming
Acest decodor Hamming acceptă un cod Hamming de 8 biţi (produs de codificatorul descris mai sus) şi corectează erorile singulare şi detectează erorile duble.
ENTITY hamdec IS PORT(hamin : IN BIT_VECTOR(0 TO 7); --d0 d1 d2 d3 p0 p1 p2 p4 dataout : OUT BIT_VECTOR(0 TO 3); --d0 d1 d2 d3 sec, ded, ne : OUT BIT); -- iesiri END hamdec; ARCHITECTURE dec OF hamdec IS BEGIN PROCESS(hamin) VARIABLE sindrom : BIT_VECTOR(3 DOWNTO 0); BEGIN --generare biţi sindrom sindrom(0) := (((((((hamin(0) XOR hamin(1)) XOR hamin(2)) XOR hamin(3)) XOR hamin(4)) XOR hamin(5)) XOR hamin(6)) XOR hamin(7)); sindrom(1) := (((hamin(0) XOR hamin(1)) XOR hamin(3)) XOR hamin(5)); sindrom(2) := (((hamin(0) XOR hamin(2)) XOR hamin(3)) XOR hamin(6)); sindrom(3) := (((hamin(1) XOR hamin(2)) XOR hamin(3)) XOR hamin(7)); IF (sindrom = "0000") THEN --no errors ne <= '1'; ded <= '0'; sec <= '0'; dataout(0 TO 3) <= hamin(0 TO 3); ELSIF (sindrom(0) = '1') THEN – eroare singulara ne <= '0'; ded <= '0'; sec <= '1'; CASE sindrom(3 DOWNTO 1) IS WHEN "000"|"001"|"010"|"100" => dataout(0 TO 3) <= hamin(0 TO 3); -- eroare paritati WHEN "011" => dataout(0) <= NOT hamin(0); dataout(1 TO 3) <= hamin(1 TO 3);

WHEN "101" => dataout(1) <= NOT hamin(1); dataout(0) <= hamin(0); dataout(2 TO 3) <= hamin(2 TO 3); WHEN "110" => dataout(2) <= NOT hamin(2); dataout(3) <= hamin(3); dataout(0 TO 1) <= hamin(0 TO 1); WHEN "111" => dataout(3) <= NOT hamin(3); dataout(0 TO 2) <= hamin(0 TO 2); END CASE; --eroare dubla ELSIF (sindrom(0) = '0') AND (sindrom(3 DOWNTO 1) /= "000") THEN ne <= '0'; ded <= '1'; sec <= '0'; dataout(0 TO 3) <= "0000"; END IF; END PROCESS; END dec;

Concluzii
Codurile Hamming sunt utilizate pentru corecţia erorilor singulare şi detecţia erorilor duble în transmisiile de date. Suprafaţa circuitului depinde de numărul biţilor ce urmează a fi protejaţi. Implică astfel circuite logice combinaţionale adiţionale pentru implementarea blocurilor logice de codificare şi decodificare. Performanţa poate fi afectată de blocurile de codificare şi decodificare care sunt situate în drumul critic. Intârzierile sunt proporţionale cu numărul biţilor ce urmează a fi codificaţi, deoarece se măreşte şi numărul porţilor SAU EXCLUSIV din blocurile de codificare şi decodificare. Corecţia erorilor se face pentru un singur bit din cuvântul de date. Dar nu poate corecta erorile din cuvântul stocat deja. Erorile se vor acumula dacă nu există logică adiţională pentru a le corecta. Codurile Hamming sunt convenabile pentru protecţia registrelor şi memoriilor atât timp cât cuvintele de date nu sunt prea mari şi întârzierile nu constituie o problemă.

Bibliografie
1. Hentschke, R., Marques, F., Lima, F., Carro, L., Susin, A., Reis, R., Analyzing Area and Performance Penalty of Protecting Different Digital Modules with Hamming Code and Triple Modular Redundancy, Proceedings of the 15th Symposium on Integrated Circuits and Systems Design (SBCCI’02) © 2002 IEEE. Dilliner, J., DePriest, M., Hamming Code Error Detector/Decoder, EE 451 Senior Design Project Proposal, December 14, 2001. Panaitescu, Gh., Teoria Transmiterii Informaţiei. Note de curs. Kumar, N., Zacher, D., Automated FSM Error Correction for Single Event Upsets, Mentor Graphics Corporation, 118/MAPLD 2004.

2. 3. 4.

Corecţia erorilor cu coduri Hamming
Nicu Zecheru Student, specializarea Electronică Aplicată Facultatea de Inginerie Mecanică şi Electrică Universitatea Petrol–Gaze din Ploieşti
Aşa numitele coduri limiare crează biţi de corecţie a erorilor prin combinarea biţilor de date liniar. Subiectul tratat în acest articol include matrice generatoare, coduri Hamming şi implementarea acestora în VHDL.

Error Correction with Hamming Codes
Nicu Zecheru Student, Electronics Departement Mechanical and Electrical Engineering Faculty University Petroleum–Gas of Ploieşti
So-called linear codes create error-correction bits by combining the data linearly. Topics discussed in this article include generator matrices, Hamming codes and their implementation in VHDL.


								
To top