Salta al contenuto
Note per Studenti Latch, registri e parametri temporali

Latch, registri e parametri temporali

In questa pagina 9

I circuiti combinatori (Porte logiche CMOS - struttura statica complementare e dimensionamentoUna porta CMOS statica complementare ha una rete di pull-down (PDN, n-MOS) verso massa e una di pull-up (PUN, p-MOS) verso V_DD, duali tra loro: serie ↔ parallelo. La PDN conduce quando la funzione f degli ingressi vale 1 e porta l'uscita a 0, quindi F = NOT f (le porte a uno stadio sono invertenti). Serie di n-MOS = AND, parallelo = OR; i p-MOS (chiusi con ingresso basso) fanno l'opposto. Escursione completa, nessun consumo statico, ritardo da R e C di uscita. Dimensionamento: si parte dall'inverter di riferimento (Z_n = 1, Z_p = r ≈ 2,4) e si scala ogni transistor del numero di transistor della serie peggiore a cui appartiene, così che la resistenza nel caso peggiore uguagli quella dell'inverter (NAND2: Z_n = 2, Z_p = r; NOR2: Z_n = 1, Z_p = 2r). Per un obiettivo R_pd = R*: Z_n = m R_n0/R* con m transistor in serie nel cammino peggiore. Per minimizzare la capacità di uscita si collegano all'uscita meno drain possibile.Porte logiche CMOS - struttura statica complementare e dimensionamento →) non ricordano nulla. Un circuito sequenziale ha uscite che dipendono dagli ingressi e dallo stato attuale, memorizzato in un registro che si aggiorna a ogni periodo di clock (stato presente →\to stato prossimo). Esistono due meccanismi di memorizzazione:

Nomenclatura

Nel libro adottato un latch è sensibile al livello del clock, un registro è edge-triggered (sensibile al fronte). Molti testi chiamano flip-flop i dispositivi edge-triggered. Le due famiglie:

  • latch trasparente a clock alto (positivo): se CLK=1CLK=1 l'uscita segue l'ingresso (Q=DQ=D), se CLK=0CLK=0 l'uscita mantiene il valore. Equazione: Q=CLK⋅D+CLK‾⋅QQ=CLK\cdot D+\overline{CLK}\cdot Q (un multiplexer con uscita retroazionata). Il latch negativo è il duale (trasparente per CLK=0CLK=0).
  • registro: campiona DD sul fronte del clock (di salita, per convenzione) e mantiene QQ per tutto il periodo.

Bistabilità, scrittura e latch a multiplexer

Due inverter in anello hanno tre punti di equilibrio: due stabili (guadagno minore di 11) e uno instabile in VMV_M (guadagno maggiore di 11): la metastabilità. Per scrivere un nuovo valore bisogna spezzare l'anello: durante la scrittura un ingresso forza lo stato (sovrastando l'inverter in retroazione), poi l'anello viene richiuso. Il clock fa da segnale di disaccoppiamento tra lo stato trasparente e lo stato di memoria. Con un multiplexer (CLKCLK seleziona DD oppure la retroazione QQ) si ottiene il latch a multiplexer; versioni a soli n-MOS richiedono clock non sovrapposti.

Registro master-slave

Due latch con fasi di clock opposte in cascata: il master (trasparente con CLK=0CLK=0) campiona DD mentre lo slave è in memoria; quando il clock sale il master memorizza e lo slave diventa trasparente e passa il valore del master a QQ. Ne risulta un registro edge-triggered sul fronte di salita: l'uscita cambia solo in quell'istante. Il valore su QQ è quello che DD aveva poco prima del fronte.

Latch SR

La coppia incrociata di porte NOR dà il latch SR (set-reset): Q=R+Q‾‾Q=\overline{R+\overline Q}, Q‾=S+Q‾\overline Q=\overline{S+Q}.

SS RR QQ
0 0 memoria (QQ invariato)
0 1 0
1 0 1
1 1 non ammesso: entrambe le uscite a 00 (non complementari)

