|
In realtà il bus del microprocessore si compone
di 3 bus diversi:
Bus dati
Il data bus consente
il trasferimento di informazioni:
Da una cella di memoria alla CPU
(lettura): questa azione viene
svolta dalla CPU quando deve ottenere il codice operativo di una istruzione da
eseguire oppure quando il programma che sta eseguendo chiede di prelevare un
dato dalla memoria.
Dalla CPU ad una cella di memoria
(scrittura): questa azione viene
svolta dalla CPU quando il programma
chiede l’inserimento di un dato in memoria
Da una porta di ingresso alla CPU
(acquisizione o lettura di una
porta): questa azione viene svolta dalla CPU quando il programma chiede il prlevamento
di una informazione dall’esterno (posizione del mouse, pressione di un tasto
...)
Dalla CPU ad una porta di uscita
(scrittura di una porta): questa azione viene svolta dalla CPU quando il
programma chiede la modifica dello stato di una grandezza fisica esterna al
sistema (accensione/spegnimento di un led, carattere sul monitor , canzone di
Tony Tammaro emessa dagli altoparlanti...)
Alcune considerazioni
che emergono da questa lista di possibili azioni:
Tutte
le azioni coinvolgono da un lato CPU e dall’altro un solo elemento (cella di
memoria o porta) dei sistemi periferici (memoria o I/O).
Dei
due elementi coinvolti in un trasferimento ( CPU e memoria o I/O) uno impone il
dato sul data bus facendo assumere temporaneamente ai segnali di data bus i
valori delle sue uscite mentre l’altro campiona il dato copiando i segnali di
data bus attraverso i suoi ingressi.
Tutti
gli altri elementi periferici (altre celle di memoria e altre porte I/O) pur essendo elettricamente collegati al
bus devono mantenersi funzionalmente scollegati, cioè non imporre le loro
uscite sul bus ne campionare il bus con i loro ingressi. Questa condizione
viene realizzata con la tecnica dei buffer tri-state.
La
presenza di un dato sul data bus è solo
temporanea. I dati si avvicendano, uno dopo l’altro, in funzione delle azioni
svolte dalla CPU. Inoltre la direzione dei dati sul data bus può cambiare
perché un elemento può in momenti diversi comportarsi da ingresso o da uscita
nei confronti del data bus (ad esempio un cella di memoria è uscita durante una
lettura ed ingresso durante la scrittura). Per questo motivo si dice che il databus e’ bidirezionale.
Tutti i dispositivi
che si collegano al data bus devono essere in grado di rimanere funzionalmente
disconnessi e di invertire la direzione del flusso dei dati.
Per realizzare questa
prestazione il pin di collegamento al data bus è internamente collegato a due
buffer tri-state collegati in opposizione.
|
In questo modo quando entrambe
le abilitazioni dei due buffer sono “non attive” il dispositivo è
funzionalmente scollegato dal bus. Questa è la situazione normale in cui si
trovano per la maggior parte del tempo tutti i dispositivi. Se un dispositivo
riceve l’”abilita uscita” il dato che esso contiene viene copiato all’esterno
imponendo il segnale corrispondente a questo dato sul data bus. Un solo
dispositivo alla volta può trovarsi in questa situazione. Se più di un
dispositivo impone i suoi dati sul data bus si crea un conflitto di bus (due
uscite collegate insieme con valori che possono essere diversi e quindi
risultato imprevedibile)
Se un dispositivo
riceve l’”abilita entrata” il dato che
si trova sul data bus viene copiato all’interno del dispositivo. Anche in
questo caso un solo dispositivo alla volta può trovarsi in questa situazione,
questa volta non per un problema di bus ma perché non ha alcun significato che
due dispositivi copino contemporaneamente lo stesso dato.
Non è lecito che sia
contemporaneamente attive entrambe le abilitazioni.
L’ampiezza di parola
del data bus è determinata dal numero di bit che la CPU è in grado di
trasferire dal/al data bus in una singola operazione e prende il nome di
parallelismo.
Maggiore è l’ampiezza
del data bus e maggiore è il parallelismo e quindi la rapidità con cui si
svolgono le operazioni.
Questa ampiezza non
impedisce però le operazioni su dati di dimensioni più grandi di questa
ampiezza ma le rende solamente più lente perché la CPU deve spezzare il dato
durante il trasferimento eseguendo più azioni in sequenza. Valori tipici di
ampiezza di parola sono 8, 16, 32, 64 bit.
I valori di ampiezza
di parola sono cresciuti nel tempo e i microprocessori attuali (famiglia
Pentium e compatibili) hanno in genere una ampiezza di parola di 64 bit, cioè
leggono/scrivono 8 BYTES in una singola operazione di bus.
Le azioni di lettura, scrittura,
acquisizione ed emissione sono governate dalla CPU che quindi è sempre uno dei
due estremi di un trasferimento. L’altro estremo è una singola cella di memoria
nei primi due casi e una singola porta di ingresso o uscita nei secondi due
casi.
La CPU che decide un trasferimento deve
specificare da/per quale cella o da/per quale porta l’operazione deve essere
eseguita.
Le celle di memoria e le porte di I/O
sono organizzate in schiere di elementi omogenei. Potete immaginare, ad
esempio, un banco di meoria come una cassettiera, e la singola cella o locazione
di memoria come il singolo cassetto.
Indirizzo |
Cella o Porta |
|
0 |
Valore0 |
Primo elemento |
1 |
Valore1 |
Secondo elemento |
2 |
Valore2 |
Terzo elemento |
|
|
|
… |
… |
|
M-2 |
ValoreM-2 |
M-1esimo elemento |
M-1 |
ValoreM-1 |
Mesimo elemento |
Ogni locazione o porta di IO deve essere
identificata da un indirizzo , un numero che la identifica. I sostanza, la CPU,
per poter dialogare con una locazione di memoria o con una porta deve indicare
con quale locazione o porta vuole comunicare immettendo sul bus indirizzi il
suo indirizzo. E’ un po’ come la posta:
per poter inviare una lettera ad una persona (il dato) dovete comunicare al
sistema postale il suo indirizzo; se quella persona non ha un indirizzo no
potete inviarle una lettera: un altro esempio è il telefono:
per poter comunicare con una persona dovete fornire al sistema telefonico il
suo numero identificativo. Provate a pensare a tutti gli altri sistemi in cui
lo scambio di informazioni presuppone che gli attori del dialogo devono essere
dotati di un identificativo, di un indirizzo.
L’address bus è unidirezionale, esce
dalla CPU per raggiungere tutti gli altri dispostivi (memoria ed I/O) che lo
vedono sempre come un ingresso.
L’informazione contenuta nell’address bus
indica quale elemento periferico (cella o porta) deve essere coinvolto nella successiva
operazione di trasferimento sul data bus e quindi deve uscire dallo stato di
alta impedenza per impegnare (se deve scrivere) o campionare il bus (se deve leggere un dato inviato dal
microprocessore) a seconda della direzione di trasferimento richiesta dalla
operazione.
Tutti gli elementi che hanno un indirizzo
diverso da quello specificato rimangono in alta impedenza durante l’operazione
non imponendo nulla sul data bus ne campionando nulla dal data bus perché non
sono coinvolti nell’operazione.
Spazio
di indirizzamento
L’informazione di indirizzo portata
dall’address bus è codificata in binario quindi il numero di fili dell’address
bus è tale da consentire la codifica binaria dell’indirizzo di tutte le locazioni
di memoria o unità di ingresso/uscita che si devono poter raggiungere.
La quantità di indirizzi che si possono
comporre viene chiamata spazio o
capacità di indirizzamento e la
relazione tra il numero di fili dell’address bus e la dimensione dello spazio
di memoria è data dalle seguenti formule:
M=2N
dove M è il numero di indirizzi diversi
che si possono comporre ed N è il numero di bit del bus indirizzi.
Notate che teoricamente nulla vi
impedisce di collegare il microprocessore a quanta memoria volete: gli unici
limiti possono essere eventualmente di tipo elettrico come alimentazione e così
via. Ma se il numero di locazioni di memoria che collegate alla CPU supera la
sua capacità di indirizzamento, una volta esauriti gli indirizzi disponibili ci
sarà un certo numero di locazioni di memoria o porte a cui non si potrà
associare alcun indirizzo: queste locazioni o porte saranno inutilizzabili perché
il microprocessore non avrà alcun modo per indicare che vuole dialogare con
loro.
Spazi di indirizzamento tipici sono:
16
bit à 64K locazioni (Z80 e molti attuali microcontrollori)
20
bit à 1Mega di locazioni [tenete presente che in informatica i multipli non
crescono di un fattore 1000 ma 1024, cioè un mega è pari a 1024 K cioè a
1024*1024 = 1048576 indirizzi] (8088,8086,80186,80286)
32 bit à 4Giga
(80386,80486,Pentium, G3,G4)
36 bit à 64G (Pentium II,Pentium III,Pentium IV,
Athlon)
64 bit à 16Tera (Xeon, Itanium, Athlon64, G5)
Nel file seguente vi è l’esempio della mappa degli indirizzi di memoria
per un microprocessore con bus indirizzi a 16 bit.
Control
bus
Le azioni di lettura, scrittura,
acquisizione ed emissione sono governate dalla CPU che sincronizza gli altri dispositivi
attraverso il control bus.
Il control bus è costituito da un insieme
di segnali logici. Alcuni di questi escono dalla CPU e quindi sono comandi che
la CPU da agli altri dispositivi mentre altri entrano nella CPU e quindi sono
informazioni che gli altri dispositivi danno alla CPU.
Si può quindi affermare che il control
bus è bidirezionale, ma con un significato diverso rispetto al data bus.
Infatti nel caso del control bus esistono segnali d ingresso e segnali di
uscita ma ciascun segnale non inverte mai la sua direzione mentre nel data bus
tutti i segnali sono sia di ingresso che di uscita perché in funzione della
operazione svolta la direzione si può invertire.
I segnali di uscita del control bus sono
quindi comandi per le periferiche; questi segnali sono a loro volta governati
dal ‘clock’ che è il motore che fa avanzare le azioni della CPU con una cadenza
fissata dalla sua frequenza. Esempi di segnali di controllo sono:
READ:
segnale di controllo che indica che l’operazione da eseguire sul bus dati è una
lettura, cioè un trasferimento dalla periferia (cella o porta) verso la CPU.
WRITE:
segnale di controllo che indica che l’operazione da eseguire sul bus dati è una
scrittura, cioè un trasferimento dalla CPU verso la periferia (cella o porta).
MEMORY:
segnale di controllo che indica che l’operazione da eseguire sul bus dati
(lettura o scrittura) è riferita ad una cella di memoria.
I/O: segnale di controllo che indica che
l’operazione da eseguire sul bus dati (lettura o scrittura) è riferita ad una
porta di I/O.