Salta al contenuto
Note per Studenti Esercizio 29 · codice di Hamming su 16 bit di dati

Esercizio 29codice di Hamming su 16 bit di dati

Esame
In questa pagina 7

Testo (compitino di Architettura degli Elaboratori, UniPD, del 17 novembre 2015, quesito 2, e esempio di compitino sulla prima parte, a.a. 2015-16, quesito 2). Si consideri un codice di correzione di Hamming su 16 bit. Dire quale sequenza di bit è memorizzata in memoria se si devono memorizzare i seguenti 16 bit di dati:

A. 0100111000101011, con le opzioni: a) 010011100010101111110; b) 111110110100011010010; c) 110101000111001001111; d) 010010110001011011111; e) nessuna delle precedenti.

B. 0101101011101010, con le opzioni: a) 110101110000001010111; b) 010111110101001010101; c) 010010000111011001011; d) 010111010111001011010; e) nessuna delle precedenti.

Inoltre: C. se leggendo dalla memoria la parola A si trova il bit in posizione 13 invertito, come lo si scopre e come lo si corregge?

Teoria: Codifiche binarie e informazione non numericaBit, byte e multipli (potenze di 2 e di 10); codici BCD e Gray; caratteri ASCII, Unicode e UTF-8; ordine dei byte (little e big endian); bit di parità e codice di Hamming per rilevare e correggere errori.Codifiche binarie e informazione non numerica →, Memoria principale a semiconduttoreCella di memoria e operazioni; RAM dinamica (condensatore, refresh) e statica (flip-flop), confronto; ROM, PROM, EPROM, EEPROM e flash; organizzazione dei chip e dei moduli con calcolo di linee di indirizzo e numero di chip; DRAM sincrona e DDR; errori e codici di correzione.Memoria principale a semiconduttore →. Esercizi analoghi: Esercizio 3 · bit di controllo di Hamming per un byte, Esercizio 6 · codice SEC per una parola di 16 bit.


Quanti bit di controllo

Per MM bit di dati servono KK bit di controllo con

2K−1≥M+K.2^K - 1 \ge M + K.

Per M=16M = 16: con K=4K = 4 è 15≥2015 \ge 20 falso; con K=5K = 5 è 31≥2131 \ge 21 vero. Quindi K=5K = 5 e la parola è di M+K=21M + K = 21 bit.

Disposizione dei bit

  • Le posizioni sono numerate da 1 (la meno significativa, a destra) a 21 (a sinistra).
  • I bit di controllo stanno nelle posizioni potenza di 2: 1, 2, 4, 8, 16.
  • I 16 bit di dati occupano le altre 16 posizioni (3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21), con il primo bit del dato (a sinistra) nella posizione più alta, 21 (è la disposizione per cui i risultati coincidono con le opzioni dei temi).
  • Il bit di controllo in posizione 2i2^i è lo XOR (parità pari) dei bit di dati le cui posizioni, scritte in binario, hanno il bit ii uguale a 1.

A. Dati 0100111000101011

Posizioni da 21 a 1 (le caselle CjC_j sono i bit di controllo, da calcolare):

posizione 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
contenuto 0 1 0 0 1 C16C_{16} 1 1 0 0 0 1 0 C8C_8 1 0 1 C4C_4 1 C2C_2 C1C_1

Ogni bit di controllo copre le posizioni con quel bit a 1 nel numero di posizione:

bit posizioni di dati coperte valori XOR (parità pari)
C1C_1 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 1, 1, 1, 0, 0, 0, 1, 1, 0, 0 5 uni → 1
C2C_2 3, 6, 7, 10, 11, 14, 15, 18, 19 1, 0, 1, 1, 0, 1, 1, 0, 0 5 uni → 1
C4C_4 5, 6, 7, 12, 13, 14, 15, 20, 21 1, 0, 1, 0, 0, 1, 1, 1, 0 5 uni → 1
C8C_8 9, 10, 11, 12, 13, 14, 15 0, 1, 0, 0, 0, 1, 1 3 uni → 1
C16C_{16} 17, 18, 19, 20, 21 1, 0, 0, 1, 0 2 uni → 0

Parola memorizzata (posizione 21 a sinistra):

posizione 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
bit 0 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1

010010110001011011111⇒risposta d.\texttt{010010110001011011111} \quad \Rightarrow \text{risposta d.}

B. Dati 0101101011101010

Con lo stesso procedimento i dati occupano le posizioni 21...3 saltando le potenze di 2; i bit di controllo risultano C1=0C_1 = 0, C2=1C_2 = 1, C4=1C_4 = 1, C8=0C_8 = 0, C16=1C_{16} = 1 (rispettivamente: parità dei bit 0,1,1,0,1,0,0,1,0,0, 0,0,1,1,1,1,0,1,0, 1,0,1,1,0,1,0,1,0, 0,1,1,1,0,1,0, 1,1,0,1,0). Parola memorizzata:

010111010111001011010⇒risposta d.\texttt{010111010111001011010} \quad \Rightarrow \text{risposta d.}

