L'architettura dei calcolatori: il microprocessore.


Quando si parla di un sistema di elaborazione si pensa ad un entità inscindibile, in realtà le cose non stanno così. Il Calcolatore è costituito da diverse parti che cooperano per portare a termine il compito assegnato dall'utente. Il nome stesso di sistema lascia trasparire la vera struttura della macchina, costituita da un'unità centrale che ha il compito di coordinare il lavoro delle unità periferiche, alle quali viene spesso affidato un ruolo specifico, basti pensare ai dispositivi di INPUT / OUTPUT , come la tastiera, il monitor, le unità dischi, la stampante, ecc...

All'unità centrale compete soprattutto il compito di elaborare i dati seguendo scrupolosamente l'algoritmo codificato all'interno del programma in corso di esecuzione.

Lo schema di funzionamento che analizzeremo è quello più diffuso al mondo e fu proposto dal grande matematico di origine ungherese John von Neumann .

In tale modello le funzioni di calcolo e di governo sono svolte dall'unità centrale del calcolatore, di solito indicata con l'acronimo CPU . Essa è costituita dall'unità aritmetico logica (ALU), e dall'unità di governo, e dalla memoria interna che possiamo suddividere in registri, ROM , ed eventualmente memoria cache.

Solo i dati presenti nei registri possono essere elaborati, quindi un qualsiasi dato, per poter essere processato, deve essere spostato dalla memoria principale o ausiliaria nei registri. In un certo senso proprio questo trasferimento rappresenta l'anello debole della catena elaborativa, per questo si cerca di limitare gli accessi alla memoria centrale o ausiliaria dotando il microprocessore di generose aree di memoria cache sia interne (dette di 1º livello), che esterne (2º livello).

La memoria principale, spesso indicata con il termine RAM , è impiegata per contenere sia i dati da elaborare, sia la descrizione dell'algoritmo da seguire per processarli. Per algoritmo si intende una successione di istruzioni elementari che costituiscono il programma e che sono interpretate ed eseguite direttamente dalla CPU. Queste istruzioni, che sono dette "macchina", costituiscono il famoso "Linguaggio Macchina" ovvero l'insieme di tutte le istruzioni riconosciute.

E' importante che tutte le istruzioni costituenti un programma, siano disposte sequenzialmente nella memoria, in modo che la CPU possa eseguirle una dopo l'altra.

Fortunatamente è possibile scegliere quale programma far eseguire all'elaboratore in modo da adattarlo alle nostre esigenze. Per questo motivo è detto "calcolatore" e non "calcolatrice". Con questo termine si indica invece una macchina in grado di eseguire diverse operazioni, ma sotto la supervisione di un essere umano che in pratica funge da unità di governo.

Ogni istruzione è suddivisa a livello logico in due parti. La prima è l'operatore, che istruisce la CPU, o meglio l'unità di governo, sul da farsi, mentre la seconda parte è costituita da una sequenza di operandi, che indicano quali dati elaborare oppure dove sono memorizzati.

All'inizio dell'era informatica, ciascuna istruzione era eseguita da un apposita rete logica, ma con il passare del tempo, il progredire delle conoscenze e l'aumentare della complessità dei calcoli richiesti, ci si rese conto che era più conveniente realizzare solo alcune reti logiche elementari e con queste (raggruppate opportunamente) simulare le operazioni più complesse.
In altre parole, oggi, ad ogni istruzione macchina viene in realtà associato un microprogramma contenuto nella ROM del processore.
Questa tecnica prende il nome di microprogrammazione , e l'insieme dei programmi presenti nella ROM della CPU è detto FIRMWARE .

L'insieme delle istruzioni macchina varia da CPU a CPU, tuttavia è possibile classificarle in tre categorie:

a) istruzioni aritmetico-logiche e di confronto.

b) istruzioni di trasferimento dati (Input/Output).

c) istruzioni di controllo del flusso del programma.

