Salta al contenuto
Note per Studenti Moltiplicatori veloci e divisione

Moltiplicatori veloci e divisione

In questa pagina 5

Le realizzazioni a somme e shift (Moltiplicazione e algoritmo di BoothLa moltiplicazione hardware imita il calcolo a mano: somme e shift ripetuti. Per numeri senza segno si somma il moltiplicando se il bit del moltiplicatore è 1 e si fa shift a destra del prodotto parziale; il moltiplicatore sta nella metà bassa del registro del prodotto. Per i numeri con segno serve l'algoritmo di Booth: si guardano i bit del moltiplicatore a coppie (bit corrente, bit precedente, all'inizio 0): 10 → si sottrae il moltiplicando, 01 → si somma, 00/11 → niente; poi shift aritmeticoscorrimento che conserva il segno: a destra ripete il bit di segno a destra. Dopo $n$ passi si hanno $2n$ bit in complemento a 2. Va eseguito sui compiti d'esame a mano con lo schema di registri $A,|,Q,|,q_{-1}$.Moltiplicazione e algoritmo di Booth →) richiedono molte iterazioni: troppo lente per il controllo real-time di processi dinamici o per il signal processing. Nei µC e DSP si trovano quindi moltiplicatori veloci, capaci di calcolare il prodotto in un solo ciclo di clock.

Moltiplicatori a look-up table

Una memoria look-up tablememoria in cui sono scritti, già calcolati, i valori di una funzione: si legge la risposta invece di calcolarla contiene i prodotti di tutte le coppie di numeri a nn bit (senza segno). L'indirizzo della cella si forma accostando i due operandi, quindi un moltiplicatore n×nn\times n richiede 22n2^{2n} righe di 2n2n bit. Per esempio 1101⋅0110=010011101101\cdot0110=01001110 si legge alla riga di indirizzo 1101 01101101\,0110.

nn indirizzo righe 22n2^{2n} bit totali 22n⋅2n2^{2n}\cdot2n
4 8 bit 256 2048
5 10 bit 1024 10240
6 12 bit 4096 49152
7 14 bit 16384 229376
8 16 bit 65536 1048576

La crescita è esponenziale: già con 8 bit servono 1 Mbit di memoria, inaccettabile per l'area sul chip. Si realizzano quindi solo moltiplicatori a pochi bit (4) e se ne combinano più copie per operandi più larghi, fattorizzandoscomponendo il prodotto in prodotti parziali più piccoli il prodotto. Con A=AH⋅16+ALA=A_H\cdot16+A_L e B=BH⋅16+BLB=B_H\cdot16+B_L (due nibble a 4 bit): A⋅B=AHBH⋅256+(AHBL+ALBH)⋅16+ALBL.A\cdot B=A_HB_H\cdot256+(A_HB_L+A_LB_H)\cdot16+A_LB_L . Servono quattro moltiplicatori 4×44\times4 e un addizionatore che allineaporta le uscite dei moltiplicatori parziali alla posizione corretta con shift le uscite.

Moltiplicatori a matrice

Il prodotto di due numeri a 1 bit è un AND. Generalizzando, il prodotto A⋅BA\cdot B a nn bit è la somma dei prodotti parziali A bj 2jA\,b_j\,2^j: una matrice di porte AND e una matrice di sommatoricircuiti che sommano due parole binarie, con struttura regolare e quindi facile da realizzare. Il prodotto è pronto dopo circa 2n2n ritardi elementariil ritardo di una porta logica, usato come unità di misura del tempo di propagazione (quelli dei sommatori; le AND si trascurano); con sommatori veloci (CLA, ALU - sommatore, overflow, carry look-ahead e shiftL'ALU è un insieme di celle a 1 bit (full adder + selettori) collegate in parallelo: somma, sottrae ($A-B=A+\overline B+1$: si inverte $B$ e si porta il riporto iniziale a 1), fa AND/OR. Il ritardo è dominato dal riporto: nel ripple-carry cresce linearmente con i bit; col carry look-aheadtecnica che calcola in anticipo i riporti da generazione e propagazione, riducendo il ritardo i riporti si calcolano da generazione $g_i=A_iB_i$ e propagazione $p_i=A_i+B_i$ in pochi livelli di logica. L'overflow è $V=C_{in,n-1}\oplus C_{out,n-1}$. Gli shift logici inseriscono 0, gli aritmetici estendono il segno; il barrel shiftercircuito che sposta una parola di un numero qualsiasi di posizioni in un solo ciclo sposta di $m$ posti in un ciclo.ALU - sommatore, overflow, carry look-ahead e shift →) il ritardo si riduce molto.

