Sommatori binari - half adder, full adder e ripple carry
In questa pagina 6
I circuiti aritmetici binari sono circuiti combinatori che eseguono somme, sottrazioni e altre operazioni su numeri binari. Sono l'esempio tipico di circuito iterativo: la stessa sotto-funzione è ripetuta per ogni bit, e i blocchi uguali si passano dati intermedi (i riporti) che non compaiono in uscita. Si usa quindi l'approccio gerarchico (Progettazione di una rete combinatoria - approccio gerarchico e porte NAND-NORUna rete combinatoria ha uscite che dipendono solo dagli ingressi presenti (nessuna memoria, nessuna retroazione); una sequenziale dipende anche dalla storia (stato, memoria, feedback). Progetto: specifiche, tabella di verità, funzione a costo minimo, diagramma logico, verifica. Con molti ingressi si usa l'approccio gerarchico (blocchi e sottoblocchi riusabili; regolarità). Blocchi base: funzioni di una variabile, vettori, enabling. Mappatura tecnologica: in CMOS NAND e NOR sono più compatte, quindi SOP $\to$ NAND-NAND e POS $\to$ NOR-NOR.Progettazione di una rete combinatoria - approccio gerarchico e porte NAND-NOR →).
Half adder (semisommatore)
L'half adder somma due bit e e dà due uscite: la somma (il bit meno significativo del risultato) e il riporto (carry).
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
È una porta XOR più una AND. Non gestisce un riporto in ingresso.
Full adder (sommatore completo)
Il full adder somma tre bit: i due addendi e il riporto in ingresso proveniente dal bit meno significativo vicino.
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
La somma vale 1 quando il numero di 1 in ingresso è dispari: è la funzione di disparità (Mappe di Karnaugh - POS, condizioni di don't care e paritàPer la POS minima si raggruppano gli 0 della mappa, si ottiene la SOP minima di $\overline F$ e si scrive $F$ come prodotto di somme (variabile diretta se vale 0 nel gruppo, negata se vale 1). Le condizioni di don't care (X) sono combinazioni di ingresso che non si presentano o la cui uscita è indifferente: si usano come 1 o come 0 a seconda di quel che allarga i gruppi (mai raggruppamenti fatti solo di X). Le funzioni XOR a più variabili (disparità) e XNOR (parità) hanno mappa a scacchiera: non si semplificano con i gruppi.Mappe di Karnaugh - POS, condizioni di don't care e parità →), . Il riporto vale 1 quando almeno due ingressi valgono 1 (funzione maggioranza): (SOP minima: 3 implicanti primi, tutti essenziali).
Realizzazione con due half adder. Si pone (propagate) e (generate). Allora Il riporto in uscita c'è se i due bit generano un riporto da soli () oppure se propagano il riporto in ingresso ( e ). Quindi un full adder è: un primo half adder , un secondo half adder e una OR che unisce e . Equivalenza con la forma a maggioranza: (si usano e , cioè con il fattore comune raccolto).
Ripple carry adder
Per sommare due numeri di bit e si collegano full adder: il riporto in uscita di ciascuno è il riporto in ingresso del successivo, dal LSB (, di solito ) al MSB (). Il riporto si propaga (ripple = ondeggiare) lungo la catena.
Esempio: (). Si procede dal bit 0:
| bit | (in) | (out) | |||
|---|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 0 | 0 | 1 |
| 2 | 1 | 1 | 1 | 1 | 1 |
| 3 | 0 | 0 | 1 | 1 | 0 |
Somma , riporto finale ✓.
Esempio con riporto in uscita: (): le somme parziali sono tutte e i riporti : risultato con , cioè . Per numeri senza segno indica overflow (il risultato non sta in 4 bit) (Numeri con segno, complemento a 2, sottrazione e overflowSottrazione senza segno: se $M\ge N$ nessun prestito in uscita, altrimenti il risultato $M-N+2^n$ è scorretto. Complemento a 1: $2^n-1-N$ (inversione bit a bit); complemento a 2: $2^n-N=$ complemento a 1 $+1$. Numeri con segno: segno e modulo (due zeri, intervallo simmetrico) oppure complemento a 2 (un solo zero, da $-2^{n-1}$ a $2^{n-1}-1$, MSB di peso $-2^{n-1}$). In complemento a 2 somma e sottrazione sono la stessa addizione: $A-B=A+\overline B+1$, riporto in uscita scartato. Overflow: senza segno $\Leftrightarrow C_{out}=1$ nella somma; con segno $\Leftrightarrow C_{in,MSB}\ne C_{out,MSB}$ (due operandi dello stesso segno con risultato di segno opposto).Numeri con segno, complemento a 2, sottrazione e overflow →).
Un sommatore a 4 bit con riporto in ingresso ha 9 ingressi: una tabella di verità da righe sarebbe ingestibile; da qui l'utilità della struttura iterativa.
Ritardo
Ogni full adder può calcolare la propria somma solo quando riceve il riporto dal precedente: i riporti si determinano uno dopo l'altro. Se ogni porta ha ritardo , il riporto attraversa ogni stadio in circa (una AND e una OR). Il ritardo totale cresce linearmente con : circa per l'ultima somma. Il ripple adder è il più semplice e il più lento; per numeri a molti bit si usano circuiti con riporto anticipato (carry look-ahead), non trattati nel corso.
VHDL
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity fa is
port ( x, y, cin : in std_logic;
s, cout : out std_logic );
end fa;
architecture df of fa is
begin
s <= x xor y xor cin;
cout <= (x and y) or (cin and (x xor y));
end df;Sommatore a 4 bit gerarchico (structural, quattro istanze del full adder):
entity add4 is
port ( a, b : in std_logic_vector(3 downto 0);
cin : in std_logic;
s : out std_logic_vector(3 downto 0);
cout : out std_logic );
end add4;
architecture ripple of add4 is
signal c : std_logic_vector(4 downto 0); -- riporti interni
begin
c(0) <= cin;
FA0 : entity work.fa(df) port map (a(0), b(0), c(0), s(0), c(1));
FA1 : entity work.fa(df) port map (a(1), b(1), c(1), s(1), c(2));
FA2 : entity work.fa(df) port map (a(2), b(2), c(2), s(2), c(3));
FA3 : entity work.fa(df) port map (a(3), b(3), c(3), s(3), c(4));
cout <= c(4);
end ripple;Versione behavioral: non descrive il circuito ma il comportamento, e lascia al sintetizzatore la scelta dell'hardware. Realizza il sommatore come somma di tre numeri senza segno da 5 bit: i due addendi preceduti da uno '0' e il riporto in ingresso preceduto da quattro '0'; il riporto in uscita è il bit più significativo del risultato.
architecture behav of add4 is
signal cin5 : std_logic_vector(4 downto 0);
signal sum : std_logic_vector(4 downto 0);
begin
cin5 <= "0000" & cin;
sum <= std_logic_vector( unsigned('0' & a) + unsigned('0' & b) + unsigned(cin5) );
s <= sum(3 downto 0);
cout <= sum(4);
end behav;Cenni sul moltiplicatore
Come in decimale, si moltiplica il moltiplicando per ciascun bit del moltiplicatore (un prodotto di due bit è una AND) ottenendo i prodotti parziali, che si traslano e si sommano. Il moltiplicatore a 2 bit (, prodotto ) usa 4 AND e 2 half adder: Controllo con : ; con riporto ; ; → ✓ (verificato su tutte le 16 combinazioni).
Errori comuni
- Dimenticare il riporto in ingresso nel full adder (un half adder non basta per i bit centrali).
- Leggere come "risultato errato" per numeri con segno: il criterio di overflow è diverso (Numeri con segno, complemento a 2, sottrazione e overflowSottrazione senza segno: se $M\ge N$ nessun prestito in uscita, altrimenti il risultato $M-N+2^n$ è scorretto. Complemento a 1: $2^n-1-N$ (inversione bit a bit); complemento a 2: $2^n-N=$ complemento a 1 $+1$. Numeri con segno: segno e modulo (due zeri, intervallo simmetrico) oppure complemento a 2 (un solo zero, da $-2^{n-1}$ a $2^{n-1}-1$, MSB di peso $-2^{n-1}$). In complemento a 2 somma e sottrazione sono la stessa addizione: $A-B=A+\overline B+1$, riporto in uscita scartato. Overflow: senza segno $\Leftrightarrow C_{out}=1$ nella somma; con segno $\Leftrightarrow C_{in,MSB}\ne C_{out,MSB}$ (due operandi dello stesso segno con risultato di segno opposto).Numeri con segno, complemento a 2, sottrazione e overflow →).
- Credere che il ripple adder sia veloce: il ritardo cresce con .
- Confondere (bit di somma) con (riporto) nello scrivere le uscite dell'half adder.
Versione ripasso
- Half adder: , (XOR + AND).
- Full adder (, riporto ): (disparità), (maggioranza). Con , : , = 2 half adder + OR.
- Ripple carry: full adder in cascata, al LSB, al MSB; ritardo (lineare); es. , ; con (overflow senza segno). Tabella di verità a 9 ingressi: 512 righe.
- VHDL:
s <= x xor y xor cin; cout <= (x and y) or (cin and (x xor y));;add4con 4 istanze ec(4 downto 0); behavioral con sommaunsigneda 5 bit. - Moltiplicatore 2 bit: 4 AND + 2 half adder (Numeri con segno, complemento a 2, sottrazione e overflowSottrazione senza segno: se $M\ge N$ nessun prestito in uscita, altrimenti il risultato $M-N+2^n$ è scorretto. Complemento a 1: $2^n-1-N$ (inversione bit a bit); complemento a 2: $2^n-N=$ complemento a 1 $+1$. Numeri con segno: segno e modulo (due zeri, intervallo simmetrico) oppure complemento a 2 (un solo zero, da $-2^{n-1}$ a $2^{n-1}-1$, MSB di peso $-2^{n-1}$). In complemento a 2 somma e sottrazione sono la stessa addizione: $A-B=A+\overline B+1$, riporto in uscita scartato. Overflow: senza segno $\Leftrightarrow C_{out}=1$ nella somma; con segno $\Leftrightarrow C_{in,MSB}\ne C_{out,MSB}$ (due operandi dello stesso segno con risultato di segno opposto).Numeri con segno, complemento a 2, sottrazione e overflow →).
- Errori: riporto in ingresso dimenticato; come overflow con segno.
Esercizi su questo argomento
Teoria collegata
- Datapath e unità di controllo - un sistema digitale non programmabile
- Decoder, encoder e priority encoder
- Logica programmabile - ROM, PLA, PAL e FPGA
- Mappe di Karnaugh - POS, condizioni di don't care e parità
- Multiplexer e funzioni logiche realizzate con decoder e multiplexer
- Numeri con segno, complemento a 2, sottrazione e overflow
- Registri a scorrimento e contatori
- Un semplice microprocessore - datapath, ALU e register file