L'esecuzione delle istruzioni macchina non è un processo continuo, ma discreto cioè avviene a passi detti "cicli macchina", questi cicli sono determinati da un'onda quadra generata da un apposito circuito pulsante, chiamato "clock" (orologio), la cui pulsazione avviene con una fissata e precisa frequenza.
Oggi si viaggia a frequenze di alcune centinaia di MegaHertz e per l'anno prossimo ci si attende di abbattere la fatidica soglia del GigaHertz.

Ogni istruzione viene prelevata dalla memoria, trasferita in una apposita cella nell'unità di governo detta Instruction Register, viene decodificata ed in base al suo codice operativo viene calcolato l'indirizzo del microprogramma ad essa associato dal costruttore della CPU.

Struttura computer

Una volta terminata l'esecuzione del microprogramma, che può richiedere diversi cicli macchina, si passa all'istruzione immdediatamente successiva.

A questo punto è doveroso indicare come fa la CPU a sapere da quale posizione della memoria prelevare un'istruzione e come sia in grado di distinguerla da un dato.

La memoria è suddivisa in "celle", in grado di contenere un'informazione elementare detta BIT (Binary digIT) che può assumere due soli stati mutuamente esclusivi, convenzionalmente indicati con 0 e 1. Le informazioni più complesse sono ottenute ragruppando più celle per formarne una più grande.
Storicamente si è deciso di raggrupparne 8, creando così l'arcinoto BYTE (8Bit = 1Byte) e ad ogni byte è stato associato un numero, detto indirizzo, che consente di distinguerlo dagli altri. Tramite l'indirizzo è quindi possibile individuare in modo sicuro ed univoco qualsiasi byte (non il singolo bit!) e quindi leggere, modificare e/o scrivere il valore numerico in esso contenuto.

Per far prelevare ed eseguire un programma alla CPU, è sufficiente indicarle l'indirizzo della prima istruzione che costituisce il programma e l'esecuzione continuerà automaticamente fino al raggiungimento dell'istruzione che indica la fine dell'elaborazione. Nella CPU esiste un registro detto Program Counter che serve per specificare proprio l'indirizzo dell'istruzione da eseguire.

Dati ed istruzioni per la CPU sono visti come una semplice sequenza di bit pertanto non può distinguerli, quindi si limita semplicemente a decodificare ed eseguire l'istruzione presente nell'indirizzo specificato nel Program Counter.
In altre parole legge il contenuto della cella indicata dal Program Counter e lo considera sempre come se fosse un'istruzione; nel caso in cui non riesca ad associarle un microprogramma genera uno stato di errore che provoca il blocco dell'elaborazione o della macchina. Per questo motivo è compito dell'utente-programmatore fare in modo che all'avvio il Program Counter punti esattamente all'inizio di un programma.

Se l'elaborazione dell'istruzione corrente ha avuto buon fine, l'indirizzo nel Program Counter viene aggiornato, in modo da puntare alla prossima istruzione. Tale operazione consiste nel sommare all'indirizzo precedentemente contenuto nel Program Counter la lunghezza in byte dell'operatore corrente, comprensiva dei suoi eventuali operandi.
Durante la decodifica dell'istruzione non solo viene calcolato l'indirizzo del microprogramma da eseguire, ma è anche individuato il numero degli operandi richiesti dall'istruzione. Tali operandi sono trasferiti in apposite aree della memoria interna, di solito in registri di tipo Accumulatore, caratteristici delle ALU.

La ALU è un'unità completamente indipendente dall'unità di governo, anche se per ragioni tecnico-economiche si tende ad integrarle nello stesso circuito.
La sua funzione specifica è quella di eseguire le operazioni di tipo aritmetico-logico e di confronto. Di solito nella ALU si trovano solo le reti logiche per eseguire le quattro operazioni aritmetiche (+, -, *, /), quelle logiche (AND, OR, NOT) e quelle di confronto. Tutte le altre operazioni sono realizzate mediante microprogrammazione. Inoltre si trovano uno o più registri Accumulatori, che sono utilizzati per memorizzare temporaneamente i dati da elaborare o i risultati di precedenti elaborazioni.

Nella prossimo numero proseguiremo l'analisi della struttura e del funzionamento del principale compontente del computer.

Francesco De Napoli