Calcolatori elettronici/Unità di controllo
Per approfondire su Wikipedia, vedi la voce Unità di controllo (informatica). |
Il processore è composto da due parti:
- unità di elaborazione (o data path): contiene tutti i componenti attraverso cui passano i dati;
- unità di controllo (UC): si occupa di fornire i segnali di controllo per pilotare i componenti contenuti nell'unità di elaborazione, a seconda di volta in volta della istruzione corrente contenuta nell'IR e degli stimoli provenienti dall'esterno (es. campionamento MFC).
Microistruzioni
[modifica | modifica sorgente]L'unità di controllo deve conoscere le operazioni che deve effettuare per tutte le microistruzioni dell'instruction set. L'unità di controllo può eseguire le seguenti operazioni elementari:
- trasferimento di un dato da un registro ad un altro;
- prelievo di un dato o di una istruzione dalla memoria e caricamento in un registro;
- scrittura in memoria di un dato contenuto in un registro;
- passaggio alla ALU degli operandi di un'operazione aritmetica o logica e memorizzazione del risultato in un registro.
Trasferimento di dati tra registri
[modifica | modifica sorgente]I dati possono passare attraverso il bus interno da un registro all'altro. La unità di controllo può pilotare l'ingresso e l'uscita di ogni registro attraverso due segnali di controllo: uno pilota l'ingresso per il caricamento di dati dal bus, l'altro viceversa.
La unità di controllo deve anche preoccuparsi che l'ingresso del registro di destinazione venga attivato dopo che il registro di partenza ha finito di scrivere il dato sul bus.
Lettura e scrittura di dati in memoria
[modifica | modifica sorgente]Dal punto di vista della comunicazione tra memoria e processore, il bus esterno è in realtà diviso in tre bus: bus dati, bus indirizzi e bus di controllo.
Il registro MAR può solo leggere dal bus interno e scrivere sul bus esterno tramite due segnali di controllo, e ha il compito di passare alla memoria l'indirizzo della cella da leggere. L'unità di controllo campiona il segnale di controllo MFC: quando la memoria ha finito di leggere il dato e il segnale è stabile, essa attiva l'MFC.
Il registro MDR è connesso con il bus interno e con il bus esterno con segnali bidirezionali. Un multiplexer pilotato dal segnale di controllo SEL decide se gli ingressi dell'MDR devono essere pilotati dal bus interno oppure da quello esterno. Due buffer tri-state decidono invece a quale bus inviare le uscite.
Passaggio di operandi e ritorno del risultato di un'operazione
[modifica | modifica sorgente]Y e Z sono due registri AC che forniscono gli operandi alla ALU e ricevono i risultati delle operazioni.
Nel caso di un'operazione a due operandi, siccome non si può leggere dalla memoria più un operando per volta, il primo operando va caricato temporaneamente nel registro Y, aspettando che il secondo operando venga letto in modo che i due operandi vengano passati parallelamente alla ALU.
Il risultato dell'operazione viene memorizzato nel registro Z pronto ad essere passato al bus interno.
Esempi
[modifica | modifica sorgente]ADD [R3], R1
[modifica | modifica sorgente]Durante la fase di fetch, il processore esegue in parallelo l'accesso in memoria e, mentre aspetta l'MFC, l'aggiornamento del PC (tramite una rapida PCin), sfruttando il fatto che il PC è stato caricato sul bus interno dalla precedente PCout. Inoltre, nell'attesa della lettura del secondo operando il primo viene già predisposto all'elaborazione venendo caricato nel modulo Y.
JMP lab
[modifica | modifica sorgente]Il codice macchina dell'istruzione contiene l'offset dell'istruzione a cui saltare relativo all'indirizzo dell'istruzione di salto, pronto da sommare al valore corrente del PC.
JE lab
[modifica | modifica sorgente]L'unità di controllo verifica il valore del generico flag N trasferito dall'unità di elaborazione all'unità di controllo (C''in).
Tipi di unità di controllo
[modifica | modifica sorgente]Gli obiettivi di progettazione di un'unità di controllo sono:
- minimizzare la quantità di hardware;
- massimizzare la velocità di esecuzione;
- ridurre il tempo di progetto (flessibilità).
A seconda delle esigenze si possono scegliere due tipi di unità di controllo: cablata e microprogrammata.
Generalmente i sistemi CISC sono dotati di un'unità di controllo microprogrammata, e i RISC di una cablata. L'unità di controllo dei microprocessori 8086 è microprogrammata.
Unità di controllo cablata
[modifica | modifica sorgente]L'unità di controllo cablata (o hardwired) è un circuito sequenziale che riceve i segnali di ingresso, passa attraverso una variazione degli stati e restituisce i dati in uscita: dei flip-flop memorizzano lo stato corrente, e la rete combinatoria ha in ingresso l'IR e altri segnali e in uscita i segnali di controllo con cui pilotare l'unità di elaborazione.
Le operazioni sono temporizzate da colpi di clock:
- dopo aver ricevuto il segnale di
END
dell'istruzione precedente, inizia il fetch tramite il registro MAR; - continua a campionare il segnale MFC in attesa che la memoria sia pronta, finché l'MFC non è pari a 1;
- carica l'istruzione nell'IR tramite il registro MDR;
- esegue l'istruzione contenuta nell'IR pilotando i vari segnali di controllo.
Svantaggi
[modifica | modifica sorgente]- complessità di progetto: i tempi e i costi di progetto dell'unità di controllo possono diventare troppo alti se un processore è troppo complesso e richiede troppi segnali di controllo da gestire;
- mancanza di flessibilità: dimenticando anche solo un segnale di controllo l'operazione non va a buon fine. Inoltre, se si aggiungono istruzioni bisogna rifare da capo il progetto.
Unità di controllo microprogrammata
[modifica | modifica sorgente]L'unità di controllo microprogrammata ha una maggiore flessibilità di progetto, al prezzo di un maggiore costo hardware e di una minore velocità.
Memoria di microcodice
[modifica | modifica sorgente]Le sequenze di segnali di controllo relative a ogni microistruzione non sono generate da una logica di controllo sequenziale, ma memorizzate direttamente all'interno di una memoria di microcodice, di solito una ROM, pilotata da un microPC. Un registro microIR memorizza temporaneamente la sequenza di bit da inviare all'unità di elaborazione. All'inizio della memoria di microcodice si trova la sequenza per la fase di fetch; successivamente sono elencati i codici di controllo delle istruzioni a cui saltare in base al campo codice operativo specificato; altre istruzioni di salto alla fase di fetch successiva sono presenti al termine di ogni istruzione. Se il progettista si accorge di avere sbagliato un valore, può correggere quel valore direttamente nella memoria senza dover riprogettare tutto da capo.
Circuito di selezione dell'indirizzo
[modifica | modifica sorgente]Il circuito di selezione dell'indirizzo si assicura che il microPC punti sempre alla parola corretta:
- normalmente il circuito di selezione invia il valore del microPC a un semplice sommatore che lo incrementa all'istruzione consecutiva;
- durante l'attesa dell'MFC, il circuito di selezione deve mantenere fisso il microPC fino a quando la memoria non è pronta;
- il circuito di selezione valuta i flag per le istruzioni di salto condizionato:
- al termine della fase di fetch il microPC deve saltare alla prima microistruzione dell'istruzione letta;
- all'ultima microistruzione dell'istruzione corrente il microPC deve tornare all'inizio della successiva fase di fetch.
All'inizio di una parola della memoria di microcodice, possono essere previsti alcuni bit riservati al circuito di selezione dell'indirizzo per aiutarlo, in termini di complessità della logica combinatoria, a decidere se la microistruzione successiva richiede un semplice incremento o un'ulteriore elaborazione del valore nel microPC. Altre soluzioni possono scegliere di specificare al termine della parola direttamente il nuovo valore da caricare nel microPC.
Microprogrammazione verticale
[modifica | modifica sorgente]Il numero m di parole nella memoria di microcodice è difficile da minimizzare perché dipende dal numero di microistruzioni proprie del microprocessore e dalla loro complessità in termini di colpi di clock. Il parallelismo n è pari al numero dei segnali di controllo da pilotare a ogni colpo di clock, e può essere minimizzato attraverso tecniche di microprogrammazione verticale.
Per esempio, si possono individuare le classi di compatibilità aggiungendo un decoder in uscita di ciascuna. La classe di compatibilità è un gruppo di segnali di controllo a due a due compatibili, ovvero tra tutti i segnali ne viene attivato sempre e solo uno per colpo di clock. Un esempio è la classe di compatibilità dei segnali di controllo che pilotano i buffer tri-state connessi a un bus.
Unità di controllo dell'8088
[modifica | modifica sorgente]L'unità di controllo dell'8088 è composta da una parte cablata e da una parte microprogrammata. La memoria di microcodice ha 504 parole di parallelismo 21.
In realtà, il codice operativo di ogni istruzione oltre a indicare il tipo di istruzione dà informazioni sul tipo di operandi (registro, memoria...). Gli operandi stessi (es. AX) vengono memorizzati all'interno dei registri M e N. Alla fine della fase di fetch, una PLA riceve il codice operativo dell'istruzione letta e restituisce il nuovo valore del microPC, selezionando l'indirizzo di partenza della sequenza di microistruzioni. Inoltre, le istruzioni che si differenziano per poche microistruzioni possono essere fatte corrispondere allo stesso blocco di memoria di microcodice, valutando quando necessario il contenuto del registro X per differenziarle.