Salta al contenuto
Note per Studenti Sommatori - full adder e ripple-carry

Sommatori - full adder e ripple-carry

In questa pagina 5

I blocchi aritmetici fondamentali di una ALU (Blocchi logici di un microprocessore - ALU, bus e logica tri-stateUn microprocessore semplice è formato da un'unità di controllo (decodifica le istruzioni e abilita gli altri blocchi), una ALU (operazioni aritmetiche e logiche), la memoria e i registri, collegati da bus (linee condivise unidirezionali o bidirezionali). La ALU combina un sommatore con un'unità logica e un multiplexer di selezione dell'operazione: la sottrazione è A + B̄ + 1 (XOR su B e riporto in ingresso a 1), le flag (zero, riporto, segno, overflow) descrivono il risultato. Un bus è una linea pilotata da più sorgenti: per evitare conflitti ogni uscita collegata è tri-state (il segnale enable la mette in alta impedenza) oppure open-drain (solo PDN: ciascuna può imporre 0, serve un pull-up per l'1).Blocchi logici di un microprocessore - ALU, bus e logica tri-state →) sono i sommatori, i traslatori, i comparatori e i moltiplicatori. Tutti gli altri si costruiscono sul sommatore (la sottrazione è A+B‾+1A+\overline B+1: Rappresentazione dei numeri e dell'informazioneUn'informazione digitale è una stringa di bit. Numeri senza segno: N bit rappresentano 0…2^N − 1; in esadecimale ogni cifra raggruppa 4 bit. Numeri con segno: complemento a due (range −2^(N−1)…2^(N−1) − 1; si nega invertendo i bit e sommando 1; il bit più significativo è il segno e l'estensione di segno lo replica). Il BCD codifica ogni cifra decimale con 4 bit (0…9) e si ottiene dal binario con l'algoritmo double dabble (shift a sinistra, e +3 a ogni gruppo maggiore di 4 prima dello shift). Il codice Gray cambia un solo bit tra valori consecutivi. I numeri frazionari si trattano in virgola fissa (4 bit di parte frazionaria = multipli di 1/16), i caratteri in ASCII, gli errori con un bit di parità.Rappresentazione dei numeri e dell'informazione →).

Addizione di bit e di numeri

La somma di due bit X+YX+Y dà un bit di somma SS e un bit di riporto (carry) CC: 0+0=000+0=00, 0+1=010+1=01, 1+0=011+0=01, 1+1=101+1=10 (riporto 11, somma 00). Un half adder ha S=A⊕BS=A\oplus B, C=ABC=AB. Per sommare numeri a più bit, ogni posizione deve sommare anche il riporto della posizione precedente: tre bit AA, BB, CinC_{in} danno somma SS e riporto CoutC_{out}.

Full adder

Il full adder (sommatore completo a un bit) ha per tabella di verità S=A⊕B⊕Cin=A‾ B‾ Cin+A‾B Cin‾+AB‾ Cin‾+ABCin,Cout=AB+BCin+ACin.S=A\oplus B\oplus C_{in}=\overline A\,\overline B\,C_{in}+\overline AB\,\overline{C_{in}}+A\overline B\,\overline{C_{in}}+ABC_{in},\qquad C_{out}=AB+BC_{in}+AC_{in}. Il riporto d'uscita è la funzione maggioranza: vale 11 se almeno due ingressi valgono 11. Si ottimizza il circuito con tre segnali:

Sommatore ripple-carry

Un sommatore a NN bit si ottiene collegando NN full adder in cascata: Cout,i=Cin,i+1C_{out,i}=C_{in,i+1}. Il riporto "si propaga a onda" (ripple) dal bit meno significativo al più significativo. Indicati tst_s il ritardo del sum (da CinC_{in} a SS) e tct_c il ritardo di carry (da CinC_{in} a CoutC_{out}) di un full adder, e con Cin,0=0C_{in,0}=0:

  • il bit ii dà la somma al tempo ts+(ritardi di riporto accumulati fino allo stadio i)t_s+\big(\text{ritardi di riporto accumulati fino allo stadio }i\big);
  • nel caso peggiore (riporto che attraversa tutti gli stadi: tutti P=1P=1) l'ultimo bit attende N−1N-1 ritardi di carry: tadd=(N−1) tc+ts(lineare in N).\boxed{t_{add}=(N-1)\,t_c+t_s}\qquad(\text{lineare in }N). Si include il set-up quando vale: tadd=tsetup+(N−1)tc+tst_{add}=t_{setup}+(N-1)t_c+t_s.

Esempio numerico. tc=100 pst_c=100\ \mathrm{ps}, ts=150 pst_s=150\ \mathrm{ps}: N=4N=4: 450 ps450\ \mathrm{ps}; N=16N=16: 1650 ps1650\ \mathrm{ps}; N=32N=32: 3250 ps3250\ \mathrm{ps}: raddoppiando il numero di bit il ritardo raddoppia circa. È il sommatore più semplice e compatto, ma lento: per le larghezze maggiori si usano architetture più veloci (Sommatori veloci - carry-bypass, carry-select e square-rootIl ripple-carry ha ritardo lineare in N. Il carry-bypass divide i bit in blocchi da M: se tutti i propagate del blocco valgono 1 (BP = P0P1…P_{M−1} = 1) un multiplexer fa saltare il riporto dall'ingresso all'uscita del blocco. Ritardo: t = t_setup + M t_carry + (N/M − 1) t_mux + (M−1) t_carry + t_sum, ottimo per M = √(N t_mux/(2 t_carry)); è determinato principalmente dal tempo di riporto. Il carry-select calcola in ogni blocco le somme per riporto 0 e per riporto 1 e un mux sceglie quella giusta: t = t_setup + M t_carry + (N/M) t_mux + t_sum, M ottimo √(N t_mux/t_carry); lo square-root carry-select usa blocchi di dimensione crescente (M, M+1, M+2…) perché il riporto arriva ogni volta un mux dopo: N ≈ K²/2 e t = t_setup + M t_carry + √(2N) t_mux + t_sum, cioè ritardo ∝ √N.Sommatori veloci - carry-bypass, carry-select e square-root →).

Ritardo dipendente dagli operandi

Il ritardo reale dipende dai dati. Si assumono AA, BB applicati insieme e Cin,0C_{in,0} noto. Il riporto in uscita dallo stadio ii è disponibile dopo un tempo τi=tc\tau_{i}=t_c se lo stadio è generate o delete (la sua uscita non dipende da CinC_{in}) e τi=tc+τi−1\tau_i=t_c+\tau_{i-1} se è propagate. Il tempo totale è tst_s più il massimo ritardo del riporto entrante in uno stadio, cioè tct_c per il numero di stadi consecutivi della catena più lunga (un generate o delete e i propagate che lo seguono).

Esempio dalle slide (stadi 0…30\ldots3 con (Ai,Bi)=(1,0),(0,1),(1,1),(0,0)(A_i,B_i)=(1,0),(0,1),(1,1),(0,0)): lo stadio 00 è propagate (Cin,0=0C_{in,0}=0 è comunque contato: Cout,0C_{out,0} è disponibile a tct_c), lo stadio 11 propagate (2tc2t_c), lo stadio 22 generate (resetta la catena), lo stadio 33 delete. Le somme sono pronte a tst_s, ts+tct_s+t_c, ts+2tct_s+2t_c e ts+tct_s+t_c (lo stadio 33 riceve il riporto dello stadio 22, che dipende solo da G2G_2): tadd=2tc+tst_{add}=2t_c+t_s.

Operandi uguali bit a bit (Ai=BiA_i=B_i in ogni posizione): ogni stadio è generate o delete, nessun riporto si propaga e tadd=tc+tst_{add}=t_c+t_s (i due operandi devono coincidere in ogni posizione, cioè essere lo stesso numero: se differissero anche solo in alcuni bit comparirebbero stadi propagate). Per esempio la somma di due numeri a 1616 bit identici si completa in tc+tst_c+t_s e non in 15 tc+ts15\,t_c+t_s.

Esempio con operandi a 16 bit (A=1010101010101000A=1010101010101000, B=1100100010101100B=1100100010101100, LSB a destra): le posizioni 0,…,150,\dots,15 sono, nell'ordine, D, D, P, G, D, G, D, G, D, P, D, G, D, P, P, G. Il ritardo del riporto entrante nel bit 1515 è il massimo: nasce dallo stadio D in posizione 1212 (tct_c), poi due stadi P (posizioni 1313 e 1414): 3 tc3\,t_c. Quindi tadd=3 tc+tst_{add}=3\,t_c+t_s, molto minore del caso peggiore (15 tc+ts15\,t_c+t_s). (Esercizio 17 · quesiti rapidi sui sommatori con dati numerici (temi d'esame 2025-2026) discute questo caso.)

