Registri e microoperazioni
In questa pagina 4
Nei capitoli precedenti i circuiti sequenziali avevano pochi flip-flop ed erano descrivibili con un diagramma degli stati. Per sistemi più complessi, divisi in moduli (alcuni formati da blocchi uguali ripetuti), servono strutture più grandi: registri, contatori, datapath e unità di controllo. (Versione sintetica: Registri e contatoriRegistro parallelo a n bit con caricamento abilitato; banco dei registri con due porte di lettura e una di scrittura; registri a scorrimento; contatori sincroni e asincroni (ripple), contatore modulo N con esempio svolto.Registri e contatori →.)
Registri
Un registro a bit è formato da flip-flop e da un insieme di porte logiche: i flip-flop memorizzano i dati, le porte elaborano i dati che arrivano agli ingressi dei flip-flop. Un contatore è un particolare registro che percorre una sequenza di stati (Registri a scorrimento e contatoriPiù sorgenti per un registro di destinazione si gestiscono con un MUX che sceglie la sorgente (e un encoder se i segnali di controllo sono 1-hot) più il Load. Lo shift register è una catena di FF con uscita di ognuno collegata all'ingresso del successivo: ingresso e uscita seriali, caricamento parallelo (Shift ha priorità su Load), versione bidirezionale con un MUX 4-to-1 per stadio (S1S0: 00 hold, 01 shift left, 10 shift right, 11 load). Usi: conversione serie/parallelo, interfacce, linee di ritardo, generatori pseudo-casuali. Contatori: ripple (asincrono, il clock di ogni FF è l'uscita del precedente, ritardo crescente) e sincrono (stesso clock, più veloce; EN e CO per la cascata).Registri a scorrimento e contatori →).
Registro a 4 bit più semplice. Solo flip-flop D PET, senza porte: ogni FF memorizza un bit a ogni fronte di salita del clock, comune ai 4 FF. L'operazione di caricamento di nuovi dati è detta load, qui parallelo (i 4 bit insieme). Un segnale di reset comune (, attivo basso, cioè azzera) porta tutte le uscite a 0 in modo asincrono; durante il funzionamento normale .
Controllo del caricamento
Non sempre si vuole che il registro sia aggiornato a ogni clock, ma solo quando serve. Due tecniche.
a) Clock gating. Il clock di sistema (master clock) è una sequenza continua di impulsi; una porta OR controllata da fa arrivare il clock ai FF solo quando desiderato: l'ingresso di clock dei FF è . Con è : i FF ricevono il clock e si aggiornano a ogni fronte di salita. Con è in modo stabile: non ci sono mai fronti di salita e il contenuto non cambia. Per funzionare correttamente deve rimanere costante quando (per esempio se proviene da un FF PET).
Svantaggi: le porte tra il clock di sistema e quello effettivo introducono ritardi di propagazione e quindi clock skew (il clock arriva in momenti diversi ai vari elementi, il sistema non è più perfettamente sincronizzato): servono attenzione e controllo dei ritardi, soprattutto nei progetti ad alta velocità (Temporizzazione dei flip-flop - setup, hold e frequenza massima di clockUn flip-flop memorizza il dato corretto solo se l'ingresso è stabile per $t_s$ (setup) prima e $t_h$ (hold) dopo il fronte di clock; l'uscita cambia dopo il tempo di propagazione $t_{pd,FF}$ dal fronte. In un circuito sincrono il periodo deve soddisfare $T\ge t_{pd,FF}+t_{COMB}+t_{s,FF}+t_{slack}$, quindi $f_{max}=1/T_{min}$; abbassare la frequenza risolve le violazioni di setup. Il vincolo di hold $t_{pd,FF,min}+t_{COMB,min}\ge t_h$ non dipende dal clock (e non si risolve rallentandolo). Il clock skew modifica i vincoli.Temporizzazione dei flip-flop - setup, hold e frequenza massima di clock →). Vantaggio: nei circuiti complessi non tutti i sottosistemi lavorano insieme; spegnere il clock delle parti inattive riduce il consumo di potenza senza ridurre le prestazioni (nei sistemi complessi ogni blocco ha di solito una logica di clock gating).
b) Load enable. Il clock arriva sempre ai FF; si controlla l'ingresso: un MUX 2-to-1 seleziona per il D tra il dato (se ) e l'uscita del FF stesso (se ):
- : (si carica il dato al fronte di salita);
- : (il registro mantiene il valore).
Si definisce così il flip-flop D con enable; il registro con load enable è fatto di di questi in parallelo con lo stesso clock e lo stesso . È preferibile al clock gating perché evita problemi di clock skew e malfunzionamenti. In VHDL è if load = '1' then Q <= D; end if; dentro il ramo del fronte (VHDL - latch, flip-flop e reset sincrono e asincronoIn VHDL un elemento di memoria si descrive con un process il cui ramo non assegna sempre il segnale: latch D = process(D,C) con if C='1' then Q<=D; flip-flop positive-edge-triggered = process(CLK) con if CLK'event and CLK='1'. Reset asincrono: RST nella sensitivity list e testato per primo (if RST='1' ... elsif fronte); reset sincrono: solo CLK in lista e RST testato dentro al ramo del fronte (serve un fronte per averne effetto). Il testbench di un circuito sincrono ha un process che genera il clock e uno che applica gli ingressi lontano dal fronte attivo.VHDL - latch, flip-flop e reset sincrono e asincrono →).
Datapath e unità di controllo
Un sistema sequenziale con molti stati non si descrive bene con un solo diagramma o tabella degli stati: si usa l'approccio gerarchico e si divide il sistema in blocchi. Molti sistemi digitali si dividono in due macroblocchi:
- il datapath svolge le operazioni di elaborazione dei dati (aritmetiche, logiche, ecc.): è fatto di registri e blocchi aritmetico-logici; riceve ingressi dati e segnali di controllo, fornisce uscite dati e segnali di stato;
- la unità di controllo (control unit) stabilisce l'ordine delle operazioni: è una macchina sequenziale sincrona che, in base ai propri ingressi di controllo e ai segnali di stato del datapath, genera i segnali di controllo che il datapath esegue.
Datapath e unità di controllo possono comunicare con altri blocchi come memoria e I/O. Le operazioni elementari su dati nei registri sono le microoperazioni; la unità di controllo fornisce i segnali che attivano la sequenza di microoperazioni (Datapath e unità di controllo - un sistema digitale non programmabileUna cella di registro è un flip-flop con la logica per le microoperazioni; un registro a $n$ bit ha $n$ celle e logica di controllo condivisa. Un sistema programmabile (CPU) ha un'unità di controllo che esegue istruzioni lette da una memoria (PC); in un sistema non programmabile la unità di controllo decide le microoperazioni solo da ingressi e segnali di stato del datapath. Esempio completo: sommare cinque valori consecutivi con start, res, busy; datapath con ACC_REG, OUT_REG, CNT_REG (decrementer, MUX, segnale di stato zero); microoperazioni (op_acc_idle/clr/acc/upd_out, op_cnt_idle/cnt/reload); unità di controllo a 3 stati (ready, acc, init), macchina di Mealy.Datapath e unità di controllo - un sistema digitale non programmabile →).
Microoperazioni e RTL
Una microoperazione è un'operazione elementare eseguita sui dati di un registro: incrementare il registro, scambiare i dati di due registri, far scorrere i bit. Il risultato può sostituire il valore nel registro stesso o essere trasferito in un altro, lasciando invariato il primo. Il linguaggio con cui si scrivono è il Register Transfer Language (RTL), simile agli statement degli HDL ma non identico al VHDL.
Notazioni. I registri hanno nomi in maiuscolo, spesso con numeri (AR address register, PC program counter, R1, R2). I bit si indicano tra parentesi dopo il nome: . La convenzione little endian ha il bit di indice (LSB) a destra; la big endian a sinistra; un registro lungo si divide in byte più significativo (H) e meno significativo (L).
Tipi di microoperazioni
1. Trasferimento. : il contenuto di (sorgente) viene copiato in (destinazione); per definizione cambia la destinazione, non la sorgente. Nel circuito gli bit di uscita di sono collegati agli ingressi di e il segnale di controllo è collegato al di . Un trasferimento è condizionato se avviene solo quando un segnale di controllo vale 1: (prima dei due punti la condizione). Il clock non compare nello statement: si assume che tutto avvenga sul fronte attivo. I trasferimenti simultanei si separano con una virgola: scambia i contenuti al fronte di clock in cui (entrambi leggono i valori vecchi).
2. Aritmetiche. Somma (), sottrazione (), incremento (), decremento (), complemento. Moltiplicazione e divisione non sono elementari: si ottengono da sequenze di microoperazioni di base. Un sommatore-sottrattore con segnali di controllo (0 somma, 1 sottrazione) e : Si usa l'hardware dell'addizionatore-sottrattore (Numeri con segno, complemento a 2, sottrazione e overflowSottrazione senza segno: se $M\ge N$ nessun prestito in uscita, altrimenti il risultato $M-N+2^n$ è scorretto. Complemento a 1: $2^n-1-N$ (inversione bit a bit); complemento a 2: $2^n-N=$ complemento a 1 $+1$. Numeri con segno: segno e modulo (due zeri, intervallo simmetrico) oppure complemento a 2 (un solo zero, da $-2^{n-1}$ a $2^{n-1}-1$, MSB di peso $-2^{n-1}$). In complemento a 2 somma e sottrazione sono la stessa addizione: $A-B=A+\overline B+1$, riporto in uscita scartato. Overflow: senza segno $\Leftrightarrow C_{out}=1$ nella somma; con segno $\Leftrightarrow C_{in,MSB}\ne C_{out,MSB}$ (due operandi dello stesso segno con risultato di segno opposto).Numeri con segno, complemento a 2, sottrazione e overflow →); a ogni fronte con la somma o la differenza di e viene caricata in , e il bit di riporto in uscita e quello di overflow sono trasferiti ai loro flip-flop.
3. Logiche. Operazioni bit a bit (bitwise): ogni bit del registro è una variabile binaria. Operazioni: NOT, AND, OR, XOR. (Il simbolo può essere somma aritmetica oppure OR logico: lo dice il contesto; dentro una funzione booleana è un OR.) Servono anche per modificare alcuni bit di un registro usando una maschera:
| scopo | operazione | maschera |
|---|---|---|
| azzerare (clear) alcuni bit | AND | sui bit da azzerare, sugli altri |
| porre a 1 (set) alcuni bit | OR | sui bit da porre a 1, sugli altri |
| complementare alcuni bit | XOR | sui bit da complementare, sugli altri |
Esempi con .
- clear dei primi 8 bit: maschera , risultato ;
- set dei primi 8 bit: maschera con OR, risultato ;
- complemento dei primi 8 bit: maschera con XOR, risultato .
4. Scorrimento (shift). Spostano lateralmente i bit di un registro. Shift a sinistra (): i bit si spostano verso il MSB; il bit uscente è quello più a sinistra del sorgente, il bit entrante nella posizione più a destra del destinazione. Shift a destra (): i bit si spostano verso il LSB; bit uscente a destra, bit entrante a sinistra. Qui il bit entrante è e il bit uscente è scartato. equivale a moltiplicare per (se non c'è overflow), a dividere per (senza segno).
Una microoperazione può appartenere a più tipi: il complemento a 1 è sia logica sia aritmetica.
Errori comuni
- Credere che il trasferimento modifichi : modifica solo la destinazione.
- Usare il clock gating per il load senza considerare skew e ritardi: preferire il load enable.
- Scambiare le maschere: AND azzera, OR pone a 1, XOR complementa.
- Dimenticare che in RTL può essere una somma aritmetica oppure un OR.
- Confondere e : va verso il MSB.
Versione ripasso
- Registro bit: FF D PET, clock comune, load parallelo, clear asincrono attivo basso. Clock gating (porta sul clock: meno potenza, ma ritardo skew; stabile a clock basso) vs load enable (MUX + D FF: carica , mantiene ): preferibile.
- Datapath (registri + ALU, ingressi/uscite dati, segnali di stato) e unità di controllo (FSM: segnali di controllo; ingressi: controllo + stato) (Datapath e unità di controllo - un sistema digitale non programmabileUna cella di registro è un flip-flop con la logica per le microoperazioni; un registro a $n$ bit ha $n$ celle e logica di controllo condivisa. Un sistema programmabile (CPU) ha un'unità di controllo che esegue istruzioni lette da una memoria (PC); in un sistema non programmabile la unità di controllo decide le microoperazioni solo da ingressi e segnali di stato del datapath. Esempio completo: sommare cinque valori consecutivi con start, res, busy; datapath con ACC_REG, OUT_REG, CNT_REG (decrementer, MUX, segnale di stato zero); microoperazioni (op_acc_idle/clr/acc/upd_out, op_cnt_idle/cnt/reload); unità di controllo a 3 stati (ready, acc, init), macchina di Mealy.Datapath e unità di controllo - un sistema digitale non programmabile →).
- RTL: ; simultanee con virgola ( = scambio); il clock è implicito.
- Tipi: trasferimento; aritmetiche (, complemento; es. ); logiche bitwise con maschera (AND azzera, OR pone a 1, XOR complementa); shift ( verso il MSB, verso il LSB; entrante 0).
- Errori: sorgente modificata; maschere scambiate; somma/OR (Registri a scorrimento e contatoriPiù sorgenti per un registro di destinazione si gestiscono con un MUX che sceglie la sorgente (e un encoder se i segnali di controllo sono 1-hot) più il Load. Lo shift register è una catena di FF con uscita di ognuno collegata all'ingresso del successivo: ingresso e uscita seriali, caricamento parallelo (Shift ha priorità su Load), versione bidirezionale con un MUX 4-to-1 per stadio (S1S0: 00 hold, 01 shift left, 10 shift right, 11 load). Usi: conversione serie/parallelo, interfacce, linee di ritardo, generatori pseudo-casuali. Contatori: ripple (asincrono, il clock di ogni FF è l'uscita del precedente, ritardo crescente) e sincrono (stesso clock, più veloce; EN e CO per la cascata).Registri a scorrimento e contatori →).