Altre organizzazioni:

  • somma per colonne: una colonna della matrice dei prodotti parziali (le AND) entra in un encodercircuito che conta gli uni presenti nei suoi ingressi e li scrive in binario che genera il bit di prodotto e i riporti per le colonne a sinistra. Struttura irregolare, ritardo ∼2n\sim2n.
  • riduzione per passi della matrice dei prodotti parziali fino a due sole righe, poi un sommatore finale veloce: evita la propagazione dei riporti nella matrice.
  • Wallacemoltiplicatore che riduce a passi la matrice dei prodotti parziali usando solo half adder e full adder: stessa idea, con soli sommatori parziali da 2 o 3 bit (half addersemisommatore: somma due bit senza riporto entrante e full adder): struttura più regolare, riduzione un po' più lenta, ritardo comunque dominato dal sommatore finale.

Divisione

La divisione è richiesta raramente nei µC e nei DSP; alcuni processori hanno l'istruzione, ma richiede molti cicli. L'algoritmo più comune opera su operandi positivi per sottrazioni successive e sistema il segno alla fine.

Algoritmo "con ripristino" (restoring). Il restoquello che rimane dopo aver sottratto il quoziente per il divisore RR parte uguale al dividendo; il divisore DD è allineato al bit più alto del dividendo. A ogni passo si calcola R−DR-D: se il risultato è positivo o nullo il bit di quozienteil risultato intero di una divisione è 1 e RR resta ridotto; se negativo il bit è 0 e si ripristina RR (si risomma DD). Poi DD si sposta di un posto a destra e si ripete. Esempio: 65:1365:13. 65=1000001265=1000001_2, 13=110113=1101 (allineato: 11010001101000): 65−104<065-104<0 → bit 0; con DD spostato (110100110100): 65−52=13≥065-52=13\ge0 → bit 1, R=13R=13; D=11010D=11010 (2626): 13−26<013-26<0 → 0; D=1101D=1101 (1313): 13−13=013-13=0 → bit 1, R=0R=0. Quoziente 0101=50101=5, resto 00 ✓.

Versione con meno hardware. Si sposta a sinistra il dividendo (invece di spostare a destra il divisore) usando una ALU a nn bit invece di 2n2n, e si ospita il quoziente nella metà bassa del registro del resto. Il primo passo è sempre uno shift a sinistra senza sottrazione (se la prima sottrazione desse R≥0R\ge0 il quoziente sarebbe troppo grande: è così che si riconosce una divisione non permessa, che genera errore). Ogni sottrazione che dà R<0R<0 si ripristina; a fine algoritmo la parte alta di RR va spostata a destra di un posto (altrimenti il resto è shiftato una volta di troppo). Esempio 37:6=637:6=6 resto 11: ripercorrendo i passi (shift, sottrazione R−DR-D sulla parte alta, ripristinooperazione che risomma il divisore al resto quando la sottrazione ha dato un valore negativo se negativa) si arriva al quoziente 01100110 e al resto 00010001.

Vincoli con nn bit

