Traslatori, comparatori e moltiplicatori
In questa pagina 4
I blocchi aritmetici di una ALU (Blocchi logici di un microprocessore - ALU, bus e logica tri-stateUn microprocessore semplice è formato da un'unità di controllo (decodifica le istruzioni e abilita gli altri blocchi), una ALU (operazioni aritmetiche e logiche), la memoria e i registri, collegati da bus (linee condivise unidirezionali o bidirezionali). La ALU combina un sommatore con un'unità logica e un multiplexer di selezione dell'operazione: la sottrazione è A + B̄ + 1 (XOR su B e riporto in ingresso a 1), le flag (zero, riporto, segno, overflow) descrivono il risultato. Un bus è una linea pilotata da più sorgenti: per evitare conflitti ogni uscita collegata è tri-state (il segnale enable la mette in alta impedenza) oppure open-drain (solo PDN: ciascuna può imporre 0, serve un pull-up per l'1).Blocchi logici di un microprocessore - ALU, bus e logica tri-state →) comprendono, oltre ai sommatori (Sommatori - full adder e ripple-carryLa somma di due bit con riporto in ingresso è realizzata dal full adder: S = A ⊕ B ⊕ C_in, C_out = AB + BC_in + AC_in. Con generate G = AB, propagate P = A ⊕ B (e delete D = Ā B̄) si scrive C_out = G + P·C_in e S = P ⊕ C_in: G e P non dipendono dal riporto in ingresso (fase di set-up), solo C_out ed S ne dipendono. Il sommatore ripple-carry collega N full adder in cascata: il riporto attraversa gli stadi uno dopo l'altro, nel caso peggiore t_add = (N−1) t_carry + t_sum (lineare in N). Il ritardo effettivo dipende dagli operandi: un generate o un delete azzera la catena, un propagate la prolunga; per operandi uguali bit a bit vale t_carry + t_sum.Sommatori - full adder e ripple-carry →, Sommatori veloci - carry-bypass, carry-select e square-rootIl ripple-carry ha ritardo lineare in N. Il carry-bypass divide i bit in blocchi da M: se tutti i propagate del blocco valgono 1 (BP = P0P1…P_{M−1} = 1) un multiplexer fa saltare il riporto dall'ingresso all'uscita del blocco. Ritardo: t = t_setup + M t_carry + (N/M − 1) t_mux + (M−1) t_carry + t_sum, ottimo per M = √(N t_mux/(2 t_carry)); è determinato principalmente dal tempo di riporto. Il carry-select calcola in ogni blocco le somme per riporto 0 e per riporto 1 e un mux sceglie quella giusta: t = t_setup + M t_carry + (N/M) t_mux + t_sum, M ottimo √(N t_mux/t_carry); lo square-root carry-select usa blocchi di dimensione crescente (M, M+1, M+2…) perché il riporto arriva ogni volta un mux dopo: N ≈ K²/2 e t = t_setup + M t_carry + √(2N) t_mux + t_sum, cioè ritardo ∝ √N.Sommatori veloci - carry-bypass, carry-select e square-root →), i traslatori, i comparatori e i moltiplicatori.
Traslatori (shifter)
Un traslatore sposta i bit di una parola di posizioni. Tipi, per una parola :
- shift logico a sinistra (LSL): i bit si spostano verso l'MSB, si entra con da destra: equivale a moltiplicare per (senza overflow);
- shift logico a destra (LSR): si entra con da sinistra: divisione per per i numeri senza segno;
- shift aritmetico a destra (ASR): si replica il bit di segno da sinistra: divisione per per i numeri in complemento a due;
- rotazione (ROL, ROR): i bit usciti da un lato rientrano dall'altro.
Esempi (8 bit). , LSL di : . , ASR di : ; LSR di darebbe , sbagliato per un numero con segno. Rotazione a destra di di : .
Barrel shifter. Un traslatore a una sola posizione (un multiplexer per bit: "shifta" o "non shifta") non basta per spostamenti variabili. Il barrel shifter usa livelli di multiplexer : il livello trasla di posizioni se il bit del numero di posizioni vale . Per : tre livelli (traslazioni di , , ) coprono ogni da a ; per sono attivi i livelli e . Costo: multiplexer; ritardo: ritardi di multiplexer, indipendente da . In VHDL gli operatori di traslazione sono sll, srl, sla, sra, rol, ror (VHDL - struttura, tipi di dato e processiVHDL è un linguaggio di descrizione dell'hardware: un listato non è una sequenza di istruzioni eseguite da un processore ma la descrizione di un circuito, che la sintesi traduce in uno schema (LUT, flip-flop, multiplexer). Ogni modulo ha una entity (interfaccia: port con modo in, out, inout e tipo; eventuali generic) e una architecture (parte dichiarativa: segnali, costanti, componenti; parte assertiva dopo begin: assegnazioni concorrenti e processi). Le istruzioni nell'architecture sono concorrenti: l'ordine in cui sono scritte non conta. Un process esegue le proprie istruzioni in modo sequenziale quando un segnale della lista di sensibilità cambia. Segnali (<=, aggiornati alla fine del delta cycle, definiti nella parte dichiarativa) e variabili (:=, immediate, solo dentro il processo) hanno semantica diversa. Tipi: bit, boolean, integer, std_logic (a 9 valori, tra cui 'Z', 'X', 'U'), std_logic_vector, unsigned e signed (numeric_std).VHDL - struttura, tipi di dato e processi →).
Comparatori
Uguaglianza. se e solo se ogni coppia di bit è uguale: il bit è uguale se (XNOR); (AND di XNOR, ad albero per limitare il fan-in: Porte logiche CMOS - ritardo di Elmore, fan-in e consumoIl ritardo di una porta dipende dalla configurazione degli ingressi: si calcola il caso peggiore (un solo cammino conduttivo, il più resistivo) e il caso migliore. Per una rete RC con transistor in serie si usa il ritardo di Elmore: t = 0,69 Σ_k C_k · R_k, con R_k la resistenza totale tra il nodo k e il generatore (massa o V_DD) lungo il cammino e C_k la capacità del nodo. Per NAND2 con R_n = R_p: t_pLH (caso peggiore) = 0,69 R_p C, t_pHL = 0,69·2R_n C, quindi t_pHL = 2 t_pLH; per NOR2 è l'opposto. Una NOR a N ingressi (tutti i transistor uguali, nodi interni trascurati): t_pLH = 0,69 R_p C N(N+1), t_pHL = 0,69 R_n C (N+1): il ritardo cresce col quadrato del fan-in, perciò si evitano fan-in maggiori di 4. Rimedi: dimensionamento progressivo (transistor più grandi dal lato opposto all'uscita), riordino degli ingressi (il più tardivo vicino all'uscita), cascata di porte con meno ingressi, buffer. La potenza dinamica dipende dalla probabilità di commutazione.Porte logiche CMOS - ritardo di Elmore, fan-in e consumo →).
Grandezza (senza segno). Si confrontano i bit a partire dal più significativo: se al primo bit in cui differiscono e . Con (qui ) e come sopra: Esempio: , : (1,1), (0,0), il bit : (): quindi , ().
Con la sottrazione. Si calcola e si legge: per l'uguaglianza; per i numeri senza segno se il riporto d'uscita vale (nessun prestito); per i numeri con segno se vale (segno del risultato corretto dall'overflow). È il metodo dei processori (flag , , , ).
Moltiplicatori
Il prodotto di due numeri senza segno di bit ha bit. Per ogni bit del moltiplicatore si forma un prodotto parziale (un AND per bit) traslato di posizioni e si sommano tutti.
Esempio ( bit): , :
1011 A (11)
x 1101 B (13)
------
1011 bit B0 = 1: A
0000 bit B1 = 0: zero, traslato di 1
1011 bit B2 = 1: A traslato di 2
1011 bit B3 = 1: A traslato di 3
--------
10001111 = 11 + 44 + 88 = 143Moltiplicatore a matrice (array): porte AND generano i prodotti parziali e una matrice di full adder ne somma le righe (il riporto di ciascuna riga si propaga alla successiva): : AND e full adder. Il cammino critico attraversa circa celle: ritardo , lineare in ma con area quadratica ( celle).
Alternative.
- Wallace tree (somma con riporto salvato, carry-save): i prodotti parziali si riducono con livelli di full adder usati come compressori 3:2 (tre bit in ingresso, due in uscita) fino a due righe; l'ultimo passo è un sommatore veloce. Ritardo .
- Booth: raggruppa il moltiplicatore in coppie di bit (): dimezza il numero di prodotti parziali e gestisce direttamente il complemento a due.
- Sequenziale (shift-and-add): un solo sommatore e un registro che accumula; ad ogni ciclo si somma (se il bit ) e si trasla: cicli, area minima.
- Nelle FPGA (FPGA - LUT, slice e risorse della famiglia 7Una FPGA è una matrice di blocchi logici configurabili (CLB) immersi in una griglia di interconnessioni programmabili, con risorse dedicate: block RAM, blocchi DSP, gestione del clock (MMCM, PLL), blocchi di I/O e transceiver. La memoria di configurazione è SRAM. L'elemento base è la LUT: una memoria SRAM con 2^k celle che realizza una qualsiasi funzione di k ingressi (i segnali di selezione del multiplexer sono gli ingressi della funzione). Nella famiglia 7 di Xilinx un CLB ha 2 slice; uno slice ha 4 LUT a 6 ingressi (ciascuna divisibile in due LUT a 5), multiplexer larghi F7/F8 (funzioni a 7-8 ingressi), una catena di riporto veloce, 4 flip-flop/latch più 4 flip-flop. Nei SLICEM la LUT può essere usata come RAM distribuita o registro a scorrimento (SRL32), nei SLICEL solo come logica.FPGA - LUT, slice e risorse della famiglia 7 →) i moltiplicatori sono blocchi DSP dedicati ( bit con pre-sommatore e accumulatore), molto più veloci di quelli in logica generale.
Errori comuni
- Usare lo shift a destra logico per un numero con segno (perde il segno): serve quello aritmetico.
- Dimenticare che il prodotto di due numeri a bit richiede bit.
- Confrontare i bit da quello meno significativo: il confronto di grandezza parte dall'MSB.
- Dire che il moltiplicatore array è : lo è il Wallace tree (con sommatore finale veloce).
Versione ripasso
- Shift: LSL (); LSR senza segno; ASR replica il segno (); rotazioni. Barrel shifter: livelli di mux ( mux, : livelli e per ); ritardo .
- Comparatore: uguaglianza XNOR; grandezza dal MSB: (); con la sottrazione: , riporto (senza segno), (con segno).
- Moltiplicatore: bit di prodotto; prodotti parziali con AND traslati e sommati (); array: AND, full adder, ritardo celle; Wallace (carry-save, ), Booth radix-4, sequenziale ( cicli); DSP in FPGA.
- Errori: LSR su numeri con segno; bit dimenticati; confronto dall'LSB; array .