5. Il processore: unità di elaborazione dati e unità di controllo
5.1 Introduzione
La modalità di implementazione delle istruzioni MIPS base, comprese quelle logico-aritmetiche su
numeri interi, quelle di accesso alla memoria e quelle di salto è in larga misura simile. Per
ciascuna istruzione i primi due passi sono identici:
- inviare l'uscita del contatore di programma (program counter, PC) all'unità di memoria che
contiene il programma e prelevare l'istruzione dalla memoria stessa. Questa operazione viene indicata
con il termine fetch.
- Leggere uno o due registri, selezionati mediante i campi dell'istruzione. Per l'istruzione load
word è sufficiente un solo registro, ma la maggior parte delle altre istruzioni richiede la
lettura di due registri.
Compiuti questi due passi, le azioni necessarie al completamento dell'istruzione dipendono dalla sua
classe; comunque all'interno della stessa classe (accesso alla memoria, logico-aritmetica, salto) le
azioni sono in larga misura le stesse.
Si possono riscontrare delle somiglianze anche tra diverse classi di istruzioni; tutte le classi di
istruzioni utilizzano l'unità logico-aritmetica (ALU) dopo aver letto i registri: le istruzioni
di accesso alla memoria usano la ALU per il calcolo dell'indirizzo, le istruzioni logico-aritmetiche
per l'esecuzione dell'operazione ed i salti per eseguire confronti.
Dopo l'utilizzo della ALU, le azioni richieste per completare le istruzioni differiscono per le diverse
classi: un'istruzione di accesso alla memoria dovrà accedervi per scrivere il dato (store) o
per leggerlo (load); un'istruzione logico-aritmetica dovrà scrivere il risultato calcolato dalla
ALU in un registro; le istruzioni di salto potrebbero dover modificare l'indirizzo della prossima
istruzione da eseguire in funzione dell'esito del confronto.
Le unità funzionali nell'implementazione del MIPS consistono di due tipi diversi di elementi
logici: elementi che operano sui dati ed elementi che memorizzano lo stato. Gli elementi che operano sui
valori dei dati sono di tipo combinatorio, il che significa che le loro uscite
dipendono solamente dagli ingressi. La ALU è un elemento combinatorio: dato un insieme di ingressi
produce sempre la stessa uscita perchè non contiene alcun elemento di memoria.
Altri elementi memorizzano lo stato: un elemento può memorizzare informazioni di stato solo se
contiene al suo interno degli elementi di memoria; tali elementi verranno chiamati
elementi di stato.
Un elemento di stato possiede almeno due ingressi ed un'uscita: gli ingressi sono il valore da scrivere
nell'elemento ed il clock, che determina l'istante in cui il valore viene scritto; l'uscita fornisce
il valore che era stato scritto in un ciclo di clock precedente. Uno dei più semplici elementi di
stato è il flip flop di tipo D, ma dalla figura qui illustrata possiamo osservare che altri
elementi di stato sono le memorie ed i registri. Il clock viene utilizzato per determinare l'istante in
cui avviene l'operazione di scrittura, mentre la lettura può avvenire in ogni istante
La metodologia di temporizzazione definisce quando i segnali possono essere scritti e
quando possono essere letti: è importante definire la temporizzazione delle operazioni di lettura
e scrittura perchè se un segnale venisse letto contemporaneamente alla sua scrittura, il valore
letto potrebbe essere quello precedente, quello appena scritto, o addirittura una combinazione dei due!
La metodologia di temporizzazione che useremo sarà quella sensibile ai fronti
(edge-triggered), ossia i valori memorizzati all'interno del sistema sono modificati
solamente in corrispondenza di un fronte del segnale di clock. Poichè solo gli elementi di stato
possono memorizzare un valore, le reti combinatorie devono ricevere i propri ingressi da un insieme di
elementi di stato e scrivere il valore delle proprie uscite in un insieme di elementi di stato: gli
ingressi sono i valori scritti in un ciclo di clock precedente, mentre i valori di uscita potranno essere
utilizzati in un ciclo successivo.
La metodologia sensibile ai fronti permette di leggere il contenuto di un registro, inviarne il valore
attraverso uno o più blocchi di logica combinatoria e scrivere lo stesso registro nel medesimo
ciclo di clock.
|