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.

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}}}. 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.

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}}}. (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

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}. 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

  • Carry-bypass: blocchi da MM; BP=∏Pi=1⇒BP=\prod P_i=1\Rightarrow mux fa saltare il riporto. t=tsetup+(2M−1)tcarry+(N/M−1)tmux+tsumt=t_{setup}+(2M-1)t_{carry}+(N/M-1)t_{mux}+t_{sum}, Mopt=Ntmux/(2tcarry)M_{opt}=\sqrt{Nt_{mux}/(2t_{carry})}; ritardo dominato dal riporto.
  • Linear carry-select: per ogni blocco somme per riporto 00 e 11 in parallelo, mux sceglie: t=tsetup+Mtcarry+(N/M)tmux+tsumt=t_{setup}+Mt_{carry}+(N/M)t_{mux}+t_{sum}, Mopt=Ntmux/tcarryM_{opt}=\sqrt{Nt_{mux}/t_{carry}}. Esempio 2020 bit 4×54\times5: dati specifici tsu+5tc+3tmux+tst_{su}+5t_c+3t_{mux}+t_s (formula generale: 4tmux4t_{mux}, limite superiore).
  • Square-root select: blocchi M,M+1,…M,M+1,\ldots; N=MK+K(K−1)/2≈K2/2N=MK+K(K-1)/2\approx K^2/2, t=tsetup+Mtcarry+2Ntmux+tsum∝Nt=t_{setup}+Mt_{carry}+\sqrt{2N}t_{mux}+t_{sum}\propto\sqrt N.
  • Confronto (TT unitario): N=32N=32: ripple 33T33T, bypass 16T16T, linear select 14T14T, sqrt select 11T11T; N=64N=64: 65,24,18,14 T65,24,18,14\,T.
  • Altro: carry-lookahead/prefix O(log⁡N)O(\log N); carry chain dedicata in FPGA.
  • Errori: conteggio dei mux; MoptM_{opt} con fattore sbagliato; bypass dominato da sum; blocchi uguali nel sqrt select.

Esercizi su questo argomento

Teoria collegata