# Unità di controllo (informatica)

L'unità di controllo, abbreviata anche come CU (dall'inglese: Control Unit), è un componente della CPU che ha il compito di coordinare tutte le azioni necessarie per l'esecuzione di una istruzione e di insiemi di istruzioni. Essa è uno dei tre blocchi funzionali principali in cui è suddivisa un'unità di elaborazione centrale (CPU). Gli altri due blocchi sono l'unità logica aritmetica e l'unità di registro.
La sua funzione è quella di recuperare le istruzioni dalla memoria principale, decodificarle (interpretarle) ed eseguirle, utilizzando l'unità di elaborazione centrale.
La CU il componente che dà la possibilità al microprocessore di eseguire istruzioni diverse. Le azioni che coordinano i vari settori della CPU (la ALU, i registri, il Write-Back) vengono dette "micro operazioni", mentre un insieme di micro-istruzioni viene detto "microprogramma".
Esistono due tipi di unità di controllo: le unità di controllo cablate, generalmente utilizzate nelle macchine semplici, e le unità di controllo microprogrammate, utilizzate nelle macchine più complesse. Nel primo caso, i componenti principali sono il circuito logico sequenziale, il circuito di controllo dello stato, il circuito logico combinatorio e il circuito di emissione del riconoscimento del segnale di controllo. Nel secondo caso, la microprogrammazione dell'unità di controllo è memorizzata in una micro-memoria, alla quale si accede in modo sequenziale per eseguire successivamente ciascuna delle micro-istruzioni.

## Struttura del computer

* unità logica e aritmetica (ALU): esegue operazioni aritmetiche e logiche;
* unità di controllo: storicamente definita come parte distinta dal modello di riferimento del 1946: l'architettura di von Neumann. Nei moderni progetti di computer, l'unità di controllo è tipicamente una parte interna della CPU ed era conosciuta inizialmente come architettura Eckert-Mauchly.
* memoria: memorizza dati e programmi;
* dispositivi di input e output: alimentano la memoria con dati e istruzioni e forniscono i risultati dei calcoli memorizzati;
* bus: forniscono un mezzo di trasporto dei dati e delle istruzioni tra i diversi dispositivi e, più piccoli della memoria principale (registri), costituiscono la CPU (Central Processing Unit).

## Operazioni generali della CU

Le uscite della CU sono responsabili del controllo dell'attività del resto del dispositivo. Una CU può essere considerata come una macchina a stati finiti.
La CU è il circuito che controlla il flusso di dati attraverso il processore e coordina quest'ultimo, che a sua volta controlla il resto del computer.
Esempi di dispositivi che richiedono una CU sono le CPU e le GPU. La moderna era dell'informazione non sarebbe possibile senza la progettazione di complesse CU.

## Tipologie di CU

Si distinguono unità di controllo cablate e microprogrammate.

### Unità di controllo cablate

Un tempo le unità di controllo per le CPU erano costituite da una logica ad hoc ed erano difficili da progettare. Possono essere identificate come la parte principale del computer e il dispositivo principale che aiuta il computer a funzionare in modo corretto. La CU è costituita da porte logiche, circuiti bistabili, circuiti di codifica, circuiti di decodifica, contatori digitali e altri circuiti digitali. Il suo controllo si basa su un'architettura fissa, cioè richiede modifiche al cablaggio se il set di istruzioni viene modificato. Questa architettura è preferita nei computer di tipo RISC, in quanto consiste in un set di istruzioni più piccolo.
Le unità di controllo sono utilizzate per invocare queste risposte. Queste istruzioni sono evidenti nella progettazione dell'architettura, ma possono essere rappresentate anche in altri modi.

### Unità di controllo microprogrammate

Nel 1951, ad opera di M. V. Wilkes, fu introdotta l'idea della microprogrammazione come livello intermedio per l'esecuzione delle istruzioni dei programmi per computer (vedi anche microcodice). I microprogrammi erano organizzati come una sequenza di microistruzioni e memorizzati in una speciale memoria di controllo. L'algoritmo dell'unità di controllo microprogrammata è solitamente specificato da una descrizione a diagramma di flusso. Il vantaggio principale dell'unità di controllo microprogrammata è la semplicità della sua struttura. Le uscite del controllore sono organizzate in microistruzioni e possono essere facilmente sostituite.

## Componenti della CU

