L'unità aritmetico-logica, nota come ALU (arithmetic-logic unit), è un circuito combinatorio che racchiude le funzionalità di calcolo principali di un CPU. Complessivamente si tratta dell'unione di più circuiti combinatori, ognuno dei quali compie un solo tipo o pochi tipi di calcoli; tale complesso si ottiene attraverso l'uso opportuno di multiplatori per selezionare il risultato a cui si è interessati.
Negli esempi, dove possibile, si suddivide il lavoro in moduli da 8 cifre binarie; inoltre, le varie componenti vengono realizzate in modo che possano operare con ranghi differenti di bit: 8, 16, 24 e 32.
Quando opportuno, devono essere fornite informazioni aggiuntive sui risultati dei calcoli, cosa che si fa normalmente attraverso degli indicatori, costituiti in pratica da delle uscite aggiuntive. Gli indicatori più comuni sono: riporto, zero, segno e traboccamento.
|
La verifica del risultato pari a zero può essere fatta poco prima dell'uscita dell'ALU, con l'ausilio di una porta NOR, la quale produce un risultato solo quando nessun ingresso è attivo; allo stesso modo, si determina facilmente il segno del risultato (ammesso che il contesto consideri la presenza di un segno), controllando il valore del bit più significativo.
Volendo gestire, a seconda dei casi, interi con rango diverso, si può utilizzare quanto già visto nella figura precedente, in forma di modulo, costruendo un sistema un po' più complesso.
I moduli che vengono presentati nelle sezioni successive, consentono di operare su valori a 32 bit, con la possibilità di limitare l'intervento a ranghi inferiori (ma sempre multipli di otto). I risultati che si ottengono sono validi solo nell'ambito del rango selezionato, ma ci possono essere dei contenuti ulteriori, da ignorare, nei bit più significativi oltre al rango voluto. Il modulo successivo, consente di filtrare opportunamente ciò che è al di fuori del rango desiderato, con la possibilità di estendere il segno, in modo da non creare confusione, o comunque per ridurre la possibilità di errori.
Per la moltiplicazione e la divisione, si rende necessario un modulo in grado di invertire il segno di un numero binario. Il modulo minus8
interviene su 8 bit e serve per realizzare moduli di rango maggiore.
La figura successiva mostra un modulo da 8 bit per la somma e la sottrazione, gestendo opportunamente il riporto o la richiesta di prestito di una cifra e fornendo l'informazione sull'eventuale traboccamento, confrontando gli ultimi due riporti.
La figura successiva mostra un modulo per lo scorrimento logico e aritmetico su 8 bit. Gli ingressi e le uscite lin, lout, rin, rout (left/right in/out), servono a produrre lo scorrimento e anche la rotazione su una scala multipla di 8 bit. Le uscite Cl e Cr (carry left/right) riproducono sempre il valore del bit che viene sospinto all'esterno (dal lato sinistro o dal lato destro), mentre l'uscita O (overflow) si attiva solo in presenza di un traboccamento, dovuto a uno scorrimento aritmetico a sinistra che fa cambiare di segno al valore.
La comparazione tra due valori consente di determinare se questi sono uguali o se uno dei due sia maggiore. Il modulo cmp8
esegue una comparazione di valori senza segno, attivando un'uscita differente a seconda dei tre casi possibili: a>b, a<b, a=b.
Il modulo cmp8
può essere utilizzato per il confronto di valori espressi su una quantità multipla di bit; in tal caso, si può introdurre il controllo sul segno: se i valori da confrontare si intendono con segno, se i segni dei due valori sono discordi, l'esito del confronto va invertito. Il modulo cmp32
confronta due valori a 32 bit, restituendo l'esito del confronto in forma di valore a 32 bit: zero se i valori sono uguali; +1 se A>B; -1 se A<B.
Il modulo cmp32
non consente di ridurre il rango di bit preso in considerazione nel confronto; pertanto, se si desidera poter controllare il rango, occorre aggiungere il filtro del modulo rk
(figura u127.5), come si vede nella figura successiva.
Come già descritto in precedenza, per la moltiplicazione ci si avvale di un modulo apposito che somma il risultato dell'operatore AND sui due valori in ingresso. Viene richiamato nella figura successiva.
Per la moltiplicazione viene proposto il modulo mul8
, a 8 bit, con tutte le connessioni necessarie a collegarlo ad altri moduli uguali, per realizzarne di più grandi in forma compatta.
Dato che il modulo mul8
è abbastanza complesso a causa delle connessioni di cui dispone, nella figura successiva si vede come potrebbe essere utilizzato da solo, per numeri a 8 bit.
Per procedere gradualmente, si vede anche come potrebbe essere sviluppato un modulo a 16 bit, per il quale servono quattro moduli mul8
.
Per la divisione ci si avvale di un modulo che esegue la sottrazione del divisore dal dividendo, in fasi successive. Il modulo in questione è già apparso in precedenza nel capitolo, ma viene ripresentato per maggiore comodità.
Per unità logica si intende quella che esegue operazioni booleane, bit per bit, su valori interi espressi in forma binaria. Di solito le operazioni disponibili sono poche (AND, OR, NOT, XOR), ma nell'esempio della figura successiva appaiono tutti i casi già descritti nella tabella u126.4, anche se ciò può essere superfluo.
Nella figura successiva viene proposta una, ALU completa di tutti i moduli descritti in questo gruppo di sezioni. Valgono le osservazioni seguenti:
i moduli della rotazione sono gestiti come se fossero uno solo, in cui la funzione di rotazione con o senza riporto avviene in base alla selezione del tipo di scorrimento; inoltre, sia per lo scorrimento, sia per la rotazione, è possibile scegliere su quale ingresso intervenire;
per risolvere in qualche modo il problema del risultato della moltiplicazione, che occupa 64 bit, si è scelto di selezionare quale porzione del risultato si vuole ottenere, anche se ciò comporta in pratica un raddoppio del tempo necessario alla moltiplicazione, perché ogni volta il calcolo viene ripetuto;
i moduli pescano dalla linea dell'ingresso F (function) i bit che gli servono per adeguare il proprio comportamento, tenendo conto che i primi quattro bit di F servono ai multiplatori che selezionano le uscite da prelevare, mentre i quattro bit più significativi sono quelli che sono affidati ai moduli rispettivi.
Si comprende che si tratta di una soluzione che non è ottimale dal punto di vista delle prestazioni, avendo soltanto uno scopo dimostrativo.
«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net