I circuiti logici combinatori hanno una proprietà che consiste nel fatto che l’uscita di un blocco è solo una funzione dei valori di ingresso correnti. Eppure, quasi tutti i sistemi utili richiedono memorizzazione di informazioni di stato, portando a un’altra classe di circuiti chiamati logici sequenziali. In questi circuiti, l’uscita dipende non solo dai valori correnti degli ingressi, ma anche dallo stato precedente. In altre parole, un circuito sequenziale ricorda alcune fasi della storia passata del sistema. Una varietà di scelte in circuiti sequenziali e metodologie rende la scelta corretta, che è sempre più importante nei moderni circuiti digitali, con un grande impatto sulle prestazioni, potenza e/o complessità di progettazione.
La figura 1 mostra uno schema a blocchi generale di una macchina a stati finiti (FSM) che consiste di una logica combinatoria e registri che contengono lo stato del sistema. Il sistema descritto appartiene alla classe dei sistemi sequenziali sincroni, in cui tutti i registri sono sotto il controllo di un singolo clock. Le uscite del FSM sono funzioni degli ingressi correnti e dello stato attuale. Sul fronte di salita del clock, i bit relativi allo stato successivo vengono copiati alle uscite dei registri (dopo un certo ritardo di propagazione). Il registro ignora quindi variazioni dei segnali di ingresso fino al successivo fronte di salita. In generale, i registri possono essere positive edge-triggered (dove i dati di ingresso vengono copiati sul fronte positivo) o negative edge-triggered (dove i dati di ingresso vengono copiati sul fronte di discesa del clock).
In generale, ci sono tre parametri di temporizzazione importanti associati con un registro come illustrato in figura 2. Il tempo di set-up (tsu) è il tempo di validazione dei dati di ingresso (ingresso D) prima della transizione dal clock (questo è la transizione 0-1 per un registro edge-triggered positivo). Il tempo di attesa (Thold) è il tempo affinché i dati rimangono validi dopo il fronte di clock. Supponendo che i tempi di set-up e hold-time (attesa) siano soddisfatti, i dati in ingresso D vengono copiati all’uscita Q dopo il ritardo di propagazione (con riferimento al fronte del clock) indicato con tc–q.
Registri Master-Slave Based Edge Triggered
L’approccio più comune per la costruzione di un registro edge-triggered è di utilizzare una configurazione master-slave, come mostrato nella figura 3. Il registro è composto da un latch positivo e uno negativo posti in cascata. Nella fase bassa del clock, la fase master è trasparente e l’ingresso D viene trasmesso all’uscita, QM. Durante questo periodo, lo stadio slave è in modalità di attesa, mantenendo il suo valore precedente con il sistema di retroazione.
Sul fronte di salita del clock, il master smette di campionare l’ingresso, e lo slave inizia la fase di campionamento. Durante la fase alta del clock, lo slave campiona il segnale in ingresso mentre il master rimane in attesa. Poiché QM è costante durante la fase alta del clock, l’uscita Q rende una sola transizione per ciclo. Un registro negative edge-triggered può essere costruito utilizzando lo stesso principio semplicemente commutando l’ordine del latch positivo e negativo.
Un’implementazione completa di un registro master-slave positive-edge triggered con multiplexers è visualizzata in figura 4. Il multiplexer è configurato utilizzando dei gate di trasmissione.
Registri e latch dinamici
Gli storage in un circuito sequenziale statico si basano sul concetto che una coppia di invertitori ad accoppiamento incrociato produce un elemento bistabile e può quindi essere utilizzata per memorizzare valori binari. Questo approccio ha la proprietà che un valore memorizzato rimane valido finché la tensione di alimentazione è applicata al circuito, da cui il nome statico. Il principale svantaggio, tuttavia, è la sua complessità. Quando i registri vengono utilizzati in strutture di calcolo che sono costantemente sotto un clock come struttura pipeline, il requisito che la memoria dovrebbe mantenere lo stato per lunghi periodi di tempo può essere significativamente meno rigido.
Ciò si traduce in una classe di circuiti basati su un deposito temporaneo di carica sulla capacità parassita. Il principio è identico a quello utilizzato nella logica dinamica: la carica immagazzinata in un condensatore può essere utilizzata per rappresentare un segnale logico. L’assenza di carica denota uno 0 logico, mentre la sua presenza significa un bit 1. Il condensatore non è ideale, purtroppo, e qualche perdita di carica è sempre presente.
Un valore memorizzato può, quindi, essere mantenuto solo per un limitato periodo di tempo, tipicamente nell’intervallo di millisecondi. Se si vuole preservare l’integrità del segnale è necessario un aggiornamento periodico del suo valore. Da qui il nome di storage dinamico. La lettura del segnale memorizzato da un condensatore senza interrompere la carica, richiede la disponibilità di un dispositivo con un’elevata impedenza di ingresso.
Un registro completamente dinamico positive edge-triggered basato sul concetto master-slave è mostrato nella figura 5. Quando CLK = 0, i dati di ingresso vengono campionati sul nodo di archiviazione 1, che ha una capacità equivalente di C1 costituito dalla capacità di gate di I1, la capacità di giunzione e di gate di T1. Durante questo periodo, lo stadio slave è in una modalità di attesa, con un nodo 2 in alta impedenza.
Sul fronte di salita del clock, T2 si accende, e il valore campionato sul nodo 1 si propaga all’uscita Q. Il nodo 2 memorizza, successivamente, la versione invertita del nodo 1. Questa implementazione di un registro edge-triggered è molto efficiente in quanto richiede solo 8 transistor. Gli switch di campionamento possono essere implementati usando strutture NMOS. Il numero di transistor ridotto è attraente per sistemi ad alte prestazioni e bassa potenza.
Pipelining
Fino ad ora abbiamo utilizzato la configurazione master-slave per creare registri edge-triggered. Un approccio completamente diverso per la costruzione di un registro è l’utilizzo di segnali impulsivi. L’idea è di costruire un breve impulso intorno al fronte di salita (o di discesa) del clock. Questo impulso agisce come ingresso di clock per un latch, campionando l’ingresso solo in una breve finestra, mantenendo a sua volta il tempo di apertura del latch molto breve (Fig. 6).
Pipelining è una tecnica di progettazione popolare spesso utilizzata per accelerare il funzionamento dei percorsi in data-processing digitali. L’idea è facilmente spiegabile con l’esempio della figura 7. L’obiettivo del circuito presentato è quello di calcolare log (| a – b |), dove entrambi a e b rappresentano flussi di numeri, il calcolo deve essere eseguito su un ampio set di valori.
Pipelining è una tecnica per migliorare l’utilizzo delle risorse e aumentare il throughput funzionale. Supponiamo di introdurre registri tra i blocchi logici, come mostrato nella figura 7. Il vantaggio di funzionamento pipeline diventa evidente in sede di esame del minimo periodo di clock. Il blocco del circuito combinatorio è partizionato in tre sezioni, ciascuna delle quali ha un ritardo di propagazione più piccolo rispetto alla funzione originale.
Supponiamo che tutti i blocchi logici abbiano approssimativamente lo stesso ritardo di propagazione. La rete pipeline supera il circuito originale di un fattore tre sotto queste ipotesi. L’aumento delle prestazioni avviene a costi relativamente piccoli con due registri supplementari, e un aumento della latenza. Questo spiega perché il pipelining è popolare nelll’attuazione di datapath high performance.