Circuiti logici che implementano funzioni matematiche
Circuiti logici che implementano funzioni matematiche
Sommatori:
-half-adder, prendono in ingresso due bit, A e B, li sommano e danno in uscita la somma e il riporto.
-full-adder, prendono in ingresso tre variabili A, B e C_in e danno in uscita la somma e il riporto.
Innanzitutto vedremo come progettare un half-adder, dopo di che useremo gli half-adder per costruire un full-adder e infine andremo a effettuare somme e sottrazioni tra più bit in una unità aritmetico logica da noi progettata.
Half-adder

Per compilare la tabella di verità basta calcolare la somma e il riporto di A e B per ogni riga e scrivere la somma nella colonna "somma" e il riporto nella colonna "C_out" (A e B sono gli ingressi quindi gli compileremo con la tecnica che prevede di scrivere tutti i numeri esprimibili con due bit cambiando riga per ogni numero, notare 00 01 10 11 nelle prime due colonne). A questo punto non è necessario ricorrere alla mappa di Karnaugh in quanto con due variabili è già abbastanza agibile la tabella di verità. Notiamo che l'unica volta in cui C_out vale 1 è quando A e B sono veri entrambi dunque C_out=AB e che la somma vale 1 solo nel caso in cui A e B sono diversi dunque poniamo somma=A XOR B.



Unità aritmetico logica
Un unità aritmetico logica (ALU) è un circuito con due ingressi dati (che possono essere formati da più di un bit), un ulteriore ingresso che determina l'operazione che deve essere effettuata e un'uscita per il risultato, un'uscita per un eventuale segnale di overflow e/o di segno e/o di riporto. Impareremo innanzitutto a usare i full hadder in parallelo per sommare dati formati da più di un bit per poi ragionare su come costruire reti capaci di eseguire le altre operazioni e infine progettare la nostra ALU.
Sommare numeri binari con i full hadder
Per effettuare una somma tra due numeri basta usare un full hadder per ogni bit ponendo al primo full hadder C_in=0 e dal successivo C_in k=C_out k-1, ovvero colleghiamo il C_out di ogni full hadder all'ingresso C_in del successivo, l'uscita C_out dell'ultimo full hadder sarà il riporto della somma e i bit di somma in uscita da ogni full hadder costituiscono la somma tra i due dati.

Il circuito sommatore a n bit potrà rappresentare con successo risultati con valori compresi tra 0 e 2^n
Sottrarre due numeri binari
Utilizzeremo un circuito che effettua A-B come A+(-B) dove -B viene espresso tramite il complemento a 2 e sommato ad A. Per fare questo basta negare tutti i bit di B in ingresso a un sommatore e sommare 1 al risultato di A+B. Per sommare 1 al risultato ci basterà impostare C_in=1.

La rete combinatoria per effettuare la sottrazione potrà rappresentare con successo risultati compresi tra -2^(n-1) e 2^(n-1)-1 in quanto il bit più significativo viene utilizzato per la rappresentazione del segno del risultato.
Circuito sommatore/sottrattore
Per prima notiamo che sia il sottrattore che il sommatore sono costruiti attraverso 4 full hadder. Nel sommatore effettuiamo A+B con C_in=0 e nel sottrattore A+(-B) ottenuto come A+B' con C_in=1
Ci servirà dunque port scegliere se dare in ingresso B o B' e se dare in ingresso C_in=0 0 C_in=1, faremo questo grazie alla conoscenza del multiplexer collegando all'ingresso 0 del MUX il dato B e all'ingresso 1 B', cosi facendo collegando lo stesso bit di controllo sia al selettore del multiplexer che all'ingresso C_in del full hadder otteniamo che in corrispondenza del bit di controllo 1 si effettua la sottrazione (il multiplexer fa passare B' e C_in=1) mentre in corrispondenza del bit di controllo 0 abbiamo la somma.

Ora dotiamo il nostro circuito sommatore/sottrattore di un bit di overflow. Ricordiamo che si ha overflow quando si sommano due numeri positivi e si ottiene un numero negativo come risultato o quando si sommano due numeri negativi e si ottiene un numero positivo. Il bit che stabilisce se un numero è positivo o negativo è quello più significativo, sarà 1 per i numeri negativi e 0 per i positivi. Overflow= A3B3R3'+A3'B3'R3. Il primo mintermine indica la situazione in cui A e B sono negativi mentre R è positivo e il secondo indica la situazione A e B positivi e R negativo.

Ricordiamo che in complemento a 2 i numeri rappresentabili con n bit vanno da -2^(n-1) a 2^(n-1)-1 in quanto un bit viene utilizzato per il segno. Nel caso del sommatore sottrattore in figura, abbiamo dati da 4 bit dunque potremo rappresentare valori da -8 a +7 e incorreremo in overflow ogni qualvolta il risultato della nostra operazione non sia compresa tra questi valori.
Moltiplicare numeri binari
Prendiamo spunto dal algoritmo con cui facciamo le operazioni in colonna.

In un prodotto tra numeri di n bit per compilare la tabella basta scrivere a partire da destra per ogni riga n volte l'elemento i del secondo fattore a partire dalla colonna i. Per ogni colonna j (contate da destra verso sinistra) invece aggiungeremo alle caselle gli elementi dal j allo 0 del primo fattore a partire dall'alto verso il basso fino a occupare le caselle.
Nell'esempio precedente infatti abbiamo scritto B0 per 4 volte nella riga 0 a partire dalla colonna 0, B1 4 volte nella riga 1 a partire dalla colonna 1 etc.. poi abbiamo messo A0 nella colonna 0, A1 e A0 nella colonna 1 a partire dall'alto verso il basso, A2 A1 e A0 nella colonna 2 a partire dall'alto verso il basso... nella colona 5 avremo dovuto mettere A3 A2 A1 e A0 ma esauriamo le caselle per tanto ci fermiamo con A2.
Ora P=(p7,p6,p5,p4,p3,p2,p1,p0) è il risultato del prodotto A*B. Per come abbiamo definito le regole per la moltiplicazione viene fuori che moltiplicando dei dati da n bit il risultato avrà 2n bit, P=(p2n, p2n-1,...,p0). Ora se poniamo A e B come dati da 2n bit e consideriamo nulli tutti i bit dall'n-ennesimo, ponendo inoltre C_out-1=0 possiamo scrivere per ogni Pi

Tp=(Tphl + Tplh)/2
Consideriamo come ritardo totale del circuito il tempo di propagazione della generica porta moltiplicato per il numero di livelli logici, cosi facendo calcoliamo il tempo di propagazione del segnale che dovrà incontrare più porte nel suo percorso .
-Il tempo di propagazione alto-basso è definito come il tempo che intercorre tra l'istante in cui l'ingresso raggiunge, in salita, il 50% del valore alto e l'istante in cui l'uscita raggiunge, in discesa, il 50% del valore alto.
-Il tempo di propagazione basso-alto è definito come il tempo che intercorre tra l'istante in cui l'ingresso raggiunge, in discesa, il 50% del valore alto e l'istante in cui l'uscita raggiunge, in salita, il 50% del valore alto.
-Tempo di salita, è il tempo in cui in una transizione basso-alto l'uscita passa dal 10% al 90% del valore alto
-Tempo di discesa, è il tempo in cui in una transizione alto-basso l'uscita passa dal 90% al 10% del valore alto