* contatore del programma (PC): chiamato anche registro di controllo della sequenza (SCR), contiene permanentemente l'indirizzo di memoria della prossima istruzione da eseguire. All'inizio dell'esecuzione del programma, prende l'indirizzo della prima istruzione e incrementa automaticamente il suo valore di uno ogni volta che viene completata un'istruzione. Ciò non vale quando l'istruzione in esecuzione sia un'istruzione di salto o di interruzione della sequenza, caso in cui il contatore di programma assume l'indirizzo dell'istruzione da eseguire successivamente, che si trova memorizzato nell'istruzione corrente;
* Registro istruzione (IR): contiene l'istruzione in corso di esecuzione. Questa istruzione porta con sé il codice dell'operazione (CO) e, se del caso, gli operandi o i loro indirizzi di memoria;
* decoder (D): ha il compito di interpretare l'istruzione per la sua successiva elaborazione. Ha il compito di estrarre il codice operativo dell'istruzione in corso (che si trova nel registro istruzione), di analizzarlo e di emettere i segnali necessari al resto degli elementi per la sua esecuzione attraverso il sequenziatore;
* orologio (R): fornisce una successione di impulsi elettrici a intervalli costanti, che segnano gli istanti in cui devono iniziare le diverse fasi di ogni istruzione.

## Input e output della CU

L'unità di controllo riceve in input ad ogni ciclo di clock:
* lo stesso clock che sincronizza lo svolgimento delle singole micro-istruzioni;
* l'istruzione, contenente il codice operativo, sul quale determina le micro-istruzioni da eseguire;
* i segnali di flag, che determinano lo stato della CPU e danno indicazioni sul precedente stato della ALU;
* segnali dal bus di controllo, come interrupt e di acknowledgement dai dispositivi esterni.
In output genera segnali interni alla CPU di trasferimento dati e di controllo della alu, e segnali attraverso il bus di controllo per memoria e I/O per quanto riguarda il resto del sistema.

## Tecniche di implementazione
### Rete combinatoria

È possibile implementare l'unità di controllo come rete combinatoria che genera delle uscite a seconda degli ingressi, sempre possibile per il Teorema di Shannon. I limiti di questo metodo sono una difficile progettazione e collaudo, e la scarsa flessibilità del sistema. Se si dovesse aggiungere un'istruzione o qualche controllo sarebbe necessario riprogettare il tutto.

### Micro-linguaggio

Guardando più attentamente è possibile osservare che il compito dell'unità di controllo è simile a quello di un microprocessore ovvero effettuare delle scelte a seconda degli input e reagire di conseguenza (sequenzializzare le micro-operazioni ecc). È possibile quindi costruire un linguaggio di micro-programmazione. Sostanzialmente un segnale di controllo è una linea che varia tra 0 e 1 a seconda se il segnale deve essere spento o attivo. Ogni microistruzione deve quindi associare il valore 1 ai segnali di controllo richiesti dalle micro-operazioni la cui esecuzione è prevista in tale microistruzione. Per ogni codice operativo previsto si deve definire una sequenza di micro-operazioni, ossia un micro-programma. I micro-programmi prendono il nome di firmware, sottolineando la loro appartenenza sia all'hardware sia al software. Il firmware è memorizzato in una memoria interna chiamata memoria di controllo. Ovviamente anche in questo caso occorre effettuare delle scelte rivolte all'efficienza e al numero di microprogrammi richiesti. Nei moderni microprocessori vi sono molti registri e controlli da eseguire, per cui l'unica soluzione è quella di implementare microistruzioni composte da molti bit per gestire il gran numero di controlli da eseguire. La lunghezza delle microistruzioni è composta da tre fattori: dal massimo numero di micro-istruzioni diverse da gestire contemporaneamente, dalle modalità di codifica e rappresentazione dei segnali di controllo e dalle modalità con cui si specifica l'indirizzo della successiva microistruzione da eseguire. Si distinguono qui due modelli:
* la microprogrammazione verticale dove ogni microistruzione specifica poche microoperazioni da eseguire. In questo caso le microistruzioni hanno pochi bit, dove n segnali di controllo sono rappresentati da log2 n bit, ed è quindi necessaria una decodifica successiva dell'istruzione per generare i segnali di controllo
* o una microprogrammazione orizzontale dove si possono specificare molti segnali di controllo in parallelo e avere tanti bit quanti sono i segnali di controllo da generare. In questo caso è possibile effettuare un elevato parallelismo, e la codifica dei segnali è nulla o limitata.
Si può tuttavia implementare una via di mezzo, dividendo le microistruzioni in gruppi disgiunti, ottenendo quindi un ragionevole parallelismo con un numero non enorme di bit.

