Salta al contenuto
Note per Studenti Sommatori veloci - carry-bypass, carry-select e square-root

Sommatori veloci - carry-bypass, carry-select e square-root

In questa pagina 6

Il ripple-carry (Sommatori - full adder e ripple-carryLa somma di due bit con riporto in ingresso è realizzata dal full adder: S = A ⊕ B ⊕ C_in, C_out = AB + BC_in + AC_in. Con generate G = AB, propagate P = A ⊕ B (e delete D = Ā B̄) si scrive C_out = G + P·C_in e S = P ⊕ C_in: G e P non dipendono dal riporto in ingresso (fase di set-up), solo C_out ed S ne dipendono. Il sommatore ripple-carry collega N full adder in cascata: il riporto attraversa gli stadi uno dopo l'altro, nel caso peggiore t_add = (N−1) t_carry + t_sum (lineare in N). Il ritardo effettivo dipende dagli operandi: un generate o un delete azzera la catena, un propagate la prolunga; per operandi uguali bit a bit vale t_carry + t_sum.Sommatori - full adder e ripple-carry →) ha tadd=(N−1)tc+tst_{add}=(N-1)t_c+t_s, lineare in NN: a 6464 bit il riporto deve attraversare 6363 stadi. Le architetture veloci mantengono lo stesso full adder ma accorciano il cammino critico del riporto con logica aggiuntiva. Notazione: tsetupt_{setup} (calcolo di GG, PP), tcarryt_{carry} (propagazione in uno stadio), tmuxt_{mux} (ritardo di un multiplexer), tsumt_{sum}.

Carry-bypass (carry-skip)

I NN bit si dividono in blocchi di MM bit. In ciascun blocco si calcola BP=P0P1⋯PM−1BP=P_0P_1\cdots P_{M-1}. Idea: se tutti i propagate del blocco valgono 11, il riporto in uscita è uguale al riporto in ingresso (Co,M−1=Ci,0C_{o,M-1}=C_{i,0}): un multiplexer comandato da BPBP lo fa saltare direttamente, senza aspettare che attraversi i MM stadi.

Formula (ritardo del carry-bypass e dimensione ottima dei blocchi). Ritardo nel caso peggiore (NN bit, blocchi da MM): il riporto deve (1) essere generato nel primo stadio del primo blocco e attraversare lo stesso blocco (M tcarryM\,t_{carry}), (2) saltare i blocchi successivi attraverso i loro multiplexer (N/M−1N/M-1 multiplexer in totale, uno per ogni blocco dopo il primo), (3) attraversare i M−1M-1 stadi dell'ultimo blocco e produrre la somma: tadd=tsetup+M tcarry+(NM−1)tmux+(M−1) tcarry+tsum.t_{add}=t_{setup}+M\,t_{carry}+\Big(\frac NM-1\Big)t_{mux}+(M-1)\,t_{carry}+t_{sum}. Il termine in MM è (2M−1) tcarry(2M-1)\,t_{carry}: aumentando MM cresce la parte di ripple dentro i blocchi estremi, diminuendo MM crescono i multiplexer. Derivando rispetto a MM: Mopt=N tmux2 tcarry.M_{opt}=\sqrt{\frac{N\,t_{mux}}{2\,t_{carry}}}.

Esempio. Con N=32N = 32 e tutti i ritardi uguali a TT: Mopt=32/2=4M_{opt} = \sqrt{32/2} = 4 e tadd=T+4T+7T+3T+T=16 Tt_{add} = T + 4T + 7T + 3T + T = 16\,T.

Con M=MoptM=M_{opt} il ritardo cresce come N\sqrt N (con MM fisso resta lineare ma con un coefficiente molto minore del ripple). In questa architettura il tempo di ritardo per il calcolo della somma finale è determinato principalmente dal tempo di riporto (tcarryt_{carry}), non da tsumt_{sum} o dal set-up, che compaiono una sola volta.

Carry-select

Per eliminare l'attesa del riporto in ingresso, in ciascun blocco (tranne il primo) si calcolano due volte le somme e i riporti: una assumendo riporto in ingresso 00 (0-carry) e una assumendo 11 (1-carry). Quando il riporto vero del blocco precedente arriva, un multiplexer sceglie il risultato corretto (di riporto e di somma). I due calcoli avvengono in parallelo al calcolo del riporto del blocco precedente: la selezione è l'unico lavoro che resta.

Formula (ritardo del linear carry-select e dimensione ottima dei blocchi). Linear carry-select (blocchi tutti da MM bit, N/MN/M blocchi): tadd=tsetup+M tcarry+NM tmux+tsum,Mopt=N tmuxtcarry.t_{add}=t_{setup}+M\,t_{carry}+\frac NM\,t_{mux}+t_{sum},\qquad M_{opt}=\sqrt{\frac{N\,t_{mux}}{t_{carry}}}.

Esempio. Con N=32N = 32, M=8M = 8 e tutti i ritardi uguali a TT: tadd=T+8T+4T+T=14 Tt_{add} = T + 8T + 4T + T = 14\,T.

(M tcarryM\,t_{carry}: ogni blocco calcola i suoi riporti in parallelo; poi i multiplexer si propagano in cascata, uno per blocco.) Costo: circa il doppio dei full adder, più i multiplexer.

Caso a dati specifici (tema d'esame): N=20N=20 bit, 44 blocchi da 55, con tmux<tcarryt_{mux}<t_{carry}, A=11111  11111  11111  11111A=11111\;11111\;11111\;11111 e B=10010  00000  00000  00001B=10010\;00000\;00000\;00001 (LSB a sinistra). Il primo blocco è un ripple-carry normale: (1,1) G, (1,0) P, (1,0) P, (1,1) G, (1,0) P: il riporto in uscita è pronto dopo 2 tc2\,t_c (generate nel quarto bit e un propagate). Nei blocchi 2,3,42,3,4 i riporti per entrambe le ipotesi si calcolano comunque in 5 tc5\,t_c (i bit sono tutti propagate, con B=00000B=00000, e la catena di 55 stadi è completa), cioè più tardi del riporto del primo blocco: il tempo è dominato da 5tc5t_c. Poi il riporto attraversa i multiplexer dei blocchi 22 e 33 e il mux finale che sceglie le somme del blocco 44: tre multiplexer in cascata (il primo blocco non ne ha), quindi tadd=tsu+5tc+3tmux+tst_{add}=t_{su}+5t_c+3t_{mux}+t_s. La formula generale con N/M=4N/M=4 ne conta quattro ed è quindi un limite superiore. (Esercizio 17 · quesiti rapidi sui sommatori con dati numerici (temi d'esame 2025-2026).)

