Algebre booleane e progetto logico dei calcolatori digitali/Codici
Generalità
[modifica | modifica sorgente]I calcolatori elettronici, per motivi di realizzazione, utilizzano una rappresentazione interna sia delle grandezze sia dei simboli di tipo binario. A ogni numero o simbolo viene fatta corrispondere una parola binaria, cioè una successione di 0 e 1 definendo quindi un codice binario.
In generale, stabilire una corrispondenza biunivoca tra i simboli di un insieme E1 (insieme dei messaggi da codificare) e quelli di un insieme E2 (insieme delle parole-codice) è per definizione codificare gli elementi di E1 mediante gli elementi di E2.
In pratica si dice codice la corrispondenza (cioè l'insieme delle regole di traduzione) tra gli insiemi E1 e E2. Il seguito del capitolo tratta i codici (essenzialmente binari) utilizzati per la rappresentazione delle informazioni. Seguirà una descrizione dei metodi per l'addizione, la sottrazione, la moltiplicazione e la divisione decimale.
Verrà inoltre trattata l'aritmetica floating-point, i cheks di parità e i codici autocorrettori.
Codice binario puro
[modifica | modifica sorgente]Il sistema di numerazione binario, descritto nei paragrafi precedenti, costituisce uno dei procedimenti mediante i quali si può rappresentare un numero sotto forma binaria.
Si è visto però che le conversioni binario-decimali richiedono un procedimento relativamente complesse e quindi, per evitare o semplificare il più possibile questa operazione di conversione tra dati esterni e rappresentazioni interne, si ricorre in certi casi a un altro tipo di codifica binaria fornita dai codici di tipo B.C.D. (binary-coded-decimal).
Codici di tipo B.C.D.
[modifica | modifica sorgente]Il principio consiste nel codificare il numero rappresentato in base decimale, cifra decimale per cifra decimale ottenendo la rappresentazione binaria cercata accostando la codifica binaria delle varie cifre. La tabella 3.1 fornisce un esempio di codifica delle cifre decimali: si utilizza semplicemente la loro rappresentazione in binario puro prendendo il numero minimo di simboli binari, e cioè 4.
Mediante questo codice il numero decimale 1358 sarà rappresentato da:
Per codificare in binario le 10 cifre da 0 a 9 sono necessarie almeno quattro posizioni binarie, che permettono di fornire 24=16 combinazioni. Se si considera quindi un codice a quattro posizioni, si può definire un codice particolare scegliendo 10 combinazioni tra le sedici permesse per attribuirle alle cifre 0.1.2..9, in un certo ordine. Si ha che il numero dei codici di 10 cifre decimali mediante 4 posizioni binarie è dato dal numero di disposizioni di classe 10 di 16 oggetti, cioè:
In pratica però non tutti i codici così formati sono effettivamente distinti, nel senso che non consideriamo distinti due codici i quali differiscano solamente per la permutazione delle variabili, e nel circuito a uno scambio di fili.
Inoltre, nel caso che tutte le variabili siano disponibili sotto le due forme complementata e non complementata (uscita dei flip-flop, per esempio) possono ancora essere considerati equivalenti due codici che differiscono solo per la complementazione di una o più delle quattro posizioni.
Comunque, malgrado ciò, il numero dei codici distinti resta dell'ordine dei milioni.
Codici B.C.D. pesati a 4 posizioni
[modifica | modifica sorgente]Il codice utilizzato in precedenza (tabella 3.1) e cioè quello binario puro, è di tipo pesato. Se si pone:
per la cifra decimale, x0 x1 x2 x3 simboli binari della corrispondente parola-codice, si ha:
- .
Le cifre 8, 4, 2, 1 costituiscono i pesi (cioè i coefficienti da attribuire a x3, x2, x1, x0 quando si ricostruisce X mediante la (1)). Il codice della tabella 3.1, detto codice (8,4,2,1) non è che un esempio fra i tanti di codice pesato a 4 posizioni. In un tale codice, ogni cifra decimale da 0 a 9 è rappresentata da una espressione del tipo
I coefficienti Pi costituiscono i pesi caratteristici del codice considerato e si usa indicare il codice mediante la successione ordinata dei Pi: si avrà quindi il codice 8421, il codice 2421, ecc. Si hanno nella tabella 3.2 cinque esempi di codici a pesi positivi.
Notiamo che nel codice pesato (a quattro o più posizioni) ogni gruppo decimale codificato in binario può essere facilmente convertito in un segnale analogico a dieci livelli: sommando correnti proporzionali ai pesi si ottiene una corrente proporzionale alla cifra decimale considerata.
Codici B.C.D. non pesati a quattro posizioni
[modifica | modifica sorgente]Non tutti i codici sono pesati. Tra i codici non pesati a quattro posizioni, quello che viene più usato è il codice a eccesso di 3.
In questa rappresentazione, alla cifra decimale X (0≤x≤9) si fa corrispondere la rappresentazione binaria pura di X+3 (tabella 3.3)
Questo tipo di codice è di lettura meno immediata rispetto al codice 8421 per un operatore umano e si presta meno bene alla conversione numerica analogica delle cifre decimali: ma dal punto di vista della realizzazione dei circuiti aritmetici esso possiede notevoli proprietà di simmetria: in particolare il fatto di essere autocomplementare. Infatti per ogni X=(x3x2x1x0) si ha
ove C9(x) è il complemento a 9 di x: per ottenere il complemento a 9 di una cifra è sufficiente complementare in binario, cifra dopo cifra, la rappresentazione x3x2x1x0 di X. Nel caso del codice 8421 ad es., le cifre binarie di 9-x non dipendono in maniera così diretta da quelle di X.
Codici B.C.D. a più di quattro posizioni
[modifica | modifica sorgente]Codice 2 su 5. Per questi tipi di codici B.C.D., si utilizzano 5 posizioni binarie per rappresentare le 10 cifre da 0 a 9.
A tale scopo si scelgono le 10 combinazioni binarie che hanno 2 cifre su cinque uguali a 1.
La tabella 3.4 dà un esempio di codice di questo tipo, corrispondente a una permutazione delle dieci parole binarie in oggetto.
Questo non è un codice pesato. La nozione di codice pesato si generalizza facilmente al caso di qualunque numero di cifre binarie. Inoltre, affinché un codice sia autocomplementare, è necessario (ma non sufficiente) che la somma dei pesi sia uguale a 9. Anche la nozione di codice ad eccesso di 3 può essere esteso a codici di eccesso di E.
Codici a distanza unitaria
[modifica | modifica sorgente]Generalità (caso binario)
[modifica | modifica sorgente]Si dice codice a distanza unitaria un codice binario che possiede la seguente proprietà: le rappresentazioni in questo codice di due numeri consecutivi differiscono per una sola posizione. Se si definisce distanza di Hammimg D(X,Y) fra le due parole-codice X e Y il numero di posizioni differenti, si ha che dati due numeri x{i+1} e xi aventi per parole codice X{i+1}, Xi e tali che x{i+1}-xi=1, questa proprietà è espressa dalla relazione
x | X |
---|---|
7 | 0111 |
8 | 1000 |
Si ha:
Codice riflesso (Codice Gray)
[modifica | modifica sorgente]Costruzione di un codice riflesso a n ranghi binari. Questo codice è rappresentato (per 4 posizioni) nella tabella 3.5 e può essere costruito come segue:
Considerate il blocco verticale (b1) a una colonna e due righe. Scrivete al di sotto un blocco (b'1) simmetrico rispetto all'asse b1/b'1. Per il rango binario a sinistra (rango 1) porre degli zeri di fronte al blocco (b1) e degli 1 di fronte al blocco (b'1). In tal modo si ottiene un blocco (b2) a 2 colonne e 22 righe.
Scrivete al di sotto di (b2) un blocco (b'2)simmetrico e completate il rango a sinistra (rango 2) con degli 0 di fronte a (b2) e degli 1 di fronte a (b'2). Si ottiene così un blocco (b3) a 3 colonne e 23 righe.
Ripetere l'operazione di volta in volta, ecc.
Questo codice è un codice a distanza unitaria. Infatti, se un blocco (bn) è ottenuto in tale modo e possiede tale proprietà, il blocco (b(n+1)) la possiede anch'esso, perché:
- la cifra di sinistra cambia solo attorno all'asse di simmetria n mentre il resto della parola (parte destra) non cambia.
Là ove non cambia la cifra di sinistra si hanno solo i cambiamenti propri del blocco (bn) che è per ipotesi un codice a distanza unitaria.
Quindi (bn) possiede la proprietà di distanza unitaria essendo costruito a partire da (b1) per cui tale proprietà è verificata.
Formule di conversione Binario puro-Binario riflesso: si verifica facilmente che le cifre Bk in binario puro sono ottenute dalle cifre Rk in binario riflesso mediante la relazione:
mentre inversamente si ha:
Esempio: conversione del Binario puro 10110.
Con invarianza del valore scriviamo 010110, e operiamo come segue:
R4 = B5 XOR B4 = 0 XOR 1 = 1
R3 = B4 XOR B3 = 1 XOR 0 = 1
R2 = B3 XOR B2 = 0 XOR 1 = 1
R1 = B2 XOR B1 = 1 XOR 1 = 0
R0 = B1 XOR B0 = 1 XOR 0 = 1
ottenendo 11101 come conversione di 10110.
Queste formule di conversione mostrano che il calcolo dei simboli di rango k fa intervenire le quantità di rango superiore, ciò implica che la conversione ha inizio dai pesi maggiori. Questo costituisce un inconveniente in pratica in quanto negli organi di calcolo in binario puro, a causa della struttura del codice binario, le operazioni il più delle volte vengono fatte a partire dai pesi più piccoli.
La formula (1) si può però mettere sotto una forma che si presta a un trattamento per ranghi crescenti:
................................................
Nel caso che l'operazione di conversione sia eseguita con un procedimento in serie, questa formula da luogo a una semplice realizzazione: è sufficiente infatti far circolare due volte la parola in codice riflesso in un flip-flop di tipo T al cui ingresso arrivano successivamente le cifre: in uscita del flip-flop di tipo T (inizialmente a zero) si avrà la somma modulo 2 dei valori d'ingresso. La prima circolazione permette la determinazione del valore B0, mentre durante la seconda circolazione il flip-flop darà come uscite successive i simboli Bk.
Utilità dei codici a distanza unitaria
[modifica | modifica sorgente]I codici a distanza unitaria sono molto utili ogni qualvolta si vogliono evitare transizioni contemporaneamente su più posizioni. Consideriamo, ad esempio, il passaggio da 0111 a 1000 e cioè fra cifre che pur differendo di una sola unità, comportano la variazione di tutte e quattro le posizioni della rappresentazione binaria. Il passaggio, percome sono costruiti i codificatori, non avviene simultaneamente, ma attraverso gli stati scaglionati:
Quindi gli errori, riferiti al valore finale 1\000 sono rispettivamente per ogni stadio pari a 1,5,7,8,0. I codici a distanza unitaria non sono quindi soggetti a questo tipo di inconveniente.
Controllo degli errori
[modifica | modifica sorgente]I circuiti di commutazione elettronici e in particolare quelli dei calcolatori digitali non sono dotati di perfetto grado di affidabilità: si possono generare errori dovuti a cause diverse quali elementi parassiti, perdite di alimentazione, errori casuali dati da componenti oscillanti al di fuori della tolleranza, errori sistematici dovuti al cattivo funzionamento di un componente, per usura o per guasto.