Sistemi Elettronici Programmabili
Dispense di:
Sistemi a Microprocessore
Prof. Adelio Salsano
Dott. Stefano Bertazzoni
1
1
Microcalcolatori
La realizzazione di sistemi programmabili con CPLD, PAL, PLD e FPGA viene
comunemente indicata come “sintesi hardware” delle funzioni richieste. Le stesse funzioni
possono quasi sempre essere realizzate con microcalcolatori e, in questo caso, si parla di
“sintesi software”.
Un microcalcolatore è un sistema di uso generale e il suo nome deriva dal fatto che,
normalmente, l’unità di calcolo e controllo è un microprocessore realizzato su singolo chip.
Lo schema di principio di un microcalcolatore è riportato in Figura 1-1 nella quale si
distinguono i blocchi fisici necessari per il funzionamento.
Figura 1-1
Schema di un Microcalcolatore.
La CPU, Central Processing Unit, realizzata normalmente con un microprocessore, è il
cuore del sistema in quanto gestisce lo scambio dei dati tra i vari blocchi del
microcalcolatore seguendo un programma memorizzato.
Il blocco ROM corrisponde ad uno spazio di memoria permanente che, utilizzando le
opportune tecnologie, conserva il programma che deve essere eseguito ed altri dati che
non devono essere modificati durante l’attività del microcalcolatore.
La RAM è una memoria modificabile utilizzata per dati intermedi di programma, mentre il
blocco I/O è l’interfaccia con il mondo esterno, o, meglio, la circuiteria microelettronica che
consente di intervenire dall’esterno sul microcalcolatore tramite, per esempio, una tastiera,
un convertitore A/D, ecc., e di vedere i risultati delle operazioni, per esempio su un tubo a
raggi catodici o una stampante.
Il collegamento tra i diversi blocchi è affidato ai bus e precisamente:
- il bus indirizzi individua, tramite eventualmente un decodificatore, il blocco e
l’indirizzo interno al blocco interessato al trasferimento dei dati con la CPU;
- il bus dati costituisce il canale sul quale transitano i dati. Le frecce
corrispondono alla direzione ammessa per lo scambio dei dati: la freccia
bidirezionale indica che lo scambio può avvenire sia dalla CPU alla
memoria o periferica, la freccia unidirezionale che non è ammessa l’altra
direzione ( la ROM non può essere scritta nel normale funzionamento);
2
-
-
sul bus di controllo transitano i segnali che determinano il corretto
funzionamento da tutti i punti di vista delle varie parti del microcalcolatore:
esempi tipici di segnali di controllo sono il Read, RD, e il Write, WR, che
determinano se la CPU vuole leggere il dato presente in memoria o sulla
periferica e se vuole scriverlo.
Il microcalcolatore è, come precedentemente ricordato, un sistema digitale
sincrono, basato su un segnale di clock che determina il tempo minimo
richiesto da qualsiasi operazione. In genere, come sarà illustrato in alcuni
esempi, qualsiasi operazione prevede almeno due cicli di clock, il primo per
caricare il codice dell’istruzione, il secondo per eseguire le istruzioni più
semplici, per cui appaiono evidenti le motivazioni che portano a decidere tra
l’uso di sistemi digitali dedicati (FPGA, CPLD, ecc.) e microcalcolatori: i
sistemi dedicati sono mediamente più veloci ma rigidi, non consentono
facilmente modifiche alle funzioni inizialmente previste, mentre è possibile
modificare le funzioni svolte da un microcalcolatore semplicemente
cambiandoli programma, a prezzo però di vincoli precisi di velocità.
3
2
I microprocessori
Un microprocessore può vedersi come una macchina a stati finiti, nella quale:
- il singolo stato corrisponde all’insieme di tutti i registri interni cui l’utente può
accedere direttamente o indirettamente;
- il passaggio da uno stato all’altro è determinato dall’esecuzione di una
istruzione.
La tipica istruzione comprende due fasi (vedi Figura 2-1). Nella fase di Fetch il
microprocessore carica dalla posizione di memoria corrispondente al registro PC, Program
Counter, il codice operativo dell’istruzione che viene seguita nella fase di Execute.
Alla fine della fase di Execute i registri interni del microprocessore sono aggiornati come
previsto dall’istruzione, e quindi il microprocessore ha cambiato stato: in particolare in PC
vi è l’indirizzo della successiva istruzione (vedi Figura 2-2).
Figura 2-1
Fase di Fetch del codice operative dell’istruzione.
4
Figura 2-2
Stato finale dei registri.
I microprocessori si possono classificare e valutare sulla base di alcune caratteristiche
tipiche sia hardware che software.
Per ciò che riguarda le caratteristiche hardware occorre considerare:
- la di parola;
- la di indirizzo;
- la velocità;
- le caratteristiche elettriche;
- l’architettura.
Le lunghezza di parola – word - corrisponde al numero di bit che il microprocessore tratta
in parallelo come dati (vedi Figura 2-3). I microprocessori attualmente in uso hanno
lunghezza di parola di 8, 16, 32 o 64 bit, spesso divisa in gruppi di 8 bit, detti Byte e la
scelta tra microprocessori con diversa di parola è determinata dal tipo di applicazione, in
particolare dalla precisione richiesta.
Oltre alla lunghezza di parola in un microprocessore è importante la lunghezza
dell’Address Bus, cioè il numero di bit corrispondenti agli indirizzi che il microprocessore
può indirizzare direttamente. Si va dai 16 bit dei microprocessori a 8 bit, corrispondenti a
65366 – 64 kbyte – indirizzabili ai 32 bit – 4 Gigabyte – dei microprocessori a 32 bit.
5
Figura 2-3
Relazioni tra bit, byte e word.
Figura 2-4
Schema di una memoria indirizzabile con 16 bit.
La velocità di un microprocessore è genericamente collegata al tempo necessario per
compiere certe operazioni. Una valutazione quantitativa necessaria per confrontare
soluzioni diverse richiede alcune considerazioni. Il microprocessore è una macchina
sincrona, per cui ogni istruzione richiede un numero finito di cicli di clock e quindi il tempo
di esecuzione dipende dal numero di cicli e dalla frequenza ammessa dalla tecnologia con
cui è realizzato il microprocessore.
Inoltre il tempo di esecuzione di una istruzione dipende anche dall’architettura del
microprocessore, per cui il confronto tra due sistemi richiede che vengano precisati i
termini di confronto, cioè le operazioni considerate. Normalmente la velocità viene data in
MIPS, milioni di istruzioni al secondo, o in KOPS, migliaia di operazioni al secondo.
Generalmente i MIPS vengono calcolati considerando l’operazione più favorevole per il
sistema considerato in funzione dell’architettura, mentre i KOPS vengono calcolati
6
considerando la media dei tempi richiesti dalle diverse istruzioni considerata la frequenza
di presentazione delle singole istruzioni in programmi di un certo tipo.
La temporizzazione dei microprocessori prevede un livello intermedio tra il clock e il tempo
richiesto per l’esecuzione di un’istruzione, il cosiddetto ciclo macchina. I cicli macchina
corrispondono alle operazioni elementari che il processore può compiere, scrittura in
memoria, lettura da memoria, caricamento del codice operativo, ecc. e, per definizione si
ha un ciclo macchina ogni volta che il processore deve accedere alla memoria esterna. Il
tempo di esecuzione di una istruzione è quindi legato al numero di cicli macchina
necessari per l’esecuzione dei cicli macchina necessari. Un esempio tipico di ciclo
macchina è quello di lettura di un dato in memoria (vedi Figura 2-5). L’indirizzo di memoria
viene fornito in corrispondenza del primo ciclo, subito dopo il processore deve dare il
segnale RD che individua l’operazione di lettura. A questo punto occorre attendere il
tempo di accesso della memoria, per cui il dato sarà disponibile, per esempio tra i fronti di
salita di T2 e T3, per cui il dato viene letto sul fronte di salita di T 3 e, subito dopo, il segnale
di lettura diventa non valido e, analogamente, su T 4 diventa non valido l’indirizzo. Se il
tempo di accesso della memoria considerata non è sufficiente, il processore, se
predisposto per la funzione, può inserire uno o più cicli di WAIT.
Figura 2-5
Ciclo tipico di lettura in memoria.
Le caratteristiche elettriche di un microprocessore sono legate, oltre alla velocità
considerata più sopra, a parametri generali comuni a tutti i circuiti integrati, potenza
dissipata, tensione di alimentazione, ecc. Inoltre diventano in questo caso importanti le
caratteristiche dei singoli piedini, che possono essere di ingresso, di uscita, bidirezionali e
tristate. La condizione di tristate equivale a porre il piedini in alta impedenza, così da
poterlo considerare staccato dalla linea e quindi ininfluente.
La Figura 2-6 illustra due possibili scelte architetturali per il trasferimento dei dati all’interno
del chip tra registri e CPU, il singolo bus e il triplo bus. Nel primo caso i dati transitano in
sequenza sull’unico bus, mentre nel secondo caso è possibile il trasferimento
contemporaneo fino a tre dati. È evidente che nel secondo caso è possibile raggiungere
velocità di elaborazione maggiori, però a prezzo di una maggior area di Silicio.
L’architettura più usata è quella a singolo bus, in quanto il ritardo corrispondente non è
normalmente rilevante in relazione alla frequenza di clock.
7
Figura 2-6
Architetture interne dei microprocessori:
a) Bus singolo;
b) Bus triplo.
La Figura 2-7 illustra lo schema a blocchi di un tipico microprocessore, individuando le
funzioni minime comuni a tutti i microprocessori. È una struttura a singolo bus, di
dimensioni pari alla di parola, che comprende un’unità logico-aritmetica (ALU), un’unità di
controllo (CU) ed una serie di registri, alcuni dei quali con funzioni specifiche.
L’unità logico- aritmetica, o ALU, è la parte del microprocessore che esegue le operazioni
logiche e aritmetiche richieste dalle varie istruzioni e può agire, secondo i casi, su una o
due parole, comunemente dette operandi. Un’istruzione è quella che somma un dato
prelevato dalla memoria con il contenuto di un particolare registro interno, l’accumulatore,
A, memorizzando il dato nell’accumulatore stesso. Nell’accumulatore è quindi
memorizzato in partenza il primo addendo della somma: il microprocessore preleva
innanzitutto con un ciclo di lettura in memoria il codice operativo dell’istruzione, che viene
decodificato e interpretato dall’unità di controllo che genera i segnali necessari per
l’esecuzione dell’istruzione. Con un secondo ciclo di lettura il microprocessore acquisisce il
dato che viene memorizzato in un registro interno e sommato al contenuto
dell’accumulatore: il risultato viene quindi memorizzato nell’accumulatore.
8
Figura 2-7
Schema a blocchi di un microprocessore.
In sostanza l’unità di controllo in questo come nelle altre istruzioni sulla base del codice
operativo genera gli opportuni segnali di controllo corrispondenti alle diverse istruzioni,
determinando il funzionamento dell’ALU. Caratteristica di questo tipo di architettura è che il
risultato dell’operazione è memorizzato nell’accumulatore, per cui si parla di “architettura a
singolo bus basata sull’accumulatore. Nei microprocessori sono tipicamente previste e
vengono eseguite in tempi legati solo ai ritardi della logica combinatoria, tutte le operazioni
logiche, le operazioni di somma e differenza aritmetiche, gli scorrimenti e le rotazioni di
dati contenuti nei registri interni. Operazioni più complesse quali moltiplicazioni e divisioni,
ancorché spesso indicate con una singola istruzione, vengono spesso eseguite secondo
algoritmi programmati all’interno della CPU.
I microprocessori si differenziano poi sulla base del numero e delle funzioni dei registri
interni.
I registri si possono dividere in due categorie, di uso generale e dedicati. I registri di uso
generale vengono utilizzati per memorizzare dati intermedi delle elaborazioni senza
necessità di accedere alla memoria esterna e quindi con un notevole risparmio nei tempi
di accesso, fino a dieci volte. Il bus interno e i registri hanno dimensioni pari alla di parola
e il loro accesso è regolato dall’unità di controllo.
I registri dedicati sono tipicamente i seguenti:
- l’accumulatore (A) che immagazzina uno degli operandi e l’unico operando
su cui deve agire l’ALU e, successivamente, il risultato dell’operazione
- il Program Counter (PC), che memorizza ciclo per ciclo l’indirizzo della
locazione di memoria della successiva istruzione. In particolare, salvo che
per le istruzioni di salto, il PC viene incrementato ad ogni istruzione di un
numero di posizioni pari al numero di parole dell’istruzione corrente
- l’Instruction Register (IR) che immagazzina la parte iniziale di ogni
istruzione, quella che contiene il codice operativo. L’unità di controllo utilizza
il codice operativo per riconoscere l’istruzione programmata e generare gli
opportuni segnali di controllo
9
lo Stack Pointer (SP) che immagazzina l’ultimo indirizzo di un’area di
memoria dedicata nella quale vengono memorizzati dati da utilizzare
successivamente. Esempio tipico è la chiamata di una subroutine, per cui al
termine della subroutine deve essere ripreso il programma principale con i
dati corrispondenti al momento della chiamata della subroutine
- il Data Register che immagazzina dati da scrivere in memoria o dati letti che
devono essere trasferiti ai registri interni
- il registro Status che memorizza i cosiddetti flag, ossia dei bit che
individuano situazioni particolari all’interno del microprocessore, situazioni
che ne possono condizionare il funzionamento. Flag tipici sono:
- C (Carry) che segnala l’esistenza di un riporto in un’operazione aritmetica
- Z (Zero) che segnala che in una certa operazione l’accumulatore è andato a
zero
- O (Overflow) che segnala che in un’oprazione in complemento a 2 vi è stato
un riporto al bit più significativo e quindi un errore di trabocco. Un esempio
può essere il seguente: supponiamo di voler sommare 112 (70H) e 79
(4FH), il risultato binario è 10111111 che interpretato come numero
assoluto vale 191, ma in complemento a 2 corrisponde a –65; il bit di
overflow pertanto indica che la somma di due numeri positivi ha portato fuori
dal campo di definizione dei numeri rappresentabili con 8 bit.
- N (Negative) corrispondente al valore del bit più significativo
dell’accumulatore e quindi al segno in complemento a 2.
Infine in molti processori sono presenti registri indice utilizzati per individuare aree di
memoria: il contenuto del registro indice corrisponde ad un indirizzo di riferimento in modo
tale che gli altri indirizzi vengono dati come spostamento da questo indirizzo iniziale, con
un numero di bit ridotto rispetto alla lunghezza totale dell’address bus.
-
10