## CAR e CBR

Si definisce CAR il registro indirizzi di controllo (Control Address register), e CBR il registro buffer di controllo (Control Buffer Register). Un'unità di controllo microprogrammata deve effettuare due operazioni fondamentali nell'unità temporale di riferimento che è il clock. Prelievo di una microistruzione attraverso la determinazione dell'indirizzo della memoria di controllo al quale si deve accedere (e quindi sequenzializzazione delle microistruzioni) e l'esecuzione della microistruzione.
L'unità di controllo opera quindi nel seguente modo:
* il sequenziatore emette un comando di lettura
* La microistruzione contenuta nella locazione della memoria di controllo specificata dal Registro Indirizzi del Controllo (CAR) è trasferita nel Registro Buffer del Controllo (CBR)
* Il registro CBR in base al suo contenuto genera, direttamente o previa decodifica, i segnali di controllo e l'informazione relativa al successivo indirizzo
* Il sequenziatore inserisce il nuovo indirizzo nel registro CAR sulla base delle informazioni fornitegli dal registro CBR e dei flag provenienti dall'ALU
L'indirizzo successivo dipende dal contenuto del CBR e dei flag provenienti dall'ALU. A questo punto l'unità di controllo o prende l'istruzione successiva aumentando di uno il registro CAR, o salta ad un nuovo microprogramma copiando il contenuto di CBR in CAR attraverso una microistruzione di salto, o ancora saltare ad un altro microprogramma attraverso una vera e propria istruzione del linguaggio macchina in fase di IR.

## Schema di Wilkes

Dal punto di vista prettamente fisico, è possibile implementare una unità di controllo microprogrammata attraverso lo schema di Wilkes, ovvero costruendo una griglia di conduttori a formare una enorme matrice, con dei diodi collegati agli incroci. Ad ogni colpo di clock viene attivata una riga della matrice, ottenendo dei segnali d'uscita alle colonne collegate con i diodi. La prima parte delle colonne riguarda le istruzioni da eseguire, la seconda parte l'istruzione successiva da eseguire. Ogni riga rappresenta quindi la microistruzione da eseguire e l'intera matrice è la memoria delle microistruzioni. Ovviamente questo schema è rigorosamente orizzontale, e richiede un gran numero di bit. È possibile utilizzare schemi più complessi per la generazione dell'indirizzo successivo che richiedono moduli di sequenzializzazione.
Supponiamo che l'unità di controllo debba generare K segnali, sia esterni che interni. Con lo schema di Wilkes abbiamo 2k configurazioni possibili. Non tutte queste vengono utilizzate per vari motivi (due sorgenti non possono essere inviate alla stessa destinazione nello stesso ciclo, un registro non può essere sorgente e destinazione nello stesso ciclo, in un ciclo l'ALU può ricevere un unico segnale, in un ciclo il bus di controllo esterno può ricevere un unico segnale), e si potrebbe quindi pensare di ridurre il numero di segnali di ingresso della matrice. Ma questo complicherebbe di parecchio la programmazione e la decodifica in uscita, per cui si usano più bit di quelli strettamente necessari, ma alcune configurazioni non si codificano perché inutilizzate. Una tecnica di codifica delle istruzioni è quella del dividerle in campi, ogni campo, che attiva i suoi segnali di controllo, con la sua codifica. I campi sono indipendenti, e quindi campi diversi possono dare il via ad azioni diverse simultaneamente mentre ogni campo può dare il via a una sola azione per ciclo di clock.

## Pipeline

In presenza di pipeline all'interno del microprocessore, l'unità di controllo dovrà essere in grado di rilevare hazard sui dati e sui controlli e modificare le istruzioni in corso di esecuzione. Tutti i controlli vengono salvati nei registri di pipeline e scalate via via in avanti finché non viene completata l'istruzione. L'introduzione della pipeline ha complicato notevolmente la struttura interna dell'unità di controllo, per prevenire i problemi legati agli hazard dei dati e dei controlli.