# Calcolatori elettronici/Unità di controllo

Calcolatori elettronici
Copertina Tutti i moduli · Sviluppo
    CopertinaCalcolatori elettronici/Copertina
* L'evoluzione dei sistemi di elaborazioneCalcolatori elettronici/L'evoluzione dei sistemi di elaborazione
* Il progetto di circuiti logiciCalcolatori elettronici/Il progetto di circuiti logici
* I processoriCalcolatori elettronici/I processori
* Architettura 8086Calcolatori elettronici/Architettura 8086
* Unità di controlloCalcolatori elettronici/Unità di controllo
* Introduzione alle memorieCalcolatori elettronici/Introduzione alle memorie
* Le memorie ad accesso casualeCalcolatori elettronici/Le memorie ad accesso casuale
* Le memorie cacheCalcolatori elettronici/Le memorie cache
* Le memorie ad accesso serialeCalcolatori elettronici/Le memorie ad accesso seriale
* La memoria virtualeCalcolatori elettronici/La memoria virtuale
* La gestione dei dispositivi input/outputCalcolatori elettronici/La gestione dei dispositivi input/output
* Intel 8255Calcolatori elettronici/Intel 8255
* Intel 8259Calcolatori elettronici/Intel 8259
* I busCalcolatori elettronici/I bus
* Le architetture a pipelineCalcolatori elettronici/Le architetture a pipeline
* Assembler 8086
          IntroduzioneCalcolatori elettronici/Introduzione
   * Informazioni generaliCalcolatori elettronici/Informazioni generali
   * Istruzioni di trasferimento datiCalcolatori elettronici/Istruzioni di trasferimento dati
   * Istruzioni aritmeticheCalcolatori elettronici/Istruzioni aritmetiche
   * Istruzioni per il controllo del flussoCalcolatori elettronici/Istruzioni per il controllo del flusso
   * Istruzioni per la manipolazione dei bitCalcolatori elettronici/Istruzioni per la manipolazione dei bit
   * Le procedureCalcolatori elettronici/Le procedure
   * Istruzioni per il controllo del processoreCalcolatori elettronici/Istruzioni per il controllo del processore
   * Formato delle istruzioni macchina, tempi di esecuzioneCalcolatori elettronici/Formato delle istruzioni macchina, tempi di esecuzione
Modifica il sommario
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

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

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

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

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
#### ADD [R3], R1

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 PC$_{in}$), sfruttando il fatto che il PC è stato caricato sul bus interno dalla precedente PC$_{out}$. Inoltre, nell'attesa della lettura del secondo operando il primo viene già predisposto all'elaborazione venendo caricato nel modulo Y.

#### JMP lab

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

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

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

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

* 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

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

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

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

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

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.