La combinazione S=R=1S=R=1 è proibita non perché le uscite siano indeterminate durante S=R=1S=R=1 (valgono entrambe 00), ma perché se da quella configurazione si passa alla condizione di memoria (S=R=0S=R=0) lo stato delle uscite non è più prevedibile: le due porte rilasciano insieme e vince quella casualmente più veloce (gara critica, eventualmente metastabilità). Nei latch SR sincroni (a otto transistor: la coppia incrociata più due rami in serie, uno per S⋅CLKS\cdot CLK e uno per R⋅CLKR\cdot CLK) le uscite si scrivono solo se CLK=1CLK=1: Q=R⋅CLK+Q‾‾Q=\overline{R\cdot CLK+\overline Q}, Q‾=S⋅CLK+Q‾\overline Q=\overline{S\cdot CLK+Q} (la porta equivalente è un NOR con clock); è lo schema fondamentale delle celle di memoria SRAM (SRAM e DRAMSRAM e DRAM sono memorie volatili ad accesso casuale. La cella SRAM a 6 transistor è un latch di due inverter (M1-M4) con due n-MOS di accesso (M5, M6) pilotati dalla word line: uscita differenziale, veloce, grande. Lettura: BL e BL̄ precaricate, l'n-MOS driver abbassa leggermente il lato che memorizza 0 (il transistor driver deve essere più forte di quello di accesso, così il nodo non supera la soglia degli inverter); scrittura: una BL forzata a 0 porta il nodo sotto la soglia logica degli inverter in retroazione positiva, che poi si ribaltano. La DRAM a 1 transistor ha un n-MOS di accesso e una capacità di storage C_S: scrittura caricando C_S dalla BL (si perde V_T: bootstrap della WL), lettura per ridistribuzione di carica con la BL precaricata, ΔV = C_S/(C_BL + C_S)(V_X − V_PRE) ≈ 100-250 mV, distruttiva: servono sense amplifier per ogni BL e refresh periodico. Celle DRAM a 3 transistor: lettura non distruttiva.SRAM e DRAM →), ma non più usato nelle unità di elaborazione.

Parametri temporali del registro

Per un registro D (campionamento sul fronte di clock):

  • tempo di propagazione clock-uscita tc-qt_{c\text{-}q}: ritardo tra il fronte di clock e la commutazione dell'uscita QQ (non tra DD e QQ);
  • tempo di setup tsut_{su}: tempo per cui il dato DD deve rimanere stabile prima del fronte;
  • tempo di hold tholdt_{hold}: tempo per cui DD deve rimanere stabile dopo il fronte. Se DD cambia dentro la finestra [−tsu,+thold][-t_{su},+t_{hold}] attorno al fronte, il registro può non campionare correttamente o entrare in metastabilità (uscita a un livello intermedio per un tempo imprevedibile, che si ripercuote sugli stadi successivi).

Frequenza massima di clock

Tra due registri c'è una logica combinatoria con ritardo di propagazione massimo tp,logict_{p,logic} e minimo (di contaminazione) tcd,logict_{cd,logic}. Il dato lanciato dal primo registro deve arrivare al secondo prima che il fronte successivo cominci la sua finestra di setup: Tmin ≥ tc-q+tp,logicmax+tsu,fmax=1Tmin.T_{min}\ \ge\ t_{c\text{-}q}+t_{p,logic}^{max}+t_{su},\qquad f_{max}=\frac1{T_{min}}. Per l'hold: il nuovo dato non deve arrivare al secondo registro troppo presto, cioè prima che sia scaduto il tempo di hold del fronte appena passato: tcd,reg+tcd,logic>tholdt_{cd,reg}+t_{cd,logic}>t_{hold} (con tcd,regt_{cd,reg} ritardo di contaminazione del registro, ≈tc-q\approx t_{c\text{-}q}). Il vincolo di hold non dipende dalla frequenza: se è violato non si risolve rallentando il clock. Si ripara aumentando il ritardo minimo (inserendo, per esempio, inverter in cascata tra i due registri).

Esempio. tc-q=0,4 nst_{c\text{-}q}=0{,}4\ \mathrm{ns}, tsu=0,2 nst_{su}=0{,}2\ \mathrm{ns}, logica massima 1,6 ns1{,}6\ \mathrm{ns}: Tmin=2,2 nsT_{min}=2{,}2\ \mathrm{ns}, fmax=455 MHzf_{max}=455\ \mathrm{MHz}. Hold: con thold=0,3 nst_{hold}=0{,}3\ \mathrm{ns} e logica minima 0,05 ns0{,}05\ \mathrm{ns}: 0,4+0,05=0,45>0,30{,}4+0{,}05=0{,}45>0{,}3: rispettato. Se i due registri fossero collegati direttamente (tcd,logic=0t_{cd,logic}=0) con tc-q=0,2 ns<thold=0,3 nst_{c\text{-}q}=0{,}2\ \mathrm{ns}<t_{hold}=0{,}3\ \mathrm{ns} la condizione sarebbe violata e il dato sbagliato si propagherebbe: la soluzione è inserire logica o ritardi (due inverter aggiungerebbero circa 0,1 ns0{,}1\ \mathrm{ns} ciascuno).

Pipeline

Per una funzione complessa si possono inserire registri nel mezzo della logica: ogni stadio ha meno logica, quindi il periodo minimo si riduce (Tmin=tc-q+max⁡itp,logic,i+tsuT_{min}=t_{c\text{-}q}+\max_i t_{p,logic,i}+t_{su} sul massimo tra gli stadi) e la frequenza massima aumenta; costa registri in più e una latenza maggiore (il primo risultato esce dopo più cicli), mentre il throughput è di un risultato per ciclo. Esempio: una logica di 6 ns6\ \mathrm{ns} con tc-q+tsu=0,6 nst_{c\text{-}q}+t_{su}=0{,}6\ \mathrm{ns}: Tmin=6,6 nsT_{min}=6{,}6\ \mathrm{ns} (151 MHz151\ \mathrm{MHz}); divisa in tre stadi da 2 ns2\ \mathrm{ns}: Tmin=2,6 nsT_{min}=2{,}6\ \mathrm{ns} (385 MHz385\ \mathrm{MHz}), latenza 3⋅2,6=7,8 ns3\cdot2{,}6=7{,}8\ \mathrm{ns} invece di 6,6 ns6{,}6\ \mathrm{ns}. La pipeline è vantaggiosa perché permette di massimizzare la frequenza di clock.

Latch e registri nella pratica

In FPGA e in VHDL i registri (D flip-flop) sono i soli elementi di memoria che si usano nei progetti sincroni; i latch compaiono per errore quando un processo combinatorio non assegna l'uscita in tutti i casi (VHDL - logica sequenziale e registriIn VHDL la logica sequenziale si descrive con processi sensibili al clock. Un registro D (flip-flop sul fronte) si scrive process(clk) con if rising_edge(clk); un latch è un processo sensibile al livello (if clk='1' then q<=d) senza altri rami. Il reset è sincrono se testato dentro rising_edge(clk) (la lista di sensibilità contiene solo clk), asincrono se testato prima, con RST nella lista di sensibilità (if rst='1' then ... elsif rising_edge(clk)). Registri a n bit con generic, registri a scorrimento (con load), contatori (up/down, con enable) si ottengono con la stessa struttura. In un progetto sincrono tutti i registri usano lo stesso clock (nessun clock generato da logica: si usano abilitazioni), i segnali esterni asincroni come i pulsanti si campionano con uno o più flip-flop (debouncing) e le cifre di un display si multiplexano con un contatore.VHDL - logica sequenziale e registri →). I vincoli di setup e hold si controllano nell'analisi di temporizzazione (Simulazione, testbench, vincoli di temporizzazione e flusso su FPGAUn progetto VHDL si verifica per simulazione con un testbench: una entity senza porte che istanzia il circuito sotto test (UUT), genera il clock (process con wait for e inversione), applica gli stimoli e controlla le uscite con assert/report/severity (note, warning, error, failure) o leggendo vettori da file (textio). Il flusso su FPGA è: descrizione VHDL, simulazione funzionale, sintesi (rete di LUT e flip-flop), implementazione (piazzamento e instradamento), analisi di temporizzazione, generazione del bitstream e programmazione della scheda. I vincoli (file XDC) assegnano i pin e definiscono il clock (periodo); l'analisi di temporizzazione verifica per ogni cammino registro-registro lo slack di setup, T − (t_c-q + t_logica + t_routing + t_su), e di hold; con slack negativo la frequenza è troppo alta: f_max = 1/(T − WNS).Simulazione, testbench, vincoli di temporizzazione e flusso su FPGA →).

Errori comuni

  • Dire che tc-qt_{c\text{-}q} è il ritardo tra DD e QQ: è tra il clock e QQ.
  • Scambiare setup (prima del fronte) e hold (dopo il fronte).
  • Pensare che una violazione di hold si risolva abbassando la frequenza: non dipende da TT.
  • Dire che la combinazione proibita del latch SR rende le uscite indeterminate durante S=R=1S=R=1: è il passaggio alla memoria a essere imprevedibile.
  • Dimenticare tsut_{su} e tc-qt_{c\text{-}q} nel calcolo del periodo minimo.

Versione ripasso

  • Memoria: retroazione positiva (statici) o carica (dinamici); stato presente →\to prossimo.
  • Latch (sensibile al livello): positivo: Q=CLK⋅D+CLK‾⋅QQ=CLK\cdot D+\overline{CLK}\cdot Q (trasparente a CLK=1CLK=1); registro (fronte) = due latch opposti (master-slave); scrittura: si spezza l'anello (clock = disaccoppiamento).
  • Latch SR (NOR): S RS\,R: 0000 memoria, 01→001\to0, 10→110\to1, 1111 proibito (uscite entrambe 00): da 1111 a 0000 stato imprevedibile.
  • Parametri: tc-qt_{c\text{-}q} (clock →Q\to Q), tsut_{su} (stabile prima), tholdt_{hold} (stabile dopo); finestra violata ⇒\Rightarrow metastabilità.
  • Frequenza: Tmin≥tc-q+tp,logicmax+tsuT_{min}\ge t_{c\text{-}q}+t_{p,logic}^{max}+t_{su} (0,4+1,6+0,2=2,20{,}4+1{,}6+0{,}2=2{,}2 ns, 455455 MHz); hold: tcd,reg+tcd,logic>tholdt_{cd,reg}+t_{cd,logic}>t_{hold} (indipendente da TT; rimedio: inverter in cascata).
  • Pipeline: più registri ⇒\Rightarrow frequenza maggiore, latenza maggiore (6,6→2,66{,}6\to2{,}6 ns per ciclo con 33 stadi).
  • Errori: tc-qt_{c\text{-}q} tra DD e QQ; setup/hold scambiati; hold e frequenza; SR proibito; tsut_{su} dimenticato.

Esercizi su questo argomento

Teoria collegata