Salta al contenuto
Note per Studenti Moltiplicazione e algoritmo di Booth

Moltiplicazione e algoritmo di Booth

In questa pagina 4
** a destra. Dopo nn passi si hanno 2n2n bit in complemento a 2. Va eseguito sui compiti d'esame a mano con lo schema di registri A ∣ Q ∣ q−1A\,|\,Q\,|\,q_{-1}. -->

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: 1101⋅1011101\cdot101: si scrive il moltiplicandoil numero che viene sommato (spostato) nel calcolo del prodotto 11011101 per il bit 0 (che vale 1), si scrive 00 per il bit 1 spostato di 1 posto, di nuovo 11011101 spostato di 2 posti e si sommano: 1000001=651000001=65. Il circuito segue tre miglioramenti successivi:

  1. 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;
  2. invece di spostare a sinistra il moltiplicando (servirebbe un sommatorecircuito che somma due parole binarie a 2n2n bit), si sposta a destra il risultato corrente e si somma solo sulla metà alta: bastano nn bit di sommatore;
  3. il moltiplicatore MtMt si ospita nella metà bassa del registro PP del prodotto: il controllo guarda il bit meno significativo di PP e ogni shift a destra di PP sposta anche MtMt.

Esempio con Md=1101Md=1101 (13) e Mt=0101Mt=0101 (5), n=4n=4. Si parte da P=0000 0101P=0000\,0101:

  • bit 1 (LSBbit meno significativo=1): Palto=0000+1101=1101P_{alto}=0000+1101=1101; shift: 0110 10100110\,1010;
  • bit 0: nulla; shift: 0011 01010011\,0101;
  • bit 1: Palto=0011+1101=10000→0000P_{alto}=0011+1101=10000\to0000 (con il riportobit che passa alla colonna successiva quando la somma supera la cifra massima 11 che finisce nel bit più alto: si ottiene 1 00001\,0000 e dopo lo shift 1000 00101000\,0010);
  • bit 0: nulla; shift: 0100 0001=650100\,0001=65 ✓. 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 (−2n−1-2^{n-1}) 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: −5⋅12=5⋅(4−16)=5⋅4−5⋅16-5\cdot12=5\cdot(4-16)=5\cdot4-5\cdot16 (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 0 1…1⏟k 00\,\underbrace{1\dots1}_k\,0 vale 2j+k−2j2^{j+k}-2^{j}, quindi basta sottrarre all'inizio della sequenza e sommare alla fine. Il vantaggio (meno somme) si perde con moltiplicatori alternati (tipo 1010101010101010).

Registri. AA (nn bit, parte alta del prodotto, inizialmente 0), QQ (nn bit, contiene il moltiplicatore), un bit extra q−1q_{-1} (inizialmente 0) e il moltiplicando MM (nn bit). Per ognuno degli nn passi:

Q0 q−1Q_0\,q_{-1} Azione su AA
1 01\,0 A←A−MA\leftarrow A-M (inizio di una sequenza di uni)
0 10\,1 A←A+MA\leftarrow A+M (fine di una sequenza di uni)
0 00\,0 oppure 1 11\,1 nessuna

e poi shift aritmetico a destra della terna (A,Q,q−1)(A,Q,q_{-1}) di un posto (il bit di segno di AA 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 AA si trascurano i riporti oltre il bit più significativo;
  • il bit "precedente" il bit meno significativo del moltiplicatore è considerato 0 all'inizio. Dopo gli nn passi, la concatenazione A QA\,Q (di 2n2n 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: 5⋅(−3)5\cdot(-3) su 4 bit

M=0101M=0101 (5), Q=1101Q=1101 (−3-3), A=0000A=0000, q−1=0q_{-1}=0.

Passo Q0q−1Q_0q_{-1} Azione A QA\,Q dopo lo shift
1 10 A=0000−0101=1011A=0000-0101=1011 1101 11101101\,1110
2 01 A=1101+0101=0010A=1101+0101=0010 0001 01110001\,0111
3 10 A=0001−0101=1100A=0001-0101=1100 1110 00111110\,0011
4 11 nessuna 1111 00011111\,0001

Risultato 111100012=−1511110001_2=-15 ✓.

Esempio 2 (tema d'esame): (0x1A)⋅(0x1B)(\texttt{0x1A})\cdot(\texttt{0x1B}) su 5 bit

0x1A=11010=−6\texttt{0x1A}=11010=-6 (moltiplicando MM), 0x1B=11011=−5\texttt{0x1B}=11011=-5 (moltiplicatore QQ). Prodotto atteso 3030, che sta nei 2n=102n=10 bit.

Passo Q0q−1Q_0q_{-1} Azione A QA\,Q dopo lo shift
1 10 A=00000−11010=00110A=00000-11010=00110 00011 0110100011\,01101
2 11 nessuna 00001 1011000001\,10110
3 01 A=00001+11010=11011A=00001+11010=11011 11101 1101111101\,11011
4 10 A=11101−11010=00011A=11101-11010=00011 00001 1110100001\,11101
5 11 nessuna 00000 1111000000\,11110

Risultato 00000111102=300000011110_2=30 ✓ (si ritrova, nella metà bassa, la sequenza dei bit del moltiplicatore che man mano escono). Scambiando i ruoli (M=11011M=11011, Q=11010Q=11010) 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, (0x1A)⋅(0x05)(\texttt{0x1A})\cdot(\texttt{0x05}) su 5 bit

M=11010M=11010 (−6-6), Q=00101Q=00101 (+5+5). Le righe dopo ogni shift sono 00011 0001000011\,00010, 11110 1000111110\,10001, 00010 0100000010\,01000, 11110 0010011110\,00100, 11111 0001011111\,00010. Il risultato finale 11111000102=−301111100010_2=-30 ✓ (in complemento a 2 su 10 bit: 1024−301024-30).

Errori comuni

  • Non shiftare quando l'azione è "nessuna".
  • Shift logico invece che aritmetico (quando AA è negativo si perde il segno).
  • Sbagliare il verso della coppia: 1010 è sottrazione, 0101 è somma.
  • Non portare il bit precedenteil bit meno significativo scartato nello shift precedente, che per il primo passo vale 0 q−1=0q_{-1}=0 all'inizio.
  • Leggere il risultato su nn bit invece che su 2n2n bit.
  • Dimenticare di scrivere il prodotto parziale dopo lo shift quando il testo lo chiede.

Versione ripasso

Esercizi su questo argomento

Teoria collegata