Salta al contenuto
Note per Studenti Registri e microoperazioni

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 nn bit è formato da nn 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 (clear‾\overline{clear}, attivo basso, cioè clear‾=0\overline{clear}=0 azzera) porta tutte le uscite QiQ_i a 0 in modo asincrono; durante il funzionamento normale clear‾=1\overline{clear}=1.

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 LoadLoad fa arrivare il clock ai FF solo quando desiderato: l'ingresso di clock dei FF è C=Clock+Load‾C=Clock+\overline{Load}. Con Load=1Load=1 è C=ClockC=Clock: i FF ricevono il clock e si aggiornano a ogni fronte di salita. Con Load=0Load=0 è C=1C=1 in modo stabile: non ci sono mai fronti di salita e il contenuto non cambia. Per funzionare correttamente LoadLoad deve rimanere costante quando Clock=0Clock=0 (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 DD (se EN=1EN=1) e l'uscita QQ del FF stesso (se EN=0EN=0):

  • EN=1EN=1: Q(t+1)=DQ(t+1)=D (si carica il dato al fronte di salita);
  • EN=0EN=0: Q(t+1)=Q(t)Q(t+1)=Q(t) (il registro mantiene il valore).

Si definisce così il flip-flop D con enable; il registro con load enable è fatto di nn di questi in parallelo con lo stesso clock e lo stesso LoadLoad. È 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: R(7:0)R(7:0). La convenzione little endian ha il bit di indice 00 (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. R2←R1R_2\leftarrow R_1: il contenuto di R1R_1 (sorgente) viene copiato in R2R_2 (destinazione); per definizione cambia la destinazione, non la sorgente. Nel circuito gli nn bit di uscita di R1R_1 sono collegati agli ingressi di R2R_2 e il segnale di controllo K1K_1 è collegato al LoadLoad di R2R_2. Un trasferimento è condizionato se avviene solo quando un segnale di controllo vale 1: K1: R2←R1K_1:\ R_2\leftarrow R_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: K3: R1←R2, R2←R1K_3:\ R_1\leftarrow R_2,\ R_2\leftarrow R_1 scambia i contenuti al fronte di clock in cui K3=1K_3=1 (entrambi leggono i valori vecchi).

2. Aritmetiche. Somma (++), sottrazione (−-), incremento (+1+1), decremento (−1-1), complemento. Moltiplicazione e divisione non sono elementari: si ottengono da sequenze di microoperazioni di base. Un sommatore-sottrattore con segnali di controllo XX (0 somma, 1 sottrazione) e K1K_1: X‾K1: R1←R1+R2,XK1: R1←R1+R2‾+1.\overline X K_1:\ R_1\leftarrow R_1+R_2,\qquad XK_1:\ R_1\leftarrow R_1+\overline{R_2}+1 . 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 K1=1K_1=1 la somma o la differenza di R1R_1 e R2R_2 viene caricata in R1R_1, 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 00 sui bit da azzerare, 11 sugli altri
porre a 1 (set) alcuni bit OR 11 sui bit da porre a 1, 00 sugli altri
complementare alcuni bit XOR 11 sui bit da complementare, 00 sugli altri

Esempi con R1=1010 1101  1010 1011R_1=1010\,1101\;1010\,1011.

  • clear dei primi 8 bit: maschera 0000 0000  1111 11110000\,0000\;1111\,1111, risultato 0000 0000  1010 10110000\,0000\;1010\,1011;
  • set dei primi 8 bit: maschera 1111 1111  0000 00001111\,1111\;0000\,0000 con OR, risultato 1111 1111  1010 10111111\,1111\;1010\,1011;
  • complemento dei primi 8 bit: maschera 1111 1111  0000 00001111\,1111\;0000\,0000 con XOR, risultato 0101 0010  1010 10110101\,0010\;1010\,1011.

Perché funziona: X⋅0=0X\cdot0=0 e X⋅1=XX\cdot1=X (AND); X+1=1X+1=1 e X+0=XX+0=X (OR); X⊕1=X‾X\oplus1=\overline X e X⊕0=XX\oplus0=X (XOR) (Algebra di Boole - assiomi, teoremi e complemento di una funzioneL'algebra di Boole opera su variabili a due valori con AND, OR, NOT. Identità fondamentali (neutro, idempotenza, complemento, commutativa, associativa, distributiva in entrambe le forme), dualità (si scambiano AND/OR e 0/1), De Morgan $\overline{X+Y}=\overline X,\overline Y$, assorbimento $X+XY=X$, $X+\overline XY=X+Y$, adiacenza $XY+X\overline Y=X$, consenso $XY+\overline XZ+YZ=XY+\overline XZ$. Si dimostrano per induzione perfetta (tabella) o algebricamente. Il complemento di una funzione si ottiene con De Morgan o con duale + negazione dei letterali. Costo: numero di letterali o di ingressi delle porte.Algebra di Boole - assiomi, teoremi e complemento di una funzione →).

4. Scorrimento (shift). Spostano lateralmente i bit di un registro. Shift a sinistra (slsl): 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 (srsr): i bit si spostano verso il LSB; bit uscente a destra, bit entrante a sinistra. Qui il bit entrante è 00 e il bit uscente è scartato. R←sl RR\leftarrow sl\,R equivale a moltiplicare per 22 (se non c'è overflow), R←sr RR\leftarrow sr\,R a dividere per 22 (senza segno).

Una microoperazione può appartenere a più tipi: il complemento a 1 è sia logica sia aritmetica.

Errori comuni

  • Credere che il trasferimento R2←R1R_2\leftarrow R_1 modifichi R1R_1: 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 slsl e srsr: slsl va verso il MSB.

Versione ripasso

Teoria collegata