Microprocessors based
instrumentation
1. Spiega le strategie adottate nel corso degli anni per
aumentare la velocità dei microprocessori, con
particolare attenzione alle metodologie di progettazione
dei processori e al loro scaling
Le prestazioni dei microprocessori sono strettamente legate all’evoluzione dei
transistor, che costituiscono l’elemento fondamentale dei circuiti integrati. Un
maggior numero di transistor corrisponde a un aumento delle prestazioni del
microprocessore e di conseguenza a un numero superiore di istruzioni eseguibili
al secondo.
Negli ultimi trent'anni, i progressi nelle tecnologie di produzione hanno portato a
un raddoppio del numero di transistor nei microprocessori circa ogni 18–24 mesi,
in accordo con la Legge di Moore, contribuendo così a un costante aumento delle
prestazioni.
Uno degli sviluppi chiave è stata la riduzione delle dimensioni dei transistor,
passati dai micrometri ai nanometri. Questa miniaturizzazione ha permesso di
aumentare significativamente il numero di transistor integrabili nella stessa
area, migliorando le prestazioni complessive dei chip. Poiché la produzione dei
circuiti integrati (IC) è costosa, integrare un numero sempre maggiore di
transistor in un singolo chip si è rivelato fondamentale non solo per incrementare
l’efficienza, ma anche per ridurre i costi di produzione.
Il principale motore dell'industria dei semiconduttori è stata il processo di scaling,
ovvero la riduzione delle dimensioni fisiche dei transistor e dei fili che li collegano,
permettendo di posizionare più dispositivi su ogni chip.
I transistor più piccoli hanno il vantaggio di commutare più velocemente poiché
richiedono meno corrente e possiedono una capacità inferiore, (secondo la legge
= RC).
τ
La riduzione della lunghezza del dispositivo (transistor) o della tensione di soglia
riducono il ritardo di un MOSFET e contribuiscono a velocizzare il tempo di
commutazione. Con l'aumento del numero di transistor disponibili, è stato
possibile aggiungere memoria cache nei microprocessori, dedicando una parte di
essi allo storage e i rimanenti alla computazione, incrementando così il numero di
istruzioni che possono essere eseguite in un secondo.
Un'altra strategia efficace è stata l'implementazione della computazione in
“pipeline”, che consente di eseguire più istruzioni in parallelo, migliorando
l'efficienza del microprocessore.
La progettazione dei microprocessori si è evoluta attraverso due approcci
principali: il lead design, che comporta la creazione di nuovi progetti e
architetture, e la compaction, che modifica i progetti esistenti per adattarli ai
nuovi processi di fabbricazione. La compaction permette di utilizzare i design
precedenti riducendo la dimensione della maschera di produzione, quindi avere
un componente più piccolo, senza dover sviluppare nuovi schemi da zero.
2. Descrivi le caratteristiche di un bus e le differenze fra un
bus asincrono e sincrono con il loro diagrammi
operazionali.
Un bus è un sistema di comunicazione che trasferisce dati tra componenti
all'interno di un computer o tra computer. Esso integra hardware, software e
protocolli di comunicazione per permettere lo scambio di informazioni tra i vari
componenti del sistema. Un bus funge da percorso elettrico comune che collega
più dispositivi, facilitando così la comunicazione tra di loro.
I bus vengono utilizzati all’interno della CPU per lo scambio di dati con l’ALU
(Arithmetic Logic Unit) e, all’esterno, per collegare la CPU alla memoria e alle
periferiche di I/O.
Il bus di un sistema microprocessore è composto da tre sottosistemi:
Control Bus: un bus bidirezionale utilizzato dalla CPU per gestire la
● comunicazione, sincronizzando i segnali di controllo affinché i dispositivi
possano comunicare correttamente.
Data Bus: bidirezionale e utilizzato per scambiare dati tra dispositivi (un
● parlante, uno o più ascoltatori).
Address Bus: Contiene il valore dell'indirizzo della cella (memoria o
● dispositivi I/O) che viene letta o scritta. Generalmente è una comunicazione
unidirezionale tra la CPU e la memoria o i dispositivi I/O.
Il funzionamento dei bus segue un’architettura MASTER-SLAVE, dove la CPU
agisce come master e i dispositivi di memorizzazione e periferiche sono
considerati slave.
Due caratteristiche importanti che servono a descrivere le performance del bus
sono la larghezza e il clock del bus.
La larghezza del bus si riferisce al numero di linee che compongono il bus stesso:
un bus più ampio offre una capacità dati maggiore consentendo il trasporto di
una quantità più elevata di dati ma allo stesso tempo questo aumento rallenta la
velocità di propagazione del segnale lungo il bus stesso a causa della capacità
parassita causata dai fili paralleli, inoltre i bus più larghi hanno anche un costo
maggiore. È quindi necessario trovare un trade-off tra la larghezza del bus e le
prestazioni complessive del sistema.
Una delle possibili soluzioni per aumentare la larghezza di banda del bus e
garantire un opportuno trade-off è utilizzare il multiplexed bus, che aumenta lo
spazio di memoria indirizzabile e la capacità di dati, senza aumentare il numero di
linee che compongono il bus stesso grazie ad un sottoinsieme di fili che possono
assumere ruoli diversi in diversi istanti.
Un altro modo per aumentare la capacità di trasferimento dei dati è aumentare
la velocità della comunicazione sul bus, ovvero diminuire il tempo di ciclo, ma
questo può portare ad un’asimmetria nel flusso dei dati poiché alcuni componenti
del sistema potrebbero non essere in grado di adattarsi al ciclo veloce, questo
fenomeno si chiama Bus skew (disallineamento del dato).
Il clock del bus invece definisce la velocità a cui avvengono le operazioni di
trasferimento dei dati sul bus, ed in base alla sincronizzazione si possono definire
bus di due tipi:
Bus sincrono: uno dei suoi segnali trasferiti è il clock, generato da un
● oscillatore al quarzo che produce un'onda quadra con una frequenza
generalmente compresa tra 5 e 133 MHz. Tutte le attività del bus avvengono
in un numero intero di cicli del clock, chiamati cicli del bus. Il clock viaggia
insieme ai dati;
Bus asincrono: non esiste un clock globale; ogni trasferimento è regolato
● da un protocollo di handshake (tipicamente segnali “Request” e
“Acknowledge”) tra mittente e destinatario. Un trasferimento parte solo
quando il mittente predispone i dati e il destinatario conferma di essere
pronto, e termina quando il ricevente segnala di averli acquisiti.
Lettura bus sincrono
In particolare considerando ad esempio un’azione di lettura in memoria di un
bus sincrono si può notare che l’inizio del primo ciclo è definito dal fronte di salita
del clock: durante questo ciclo la CPU inserisce sulle linee di indirizzo, l’indirizzo
della memoria che deve essere letto. Dopo un tempo TML necessario per
l’assestamento delle linee di indirizzo la CPU emette una richiesta di lettura e i
segnali MREQ (accesso alla memoria) e RD (indica un’operazione di lettura)
vengono attivati. La memoria richiede del tempo per leggere il valore e scriverlo
nei dati e comunica questo ritardo alla CPU con il segnale di WAIT; quando i dati
sono stati scritti la memoria disattiva questo segnale, la CPU inizia a leggere i dati
e disattiva i segnali MREQ e RD.
Lettura bus asincrono
Considerando invece un’azione di lettura effettuata con un bus asincrono Invece
di avere un clock, i bus asincroni sfruttano un principio di causa-effetto. Quando il
dispositivo master ha inserito l’indirizzo, i segnali MREQ e RD vengono attivati, e
subito dopo anche un segnale MSYN (Master SYN-chronization). Quando lo slave
vede questo segnale, esegue il suo lavoro il più rapidamente possibile e poi attiva
SSYN (Slave SYNchronization). Quando il master vede l’attivazione del segnale
SSYN, sa che i dati sono disponibili, li memorizza e poi nega indirizzo, MREQ, RD e
MSYN. La negazione di MSYN causa la negazione di SSYN, che conclude la lettura e
riporta il sistema allo stato originale. Questo approccio è indipendente dal tempo
e un evento è causato da un evento precedente (handshake completo).
I bus asincroni gestiscono meglio i ritardi poiché il meccanismo WAIT è gestito con
SSYN che viene attivato quando la memoria è pronta. Tuttavia, non essendo
dipendente da un clock si traduce in una maggiore incertezza nella gestione dei
segnali man mano che diventano più complessi, e questo complica le altre
procedure di trasferimento dei dati. Per questo motivo, i microprocessori
utilizzano bus sincroni.
I bus sincroni offrono una progettazione più semplice grazie alla sincronizzazione
tramite un clock comune, ma possono essere limitati dalla velocità del
dispositivo più lento. Al contrario, i bus asincroni gestiscono i ritardi in modo più
flessibile e non dipendono da un clock comune, ma introducono complessità
aggiuntive nella sincronizzazione dei segnali. Per questi motivi, i bus sincroni sono
frequentemente preferiti nei microprocessori moderni per la loro prevedibilità e
semplicità nella progettazione.
3. Descrivi l’arbitraggio del bus
I bus lavorano con una logica master-slave: durante un’operazione di
trasferimento i dispositivi Master sono attivi e iniziano il trasferimento dei dati
mentre i dispositivi slave sono passivi e aspettano la richiesta del trasferimento.
Diversi dispositivi possono comportarsi da master, ad esempio quando la CPU
ordina al controller del disco di leggere o scrivere un blocco, la CPU agisce come
master e il controllore del disco come slave, tuttavia anche il controllore del disco
può comportarsi da master mettendo in atto un’operazione di trasferimento
direttamente dalla memoria verso una periferica.
È però importante che durante un’operazione solo un dispositivo tra quelli
connessi allo stesso bus agisca da master.
L’arbitro dei bus determina chi agisce come master e può essere centralizzato o
decentralizzato.
Nell’arbitraggio centralizzato la richiesta del bus è un “wired-AND” che viene
attivato (valore 0) quando almeno un dispositivo richiede il bus, quindi l’arbitro
non può sapere quanti dispositivi hanno richiesto il bus ma solo se ci sono
dispositivi che lo hanno richiesto ed è quindi necessario un meccanismo per
capire chi ha fatto la richiesta.
Qualsiasi dispositivo che richiede il bus tiene “premuta” la linea “bus request” e
quando l’arbitro vede una richiesta del bus emette un consenso attivando la linea
“bus grant”.
Quando il primo dispositivo riceve il consenso, se ha fatto richiesta prende il
controllo del bus e blocca il segnale di consenso, così che il secondo non veda il
permesso di comunicare, altrimenti inoltra il segnale al dispositivo successivo,
quindi se più dispositivi richiedono contemporaneamente il bus quello con la
priorità più alta (la priorità è definita dall’ordine fisico di collegamento) è quello
più vicino all’arbitro: questo meccanismo si chiama daisy chaining.
Per evitare le priorità implicite basate sulla distanza dall’arbitro, molti bus
implementano livelli di priorità multipli. Per ciascun livello di priorità, esiste una
linea “bus request” e una linea di concessione del bus. Se vengono richiesti più
livelli di priorità contemporaneamente, l’arbitro emette una concessione solo per il
livello di priorità più alto.
Nell’arbitraggio decentralizzato invece non ci sono arbitri e quando un
dispositivo vuole utilizzare il bus attiva la sua linea di richiesta; tutti i dispositivi
monitorano tutte le linee di richiesta quindi, alla fine di ogni ciclo del bus ogni
dispositivo sa se è stato il richiedente con la priorità più alta.
Questo metodo rispetto all’arbitraggio centralizzato richiede più linee ma evita il
costo dell’arbitro e limita il numero dei dispositivi al numero delle linee di
richiesta.
Esiste poi un altro tipo di arbitraggio decentralizzato che utilizza solo 3 linee
indipendentemente dal numero di dispositivi.
La prima linea è la linea di richiesta, di tipo open drain e condivisa tra tutti i
dispositivi. Questa linea funziona secondo una logica wired-AND: se almeno un
dispositivo la attiva, il livello logico va a zero, indicando la presenza di una
richiesta. La seconda linea è chiamata BUSY e viene attivata dal dispositivo che
ha ottenuto il controllo del bus, segnalando agli altri che il bus è attualmente
occupato. La terza linea, quella di arbitraggio, è collegata in serie tra tutti i
dispositivi, formando una sorta di catena. La testa della catena è sempre attiva,
poiché collegata all’alimentazione, e il segnale si propaga da un dispositivo al
successivo, finché non viene interrotto.
Quando un dispositivo desidera accedere al bus, controlla innanzitutto che la
linea BUSY non sia attiva, ossia che il bus sia libero. Successivamente verifica che il
segnale di arbitraggio in ingresso, chiamato IN, sia attivo. Se entrambe le
condizioni sono soddisfatte, il dispositivo può iniziare la procedura di arbitraggio
negando il proprio segnale di uscita, OUT. In questo modo, il segnale non viene più
propagato ai dispositivi successivi nella catena. Questi, ricevendo un segnale di IN
negato, capiscono di non poter ottenere il bus e negano a loro volta il proprio OUT,
impedendo la propagazione verso valle.
Alla fine di questo processo, solo un dispositivo avrà IN attivo e OUT negato: è
quello che si trova più vicino alla testa della catena tra tutti quelli che hanno fatto
richiesta. Questo dispositivo ottiene il controllo del bus, attiva la linea BUSY per
indicare che sta effettuando una comunicazione e successivamente, al
completamento, riattiva la propria uscita OUT per ripristinare la catena.
Questo schema garantisce che, in caso di richieste simultanee, il dispositivo con
priorità più alta – determinata dalla sua posizione nella catena – ottenga
l’accesso al bus. Il sistema è quindi simile al classico arbitraggio daisy chaining,
ma completamente decentralizzato: non esiste un arbitro centrale, rendendolo più
semplice, meno costoso e più resistente a guasti.
4. Descrivi come funziona l’interrupt
Un interrupt è un meccanismo che consente di interrompere l'attività corrente del
processore in risposta a una richiesta esterna. È molto utile per ottimizzare
l'utilizzo della CPU, evitando che essa debba attendere un intervallo di tempo
indefinito per completare operazioni con dispositivi esterni. Gli interrupt sono
tipicamente generati dai dispositivi di I/O. Una questione critica nella gestione
delle interruzioni è il salvataggio dello stato della macchina nel momento in cui la
CPU passa alla nuova attività perché deve tornare allo stato originale quando ha
finito.
Il processo che porta alla generazione di un interrupt segue generalmente i
seguenti passi:
1. La CPU richiede a un dispositivo di I/O di eseguire una determinata
operazione che richiede un tempo indeterminato per essere completata.
Durante il tempo in cui il dispositivo esegue l’operazione, la CPU continua a
eseguire altre attività senza attendere il completamento dell’operazione.
2. Quando l'operazione è stata completata, il dispositivo di I/O invia un
segnale di interruzione per informare la CPU che l’operazione è terminata e
che è pronta a gestire i dati.
3. Nel momento in cui la CPU riceve il segnale di interruzione, deve salvare lo
stato corrente ed esegue poi la IHR - Interrupt Handler Routine per
esaminare la natura dell'interruzione e invocare la ISR - Interrupt Service
Routine specifica. Al termine della ISR, la CPU ripristina lo stato precedente
e riprende l'attività originale.
La gestione delle interruzioni richiede un’organizzazione specifica per trattare
richieste multiple in modo efficace. Questo processo è simile all’arbitraggio del
bus, poiché le interrupt vengono gestite attraverso cicli di bus specifici.
La soluzione per la gestione delle interruzioni è avere un arbitro centralizzato per
daremo priorità ai dispositivi più critici in termini di tempo e per gestire l
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Domande frequenti e risposte EIF
-
Domande + risposte frequenti
-
Risposte alle domande frequenti di Economia monetaria
-
Risposte alle domande Measurements and instrumentations