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 bit (senza segno). L'indirizzo della cella si forma accostando i due operandi, quindi un moltiplicatore richiede righe di bit. Per esempio si legge alla riga di indirizzo .
| indirizzo | righe | bit totali | |
|---|---|---|---|
| 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 e (due nibble a 4 bit): Servono quattro moltiplicatori 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 bit è la somma dei prodotti parziali : 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 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 .
- 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 parte uguale al dividendo; il divisore è allineato al bit più alto del dividendo. A ogni passo si calcola : se il risultato è positivo o nullo il bit di quozienteil risultato intero di una divisione è 1 e resta ridotto; se negativo il bit è 0 e si ripristina (si risomma ). Poi si sposta di un posto a destra e si ripete. Esempio: . , (allineato: ): → bit 0; con spostato (): → bit 1, ; (): → 0; (): → bit 1, . Quoziente , resto ✓.
Versione con meno hardware. Si sposta a sinistra il dividendo (invece di spostare a destra il divisore) usando una ALU a bit invece di , 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 il quoziente sarebbe troppo grande: è così che si riconosce una divisione non permessa, che genera errore). Ogni sottrazione che dà si ripristina; a fine algoritmo la parte alta di va spostata a destra di un posto (altrimenti il resto è shiftato una volta di troppo). Esempio resto : ripercorrendo i passi (shift, sottrazione sulla parte alta, ripristinooperazione che risomma il divisore al resto quando la sottrazione ha dato un valore negativo se negativa) si arriva al quoziente e al resto .
Vincoli con bit
Con aritmetica intera a bit con segno il quoziente e il resto stanno in . Con 5 bit sono compresi tra 0 e 15 e il massimo dividendo è : l'unico divisore valido è 15 (quoziente 15, resto 14); un divisore minore darebbe quoziente non rappresentabile. Il dividendo ammette i divisori da () a ( resto 5); con il quoziente sarebbe , 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 Per esempio con resto (e non con resto , che soddisfa la relazione ma non la convenzione): deve essere , 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 con (dopo avere scalato con una potenza di 2) si pone , quindi e . Dalla identità segue L'errore relativo dell'approssimazione è : decresce più che esponenzialmente con . Con una aritmetica a 8 bit basta per avere un errore minore dell'LSB; con si ha la precisione di un'aritmetica a 32 bit. (Il caso generale è con scalato in : .)
Esempio numerico: , : e . Il valore vero è . Con la serie: : ; : ; : (errore relativo ); : (errore ). Quindi per superare l'accuratezzavicinanza del risultato al valore vero di una rappresentazione a 16 bit () servono 4 fattori.
Errori comuni
- Credere che la tabella look-upmemoria con le risposte già calcolate scali bene: cresce come .
- Dimenticare il ripristino quando il resto parziale diventa negativo.
- Arrotondare il quoziente negativo "per difetto" invece che verso zero.
- Applicare la serie a un fuori dall'intervallo (la serie converge solo se e rapidamente se ).
Versione ripasso
- Look-up table: bit (: 2048; : 1 Mbit); composizione con nibble: .
- A matrice: AND + sommatori, ritardo ; somma per colonne, riduzione, Wallace (half/full adder).
- Divisione: sottrazioni successive con ripristino ( resto 0), quoziente verso zero, ( resto ); range di quoziente e resto (5 bit: dividendo max 239).
- Con il moltiplicatore: , , errore (: → , → ).
- Errori: look-up "scalabile"; niente ripristino; quoziente per difetto; fuori da (Operazioni in virgola fissa - somma, prodotto e riallineamentoIn virgola fissa il processore opera sugli interi e non sa dov'è la virgola: tocca al programmatore. Regola 1: si sommano solo dati con lo stesso formato (stesso $m$). Regola 2: il prodotto di $n_1.m_1$ per $n_2.m_2$ ha $m_1+m_2$ bit frazionari e il doppio dei bit: va riallineato con uno shift a destra di $m_2$ posizioni (per riportarlo a $m_1$) o preso dalla parte alta. Con la normalizzazione frazionaria $1.15$ il prodotto è $2.30$ e basta uno shift a sinistra di 1 prima di prendere la parte alta. I fattori di scala si scelgono per evitare overflow e perdita di risoluzione.Operazioni in virgola fissa - somma, prodotto e riallineamento →).