Square-root carry-select

Formula (ritardo del square-root carry-select). Nel linear carry-select il blocco jj aspetta il riporto del blocco j−1j-1, che arriva un multiplexer dopo il precedente: nel frattempo ha già finito di calcolare le due alternative. Si può quindi dare ai blocchi successivi un bit in più del precedente: ciascuno impiega tmuxt_{mux} in più per il riporto, e può quindi elaborare un bit in più in parallelo (con tcarryt_{carry} per bit). Blocchi di M, M+1, M+2,…,M+K−1M,\,M+1,\,M+2,\dots,M+K-1 bit: N=∑j=0K−1(M+j)=MK+K(K−1)2 ≈ K22(M piccolo),K≈2N.N=\sum_{j=0}^{K-1}(M+j)=MK+\frac{K(K-1)}2\ \approx\ \frac{K^2}2\quad(M\text{ piccolo}),\qquad K\approx\sqrt{2N}. tadd=tsetup+M tcarry+K tmux+tsum ≈ tsetup+M tcarry+2N tmux+tsum.t_{add}=t_{setup}+M\,t_{carry}+K\,t_{mux}+t_{sum}\ \approx\ t_{setup}+M\,t_{carry}+\sqrt{2N}\,t_{mux}+t_{sum}.

Esempio. Con N=32N = 32 e M=3M = 3: blocchi da 3,4,5,6,7,83, 4, 5, 6, 7, 8 bit (3333 bit), K=6K = 6 e, con ritardi tutti uguali a TT, tadd=T+3T+6T+T=11 Tt_{add} = T + 3T + 6T + T = 11\,T.