Con aritmetica intera a nn bit con segno il quoziente e il resto stanno in [0,2n−1−1][0,2^{n-1}-1]. Con 5 bit sono compresi tra 0 e 15 e il massimo dividendo è 15⋅15+14=23915\cdot15+14=239: l'unico divisore valido è 15 (quoziente 15, resto 14); un divisore minore darebbe quoziente non rappresentabile. Il dividendo 6565 ammette i divisori da 55 (65:5=1365:5=13) a 1515 (65:15=465:15=4 resto 5); con 44 il quoziente sarebbe 1616, non rappresentabile. Per riportare un dividendo all'interno del campo ammesso si premoltiplica per una potenza di 2 (si parla di fattore di scala del dividendo, ricordando poi di riportare il quoziente alla scala originale).

Il segno

Il segno si gestisce alla fine imponendo dividendo=Q⋅D+R.\text{dividendo}=Q\cdot D+R . Per esempio −13:4=−3-13:4=-3 con resto −1-1 (e non −4-4 con resto +3+3, che soddisfa la relazione ma non la convenzione): deve essere −(x/y)=(−x)/y-(x/y)=(-x)/y, a meno del resto, cioè il quoziente si arrotonda verso zero e il resto ha il segno del dividendo.

Divisione con il moltiplicatore

Se non c'è un divisore hardware si usa il moltiplicatore. Per Q=N/DQ=N/D con 0,5<D<10{,}5<D<1 (dopo avere scalato DD con una potenza di 2) si pone Z=1−DZ=1-D, quindi D=1−ZD=1-Z e 0<Z<0,50<Z<0{,}5. Dalla identità 11−Z=(1+Z)(1+Z2)(1+Z4)⋯(1+Z2n−1)1−Z2n\frac1{1-Z}=\frac{(1+Z)(1+Z^2)(1+Z^4)\cdots(1+Z^{2^{n-1}})}{1-Z^{2^n}} segue Q=N(1+Z)(1+Z2)⋯(1+Z2n−1)1−Z2n  ≈  N(1+Z)(1+Z2)⋯(1+Z2n−1).Q=\frac{N(1+Z)(1+Z^2)\cdots(1+Z^{2^{n-1}})}{1-Z^{2^n}}\;\approx\;N(1+Z)(1+Z^2)\cdots(1+Z^{2^{n-1}}). L'errore relativo dell'approssimazione è Z2nZ^{2^n}: decresce più che esponenzialmente con nn. Con una aritmetica a 8 bit basta n=3n=3 per avere un errore minore dell'LSB; con n=5n=5 si ha la precisione di un'aritmetica a 32 bit. (Il caso generale è Q=1D/NQ=\frac{1}{D/N} con D/ND/N scalato in (0,5,1)(0{,}5,1): Z=1−D/NZ=1-D/N.)

Esempio numerico: N=3N=3, D=2,1D=2{,}1: D/N=0,7D/N=0{,}7 e Z=0,3Z=0{,}3. Il valore vero è Q=3/2,1=1,428571Q=3/2{,}1=1{,}428571. Con la serie: n=1n=1: 1+Z=1,31+Z=1{,}3; n=2n=2: 1,3⋅1,09=1,4171{,}3\cdot1{,}09=1{,}417; n=3n=3: 1,417⋅1,0081=1,428481{,}417\cdot1{,}0081=1{,}42848 (errore relativo Z8=6,6⋅10−5Z^8=6{,}6\cdot10^{-5}); n=4n=4: 1,4285711{,}428571 (errore Z16=4,3⋅10−9Z^{16}=4{,}3\cdot10^{-9}). Quindi per superare l'accuratezzavicinanza del risultato al valore vero di una rappresentazione a 16 bit (∼3⋅10−5\sim3\cdot10^{-5}) servono 4 fattori.

Errori comuni

  • Credere che la tabella look-upmemoria con le risposte già calcolate scali bene: cresce come 4n4^n.
  • Dimenticare il ripristino quando il resto parziale diventa negativo.
  • Arrotondare il quoziente negativo "per difetto" invece che verso zero.
  • Applicare la serie a un DD fuori dall'intervallo (0,5,1)(0{,}5,1) (la serie converge solo se ∣Z∣<1|Z|<1 e rapidamente se Z<0,5Z<0{,}5).

Versione ripasso

Esercizi su questo argomento

Teoria collegata