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 |
Formula (half adder)
Esempio. Con : e , cioè .
È 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 |
Formula (full adder: somma e riporto). 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).
Esempio. Con : e (); con : e ().
Formula (full adder con propagate e generate). Si pone (propagate) e (generate). Allora
Esempio. Con : , , e .
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
Definizione (sommatore ripple carry). 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
Formula (ritardo del sommatore ripple carry). 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.
Esempio. Con bit e l'ultima somma arriva dopo circa .
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
- Circuito iterativo: la stessa sotto-funzione si ripete per ogni bit e i riporti passano da un blocco al successivo; è un caso dell'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 (): (bit meno significativo), (riporto). Una XOR e una AND; non ha riporto in ingresso. Esempio: .
- Full adder ( e riporto in ingresso ): , cioè 1 quando il numero di 1 in ingresso è dispari; , cioè 1 quando almeno due ingressi sono 1 (funzione maggioranza). Esempi: ; .
- Forma con propagate e generate: , , quindi e . Il riporto c'è se i due bit generano un riporto () oppure se propagano quello in ingresso ( e ). Realizzazione: due half adder più una OR. Esempio con , , : , , , .
- Ripple carry adder a bit: full adder in cascata, con (di solito 0) al LSB e al MSB. Esempio : somma e . Esempio (): somme parziali tutte 0, riporti tutti 1, risultato con , cioè ; per numeri senza segno è overflow.
- Costo di una tabella: un sommatore a 4 bit con riporto in ingresso ha 9 ingressi e righe: per questo serve la struttura iterativa.
- Ritardo: il riporto attraversa ogni stadio in circa (una AND e una OR), quindi l'ultima somma arriva dopo circa : con e ns sono circa 16 ns. Il ritardo cresce linearmente con ; il carry look-ahead non è trattato nel corso.
- VHDL del full adder:
s <= x xor y xor cin;ecout <= (x and y) or (cin and (x xor y));. Sommatore a 4 bit gerarchico con quattro istanzeentity work.fa(df)e riporti internic(4 downto 0); versione behavioral con sommaunsigneddi tre numeri a 5 bit (Introduzione al VHDL - entity, architecture, tipi e livelli di descrizioneVHDL è un linguaggio di descrizione dell'hardware (HDL), non di programmazione: le dichiarazioni sono concorrenti e descrivono blocchi di circuito; serve per documentare, simulare e sintetizzare. Un blocco ha una entity (nome e porte in/out) e almeno una architecture (cosa c'è dentro: structural con component e port map, dataflow con equazioni booleane, behavioral con comportamento). Tipi: std_logic (da 1164: '0','1','X','Z','U','-',...), std_logic_vector, bit, boolean, integer. Signal per i collegamenti interni, constant per i valori fissi.Introduzione al VHDL - entity, architecture, tipi e livelli di descrizione →). - Moltiplicatore a 2 bit: , , , : 4 AND e 2 half adder. Controllo con : .
- Overflow: il criterio con segno è diverso da (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 del full adder dimenticato (un half adder non basta per i bit centrali); letto come errore per numeri con segno; ripple considerato veloce; e scambiati nell'half adder.
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