Il ritardo cresce come N\sqrt N invece che linearmente. Se tcarry=tmuxt_{carry}=t_{mux} i tempi si bilanciano: il riporto del blocco j−1j-1 arriva a M tcarry+(j−1) tmuxM\,t_{carry}+(j-1)\,t_{mux} e il blocco jj, con un bit in più, finisce di calcolare le sue due alternative esattamente allora. Nel caso generale tmux≠tcarryt_{mux}\ne t_{carry} i blocchi crescono di tmux/tcarryt_{mux}/t_{carry} bit alla volta.

Confronto

Con tsetup=tcarry=tmux=tsum=Tt_{setup}=t_{carry}=t_{mux}=t_{sum}=T:

NN ripple carry-bypass linear select square-root select
16 17T17T 12T12T (M=2,4M=2,4) 10T10T (M=4M=4) 9T9T
32 33T33T 16T16T (M=4M=4) 14T14T (M=5M=5–88) 11T11T
64 65T65T 24T24T (M=4,8M=4,8) 18T18T (M=8M=8) 14T14T

(Per il square-root select: N=32N=32 con M=3M=3: blocchi da 3,4,5,6,7,83,4,5,6,7,8 (=33=33 bit), K=6K=6 e t=1+3+6+1=11Tt=1+3+6+1=11T.) Al crescere di NN il vantaggio delle strutture a blocchi variabili aumenta; il costo è l'area (le architetture select duplicano i full adder) e la complessità del routing.

Altre soluzioni

Esistono anche sommatori carry-lookahead e ad albero (prefix adders, per esempio Kogge-Stone), che calcolano i riporti in tempo O(log⁡N)O(\log N) combinando i segnali di generate e propagate di gruppi di bit; nelle FPGA (FPGA - LUT, slice e risorse della famiglia 7Una FPGA è una matrice di blocchi logici configurabili (CLB) immersi in una griglia di interconnessioni programmabili, con risorse dedicate: block RAM, blocchi DSP, gestione del clock (MMCM, PLL), blocchi di I/O e transceiver. La memoria di configurazione è SRAM. L'elemento base è la LUT: una memoria SRAM con 2^k celle che realizza una qualsiasi funzione di k ingressi (i segnali di selezione del multiplexer sono gli ingressi della funzione). Nella famiglia 7 di Xilinx un CLB ha 2 slice; uno slice ha 4 LUT a 6 ingressi (ciascuna divisibile in due LUT a 5), multiplexer larghi F7/F8 (funzioni a 7-8 ingressi), una catena di riporto veloce, 4 flip-flop/latch più 4 flip-flop. Nei SLICEM la LUT può essere usata come RAM distribuita o registro a scorrimento (SRL32), nei SLICEL solo come logica.FPGA - LUT, slice e risorse della famiglia 7 →) la catena di riporto dedicata (carry chain) fa tutto questo con un cammino fisico veloce.

Errori comuni

  • Dimenticare di contare i multiplexer come N/M−1N/M-1 (bypass) o N/MN/M (select): sono tanti quanti i blocchi attraversati.
  • Applicare Mopt=N tmux/(2tcarry)M_{opt}=\sqrt{N\,t_{mux}/(2t_{carry})} al carry-select (che ha il fattore 22 in meno: Mopt=N tmux/tcarryM_{opt}=\sqrt{N\,t_{mux}/t_{carry}}).
  • Dimenticare che nel carry-bypass il caso peggiore è determinato dal riporto (non dalla somma).
  • Credere che i blocchi del square-root select siano uguali: crescono di un bit per blocco.

Versione ripasso

Esercizi su questo argomento

Teoria collegata