Moltiplicazione e algoritmo di Booth
In questa pagina 4
La moltiplicazione è hardware in tutti i DSP e, oggi, in molti µC (quelli per il controllo real-time di processi veloci, come gli azionamenti elettrici). Se non servono prestazioni elevate la moltiplicazione può essere sintetizzata con un sottoprogramma di somme e scorrimenti. In ogni caso il principio è il calcolo manuale (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 →).
Moltiplicazione senza segno
A mano: : si scrive il moltiplicandoil numero che viene sommato (spostato) nel calcolo del prodotto per il bit 0 (che vale 1), si scrive per il bit 1 spostato di 1 posto, di nuovo spostato di 2 posti e si sommano: . Il circuito segue tre miglioramenti successivi:
- si sommano i prodotti parziali man mano (senza memorizzarli): si somma il moltiplicando al risultato corrente solo se il bit corrente del moltiplicatoreil numero i cui bit decidono quali somme eseguire è 1;
- invece di spostare a sinistra il moltiplicando (servirebbe un sommatorecircuito che somma due parole binarie a bit), si sposta a destra il risultato corrente e si somma solo sulla metà alta: bastano bit di sommatore;
- il moltiplicatore si ospita nella metà bassa del registro del prodotto: il controllo guarda il bit meno significativo di e ogni shift a destra di sposta anche .
Esempio con (13) e (5), . Si parte da :
- bit 1 (LSBbit meno significativo=1): ; shift: ;
- bit 0: nulla; shift: ;
- bit 1: (con il riportobit che passa alla colonna successiva quando la somma supera la cifra massima che finisce nel bit più alto: si ottiene e dopo lo shift );
- bit 0: nulla; shift: ✓. Il riporto della somma sulla metà alta si conserva nel bit più alto dopo lo shift (qui la parte alta è un naturale senza segnonumero naturale, tutti i bit sono di valore).
Perché non basta per i numeri con segno
L'organizzazione precedente non si estende ai numeri in complemento a 2codifica dei numeri con segno: il bit di segno del moltiplicatore ha peso negativo () e quello del moltiplicando va esteso nel prodotto parzialesomma delle righe del prodotto calcolate fino a quel passo. Serve un algoritmo apposito: quello di Booth.
L'algoritmo di Booth
Idea. Il moltiplicatore si fattorizzascompone in una somma o differenza di potenze di 2 in somme e differenze di potenze di 2, così che il prodotto sia una serie di shift con una sottrazione finale: (shift a sinistra di 2 e di 4 posti, e una sottrazione). Booth ha osservato che la fattorizzazione si automatizza leggendo i bit del moltiplicatore: una sequenza di unigruppo di bit consecutivi uguali a 1 nel moltiplicatore vale , quindi basta sottrarre all'inizio della sequenza e sommare alla fine. Il vantaggio (meno somme) si perde con moltiplicatori alternati (tipo ).
Registri. ( bit, parte alta del prodotto, inizialmente 0), ( bit, contiene il moltiplicatore), un bit extra (inizialmente 0) e il moltiplicando ( bit). Per ognuno degli passi:
| Azione su | |
|---|---|
| (inizio di una sequenza di uni) | |
| (fine di una sequenza di uni) | |
| oppure | nessuna |
e poi shift aritmetico a destra della terna di un posto (il bit di segno di si estende). Avvertenze:
- lo shift va fatto a ogni passo, anche quando non si somma;
- deve essere aritmetico (estensione del segnocopia del bit di segno nelle posizioni lasciate libere dallo shift);
- nella somma o sottrazione su si trascurano i riporti oltre il bit più significativo;
- il bit "precedente" il bit meno significativo del moltiplicatore è considerato 0 all'inizio. Dopo gli passi, la concatenazione (di bit) è il prodotto in complemento a 2, qualunque sia il segno degli operandi. L'hardware è poco più complesso di quello del moltiplicatore senza segno: cambia solo la logica di controllo.
Esempio 1: su 4 bit
(5), (), , .
| Passo | Azione | dopo lo shift | |
|---|---|---|---|
| 1 | 10 | ||
| 2 | 01 | ||
| 3 | 10 | ||
| 4 | 11 | nessuna |
Risultato ✓.
Esempio 2 (tema d'esame): su 5 bit
(moltiplicando ), (moltiplicatore ). Prodotto atteso , che sta nei bit.
| Passo | Azione | dopo lo shift | |
|---|---|---|---|
| 1 | 10 | ||
| 2 | 11 | nessuna | |
| 3 | 01 | ||
| 4 | 10 | ||
| 5 | 11 | nessuna |
Risultato ✓ (si ritrova, nella metà bassa, la sequenza dei bit del moltiplicatore che man mano escono). Scambiando i ruoli (, ) le righe cambiano ma il prodotto è lo stesso: nel compito si indica sempre quale operando si usa come moltiplicatore (di solito quello che dà meno somme).
Esempio 3: operandi di segno diverso, su 5 bit
(), (). Le righe dopo ogni shift sono , , , , . Il risultato finale ✓ (in complemento a 2 su 10 bit: ).
Errori comuni
- Non shiftare quando l'azione è "nessuna".
- Shift logico invece che aritmetico (quando è negativo si perde il segno).
- Sbagliare il verso della coppia: è sottrazione, è somma.
- Non portare il bit precedenteil bit meno significativo scartato nello shift precedente, che per il primo passo vale 0 all'inizio.
- Leggere il risultato su bit invece che su bit.
- Dimenticare di scrivere il prodotto parziale dopo lo shift quando il testo lo chiede.
Versione ripasso
- Senza segno: si somma il moltiplicando alla metà alta del prodotto se il bit corrente del moltiplicatore è 1, poi si shifta a destra; il moltiplicatore sta nella metà bassa di . Esempio: (13), (5) → .
- Perché non basta con segno: il bit di segno del moltiplicatore pesa ; serve Booth.
- Idea di Booth: una sequenza di uni vale : si sottrae all'inizio della sequenza e si somma alla fine. Esempio: .
- Registri: (parte alta, inizialmente 0), (moltiplicatore), , (moltiplicando). Per ciascuno degli passi: coppia = 10 → ; 01 → ; 00 o 11 → nulla; poi shift aritmetico a destra di , sempre, anche senza somma.
- Risultato: dopo passi (2 bit, complemento a 2) è il prodotto, qualunque sia il segno degli operandi.
- Esempio 1, su 4 bit: , ; passi , , , nella parte alta → .
- Esempio 2 (tema d'esame), su 5 bit: (), (); passi : , , , , → .
- Esempio 3, su 5 bit: , ; risultato .
- Errori tipici: non shiftare quando l'azione è nulla; shift logico invece che aritmetico (si perde il segno); scambiare 10 e 01; non azzerare ; leggere il risultato su bit invece che su (Moltiplicatori veloci e divisione).
- Perché Booth: una sequenza di uni vale ; il vantaggio si perde con moltiplicatori alternati tipo .
- Senza segno: il prodotto parziale si sposta a destra e il moltiplicatore occupa la metà bassa di ; il sommatore è di bit.
- Verifica: la concatenazione di bit è il prodotto in complemento a 2 qualunque sia il segno; parte da 0 e lo shift è sempre aritmetico.
- Scelta dell'operando: nel compito si indica quale operando fa da moltiplicatore, di solito quello che dà meno somme.