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: somma di nella metà alta di se , poi shift a destra; nella metà bassa di ().
- Booth (con segno): registri (, ); coppia : 10 → , 01 → , 00/11 → nulla; sempre shift aritmetico a destra; dopo passi ( bit, complemento a 2) è il prodotto.
- Idea: sequenza di uni = differenza di potenze di 2 ().
- Esempi: (4 bit) → ; (5 bit) → righe → ; .
- Errori: niente shift su "nulla"; shift logico; 10/01 scambiati; non azzerato; risultato su bit (Moltiplicatori veloci e divisionePer il controllo real-time serve un moltiplicatore a ciclo singolo: a look-up table (la tabella cresce come $2^{2n}\cdot2n$ bit, quindi si fa solo a pochi bit e si compongono prodotti da 4 bit: $A\cdot B=A_HB_H,2^{8}+(A_HB_L+A_LB_H)2^4+A_LB_L$) oppure a matrice (schiera di AND e sommatori, ritardo $\sim2n$; varianti a somma per colonne e di Wallace). La divisione hardware si fa con sottrazioni successive (con ripristino) su valori positivi e il segno alla fine ($D=Q,d+R$); con $n$ bit ci sono vincoli su dividendo e divisore. Senza divisore hardware: $Q=N/D$ con la serie $\frac{N(1+Z)(1+Z^2)\cdots}{1-Z^{2^n}}$, $D=1-Z$, $0{,}5<D<1$.Moltiplicatori veloci e divisione →).