Prima di iniziare a discutere di registri, dobbiamo introdurre il concetto di buffer invertente e non invertente.
Questo componente, viene anche chiamato tri-state.
Quando il segnale di controllo (control) è alto si comporta come un filo:
Quando il segnale di controllo è basso DataIn e DataOut (nella prima figura), vengono scollegati:
Quello presentato nelle righe immediatamente precedente è un buffer non invertente.
Mentre di seguito, mostriamo un buffer invertente che si comporta come l'opposto di un buffer non invertente:
Notiamo che vi è solamente aggiunto il pallino di negazione.
I registri sono un insieme di flip-flop di tipo D.
Lo stesso clock è in ingresso in tutti i flip-flop del registro.
Un ingresso: enable permette di connettere/disconnettere il registro dal bus di output tramite buffer non invertenti.
Ricapitolando: un registro è un insieme di flip-flop.
Un blocco di registri, come si intuisce, è un insieme di registri leggibili e scrivibili.
Per potere effettuare una operazione di lettura/scrittura si deve specificare il numero del registro sul quale compiere tale operazione.
La lettura di un blocco di registri non altera lo stato del registro che si va a leggere, quindi per ottenere il valore contenuto in uno specifico registro sarà sufficiente fornire alla logica combinatoria il numero identificativo dal quale si vuole leggere.
La scrittura invece, altera lo stato del registro. In tal caso saranno necessari tre input: il numero del registro su cui scrivere, il dato da scrivere e il clock per sincronizzare l'operazione.
Il registro che vediamo qua sopra, ha:
I 5 input sono le linee rappresentate alla sinistra della figura e linea di controllo per la scrittura (in azzurro nella figura).
I 2 output sono rappresentati alla destra.
I registri: read register number 1, read_register number 2 e write register selezionano i registri da leggere/scrivere. Write data è il dato da scrivere.
Le linee per i read register number 1 e 2 sono collegati, ognuno, ad un multiplexer.
read register number 1, non sono altro che delle linee di controllo per un multiplexer, che ci consentono di selezionare tra un certo numero di registri. In base a quanti registri ci sono read register number 1 avrà un certo numero di bit. Per esempio nel caso ci fossero 32 bit su cui scegliere, sarebbero necessari 5 bit (
Vediamo una figura:
In tal modo riusciamo ad implementare la lettura di un registro.
Supponiamo di avere 5 bit per selezionare i registri. E supponiamo di voler leggere il registro 10.
Dobbiamo passare il valore del registro che vogliamo leggere (in binario ovviamente), in questo caso il valore in 5 bit per il registro 10 è
Implementare la lettura risulta più complesso, dato che bisogna cambiare lo stato di un solo specifico registro. Tale risultato è ottenibili con un decoder che codificherò il segnale per identificare il registro da modificare.
Nella figura sopra register number non è altro che write register della figura in cui il register file è schematizzato per intero. Mentre register data non è altro che write data della stessa figura.
Tale figura viene riportata qui in basso:
Il segnale write (azzurro) non ha cambiato nome: rappresenta il clock.
Nella figura sopra il register number (ex write register) sono n linee di input per un decoder, che codificano un registro per la scrittura. Infatti il decoder è del tipo
Se nello stesso ciclo di clock uno stesso registro viene sia letto che scritto, dato che l'operazione di scrittura viene effettuata sul fronte del clock, si deve attendere che il clock si alzi di nuovo (quindi che si abbassi e si alzi) per poter effettuare la lettura.
Il che vuol dire che quando viene eseguita una operazione di scrittura su un registro, il valore scritto diventa valido durante il fronte del clock successivo. Ciò vuol dire che il valore scritto sarà disponibile per la lettura nelle operazioni successive.
Esempio:
Se si volesse restituire il valore scritto nel fronte di salita, nello stesso ciclo di clock è necessario aggiungere logica addizionale al banco di registri o al suo esterno.
Sotto è mostrato una immagine di una SRAM che ha una struttura simile ad un register file (sopra presentato).
L'immagine sopra mostra l'organizzazione complessiva della memoria.
Abbiamo 5 linee di ingresso:
Abbiamo poi 2 line di uscita.
Le celle attivate usano un buffer tri-state (descritto all'inizio di questo documento) connesso alle linee di output per fornire i dati richiesti. Come si vede nell'immagine sotto per
Il decoder ha il compito di selezionare quale coppia (linea orizzontale, riga) di celle di memoria deve essere attivata per la lettura/scrittura.
Una volta selezionate, le celle di memoria attivate utilizzano un output a tre stati che è collegato alla linea verticale per trasmettere i dati.
Ecco una simulazione della lettura, immaginiamo di avere proprio una SRAM come quella sopra.
Per l'ingresso al decoder abbiamo 2 bit che seleziona 1 tra le quattro righe di memoria.
L'indirizzo ha i bit
Il clock write enable è alto, quindi posso leggere (la lettura può avvenire in qualsiasi momento quando il clock è alto).
Vengono mandati in uscita su
L'indirizzo ha i bit
Il clock write enable è basso, nessun dato viene scritto, in questo ciclo di clock.
Si verifica un fronte di salita, vengono presi i valori passati in
Random Access Memory
Read Only Memory_ uitilizzate per dati che non devono essere modificati:
Una macchina o un automa, è un dispositivo in grado di interagire con l'ambiente esterno a fronte di uno stimolo in ingresso (input). In base a tale stimolo, l'automa, reagisce con una risposta che dipende da informazioni memorizzate in elementi interni.
Una macchina a stati finiti (FSM) è vista come una scatola che possiamo descrivere mostrando cosa succede passo dopo passo:
Distributore automatico di biglietti.
L'insieme dei simboli (finito) che supporta in ingresso è:
L'insieme dei simboli (finito) che supporta in uscita è:
L'insieme finito degli stati è formato da:
Tabella di transizione degli stati:
Grafo degli stati (diagramma di stato)
Una macchina a stati finiti
Nota: le funzioni
La macchine a stati finiti sono implementate da reti logiche sequenziali in cui le funzioni logiche
Soluzione: scegliamo il periodo del segnale di clock in modo che sia abbastanza grande da assicurare la stabilità dagli output del circuito.
Prossimo argomento organizzazione e gerarchia della memoria