Lunghezza dei numeri e overflow

La somma di due numeri a NN bit richiede N+1N+1 bit (il riporto d'uscita Cout,N−1C_{out,N-1} è il bit in più). In complemento a due l'overflow si rivela con il confronto dei segni oppure come CN−1⊕CNC_{N-1}\oplus C_N (riporto entrante e uscente nell'ultimo stadio).

Errori comuni

  • Usare N tcN\,t_c o N(tc+ts)N(t_c+t_s) invece di (N−1)tc+ts(N-1)t_c+t_s (la somma si calcola una sola volta, in fondo).
  • Ritenere il ritardo (N−1)tc+ts(N-1)t_c+t_s valido per ogni coppia di numeri: è il caso peggiore.
  • Dimenticare che un bit generate o delete interrompe la catena del riporto.
  • Confondere propagate (A⊕BA\oplus B) e generate (ABAB).

Versione ripasso

  • Full adder: S=A⊕B⊕CinS=A\oplus B\oplus C_{in}, Cout=AB+BCin+ACinC_{out}=AB+BC_{in}+AC_{in} (maggioranza). G=ABG=AB, P=A⊕BP=A\oplus B, D=A‾ B‾D=\overline A\,\overline B: Cout=G+PCinC_{out}=G+PC_{in}, S=P⊕CinS=P\oplus C_{in}; set-up (G,PG,P) indipendente dal riporto.
  • Ripple-carry: NN full adder in cascata; caso peggiore tadd=(N−1)tc+tst_{add}=(N-1)t_c+t_s, lineare (100/150100/150 ps: N=4,16,32→450,1650,3250N=4,16,32\to450,1650,3250 ps).
  • Dipendenza dai dati: G o D azzera la catena, P la prolunga; ritardo =ts+tc×=t_s+t_c\times(stadi della catena più lunga). Slide: (1,0),(0,1),(1,1),(0,0)→2tc+ts(1,0),(0,1),(1,1),(0,0)\to2t_c+t_s. Operandi uguali: tc+tst_c+t_s. A=1010101010101000A=1010101010101000, B=1100100010101100B=1100100010101100: 3tc+ts3t_c+t_s.
  • Overflow: N+1N+1 bit per la somma; con segno CN−1⊕CNC_{N-1}\oplus C_N.
  • Errori: NtcNt_c; caso peggiore sempre; G/D non interrompono; P e G scambiati.

Esercizi su questo argomento

Teoria collegata