C. Errore in lettura

Se si legge la parola A con il bit 13 invertito, si ricalcolano le cinque parità sulla parola ricevuta (ogni parità comprende il bit di controllo stesso): ciascun gruppo ii dà 00 se è giusto e 11 se contiene l'errore. Il numero binario formato dai cinque risultati è la sindrome:

13=011012  ⇒  gruppi 1,4 e 8 errati  ⇒  sindrome=8+4+1=13.13 = 01101_2 \;\Rightarrow\; \text{gruppi } 1, 4 \text{ e } 8 \text{ errati} \;\Rightarrow\; \text{sindrome} = 8 + 4 + 1 = 13.

La sindrome è la posizione del bit sbagliato: basta invertire il bit 13 per correggerlo. Se l'errore fosse in un bit di controllo (per esempio la posizione 8), la sindrome sarebbe 8 e si invertirebbe il bit di controllo; sindrome 00 significa nessun errore (con un solo errore alla volta).

Verifica con un programma

python
def hamming(dati):
    """Codice SEC: dati MSB per primo, posizioni 1..n con il bit 1 a destra, check bit nelle potenze di 2."""
    m = len(dati)
    k = 0
    while 2 ** k < m + k + 1:
        k += 1
    n = m + k
    pos_dati = [p for p in range(n, 0, -1) if p & (p - 1)]       # posizioni non potenza di 2, dall'alto
    parola = {p: int(b) for p, b in zip(pos_dati, dati)}
    for i in range(k):
        p = 2 ** i
        parola[p] = sum(v for q, v in parola.items() if q & p and q != p and q & (q - 1)) % 2
    return parola, n

def stringa(parola, n):
    return "".join(str(parola[p]) for p in range(n, 0, -1))

def sindrome(parola, n):
    s, i = 0, 0
    while 2 ** i <= n:
        s |= (sum(v for q, v in parola.items() if q & 2 ** i) % 2) << i
        i += 1
    return s

pa, n = hamming("0100111000101011")
print(stringa(pa, n))                    # 010010110001011011111
pb, _ = hamming("0101101011101010")
print(stringa(pb, n))                    # 010111010111001011010

print(sindrome(pa, n))                   # 0: parola corretta
pa[13] ^= 1                              # errore nel bit 13
print(sindrome(pa, n))                   # 13: posizione del bit errato
pa[13] ^= 1
pa[8] ^= 1                               # errore in un bit di controllo
print(sindrome(pa, n))                   # 8

Errori comuni

  • Sbagliare il numero di bit di controllo: la condizione è 2K−1≥M+K2^K - 1 \ge M + K (con K=4K = 4 si avrebbe 15≥2015 \ge 20, falso): per 16 bit di dati sono 5, non 4.
  • Mettere i bit di controllo in fondo o in testa invece che nelle posizioni potenza di 2.
  • Numerare le posizioni da sinistra: le posizioni (e i gruppi di parità) si contano da 1 a destra; in una stringa scritta con la posizione 21 a sinistra il bit C1C_1 è l'ultimo a destra.
  • Usare parità dispari invece di pari (le opzioni sono tutte a parità pari).
  • Dimenticare che ogni bit di controllo copre solo le posizioni con il proprio bit a 1.

Versione ripasso

Compitino del 17 novembre 2015 e esempio di compitino a.a. 2015-16: Hamming su 16 bit di dati. Teoria: Codifiche binarie e informazione non numericaBit, byte e multipli (potenze di 2 e di 10); codici BCD e Gray; caratteri ASCII, Unicode e UTF-8; ordine dei byte (little e big endian); bit di parità e codice di Hamming per rilevare e correggere errori.Codifiche binarie e informazione non numerica →.

Bit di controllo: 2K−1≥M+K2^K - 1 \ge M + K; M=16M = 16 → K=5K = 5, parola di 21 bit. Posizioni numerate da 1 (a destra) a 21; controllo in 1,2,4,8,161, 2, 4, 8, 16; dati nelle altre, il primo bit del dato nella posizione 21.

Parità: il controllo in posizione 2i2^i è lo XOR (parità pari) dei dati con il bit ii della posizione a 1.

  • A. 0100111000101011 → C1=1C_1 = 1, C2=1C_2 = 1, C4=1C_4 = 1, C8=1C_8 = 1, C16=0C_{16} = 0 → 010010110001011011111 (d).
  • B. 0101101011101010 → C1=0C_1 = 0, C2=1C_2 = 1, C4=1C_4 = 1, C8=0C_8 = 0, C16=1C_{16} = 1 → 010111010111001011010 (d).

Correzione: si ricalcolano le parità sulla parola ricevuta; la sindrome (numero formato dai gruppi errati) è la posizione del bit sbagliato (errore nel bit 13 → 8+4+1=138 + 4 + 1 = 13); sindrome 0: nessun errore.

Errori comuni: K=4K = 4; controllo non nelle potenze di 2; posizioni numerate da sinistra; parità dispari; copertura di tutte le posizioni invece di quelle con il proprio bit a 1.

Teoria collegata