Salta al contenuto
Note per Studenti Traslatori, comparatori e moltiplicatori

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 kk posizioni. Tipi, per una parola aN−1…a0a_{N-1}\dots a_0:

  • shift logico a sinistra (LSL): i bit si spostano verso l'MSB, si entra con 00 da destra: equivale a moltiplicare per 2k2^k (senza overflow);
  • shift logico a destra (LSR): si entra con 00 da sinistra: divisione per 2k2^k per i numeri senza segno;
  • shift aritmetico a destra (ASR): si replica il bit di segno da sinistra: divisione per 2k2^k per i numeri in complemento a due;
  • rotazione (ROL, ROR): i bit usciti da un lato rientrano dall'altro.

Esempi (8 bit). 0001 0110 (22)0001\,0110\ (22), LSL di 22: 0101 1000 (88)=22⋅40101\,1000\ (88)=22\cdot4. 1110 0100 (−28)1110\,0100\ (-28), ASR di 11: 1111 0010 (−14)1111\,0010\ (-14); LSR di 11 darebbe 0111 0010 (114)0111\,0010\ (114), sbagliato per un numero con segno. Rotazione a destra di 0001 01100001\,0110 di 22: 1000 01011000\,0101.

Barrel shifter. Un traslatore a una sola posizione (un multiplexer 2→12\to1 per bit: "shifta" o "non shifta") non basta per spostamenti variabili. Il barrel shifter usa log⁡2N\log_2N livelli di multiplexer 2→12\to1: il livello jj trasla di 2j2^j posizioni se il bit jj del numero di posizioni ss vale 11. Per N=8N=8: tre livelli (traslazioni di 11, 22, 44) coprono ogni ss da 00 a 77; per s=5=1012s=5=101_2 sono attivi i livelli 11 e 44. Costo: Nlog⁡2NN\log_2N multiplexer; ritardo: log⁡2N\log_2N ritardi di multiplexer, indipendente da ss. 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. A=BA=B se e solo se ogni coppia di bit è uguale: il bit ii è uguale se ei=Ai⊕‾Bi=Ai⊕Bi‾e_i=A_i\overline{\oplus}B_i=\overline{A_i\oplus B_i} (XNOR); EQ=eN−1 eN−2⋯e0EQ=e_{N-1}\,e_{N-2}\cdots e_0 (AND di NN 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: A>BA>B se al primo bit in cui differiscono Ai=1A_i=1 e Bi=0B_i=0. Con gi=AiBi‾g_i=A_i\overline{B_i} (qui Ai>BiA_i>B_i) e eie_i come sopra: GT=gN−1+eN−1(gN−2+eN−2(gN−3+… )),LT analogo,EQ=∏ei.GT=g_{N-1}+e_{N-1}\big(g_{N-2}+e_{N-2}(g_{N-3}+\dots)\big),\qquad LT\text{ analogo},\quad EQ=\prod e_i. Esempio: A=1011A=1011, B=1001B=1001: e3=1e_3=1 (1,1), e2=1e_2=1 (0,0), il bit 11: A1=1>B1=0A_1=1>B_1=0 (g1=1g_1=1): quindi GT=0+1⋅(0+1⋅1)=1GT=0+1\cdot(0+1\cdot1)=1, A>BA>B (11>911>9).

Con la sottrazione. Si calcola A−B=A+B‾+1A-B=A+\overline B+1 e si legge: ZZ per l'uguaglianza; per i numeri senza segno A≥BA\ge B se il riporto d'uscita vale 11 (nessun prestito); per i numeri con segno A<BA<B se N⊕VN\oplus V vale 11 (segno del risultato corretto dall'overflow). È il metodo dei processori (flag ZZ, CC, NN, VV).

Moltiplicatori

Il prodotto di due numeri senza segno di NN bit ha 2N2N bit. Per ogni bit BjB_j del moltiplicatore si forma un prodotto parziale PPj=A⋅BjPP_j=A\cdot B_j (un AND per bit) traslato di jj posizioni e si sommano tutti.

Esempio (4×44\times4 bit): A=1011 (11)A=1011\ (11), B=1101 (13)B=1101\ (13):

        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 = 143

Moltiplicatore a matrice (array): N2N^2 porte AND generano i prodotti parziali e una matrice di N(N−1)N(N-1) full adder ne somma le righe (il riporto di ciascuna riga si propaga alla successiva): N=4N=4: 1616 AND e 1212 full adder. Il cammino critico attraversa circa 2N2N celle: ritardo ≈(2N−2) tcarry+tsum\approx(2N-2)\,t_{carry}+t_{sum}, lineare in NN ma con area quadratica (O(N2)O(N^2) celle).

Alternative.

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 NN bit richiede 2N2N bit.
  • Confrontare i bit da quello meno significativo: il confronto di grandezza parte dall'MSB.
  • Dire che il moltiplicatore array è O(log⁡N)O(\log N): lo è il Wallace tree (con sommatore finale veloce).

Versione ripasso

  • Shift: LSL ×2k\times2^k (0001 0110→0101 10000001\,0110\to0101\,1000); LSR senza segno; ASR replica il segno (1110 0100 (−28)→1111 0010 (−14)1110\,0100\,(-28)\to1111\,0010\,(-14)); rotazioni. Barrel shifter: log⁡2N\log_2N livelli di mux 2→12\to1 (Nlog⁡2NN\log_2N mux, s=5s=5: livelli 11 e 44 per N=8N=8); ritardo log⁡N\log N.
  • Comparatore: uguaglianza =∏=\prod XNOR; grandezza dal MSB: GT=gN−1+eN−1(gN−2+eN−2(…))GT=g_{N-1}+e_{N-1}(g_{N-2}+e_{N-2}(\ldots)) (1011>10011011>1001); con la sottrazione: ZZ, riporto (senza segno), N⊕VN\oplus V (con segno).
  • Moltiplicatore: 2N2N bit di prodotto; prodotti parziali con AND traslati e sommati (1011×1101=143=1000 11111011\times1101=143=1000\,1111); array: N2N^2 AND, N(N−1)N(N-1) full adder, ritardo ≈2N\approx2N celle; Wallace (carry-save, O(log⁡N)O(\log N)), Booth radix-4, sequenziale (NN cicli); DSP in FPGA.
  • Errori: LSR su numeri con segno; 2N2N bit dimenticati; confronto dall'LSB; array =O(log⁡N)=O(\log N).

Teoria collegata