Appunti di Calcolatori Elettronici L-A Daniele Tiles 28 maggio 2006
.
Indice Indice
3
Introduzione
7
1 I calcolatori elettronici
9
1
Il modello di riferimento . . . . . . . . . . . . . . . . . . . . .
2
Rappresentazione astratta dell’hardware di un calcolatore elettronico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 9
3
La CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4
Accesso da parte della CPU ai dati e alle istruzioni: indirizzamento della memoria . . . . . . . . . . . . . . . . . . . . . . . 12 4.1
Spazio di indirizzamento in memoria . . . . . . . . . . 13
4.2
Accesso alle interfacce di I/O: spazio di indirizzamento in I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5
6
Trasferimento di informazioni sul bus, comandati dalla CPU . 15 5.1
Tipi di segnali . . . . . . . . . . . . . . . . . . . . . . . 16
5.2
La cache: ottimizzazione delle prestazioni . . . . . . . . 16
Agenti master e slave . . . . . . . . . . . . . . . . . . . . . . . 16 6.1
Sistemi multimaster . . . . . . . . . . . . . . . . . . . . 17
2 Architettura dell’hardware di un calcolatore elettronico
19
1
Le prestazioni di un calcolatore: CP Utime . . . . . . . . . . . . 19
2
Le memorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.1
ROM e EPROM . . . . . . . . . . . . . . . . . . . . . 21
2.2
Spazio d’indirizzamento e parallelismo . . . . . . . . . 22
2.3
Ancora EPROM . . .
. . . . . . . . . . . . . . . . . . . 23
4
Indice
3
2.4
Le RAM . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5
Una cella di RAM
. . . . . . . . . . . . . . . . . . . . 25
I circuiti notevoli . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.1
Il 244
. . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2
Il 245
. . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.3
Il 373
. . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.4
Il 374
. . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3 Il linguaggio macchina (Istruction Set Architecture - ISA) 1
31
Rappresentazione simbolica delle istruzioni macchina: l’assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2
Classificazione dei linguaggi macchina . . . . . . . . . . . . . . 33
3
Tipologia delle istruzioni . . . . . . . . . . . . . . . . . . . . . 33
4
3.1
Tecniche di indirizzamento degli operandi in memoria . 34
3.2
Classificazione in base agli operandi . . . . . . . . . . . 35
Alcune definizioni e istruzioni . . . . . . . . . . . . . . . . . . 35 4.1
Allineamento dei byte in memoria . . . . . . . . . . . . 36
4 ISA DLX 1
Formati delle istruzioni nelle architetture R-R (DLX) . . . . . 37 1.1
2
Calcolo del periodo di clock . . . . . . . . . . . . . . . 41 Altri esempi e osservazioni . . . . . . . . . . . . . . . . 43
I passi dell’esecuzione delle istruzioni . . . . . . . . . . . . . . 44
5 ISA Pipelined 1
2
39
Il diagramma degli stati del controller . . . . . . . . . . . . . . 41 3.1
4
IA 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
ISA DLX: Implementazione mediante la struttura sequenziale 2.1
3
37
47
CPU DLX Pipelined . . . . . . . . . . . . . . . . . . . . . . . 47 1.1
L’architettura Harvard . . . . . . . . . . . . . . . . . . 49
1.2
Altre osservazioni . . . . . . . . . . . . . . . . . . . . . 49
Alee nelle pipeline . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.1
Alee di controllo . . . . . . . . . . . . . . . . . . . . . 51
2.2
Branch Target Buffer . . . . . . . . . . . . . . . . . . . 52
Indice
5
6 Decodifica indirizzi e mapping 1
53
Decodifica parziale . . . . . . . . . . . . . . . . . . . . . . . . 55
7 L’8088
57
1
Una prima descrizione del processore: i segnali . . . . . . . . . 57
2
Registri Interni . . . . . . . . . . . . . . . . . . . . . . . . . . 59 2.1
Modalit`a d’indirizzamento . . . . . . . . . . . . . . . . 60
3
Altre caratteristiche dell’8088 . . . . . . . . . . . . . . . . . . 61
4
Caratteristiche del BUS . . . . . . . . . . . . . . . . . . . . . 62
5
Generazione dei segnali per pilotare il bus, i comandi . . . . . 63
6
5.1
Generazione del clock e del reset . . . . . . . . . . . . . 64
5.2
Generazione del segnale di READY . . . . . . . . . . . 65
Calcolo degli stati di wait nel caso di cicli di lettura dalla memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
8 La gestione dell’Input/Output 1
2
67
Le periferiche . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 1.1
L’8255 . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
1.2
Parola di controllo dell’8255 . . . . . . . . . . . . . . . 69
Le Interruzioni . . . . . . . . . . . . . . . . . . . . . . . . . . 70 2.1
Meccanismi d’interruzione dell’8088 (stesso per tutta la famiglia) . . . . . . . . . . . . . . . . . . . . . . . . 70
2.2
PIC 8259 . . . . . . . . . . . . . . . . . . . . . . . . . 71
Introduzione Questi appunti rappresentano il formato elettronico degli appunti da me presi nell’anno accademico 2003/2004. Questo documento non `e da considerarsi ufficiale e/o sostitutivo alle dispense del professore, ma si spera possa essere d’aiuto per lo studio della materia. (Anzi, mio spassionato consiglio: ricontrollate pi` u volte le slide, e se ci son delle discrepanze, fidatevi delle slide!) Se si riscontrano errori o mancanze, potete riferirmele all’email
[email protected], in modo che possa correggerle al pi` u presto.
Capitolo 1 I calcolatori elettronici Un calcolatore elettronico non `e nulla di pi` u o di meno di una rete logica, ovvero una rete retroazionata con un certo numero di flip-flop. Ci`o che lo contraddistingue `e la complessit`a della rete progettata, che `e notevole.
1
Il modello di riferimento
Il primo esempio di calcolatore elettronico pu`o essere ricondotto alla Macchina di Von Neumann, progettata intorno agli anni 40 del secolo scorso: una macchina teorica come quella di Turing, ma allo stesso tempo pi` u complessa e dettagliata, e con la possibilit`a di poter scegliere la sorgente di input. Un calcolatore elettronico consiste in una architettura del tutto generale, che porta a realizzazioni poco dipendenti da quello che `e il funzionamento desiderato. Il funzionamento desiderato viene espresso in termini di sequenze di istruzioni (programma) che sono memorizzate su un apposito supporto di memoria; per cambiare il funzionamento basta quindi cambiare il programma. L’architettura `e tale da trattare problemi pi` u complessi di quelli visti nelle reti logiche, a scapito per`o di una minore efficienza.
2
Rappresentazione astratta dell’hardware di un calcolatore elettronico
In un calcolatore elettronico, l’hardware necessita di un suo set di informazioni per poter comunicare con il software. Questo set viene detto linguaggio
10
I calcolatori elettronici
macchina. Nella figura seguente si pu`o vedere una generica rappresentazione della struttura logica di un calcolatore.
Figura 1.1: Struttura logica di un calcolatore Alcune definizioni dei nomi presenti nello schema: • I registri sono un insieme di flip-flop che hanno un comportamento simile • Il PC o Program Counter `e un registro dell’Unit`a di elaborazione (detta anche CPU, Central Processing Unit, che serve per reperire le istruzioni che devono essere elaborate proprio dalla CPU. • L’ALU `e l’Arithmetic Logic Unit, una rete combinatoria importantissima per la CPU: `e quella che si preoccupa di eseguire tutti i calcoli. • I registri di transito e di stato rappresentano le zone di input e output del calcololatore elettronico. • Il bus di sistema `e il supporto di interconnessione fra i blocchi che costituiscono l’elaboratore: ci transitano i segnali digitali che rappresentano le variabili binarie. I blocchi interconnessi al bus sono detti bus agent.
1.3 La CPU
11
Durante lo sviluppo dei calcolatori elettronici, si `e dovuto mantenere costante questa struttura per poter in ogni modo supportare il software che veniva realizzato: un’alterazione di tale modello porterebbe a dei problemi di compatibilit`a.
3
La CPU
La Central Processing Unit `e una macchina sequenziale sincrona. . . il comportamente di un calcolatore elettronico si pu`o quindi semplificare al massimo in una rete a 2 stati.
Figura 1.2: Gli stati di un calcolatore elettronico • IF o Instruction Fetch `e lo stato in cui la CPU legge in memoria la prossima istruzione da eseguire. • EX o EXecute `e lo stato in cui la CPU esegue l’istruzione letta nello stato IF. La CPU per poter funzionare richiede almeno due ingressi: quello di RESET e quello di CLOCK ovviamente, essendo una macchina sincrona. Nel caso il RESET non fosse attivo, la CPU legge ed esegue perennemente istruzioni, cambiando lo stato ad ogni impulso di clock. La frequenza di clock `e uno dei parametri che caratterizzano la CPU: `e circa di 10 volte superiore al clock presente sul bus. Come fa la CPU a sapere da dove reperire l’istruzione successiva mentre `e nello stato di IF? Nel Program Counter viene memorizzato l’indirizzo dell’istruzione successiva, e viene incrementato ad ogni istruzione di fetch. Nel-
12
I calcolatori elettronici
l’immagine seguente `e rappresentato il grafico del PC in funzione del tempo, nel caso il calcolatore esegua un loop di 4 istruzioni.1
Figura 1.3: Grafico del PC in funzione del tempo, nel caso la CPU esegua un loop di 4 istruzioni In realt`a, non `e detto che la CPU esegue le istruzioni nell’ordine prefissato. Per esempio, nei processori son presenti dei compilatori che sono in grado di generare il codice macchina partendo da un linguaggio di programmazione ad alto livello, e che riescono anche ad ottimizzare i programmi, ottenendo una sequenza diversa da quella programmata. Oggi giorno la situazione `e ancora pi` u complicata per via dei calcolatori fuori ordine: questi leggono n istruzioni contemporaneamente, senza rispettare quindi l’ordine imposto dal processore.
4
Accesso da parte della CPU ai dati e alle istruzioni: indirizzamento della memoria
Molte memorie 2 sono degli insiemi consecutivi di celle, e quindi si pu`o individuare ogni cella mediante il suo indirizzo. In generale ogni cella `e composta da 8 bit, dal quale si deduce che il byte `e la pi` u piccola quantit` a di memoria 1`
E da notare che la pendenza delle linee `e un indicatore del numero delle istruzioni eseguite nell’unit` a di tempo. 2 Non tutte: un esempio son le memorie cache
1.4.1 Spazio di indirizzamento in memoria
13
indirizzabile.3 Una memoria `e quindi pari a un vettore di 2n elementi, ovvero che sono individuabili mediante gli indirizzi compresi nel range fra [0, 2n − 1]. Gli indirizzi si indicano solitamente mediante codice esadecimale 4 La dimensione dello spazio d’indirizzamento di una CPU `e uno dei parametri che ne caratterizza l’architettura. Questa si pu`o esprimere in: • KiloByte = 210 byte • MegaByte = 220 byte • GigaByte = 230 byte
4.1
Spazio di indirizzamento in memoria
Lo spazio di indirizzamento `e continuamente migliorato con il progredire della tecnologia: • l’8085 aveva uno spazio di indirizzamento pari a 64 KB, con indirizzi a 16 bit • l’8086 aveva uno spazio di indirizzamento pari a 1 MB, con indirizzi a 20 bit, rappresentati in 5 cifre esadecimali. • i primi Pentium avevano uno spazio di indirizzamento pari a 4 GB, con indirizzi a 32 bit, rappresentati in 8 cifre esadecimali. • Infine, i Pentium III e IV hanno uno spazio di indirizzamento pari a 64 GB, con indirizzi a 36 bit.5
Nell’immagine seguente si pu`o vedere la rappresentazione logica di uno spazio di indirizzamento a 4 Gb. In tale spazio vengono “mappati” i dispositivi fisici di memoria: in questo modo la CPU `e in grado di riconoscere e di usare i componenti fisici della memoria (la CPU ragiona solo mediante indirizzi)! Pu`o essere che i singoli 3`
E quindi importante notare che sul bus non deve solo passare il dato, ma anche l’indirizzo 4 Che non ha nulla a che vedere con l’ASCII. . . 5 Un processore a 36 bit significa che ad ogni colpo di clock riesce a leggere fino a 36 bit (non sempre 36, pu` o anche leggerne di meno), e ci`o permette il parallelismo.
14
I calcolatori elettronici
Figura 1.4: Rappresentazione logica dello spazio di indirizzamento per una memoria a 4 Gb, ovvero la memoria viene vista come una serie di byte sequenziali. Agli estremi della memoria vengono indicati il primo e l’ultimo indirizzo indicabile, mentre l’area rossa rappresenta appunto il dispositivo fisico mappato. componenti fisici non abbiamo memoria sufficiente per costituire la memoria logica dell’architettura: in questo caso basta predisporre nell’architettura tanti componenti in modo da ottenere la memoria logica desiderata, “mappandoli” tutti.
4.2
Accesso alle interfacce di I/O: spazio di indirizzamento in I/O
Come `e gi`a stato detto, il processore di un calcolatore elettronico ragiona solo mediante indirizzi logici: si ha quindi che anche i dispositivi di I/O devono essere mappati perch`e il processore possa “riconoscerli e usarli”. I dispositivi di I/O possono essere mappati o in uno spazio distinto da quello usato per le memorie, oppure nello stesso. In quest’ultimo caso si dice che l’I/O `e mappato in memoria (memory mapped I/O). In generale lo spazio di indirizzamento per i dispositivi di I/O `e pi` u piccolo dello spazio di indirizzamento in memoria. Si ha quindi che il numero degli indirizzi in I/O sia molto inferiore al numero di indirizzi della memoria centrale6 . 6
Si dice memoria centrale quegli indirizzi che sono direttamente raggiungibili dal processore
1.5 Trasferimento di informazioni sul bus, comandati dalla CPU
15
Con il passare degli anni e l’evoluzione della tecnologia dei processori, si ha che il numero degli indirizzi per i dispositivi in I/O in realt`a `e rimasto circa lo stesso, cio`e 64 Kb. Questo numero `e anche eccessivo, ma in questo modo si possono avere degli indirizzi ridondanti che possono avere la loro utilit`a. Come si fa a discriminare i due diversi spazi di indirizzamento? Sul bus `e presente un segnale detto qualificatore che specifica il tipo di indirizzo che sta transitando sul bus.7 .
5
Trasferimento di informazioni sul bus, comandati dalla CPU
La CPU pu`o comandare come trasferimenti di informazioni sul bus • Trasferimenti da e verso dispositivi mappati nello spazio d’indirizzamento in memoria come – Lettura di istruzioni e dati (gli operandi dei primi) dalla memoria – Scrittura dei risultati nella memoria • Trasferimento da e verso dispositivi mappati nello spazio di indirizzamento in I/O come: – Lettura di dati dalle interfacce – Scrittura dei risultati sulle interfacce Per gestire correttamente questi trasferimenti (ovvero la scrittura/lettura di dati su/da indirizzi emessi dal processore, che comanda il trasferimento), il bus di sistema deve disporre di 3 gruppi di segnali: • Segnali di indirizzo • Segnali di dato • Segnali di controllo/comandi o sincronizzazioni e quindi ha bisogno di 3 piste distinte, una per ogni tipo di segnale. Il bus `e il vero collo di bottiglia delle prestazioni di un sistema. . . si ha quindi che: • Deve essere il pi` u veloce possibile • Deve essere sempre sfruttato al massimo, anche quando il processore non lo richiede 7
Si potrebbe usare le istruzioni di memoria per trasferire dati dai dispositivi di I/O, ma in generale `e sconsigliato.
16
I calcolatori elettronici
5.1
Tipi di segnali
Ci sono 4 segnali indispensabili per il funzionamento di un calcolatori: • Memory read (Si fornisce l’indirizzo di una cella di memoria, e si vuole il valore contenuto in quella cella) • Memory write (il duale del precedente) • I/O read • I/O write Tuttavia esistono molti altri segnali che son necessari al funzionamento del sistema: per esempio il segnale di wait `e necessario per poter segnalare da parte dei dispositivi esterni al processore di fermarsi prima di richiedere/scrivere dati perch`e devono terminare un loro processo.
5.2
La cache: ottimizzazione delle prestazioni
La cache `e una memoria interna molto veloce, che contiene un sottoinsieme delle informazioni presenti in memoria, quelle che hanno la pi` u alta probabilit`a di essere richiamate dal processore (di norma, i programmi consistono i tantissimi loop, e quindi le informazioni necessarie al processore non sono tantissime). Utilizzando la cache, quando il processore lavora su dati che ha gi`a a disposizione non si deve preoccupare di reperirli: il problema ora consiste nello svuotare la cache quando i dati non sono pi` u utilizzati e nel riempirla con i dati che sono pi` u richiesti dal processore. . . con lo sviluppo della tecnologia si hanno dei processori che contengono al loro interno delle memorie cache. Quello che quindi si `e costruito alla fine `e una gerarchia delle memorie, ovvero queste vengono classificate secondo il loro uso e il modo in cui il processore riesce ad accederci.
6
Agenti master e slave
Tutti i dispositivi collegati al bus di sistema sono detti agenti, e vengono catalogati a seconda del loro comportamento: • Master : generano indirizzi e segnali di comando (come per esempio la CPU nei casi precedenti) • Slave: accettano passivamente indirizzi e segnali di comando (negli esempi precedenti, le memorie e i dispositivi di I/O son afenti slave)
1.6.1 Sistemi multimaster
17
• Master/Slave: si tratta di dispositivi che con il passare del tempo alternano il ruolo da master a slave e viceversa. Finora si `e trattato di schemi in cui `e presente un singolo agente master (la CPU), e che vengono detti appunto sistemi a singolo master. Il trasferimento di un’informazione tra agenti del bus avviene con una sequenza di eventi che viene detta nel loro insieme cicli del bus. Ad ogni ciclo di bus, si ha che un agente master indirizza un agente slave.
6.1
Sistemi multimaster
Si tratta di sistemi in cui son presenti pi` u master. . . per esempio, un calcolatore elettronico con una CPU e un’interfaccia con DMA8 `e un sistema multimaster. Un sistema con pi` u CPU affacciate sullo stesso bus `e detto UMA, Uniform Memory Access. Si ha quindi che si deve gestire chi deve comandare il bus, ovvero deve essere presente solo un master alla volta a comandare sul bus. Per poter progettare un sistema del genere, oltre a una corretta gerarchia delle memorie serve una specie di “semaforo” per poter segnalare ai vari agenti master quando il bus `e libero.9 I problemi nel progettare un sistema multimaster sono due: fisico (come collegare fisicamente i master al bus) e logico (come liberare il bus). Quest’ultimo viene risolto da un sistema operativo multimaster, che `e molto pi` u complesso di quello monomaster. Quando pu`o un master cedere il suo turno? Solo quando `e stato concluso un ciclo di bus10 . Nel frattempo, un master non attivo sul bus pu`o fare lo 8
Direct Memory Access: `e la funzione di accesso autonomo alla memoria. Per gestire il trasferimento di dati fra gli agenti slave, serve un controller del DMA, un DMAC 9 In un sistema del genere, lo spazio d’indirizzamento pu`o essere riempito a “chiazze di leopardo”, a differenza di ci` o che accade di solito (ovvero la memoria `e riempita in maniera contigua): il programma che viene elaborato nel calcolatore deve essere conscio di questo problema. . . 10 Un ciclo di lettura/scrittura `e indivisibile, una volta iniziato va per forza concluso. . . esistono delle eccezioni, come nel caso della memoria virtuale: questo `e un sistema
18
I calcolatori elettronici
snooping agent, ovvero studia l’attivit`a presente sul bus per vedere se ci`o che avviene lo riguarda. Un esempio di problema: quante volte la CPU accede al bus per eseguire le istruzioni: A=B+C D =E−F G=A·D Per poter eseguire le tre operazioni, la CPU deve andare per 3 volte a reperire il tipo di operazione da eseguire (quindi 3 volte nello stato IF) e quindi le esegue 3 volte (3 volte nello stato EX). Per eseguire il fetch di una istruzione, alla CPU basta un unico ciclo di bus, mentre per l’execute servono 3 cicli di bus: due son necessari per poter leggere gli operandi delle istruzioni e infine serve un terzo ciclo per scrivere il risultato ottenuto in memoria. Si hanno quindi 3 + 3 · 3 = 12 cicli di bus per completare il programma. . . tuttavia, ci`o non indica in quanto tempo viene effettivamente eseguito il programma.
hardware realizzato dal processore che fa credere al programma in esecuzione di avere tutta la memoria del calcolatore disponibile (sul disco si ha un “prolungamento” della memoria centrale, ad accesso diretto. . . il dato comunque deve passare per la memoria centrale per essere letto.) In questo caso il ciclo deve essere interotto: il programma viene temporaneamente fermato, si preleva e legge il dato in memoria centrale, e quindi il programma riprende dal punto in cui si era fermato. . .
Capitolo 2 Architettura dell’hardware di un calcolatore elettronico L’architettura dell’hardware di un calcolatore elettronico `e definita dalla terna: • Il set d’istruzioni, ovvero l’architettura vista dall’utente: `e detto anche codice macchina • La struttura interna • La realizzazione circuitale, cio`e la tecnologia microelettronica impiegata nella realizzazione Quello che si pu`o avere `e che: • Uno stesso set d’istruzioni pu`o essere realizzato con strutture interne diverse • La stessa struttura interna pu`o essere realizzata con tecnologie diverse. • Infine, architetture diverse hanno delle prestazioni diverse. Per esempio: aumentando il numero dei registri interni, si ha un minor traffico sul bus, con prestazioni migliori. . . ma allo stesso tempo si ha una rete logica pi` u complessa. Come valutare quindi le prestazioni?
1
Le prestazioni di un calcolatore: CP Utime
Le prestazioni di un calcolatore vanno sempre riferite a un programma di riferimento, detto benchmark. Il CP Utime o “tempo di esecuzione” `e il parametro che caratterizza le prestazioni di un calcolatore rispetto a un determinato
20
Architettura dell’hardware di un calcolatore elettronico
benchmark: CP Utime = Nistruzioni · CP Imedio · Tck
(2.1)
Dove: • N `e il numero di istruzioni per l’esecuzione del programma (dipende sia dal benchmark scelto, sia dal linguaggio della macchina) • CP Imedio `e il numero medio di clock per ogni istruzione, dipendente dal benchmark e dalla struttura. Lo si pu`o determinare come n X Ni CP Imedio = CP Ii · numero totale delle istruzioni i=1
(2.2)
dove CP Ii `e il numero di periodi per eseguire l’istruzione i-sima del benchmark, e dove Ni `e la frequenza dell’istruzione i-sima. Se si ha un CP Imedio basso, significa che `e basso il CPI delle istruzioni eseguite con frequenza maggiore. 1 , ovvero l’inverfck so della frequenza del clock della macchina. Questa caratteristica di-
• Tck `e il periodo del clock della macchina, pari a
pende sia dalla struttura che dalla tecnologia utilizzata per realizzare l’elaboratore Esistono dei programmi di alto livello per controllare le prestazioni di un calcolatore. Per esempio, il drystone `e un programma in Fortran per controllare i processori, i compilatori, la memoria . . . , cio`e tutti gli elementi che influenzano l’efficienza.1 Un altro parametro per le prestazioni `e il “milioni di istruzioni per secondi” o MIPS : M IP S =
Nistruzioni CP Utime · 106
(2.3)
che fornisce un’indicazione vaga della potenza di un processore (tuttavia, questo parametro dipende dal tipo di istruzioni considerate . . . ) 1
Per quanto migliori la tecnologia, non esiste l’efficienza assoluta di un processore, perch`e dipende sempre a cosa `e collegato e ai programmi che girano sul calcolatore
2.2 Le memorie
21
Infine, un altro parametro che si pu`o considerare `e lo speed-up che corrisponde all’accorciamento nel tempo di esecuzione fra due processori diversi: SUA/B =
CP Utime (B) CP Utime (A)
(2.4)
dove il processore B `e il processore pi` u lento. Di norma, viene per`o rappresentato in maniera percentuale: SUA/B % =
2
CP Utime (B) · 100 CP Utime (A) − 1
(2.5)
Le memorie
I vari componenti tecnologici che possono costituire la memoria di un elaboratore elettronico vengono catalogate a seconda della tecnologia (RAM, ROM, EPROM. . . ). Le RAM inoltre possono essere distinte in statiche (almeno due transistor) o dinamiche 2 (1 transistor). Nelle memorie, a una minore densit`a del componente corrisponde una maggiore velocit`a.
2.1
ROM e EPROM
In realt`a, oggi le ROM non esistono pi` u, un tempo venivano costruite su commissione. . . in realt`a si parla sempre si EPROM, ovvero di Erasable Programmable ROM. Si tratta di memorie non volatili, ovvero che non perdono le istruzioni memorizzate nel caso che la tensioni cada. Hanno quindi le istruzioni primarie dell’elaboratore, e quindi stanno sul bus e vengono indirizzate direttamente dal processore. Le EPROM possono dipendere dalla temperatura. Il nome di una EPROM viene calcolato come “27 + numero dei Kbits”. Per esempio, la EPROM 27512 ha 512 Kbits, cio`e corrisponde a 64 Kbyte di memoria.3 . Una EPROM si dice dual-line se ha i piedini su due lati. 2
A differenza delle memorie statiche, dove l’informazione viene memorizzata in un FF, nelle memorie dinamiche questa `e memorizzata in un condensatore (l’1 corrisponde al condensatore carico, lo 0 al condensatore scarico). A tempi fissi quindi le memorie dinamiche vanno rinfrescate, perch`e il condensatore comunque ha un suo tempo di scarica. . . tuttavia, questo refresh potrebbe provocare un conflitto di accesso con il processore. . . sono quindi pi` u lente. 3 Importante: le EPROM vanno a multipli di 2, mentre le RAM a multipli di 4
22
Architettura dell’hardware di un calcolatore elettronico
Alcuni commenti ai piedini delle EPROM: • VCC corrisponde all’alimentazione, mentre GND alla massa • I bit A0 . . . A16 sono i bit di indirizzamento. Essendo 17 bit di indirizzamento, si ha che la memoria corrisponde a 217 = 131072 byte ovvero 128 Kbyte. • I bit D0 . . . D7 corrispondono ai bit di dato. • Il bit CE ∗ , Chip Enable, `e un piedino a logica negativa, ovvero `e vero quando si ha un segnale basso, uno 0. Nel caso sia alto, funziona la decodifica • Il bit OE ∗ , Output Enable, `e quello che indica se l’output `e attivo. Se non lo `e, le uscite sono in tristate 4 , `e come se non fossero collegate a niente. Altre memorie che vengono utilizzate: le memorie flash, che sono EPROM cancellabili, ma dove deve essere cancellata tutta l’informazione, e le OTPROM, One Time Programmable ROM (costano poco, e vengono usate per la costruzione delle macchine automatiche)
2.2
Spazio d’indirizzamento e parallelismo
Nella figura si pu`o vedere il confronto fra memoria logica e memoria fisica.
Figura 2.1: Memoria logica e fisica ` un segnale volante, Il segnale 3-state non `e uno stadio logico ben definito (1 o 0). E dipende dagli altri componenti a cui `e collegato. 4
2.2.3 Ancora EPROM . . .
23
Il parallelismo indica il massimo numero di informazioni trasferibili in un ciclo di bus. . . da ci`o si potrebbe pensare di realizzare la memoria logica come un bus a 32 bit!
2.3
Ancora EPROM . . .
Nell’esempio presente sulle slides, si considera una memoria da 1 MegaByte. La memoria `e composta da 128 K celle ognuna da un byte. Nel disegno si pu`o osservare a cosa corrisponde il dato i-simo, ovvero al bit i-esimo della cella M-sima. Perch`e il dato sia disponibile, i bit CE ∗ e OE ∗ devono essere abilitati, cio`e bassi essendo logica negativa, perch`e il tristate faccia passare l’informazione.
Figura 2.2: Circuito per decodificare i dati di una EPROM Tuttavia, fra l’attivazione dei vari segnali d’ingresso e la disponibilit`a dei dati in output passa un certo tempo. Esattamente, si dice tempo d’accesso il tempo necessario fra l’abilitazione del segnale di CE ∗ , la stabilizzazione dei segnali in ingresso e il tempo in cui i dati compaiono sui piedini di output5 . Tale intervallo di tempo dipende dalla decodifica, che `e una rete combinatoria, ovvero si tratta di circuiti combinatori a pi` u livelli. . . il tempo dipende quindi dal numero di questi livelli. In realt` a, come si pu` o vedere dal disegno, il tempo di attivazione dell’OE ∗ `e considerato. Ci` o che `e trascurabile `e invece il tempo del tri-state, rispetto a quello della decodifica 5
24
Architettura dell’hardware di un calcolatore elettronico
Come vengono scritti i dati sulle EPROM? Il processore deve usare delle tecniche diverse usate per le altre memorie, ovvero non pu`o scrivere in un normale ciclo di bus. Inoltre, si deve ricordare anche che le EPROM mantengono le informazioni senza aver bisogno dell’alimentazione. . . esiste un piedino detto “program” (P RG∗ ) che se viene attivato per un periodo considerato lunghissimo (circa 200-300 micro secondi), se si sforzano dei segnali sui piedini da dove si preleva i dati (ovvero i Di ), si pu`o scrivere all’interno delle EPROM. Inoltre, deve essere presente al piedino VPP una tensione costante da 5 volt per poter programmare, una tensione superiore a quella presente per le operazioni di lettura, che agisce su dei moss presenti nel circuito.6
2.4
Le RAM
` un circuito bistabile per la Si parla innanzitutto di SRAM, Static Ram. E memorizzazione dell’informazione (utilizza un flip-flop per memorizzare, e quindi necessita per forza di 2 transistor). In generale il tempo d’accesso si aggira sui 50-60 secondi, nel ciclo di lettura. A differenza delle EPROM, nelle RAM serve un piedino detto W E ∗ (Write Enable) che deve essere sempre attivo in alternativa al segnale di OE ∗ : `e il segnale con cui si indica alla RAM che si intende scrivere invece che leggere dai piedini di dato (I/Oi ).7 . A differenza delle EPROM, nelle RAM non `e presente il piedino per la programmazione, le letture e le scritture avvengono nei normali cicli di bus. . . ma si tratta comunque di una memoria volatile. Nelle RAM, se CE ∗ non `e attivato, non fa niente. Un discorso sulle RAM “veloci”: questi circuiti consumano di pi` u delle solite RAM, e hanno una densit`a circuitale inferiore (meno transistor, pi` u resistenze). Si ha quindi una maggiore temperatura interna e un numero maggiore di transizioni di correnti. 6
Considerando questo piedino e il piedino NC (Non Connesso, non `e presente alcun collegamento interno per quel piedino), in teoria si potrebbe aumentare il valore della memoria (19 piedini, overro 219 che corrisponde quindi a 512 K celle. . . ma si tratta di circuiti diversi) 7 La disposizione fisica di questi piedini `e come quella delle EPROM, ovvero c’`e una compatibilit` a meccanica.
2.2.5 Una cella di RAM
2.5
25
Una cella di RAM
Nel disegno si pu`o osservare una cella di RAM.
Figura 2.3: Una cella di RAM
Il bus dei dati `e bidirezionale, mentre il bus degli indirizzi `e monodirezionale. I segnali W R e RD corrispondono ai segnali W E ∗ e OE ∗ . . . dovrebbero essere in logica negativa, visto che se capita un segnale volante, ovvero un segnale che non `e chiaro cosa sia, questo viene sempre interpretato come se fosse un 1 logico. In teoria i segnali volanti non ci dovrebbero essere, ma in questo modo si `e protetti dall’eventualit`a. Quello che si pu`o osservare `e che su ogni filo fisico esiste un unico segnale pilota a ciclo, ma possono essere presenti pi` u ricevitori. Come vengono decodificati gli indirizzi? Di norma mediante una serie di AND in riga e colonna. Per esempio, se si hanno 16 celle, queste si possono individuare unicamente con 4 diversi fili (24 = 16), e quindi servono 4 AND per riga e colonna! Cosa succede se si ha power down? Esiste un circuito che mette a riposo il circuito se CE ∗ non `e attivo (in questo modo si ha una minima corrente per non perdere le informazioni memorizzate!)
26
Architettura dell’hardware di un calcolatore elettronico
3
I circuiti notevoli
In questa sezione verranno elencati e descritti alcuni circuiti notevoli per l’architettura di un calcolatore elettronico.
3.1
Il 244
Il vero nome di questo componente sarebbe 74xx 244, dove xx indica la tecnologia con cui `e stato realizzato il circuito. Si tratta di un driver 3-state (restituisce 1, 0 oppure questo valore che non pu`o essere interpretato esattamente comeun 1 o uno 0) ad 8 bit, strutturato in 2 gruppi da 4 bit, con il segnale di controllo (EN ∗ ) in comune, o anche noto come buffer. A cosa serve un buffer? Un buffer pu`o essere utilizzato: • Per separare i monti, ovvero eletricamente i fili • Per rigenerare il segnale (ha un alto fan-out) Nel disegno si pu`o vedere lo schema di un 244. Se il chip EN ∗ `e attivo (cio`e
Figura 2.4: Schema di un 244 `e 0), il 244 riproduce fedelmente il segnale. . . , tuttavia, il 244 ha anche degli svantaggi: prima di tutto ritarda il segnale, e poi occupa spazio all’interno del calcolatore e consuma. Bisogna stare attenti all’uso dei 244, specialmente non lo si deve mai mettere in serie: nel caso il 244 a monte fosse disabilitato, il circuito risulterebbe come spezzato, e logicamente si avrebbe un ingresso volante per il secondo 244, che
2.3.2 Il 245
27
non viene interpretato come un tri-state ma come un “1 sporco”; infatti si trova in prossimit`a della soglia per cui si pu`o riconoscere l’1 logico. Conviene quindi sempre inserire una resistenza fra i due 244, in modo che faccia da pull-adder e non sia presente il segnale volante.
3.2
Il 245
Il 245 `e un buffer bidirezionale: consiste fondamentalmente in 2 244 montati in maniera tale da poter trasmettere i dati da una serie di fili a un’altra o viceversa (appunto, in entrambe le direzioni). Il 245 `e anche detto transreceiver, ovvero`e un componente che “trasmette e riceve”. Nella figura si pu`o vedere lo schema di un transreceiver. In questo caso i segnali di controllo
Figura 2.5: Schema di un 245 sono due (EN ∗ e DIR) le cui combinazioni definiscono il comportamento del 245: EN ∗ DIR
Risultato
1
1
I due bus sono scollegati fisicamente
0
1
Si trasmette da A verso B, A → B
0
0
Si trasmette da B verso A, B → A
1
0
Combinazione impossibile da verificarsi
Un 245 si pu`o disporre fra una ram e il bus, in modo tale da fornire un potenziamento elettrico.
28
3.3
Architettura dell’hardware di un calcolatore elettronico
Il 373
Si tratta di un 8-latch CD. Nella figura si pu`o osservare uno schema.
Figura 2.6: Schema di un 373 Come funziona? Quando il valore di C `e alto (che dipende dal segnale di clock), si ha che si ripete esattamente l’ingresso sull’uscita. Se C `e 0 invece, nel latch CD viene memorizzato l’ultimo valore presente su D (questi due segnali per`o non devono commutare contemporaneamente, altrimenti non si riesce a memorizzare.
3.4
Il 374
Figura 2.7: Schema di un 374 Il 374 invece si tratta di un componente elettronico costituito da 8 flip-flop D, che viene anche detto registri edge-triggered con uscite 3-state: infatti i registri presenti nei calcolatori elettronici non sono nient’altro che un insieme
2.3.4 Il 374
29
di flip-flop. A differenza del 373, il 374, avendo appunto dei flip-flop D, campiona l’ingresso quando il clock passa da 0 a 1. Inoltre, nella realt`a, ad ogni flip-flop c’`e un MUX a cui `e collegato il segnale di W R∗ : se il segnale non `e abilitato, allora il flip-flop mantiene in memoria il dato.
Capitolo 3 Il linguaggio macchina (Istruction Set Architecture ISA) Il linguaggio macchina1 serve per programmare il processore. Pi` u precisamente l’ISA `e il livello dell’architettura della CPU visibile a chi sviluppa i compilatori e a chi programma in assembler2 . L’ISA `e costituita dall’insieme delle istruzioni eseguibili e dal loro formato binario. Mediante queste istruzioni s’accede alle risorse interne dell’elaboratore: • Memoria • Registri • Variabili di stato (o variabili di sistema o flag). Tra le risorse interne al calcolatore, solo quelle accessibili attraverso l’ISA possono essere rese visibili e controllabili dal software. L’ISA viene principalmente valutato in base all’efficienza del codice generato dai compilatori (si deve quindi minimizzare il pi` u possibile il CP Utime . Cosa deve contenere un’istruzione? • Il tipo dell’operazione (anche detto codice operativo) 1
Si tratta di linguaggi super-set, quando `e necessario si aumentano il numero delle istruzioni, mantenendo comunque quelle vecchie, anche la decodifica 2 La differenza fra il compilatore e l’assemblatore `e: il compilatore genera un linguaggio indipendente dalla macchina, mentre l’assemblatore genera del codice che dipende strettamente da come `e stata progettata la macchina, come l’ISA
32
Il linguaggio macchina (Istruction Set Architecture - ISA) • Da dove si prendono gli operandi dell’istruzione (gli indirizzi3 che contengono gli operandi sorgente) • La codifica del registro R1 (cio`e l’operando destinazione)
Tutte queste informazioni sono bit, che devono essere correttamente interpretati. Il problema `e che la dimensione dell’istruzione varia da processore a processore, e in alcuni i campi dipendono dal codice operativo. . . Nella struttura reale: • dei bit possono precedere il codice operativo4 • il codice operativo non `e detto che sia la prima informazione che arriva al processore. Avendo 8 bit di codice operativo, si possono avere fino a 256 operazioni diverse. Per reperire gli operandi, servono 16 bit per ognuno, e quindi si necessita per ogni operando di due cicli di bus.
1
Rappresentazione simbolica delle istruzioni macchina: l’assembler
Il linguaggio assemblativo fa riferimento alla macchina stessa: l’assemblatore `e quella struttura che si preoccupa di convertire le istruzioni in linguaggio macchina. Per esempio: add R1 , A, B significa per il processore che deve fare la somma fra gli operando agli indirizzi di memoria A e B, e deve porre il risultato nel registro R1 . Il numero delle traduzioni che la macchina deve eseguire per poter avere istruzioni a linguaggio macchina incide notevolmente sull’efficienza della macchina stessa, n particolare, le traduzioni da linguaggio di alto livello a linguaggio assemblativo. 3
Di norma gli operandi son contenuti in memoria, per questo si passano gli indirizzi I campi non sono a lunghezza finita: i primi bit indicano appunto all’operatore la lunghezza dei campi. Il codice operativo usato `e quello della Intel 4
3.2 Classificazione dei linguaggi macchina
2
33
Classificazione dei linguaggi macchina
I linguaggi macchina vengono classificati in base a: 1. Il numero delle operazioni eseguibili 2. Le tecniche d’indirizzamento (cio`e le modalit`a di calcolo dell’indirizzo degli operandi in memoria) 3. La sede degli operandi all’interno della CPU (ovvero la presenza di stack, accumulatori e registri. Al crescere del numero di registri, migliora l’efficienza della macchina) 4. Il numero degli operandi che possono comparire in un’istruzione (da 05 a 3). 5. Gli operandi immediati: un operando immediato `e un operando che risiede direttamente nell’istruzione come, per esempio, una costante. Si ha quindi che il valore `e all’interno del codice, ma ci`o richiede un codice operativo diverso . . . 6. La lunghezza delle istruzione (fissa o variabile) 7. Il numero degli indirizzi indirizzabili.
3
Tipologia delle istruzioni
Esistono diversi tipi di istruzioni che possono essere eseguite: • Aritmetiche e logiche • Istruzioni di trasferimento dati: LD indica Load, ovvero quando si carica il dato dalla memoria al registro, ST sta per Store, quando si carica dal registro alla memoria. Il comando mov `e usato da Intel: mov
ax, B
(si pone il dato in una cella)
mov
C, ax
(da una cella si pone il dato in una variabile)
mov
al, B
(invece che 16, si spostano solo 16 bit)
. . . ce ne sarebbero molte altre . . . (A destra si ha il sorgente, a sinistra la destinazione: per quanto simili, a queste due istruzioni vengono generati due codici operativi diversi!!) 5
Un’istruzione a 0 indirizzi `e un’istruzione riferita ad uno stack (ovvero una push o una pop)
34
Il linguaggio macchina (Istruction Set Architecture - ISA) • Istruzioni di trasferimento di controllo (come la jump, la call, la ret, ...) • Istruzioni di sistema, per avere una diversa “situazione” (stato) del processore. • Istruzioni per operandi in virgola mobile, che richiedono l’uso di registri e ALU diversi da quelli usati di solito.
3.1
Tecniche di indirizzamento degli operandi in memoria
Gli operandi possono essere indirizzati in due diversi modi: 1. L’indirizzamento diretto o per nome o a load time. Si tratta di indirizzi definiti all’atto del caricamento in memoria. 2. L’indirizzamento indiretto p indiciato. In questo caso invece l’indirizzo deve essere calcolato all’interno dell’istruzione. Esempio: mov ax,alpha[SI]
In questo caso l’indirizzo dell’operando `e pari alla somma fra la costante alpha e SI, che `e un registro che contiene l’indice del vettoree. Si hanno quindi cos`ı degli indirizzi variabili dinamicamente, calcolati a run-time. Questo pu`o essere utile per esempio fare la somma di tutti gli elementi di un vettore. mov i,0 mov r5,0 CICLO
add r5,alfa(i) add i,1 if(i < 10) then go to CICLO mov S,r5
6 6
CICLO `e un label, serve per marcare l’istruzione a cui tornare per poter eseguire correttamente il ciclo.
3.3.2 Classificazione in base agli operandi
3.2
35
Classificazione in base agli operandi
In generale gli operandi di un’istruzione sono 2: un registro interno (la destinazione del risultato dell’operazione) e un indirizzo di memoria. Si possono distinguere 3 diverse ISA in base a come si memorizzano operandi: 1. Stack Architecture: dati e risultati vengono memorizzati nello stack 2. Accumulator Architecture: un operando `e l’accumulatore della CPU. 3. GPR Architecture: General Purpose Register, gli operandi sono presenti in registri interni o in memoria. Un’altra classificazione `e mediante il confronto fra il numero degli operandi e il numero degli indirizzi: Numero degli operandi Numero degli indirizzi
4
Definizione
3
0
R-R (Register-Register)
2
1
M-R (Memory-Register)
3
3
M-M (Memomry-Memory)
Alcune definizioni e istruzioni
Prima di tutto, il nome di alcuni importanti multipli del byte: • Una word `e un’informazione memorizzata in 2 byte • Una double word corrisponde quindi a 4 byte • Una q-word o quad-word corrisponde infine a 8 byte. Sia mov
ax, B e sia B una word. Allora quello che si “muove” `e il byte
all’indirizzo B e quello all’indirizzo B + 1! Qui di seguito sono riportate alcune istruzioni: Istruzione
Descrizione
<< n
Vengono inseriti n zeri a destra
>> n
Vengono inseriti n zeri a sinistra
xn...m
Vengono considerati solo i bit da m a n, m < n
n
(x)
L’informazione viene ripetuta n volte
M [x]
Contenuto di celle di memoria adiacenti a partire dall’indirizzo x
##
Concatenazione
←
Trasferimento di un dato, con dimensione pari alla destinazione
←n
Trasferimento di un dato a n bit
36
Il linguaggio macchina (Istruction Set Architecture - ISA)
L’ultima istruzione viene usata quando il numero di bit da trasferire non `e noto a meno di specifiche. Come vengono memorizzati i dati mulitbyte in memoria? Esistono due diversi modi per memorizzare i multibyte. . . prima di tutto, definiamo come byte w alfa il byte costituito dai valori 33 e 77: 33—77. L’estremit`a indicata dal 33 ` edetta Big End, mentre quella con 77 `e detta Little End. Si hanno quindi i seguenti due modi per leggere i byte multibyte: • Little Endian: si legge prima il byte meno importante (ovvero il 77 nel ` quello usato dalla Intel caso del byte w alfa). E ` il metodo usato • Big Endian: si legge prima il byte pi` u importante. E dalla Motorola.
4.1
Allineamento dei byte in memoria
Sia B un blocco di dati di m byte, con m = 2k e sia B memorizzato in memoria all’indirizzo A. Allora si dice che B `e allineato se A `e multiplo di m, cio`e: Indirizzo(B) mod m = 0
(Condizione di allineamento)
L’allineamento `e importante perch`e dipende da come `e stata costruita fisicamente la memoria. Si prenda in esame la figura: Quello che si ha per esempio
Figura 3.1: Memoria logica e memoria fisica in una disposizione del genere della memoria `e che: • Per leggere i dati abcd, serve un solo ciclo di bus • Per leggere invece (per esempio) bcde, servono due cicli di bus! L’allineamento `e una caratteristica molto utile: i dati allineati si leggono pi` u velocemente (alcune ISA lo richiedono, fra cui il DLX).
Capitolo 4 ISA DLX Caratteristiche generali dell’ambiente di esecuzione nelle architetture R-R a 32 bit DLX1 : • 4 GByte di memoria • 32 registri da 32 bit general purpose (R0 . . . R31 ), con R0 = 0. Il program counter `e un ulteriore registro. • 32 registri da 32 bit per il floating point • Le istruzioni sono allineate a indirizzi multipli di 4 (Essendo a 32 bit, cio`e 4 byte, la prossima istruzione si trova all’istruzione PC + 4) • Lo stack `e gestito dal software • Nelle istruzioni di tipo “JL” l’indirizzo di ritorno `e salvato in R31 • Non esistono flag, le condizioni sono espresse da istruzioni (set condition) • Registro flag per i floating point • Un solo metodo d’indirizzamento
1
Formati delle istruzioni nelle architetture R-R (DLX)
La lunghezza delle istruzioni `e 32 bit (232 = 4GByte), e sono suddivisibili in tre diverse tipologie: 1
Non si considerato i registri a virgola mobile
38
ISA DLX • Istruzioni di tipo R: Codice operativo RS1 RS2 Rdes Estensione al codice operativo | {z }|{z}|{z}|{z}| {z } 6bit
5bit 5bit
5bit
11bit
Corrispondono alle comuni istruzioni logiche del tipo:
Rdes ← RS1 operator RS2 • Istruzioni di tipo I : Codice operativo RS1 RS2 Operando immediato {z } | {z }|{z}|{z}| 6bit
5bit 5bit
16bit
Esempi sono le load, store, alu con operando immediato, JR, . . . • Istruzioni di tipo J : Codice operativo Offset di 26 bit {z } | {z }| 6bit
26bit
Si tratta di istruzioni per il trasferimento di controllo diretto e incondizionato, come J (Jump: Salto incondizionato) e JL (Jump and Link: chiamata a procedura, salva l’indirizzo di ritorno in R31 ) 2 .L’offset indica la “distanza” con cui si deve saltare. Esistono quindi diversi tipi di istruzioni3 : • Logiche: AND, ANDI4 , OR, ORI, XOR, XORI • Aritmetiche: ADD, ADDI, SUB, SUBI, MULT, DIV • Traslazione logica: SLL, SLLI, SRL, SRLI, SRA, SRAI • Istruzioni di set: Scn o ScnI con cn = EQ, NE, LT, GT, LE, GE • ... Nell’ISA DLX `e importante ricordare che le word sono di 32 bit. 2
Esiste anche il salto condizionato, ovvero il branch Sulle slide si trova l’elenco completo 4 Si tratta di operazioni con operando immediato 3
4.1.1 IA 16
1.1
39
IA 16
` un’altra ISA molto nota. . . Le caratteristiche salienti sono: E • Registri a 16 bit • Esistono 4 registri “segmento” (SS, CS, DS, ES) • Il registro Instruction Point `e circa come il Program Counter, ed `e legato al registro CS • Lo spazio d’indirizzamento `e di 1 MegaByte (I registri sono a 16 bit, non a 20. Servono quindi due indirizzi da 16 per ottenere un registro a 20 bit!)
2
ISA DLX: Implementazione mediante la struttura sequenziale
Un calcolatore (una CPU) `e costituito da un’unit` a di controllo 5 e da un data path 6 . Come si pu`o vedere nella figura sulle slide, le due strutture comunicano fra di loro. Entrambe ricevono il segnale di clock per lavorare, e inoltre all’U.d.C sono associati altri 3 segnali molto importanti: • Reset: `e un segnale presente in tutte le CPU, serve per far iniziare la macchina in uno stato noto, forzato • Ready: `e il segnale di “sono pronto”, usato per esempio assieme al segnale di interrupt per gestire l’attivit`a della CPU. • Interrupt: segnale usato per interrompere l’attivit`a della CPU a favore delle periferiche Ogni operazione appartenente all’instruction set `e eseguita mediante una successione di operazioni elementari, dette micro-operazioni. Una micro-operazione `e eseguita all’interno del data path in un ciclo di clock (esempi: trasferimento di un dato fra due registri, elaborazioni ALU, . . . ). Il controller `e una RSS (Rete Sequenziale Sincrona) che ad ogni ciclo invia un ben preciso insieme di segnali di controllo al data path al fine di specificare l’esecuzione di una Struttura che istruisce i registri e le trasformazioni. Per esempio genera gli OE ∗ e il clock enable per i registri, i bit di controllo dell’ALU. . . 6` E l’insieme dei registri pi` u i fili di interconnessione e le unit`a di trasformazione, come per esempio la CPU 5
40
ISA DLX
determinata micro-operazione. Nel primo esempio di struttura del DLX sequenziale, le caratteristiche principali sono: • Presenza di due bus per i dati di di ingresso, S1 e S2 (sono dei MUX, fatti con tri-state, e sono collegati con l’ALU). • I registri (esclusi quello che vanno da R0 a R31 ) sono ignoti al programmatore. • Il Register File `e un insieme ordinato di file, ovvero di registri noti al programma. I registri A e B sono due registri intermedi fra il register file e S1 e S2, mentre fra il bus di destinazione e il Register File esiste un altro registro di passaggio C. La presenza dei registri A, B e C `e dovuta a motivi elettronici e di efficienza. • Ad ogni ciclo di bus `e presente un’unica sorgente. • L’Instruction Register `e una struttura presente all’interno della Control ` collegato solo ai bus. Unit che contiene l’istruzione7 da eseguire. E • Il Program Counter `e sempre un registro a 32 bit, ma di cui sono significativi solo i primi 30 (gli ultimi due sono sempre a 0). Questo perch`e le istruzioni sono allineate a multipli di 4, e quindi PC = PC + 4. • MDR (Memory Data Register ) `e un registro di transito dei dati scambiati con la memoria (o IN o OUT), non di indirizzi. (Si tratta di una scelta architetturale) • MAR (Memory Address Register ) serve per indirizzare la memoria: si deposita l’indirizzo della memoria dove si vuole legggere/scrivere il dato. • TEMP `e un registro per il deposito temporaneo dei dati, contiene il risultato intermedio ottenuto da una ALU.Insieme al MAR `e l’unico registro temporaneo presente. • IAR `e l’Interrupt Address Register • IEN `e l’Interrupt Enable Flag • La lettura dell’istruzione `e l’unica istruzione che va in parallelo alla somma del PC + 4 nella ALU. Tutte le altre operazioni e microoperazioni sono sequenziali 7
Osservazione importante: nelle istruzioni sono presenti i dati, anche quelli immediati
4.2.1 Calcolo del periodo di clock
2.1
41
Calcolo del periodo di clock
Il periodo di clock si calcola sempre nel caso peggiore. . . Si definiscono le seguenti misure: 1. TC (max): `e il massimo ritardo fra il clock e i segnali di controllo dell’U.d.C. 2. TOE (max): `e il massimo ritardo tra il segnale di Output Enable dei 3-state e l’istante in cui i dati sono disponibili sul bus 3. TALU (max): `e il massimo ritardo dell’ALU 4. TSET −U P (min) `e il minimo ritardo per cui i dati sono disponibili sul registro. Si ha quindi che il periodo di clock deve essere: TCLOCK > TC (max) + TOE (max) + TALU (max) + TSET −U P (min) (4.1) Da ci`o quindi si deduce che `e meglio avere un numero di operazioni maggiore, ma il pi` u corto possibile (in questo modo si progetta con una migliore efficienza). Se il PC fosse un registro pi` u un contatore per determinare l’indirizzo dell’istruzione successiva, non si dovrebbe aspettare che l’ALU si liberi per calcolare.
3
Il diagramma degli stati del controller
Nello schema `e rappresentato la parte del diagramma a stati comune a tutte le operazioni: M AR ← P C
(Fetch)
↓ IR ← M [M AR] (Ripetuto fino a quando non `e ready) ↓ PC ← PC + 4 A ← RS1
(Decode)
B ← RS2 In seguito le istruzioni vanno all’ALU, al data transfer. . .
42
ISA DLX
Nel grafico manca che alla seconda istruzione `e collegato il segnare di Ready come loop. . . Infatti il segnale di Ready `e collefato in maniera combinatoria con l’Instruction Register, in modo da ritardarlo finch`e non si `e pronti per proseguire con le istruzioni successive. RS1 e RS2 sono due registri che appartengono al Register File, mentre tutte e tre le ultime istruzioni fanno parte della fase di Decode. Il primo e il secondo stato si potrebbero accorpare se si ponesse un MUX per scegliere fra MAR e DES come sorgente delle informazioni da scrivere in memoria. . . Non `e sempre meglio accorpare (Minore `e il numero degli stadi, maggiore `e la complessit`a circuitale: ci`o che non si pu`o fare nel tempo si fa nello spazio. . . ). In teoria si potrebbero unire la lettura della memoria con l’incremento del PC, ma non `e il compromesso migliore. Se il PC fosse anche un contatore, in teoria si potrebbe accorpare tutto in unico stadio. Consideriamo come esempio l’istruzione per caricare un solo byte (LB). . . Nell’IR l’istruzione si trova codificata in questo modo (supponendo LB
R5 , 10(R2 )):
. LB. RS1 ovvero R2 R5 10. 10 corrisponde all’offset, la parte che deve essere sommata alle altre informazioni per poter ottenere l’indirizzo, RS1 contiene l’indicazione del registro di partenza (che corrisponde anche al registro A!), mentre in RS2 `e contenuto il registro di destinazione. Tradotto secondo il diagramma degli stati del controller diventa M AR ← A + (IR15 )16 ##IR15...0
(Bit del segno ripetuto per 16 volte)
M DR ← M [M AR] (Ripetuto fino a quando non `e ready) C ← (M DR7 )24 ##M DR7...0 RD ← C ` un’operazione di tipo I come si pu`o vedere, e si deve anche notare che il E segnale di ready, nel caso della LB, `e presente due volte quindi. Resta da definire il problema del segno, che `e presente sia nell’indirizzo (per poter fare la somma a 32 bit) che nel dato. Per poter decidere se `e un valore
4.3.1 Altri esempi e osservazioni
43
valido o meno, il bit del segno deve passare attraverso un 3-state, comandato dal segnale ENable, che `e oppurtunatamente fornito dall’unit`a di controllo.8 .
3.1
Altri esempi e osservazioni
Il comando STORE funziona solo per dati di tipo Word. Se si vuole quindi trasferire informazioni di dimensioni pari a half-word o byte, bisogna prima completare l’intera parola. 1. In un registro di memorizza la word in AND con una word di tutti 1 tranne gli 8 bit meno significativi, che son quindi tutti a 0. Questo registro Rx risulta quindi avere un dato nei bit pi` u significativi e gli 8 bit meno significativi a 0. 2. In un altro registro Ry si memorizza la word in AND opposta, ovvero dove gli 8 bit meno significativi son tutti 1 e gli altri son a 0. 3. Infine, facendo l’OR fra i due registri, si ottiene un registro con l’ultimo byte che corrisponde al byte che si voleva trasferire. Un ulteriore osservazione: in LB, LH, LBU, LHU, RS2 non serve, non si mette in quel registro il dato. Si ha che RD = RS2 solo se questo `e un operando immediato. Se in TEMP si deposita o il valore del registro B o l’offset nel caso di operazioni immediate con segno esteso, gli operandi dell’ALU diventano solo il registro A e il registro TEMP (per esempio, nel caso di somme, sottrazioni. . . fra registri) Come possiamo definire le operazioni di salto? • Nel caso di salto condizionato, con 1 si salta, 0 no. Il bit meno significativo pu`o quindi essere utilizzato a questo scopo, e viene determinato dalla condizione • Nel caso di salto non condizionato, ci son due casistiche: o `e senza ritorno o `e con ritorno (e quindi bisogna salvare l’indirizzo di ritorno nel registro R31 !) (detto anche salto ad una subroutine). Questo `e l’unico modo in cui si pu`o fare, perche`e non `e presente alcuna struttura che possa fare da stack. Nel caso del JAL quindi (Jump And Link) si ha che P C ← P C + (IR25 )26 ##IR25...0 8
Osservazione: per ogni registro son presenti 64 3-state, dal quale segue che son 32 per ogni BUS
44
ISA DLX In questo caso, l’offset `e pari a 26 bit, ma se si vuole saltare (per esempio) solo di 10 “unit`a”, basta che l’offset sia pari a 6. Infatti, al PC `e gi`a stato aggiunto 4 come valore, fatto direttamente dal compilatore! Nel caso del BRANCH, invece, si ha un offset pari a 16 bit.
4
I passi dell’esecuzione delle istruzioni
L’esecuzione delle istruzioni pu`o essere scomposta in 5 passi: 1. FETCH: Si legge l’istruzione, e viene posta nell’IR 2. DECODE: L’istruzione viene decodificata e vengono prelevati gli operandi sorgente dal register file 3. EXECUTE: Elaborazione aritmetica o logica mediante l’ALU 4. MEMORY: Accesso alla memoria e, nel caso di BRANCH, aggiornamento del PC (operazione che `e detta “Branch completition”) 5. WRITE-BACK: Scrittura dei risultati nel register file. Se si esegue un’analisi delle istruzioni pi` u accurata, si pu`o definire un’architettura nuova, pipelined, che risulta anche essere pi` u efficiente: • FETCH M AR ← P C IR ← M [M AR] • DECODE A ← RS1 B ← RS2 PC ← PC + 4 • EXECUTE – Memoria: M AR ← A + IR0...15 ##(IR15 )16 M DR ← B 9 9
RD corrisponde a RS2 solo nelle store!
4.4 I passi dell’esecuzione delle istruzioni – ALU: C ← A op B (oppure IR0...15 ##(IR15 )16 ) – Branch: T EM P ← P C + IR0...15 ##(IR15 )16 CON D ← A op 0 • MEMORY – Memoria: M DR ← M [M AR] (LOAD) M [M AR] ← M DR (STORE) – Branch: IF (cond) ⇒
P C ← T EM P
• WRITE-BACK C ← M DR (Se `e una load) RD ← C
45
Capitolo 5 ISA Pipelined Mediante il principio del pipelining si pu`o rendere pi` u veloce la CPU. Supponiamo di avere un sistema S che deve eseguire N volte un’attivit`a A (`e come una catena di montaggio). Definiamo quindi le seguenti propriet`a: • Si dice latency il tempo che intercorre fra l’inizio e il completamento dell’attivit`a A (indicato da TA ) • Si dice throughput la frequenza con cui vengono completate le attivit`a Cosa vuol dire che il sistema non `e pi` u sequenziale? Significa che si vuole iniziare un’istruzione ad ogni ciclo di clock, nonostante la precedente non sia ancora finita. Supponiamo che l’attivit`a A sa costituita da 4 sottoattivit`a pi , da eseguire in sequenza, di durata uguale. • Nel caso sequenziale, non potendo suddividere l’attivit`a A, si ha che TA il tempo di ogni attivit`a TP i = corrisponde anche al tempo di un 4 1 pipeline cycle, TP . Lo throughput `e quindi pari a TA • Ma se questo sistema si rapresentasse mediante un sistema pipeline, si 1 4 avrebbe s`ı che TA = 4 · TP , ma il throughput sarebbe pari a = , TP TA 4 volte superiore!! Ecco quindi il grande vantaggio di una pipeline: lo throughput `e molto maggiore a quello corrispondente a un sistema sequenziale.
1
CPU DLX Pipelined
I 5 stadi definiti nel capitolo precedente (InstructionFetch, InstructionDecode, Execute, MEMory, WriteBack) corrispondono a dei circuiti combinatori,
48
ISA Pipelined
separati da registri flip-flop di tipo D. Ad ogni ciclo di clock, i dati campionati nei registri vengono campionati per i blocchi combinatori a valle, in modo da produrre i valori binari corretti che saranno campionati dai registri D a valle di ogni circuito combinatorio solo quando si ha un fronte di salita del clock (da 0 a 1). Esempio: Al fronte di salita CLK1, i registri presenti fra IF e ID (detti IF/ID) campionano i dati ricevuti da IF. Nell’intervallo che separa il CLK1 dal CLK2, i dati memorizzati nei registri vengono utilizzati dal blocco combinatorio ID. Al fronte di salita CLK2, i registri ID/EX campionano i dati ricevuti da ID, e contemporaneamente IF/ID campiona i nuovi dati ricevuti da IF! Si tratta di uno “shift-register con trasformazione”, i dati continua ad es` sere memorizzato e passato all’unit`a successiva (idealmente sulla destra). E un’architettura totalmente diversa, in cui ogni stadio opera in maniera indipendente. Idealmente si potrebbe arrivare ad avere un CPI pari ad 1.1 . Si ha quindi che Tclock = Td + Tp + Tsu
(5.1)
Ovvero il clock cycle dipende dal ritardo del registro a monte (Td ), dal ritardo sullo stadio pi` u lento (Tp ) e dal tempo di set-up del registro a valle. Da osservare che il dato viene campionato nel registro di destinazione alla fine dello stadio di WB, ma ci`o potrebbe causare problemi, visto che sia lo stato di WB e MEM interagiscono entrambi con il registro MDR e son consecutivi. Per evitare questi problemi, in realt`a si usano due differenti MDR (MDR e SMDR), in questo modo si pu`o gestire una load subito seguita subito da una store. Si ha quindi che gli stadi di WB e MEM possono essere benissimo sovrapposti! Si possono sovrapporre due dati in attesa di essere scritti, uno in memoria e uno sul register file. 1
In realt` a, in caso di reti combinatorie velocissime, si devono inserire dei ritardi, aumentando quindi il tempo di hold dei flip-flop dei registri
5.1.1 L’architettura Harvard
49
Quando va incrementato il PC? Al termine di ogni stadio di Fetch, `e separato dall’ALU dello stato di EX!
1.1
L’architettura Harvard
In ogni ciclo di clock deve essere possibile eseguire due accessi alla memoria (negli stadi di IF e MEM), uno per accedere all’Instruction Memory, e l’altro al Data Memory. La soluzione a questo problema `e data dall’utilizzo dell’architettura Harvard : si utilizzano due memorie separate, per istruzioni e dati, con indirizzamento e bus diversi.2
1.2
Altre osservazioni
Il controller nel DLX pipelined `e “distribuito” fra gli stadi della pipeline. Cosa succede se per esempio si deve fare un salto? Il PC `e un dato che deve essere portato da IF a EX! In EX son presenti due MUX a 32 bit per scegliere i dati da essere elaborati dall’ALU. In un MUX si pu`o scegliere fra PC e dato del registro A e nell’altro fra il dato del registro B e un dato immediato con segno espanso. In questo modo le possibilit`a possibili sono: • Calcolo del nuovo PC in caso di salto, usando l’offset necessario • Si pu`o eseguire il salto ad un registro specifico • Eseguire un’operazione fra il dato contenuto nel registro A e un dato immediato • Eseguire un’operazione fra i dati contenuti nei due registri A e B Ma chi specifica all’ALU qual`e l’operazione da eseguire, e seleziona i dati corretti sui due MUX? L’istruzione che viene portata avanti da uno stato all’altro, ovvero quella contenuta nei registri ID/EX. Nello stato di (data)MEM si portano invece gli indirizzi calcolati (per leggere i dati) e se necessario, il dato da scrivere. All’uscita si ha il dato letto. Solo quando si raggiunge lo stadio di Write-Back si pu`o usare il register file (altrimenti si potrebbe avere delle situazioni di conflitto). Solo nello stadio di WB si pu`o scrivere. 2
Nei Pentium ci` o avviene nel processore con la presenza di 2 memorie cache
50
ISA Pipelined
Nel caso ci sia un JALR, nel branch target register va inserito il contenuto del registro di ritorno.
2
Alee nelle pipeline
Si verifica una situazione di alea o “hazard” (malfunzionamenti intrinsechi) quando, in un ciclo di clock, un’istruzione presente in uno stadio della pipeline, non pu`o essere eseguita in quel clock. Le alee si suddividono in: • Alee strutturali : una risorsa `e condivisa fra due stadi della pipeline. Le istruzioni correntemente presenti in quegli stadi non possono essere eseguite simultaneamente. • Alee di dato: Sono dovute a dipendenze fra le istruzioni (esempio: un’istruzione legge un registro scritto dall’istruzione precedente. Se il dato non `e gi`a stato scritto, si ha una situazioen d’errore, detta Read after Write) • Alee di controllo: Le istruzioni che seguono un branch dipendono dal risultato appunto del branch (taken/not taken) Si dice stallo della pipeline quando un’istruzione viene bloccata perch`e non pu`o essere eseguita. Come si pu`o fare per evitare le alee di dato (un possibile stallo quindi)? Si utilizza una tecnica detta forwarding. Per poter far ci`o, invece che utilizzare un normale ciclo di clock, si utilizza uno split-cycle: al fronte positivo del clock si scrive sul registro, al fronte negativo si legge dal registro.3 . Tuttavia, non tutte le alee di dato sono eliminabili con il forwarding (anche un’operazione di LOAD pu`o dare atto ad un’alea di dato), deve essere stallata la pipeline, per un clock. Si parla di delayed load quando l’alea `e gestita dal compilatore via software. Quello che il compilatore fa `e cercare di riempire tutti i delay-slot con un’istruzione “utile”, e nel caso peggiore inserisce una NOP, No OPeration. Ecco 3
Suddividere il lavoro nei due fronti del clock non `e detto che sia sempre conveniente. In un semiperiodo di clock si devono fare le stesse operazioni che prima si facevano in un periodo intero
5.2.1 Alee di controllo
51
un’esempio: LW R1 , 32(R6 ) LW R3 , 10(R1 ) ADD R5 , R1 , R3 LW R6 , 20(R7 ) LW R8 , 40(R9 )
Per evitare lo stallo, viene modificato l’ordine di queste istruzioni, anticipando la penultima LW prima della ADD. In questo modo, non vi `e stallo nella pipeline. In ogni caso, una NOP deve avere un suo corrispettivo hardware. . . un esempio possibile `e ADD R3 , R0 , R3
2.1
Alee di controllo
Qual’`e il problema? Non si vuole che le istruzioni saltate per via di un branch non vengano eseguite. Ci`o si potrebbe ottenere in due diversi modi: 1. Si stalla la pipeline per 3 clock, in questo modo non si scrive sul register file o in memoria, e non si `e caricato il nuovo PC 2. Altrimenti, si eseguono le istruzioni fino a quando non si ha il risultato del branch: • Taken: le operazioni diventano NOP • Not Taken: si prosegue (al momento del check, le istruzioni non erano ancora giunte allo stadio di MEM o WB!) In questo caso si fanno s`ı 3 stalli, ma se e solo se il branch `e taken Similmente alla LOAD, anche il branch pu`o essere gestito via software dal compilatore (si parla di delayed branch). Quello che si fa `e anticipare le istruzioni che verrebbero eseguite sia che il branch sia taken che non (si hanno 3 delay-slot da riempire sicuramente)
52
ISA Pipelined
Come si potrebbe ridurre il numero degli stalli? Si rende l’ALU indipendente dal branch (ma ci`o richiede un full-adder inevitabilmente pi` u complesso). Infatti, nello stato di ID son presenti tutte le informazioni necessarie per comprendere se si deve saltare o meno con la nuova ALU. In questo modo si ha s`ı uno solo clock di stallo, ma a scapito di una rete logica pi` u complessa (ci`o che non si pu`o fare nel tempo si fa nello spazio).4
2.2
Branch Target Buffer
Si utilizza il concetto di memoria “associativa”. Si utilizza una struttura ad array, in cui vengono memorizzati in memoria gli indirizzi dei branch e ad esse son associati l’indirizzo a cui si vorrebbe saltare (il predicted PC) e un bit che indica se il branch `e taken o not taken. Il PC viene quindi utilizzato per vedere se all’indirizzo correntemente usato `e associato un branch in questo buffer. Si hanno due possibili casi: • Hit: Si esegue il fetch all’indirizzo predetto • Missi: Si esegue il fetch a PC + 4. Se quindi si riconosce l’indirizzo di un branch, si esegue il salto, visto che si ha gi`a a disposizione l’indirizzo di destinazione. Esistono comunque il problema di capire se `e una predizione corretta o meno (son importantissime per i bechmark). Infatti, mentre nel caso di una predizione corretta, non si hanno cicli di stallo, nel caso di predizione errata, si hanno comunque 3 cicli di stallo! Quanti bit devono essere usati per rappresentare l’informazione taken/untaken? Normalmente due bit, tenere memorizzata solo l’ultima informazione in un unico bit pu`o causare errori!
4
Si potrebbe anche usare l’adder del PC con una serie di MUX per scegliere se sommare 4 o l’offset e se usare PC o PC1
Capitolo 6 Decodifica indirizzi e mapping In una qualunque architettura che venga realizzata, si ha necessariamente bisogno di uno strumento: • per poter relazionare gli indirizzi della memoria logica a quella fisica (l’indirizzo a quale banco di RAM appartiene?) • per poter indicare al processore come raggiungere una determinata periferica Il chip select `e appunto quello strumento fisico che serve per capire quale componente fisico si sta indirizzando. Si tratta quindi di realizzare una decodifica 1 di determinati segnali per poter individuare, in maniera univoca, cosa si sta indirizzando. L’indirizzo emesso dal processore deve contenere due informazioni: • Una parte individua il dispositivo fisico, in maniera univoca • Un’altra parte individua cosa si vuole indirizzare del dispositivo (nel caso di memorie: l’indirizzo indica sia il banco di memoria che la cella) Per poter realizzare tutto ci`o, si utilizzano delle PAL, Programmable Array Logic. ` importante notare che lo spazio di indirizzamento delle memorie deve esseE re diverso dallo spazio di indirizzamento dei dispositivi di I/O2 . In generale, lo spazio d’indirizzamento per i dispositivi di I/O `e pari a 64 Kbyte, e quindi 1
Una decodifica `e una funzione combinatoria: da n segnali di input, si ottengono m segnali di output = 2n 2 Il DLX in realt` a usa il sistema memory mapped
54
Decodifica indirizzi e mapping
` quindi necessario un bit che indichi son necessari 16 bit per indirizzamento. E se `e un indirizzo di memoria (1) o di I/O (0). D’ora in poi si faranno alcune supposizioni: • Tutti i dispositivi son allocati in maniera allineata • Si usano dispositivi ad 8 bit e bus ad 8 bit Nel caso di dispositivi tutti allineati, la decodifica risulta essere alquanto semplice: `e sempre un prodotto logico (altrimenti, diventa la somma di prodotti logici . . . ) Esempio: supponiamo di voler avere una memoria logica da 32 Kbyte (215 ), utilizzando come componenti fisici dispositivi da 8 Kbyte (213 ). Da ci`o risulta che l’indirizzo di memoria logica risulta essere lungo 15 bit, ma i 13 bit meno significativi indicano la cella della memoria a cui si vuole accedere. 15-13 = 2 bit sono utilizzati per indicizzare il crretto dispositivo: infatti, per avere 32 Kbyte di memoria servono 4 dispositivi da 8 kbyte, e quindi tutte le configurazioni dei due bit pi` u significativi sono usate per indicare il dispositivo corretto3 : • CS1 = AD14 · AD13 • CS2 = AD14 · AD13 • CS3 = AD14 · AD13 • CS4 = AD14 · AD13 Si pu`o anche analizzare il problema inverso. Supponiamo di avere un’EPROM da 2 MByte, son sufficienti 21 bit (221 = 21 MByte). Nel caso dell’8088, quante memorie da 2 MByte ci stanno? Essendo 32 i bit d’indirizzamento dell’8088, si hanno a disposizione 32 − 21 = 11 bit per poter indirizzare i singoli dispositivi. Si possono quindi avere fino a 211 diversi dispositivi. Si possono verificare casi in cui si deve determinare i chip select di dispositivi di dimensione diversa, ma comunque allineati. Supponiamo per esempio di aver gi`a inserito 3 memorie da 2 MByte, come si pu`o configurare il CS della quarta memoria da 1 MByte? Essendo da 1 MByte, richiede solo 20 bit, e quindi servono 12 bit di indirizzamento. . . il CS risulta quindi essere 3
Da ricordare che i Chip Select sono in forma negata
6.1 Decodifica parziale
55
AD31 · AD30 . . . AD22 · AD21 · AD20 Nel caso di dispositivi non allineati, la codifica `e pi` u complessa. Si immagini per esempio di voler codificare una memoria fisica da 8 Kbyte in una memoria logica da 32 Kbyte, ma non allineata (occupando quindi met`a di un’allocazione e met`a di un’altra): il CS deve appunto indicare che occupa due diverse zone, utilizzando oltre a due prodotti logici, una somma logica! CS = AD14 · AD13 · AD12 + AD14 · AD13 · AD12 In questo modo infatti si indicano proprio le due met`a coinvolte nella decodifica!
1
Decodifica parziale
In generale, la disposizione della RAM e della EPROM fisicamente `e tale da poter permettere quella che `e detta decodifica parziale. Si immagini che 2 Kbyte di RAM siano allocati nella parte bassa della memoria logica, mentre 4 Kbyte di EPROM siano allocati nella parte alta della memoria logica (“l’altra estremit`a”)4 , in uno spazio totale di 32 Kbyte. La decodifica quindi risulterebbe essere: CSEPROM = AD14 · AD13 · AD12
(bastano 12 bit)
CSRAM = AD14 · AD13 · AD12 · AD11
(Bastano 11 bit)
Ma in questo caso si potrebbe pensare di ridurre la complessit`a della decodifica, proprio perch`e le due memorie appartengono a met`a diverse della memoria logica (alta/bassa). Per esempio, si potrebbe utilizzare proprio AD14 per distinguere fra le due memorie. L’idea `e proprio quella di utilizzare il minor numero possibile di bit per non creare ambiguit`a con altre memorie. Da notare che la visibilit`a di un dispositivo aumenta di 2m , con m il numero di bit ora ininfluenti per la decodifica. All’aumento dei dispositivi, infatti, si cerca di trovare un bit tale da discriminare le memorie di nuovo (una sorta di metodo dicotomico!) 4
In generale, la RAM `e appunto allocata in basso, e la EPROM in alto
Capitolo 7 L’8088 L’8088 `e il processore capostipite della famiglia Intel: certe caratteristiche tecnologiche si possono ancora notare nei processori moderni, tanto che lo studio di questo processore aiuter`a molto a studiare processori come l’8086, il Pentium I, e cos`ı via. . .
1
Una prima descrizione del processore: i segnali
Qual’`e l’attivit`a che un processore deve svolgere? Un processore non deve fare nient’altro che trasferire dati dal “mondo interno” al “mondo esterno”. Questa `e l’unica vera attivit`a, ma allo stesso tempo pu`o essere alquanto complicata (cosa `e il mondo esterno? E se giungono pi` u segnali dal mondo esterno?). A questo proposito due segnali importanti da notare subito sono1 : • INT: Questo `e un segnale che proviene dall’esterno, e indica la presenza di un’interruzione, una forzatura che viene inviata al processore. Quando il processore riceve questo genere di segnale, deve interrompere le attivit`a normali che stava eseguendo per poter far partire la sub-routine associata a quella determinata interruzione. • HOLD: questo `e un segnale che permette la disposizione sul BUS di pi` u dispositivi master, e indica appunto al processore se `e presente o meno un dispositivo che sta facendo richiesta di divenire master L’8088 ha un impaccamento a 40 piedini: la mancanza di spazio ha costretto i progettisti a dover mettere i risultati delle elaborazioni del processore 1
Da notare: la disposizione fisica dei segnali `e diversa da quella logica a volte presentata
58
L’8088
sullo stesso bus dei dati (per questo i segnali si muovono da e verso il processore. . . Inoltre, si dice che il bus dell’8088 `e demultiplexato). Si ha quindi tendenzialmente un ritardo, e serve un apposito tempo per poter “catturare gli indirizzi”, che altrimenti verrebbero cancellati! I due bus son cos`ı caratterizzati: • Bus dati: `e a 8 bit (AD0...7 ), quindi il massimo dato possibile da trasferire in un ciclo di bus `e un byte. (ma ha comunque a disposizione registri a 16 bit, che si possono trasferire direttamente.) • Bus indirizzi: `e a 20 bit (A8...19 ), quindi si ha che lo spazio d’indirizzamento dell’8088 `e pari a 1 Mega (220 ) Il processore ha in realt`a due modi di funzionamento, minimum e maximum mode, determinato dal bit MIN/MAX*2 Analizziamo quindi alcuni dei segnali presenti nell’8088: • Son presenti due masse (GND). Questo `e dovuto al fatto che il rumore delle masse `e molto pi` u pericoloso del rumore sull’alimentazione (Vcc ).3 • ALE: Questo segnale sta per Address Latch Enable, ed `e un particolare clock con cui il processore indica che sta generando gli indirizzi, e che son disponibili quindi sull’apposito bus. • RD*: questo `e un segnale con cui il processore indica che sta leggendo i dati. Esiste ovviamente anche il segnale WR* per indicare che sta scrivendo. • DT/R*: questo segnale indica – se `e 1: si sta trasferendo dal processore al mondo esterno – se `e 0: si sta trasferendo dal mondo esterno al processore • Il segnale di READY – deve essere a 1 perch`e il processore possa essere correntemente eseguito il ciclo di bus – invece se `e a 0, il processore si ferma. • I segnali NMI, INT, INTA* verranno analizzati nel capitolo delle interruzioni, sono i segnali preposti appunto per la gestione delle interruzioni. 2
Si suppone che l’8088 lavorer` a sempre in minimum mode. In questo caso quindi, nel caso di segnali che possono avere comportamenti diversi a seconda del modo, indicati con una struttura come A/B, il segnale generato `e sempre quello a sinistra (A in questo caso) 3 L’8088 lavorava a 5 volt, ma oggi si usano potenziali inferiori
7.2 Registri Interni
2
59
Registri Interni
L’8088 `e un processore segmentato. Questo significa che il processore, per la costruzione dell’indirizzo, per quanto riguarda gli accessi alla memoria, fa riferimento a 4 registri di segmento, ognuno a 16 bit: • Code Segment • Data Segment • Stack Segment
4
• Extra Segment Oltre ai registri di segmento, ci sono anche degli altri registri detti accumulatori: si tratta di 8 registri a 8 bit, ma sono anche indirizzabili a due a due, come se fossero 4 registri a 16 bit. Il segmento `e un “concetto filosofico” (quando si pensa al programma, lo si `e gi`a suddiviso in subroutines, librerie, ecc. . . ). I segmenti sono degli insiemi di dati che possono essere globalmente protetti da un sistema di protezione. I segmenti son un insieme di informazioni coerenti fra di loro Altri registri che son presenti son i registri indice (SI, DI), che vengono autonomamente incrementati (servono per esempio per poter scorrere un vettore), e registri di flag che son pure indirizzabili (son dei flip-flop, settabili individualmente, ma raggruppati in registri)5 . Esistono quindi dei puntatori, lo Stack Pointer e l’Instruction Pointer (questo `e esattamente equivalente al PC). Si ha quindi che l’indirizzo corrente `e dato dall’IP e dal CS. Esiste anche un altro puntatore, il Base Pointer, che `e un altro registro con cui si potrebbe calcolare in maniera alternativa il registro. Si pu`o quindi ottenere lo stesso indirizzo fisico come somma fra due diverse coppie di addendi, i segmenti si possono sovraporre. L’indirizzo `e quindi dato dalla somma fra la base del segmento e l’offset del segmento. 4
Essendo lo stack sempre a 16 bit, son necessari due cicli di bus nell’8088 per aggiungere un dato. 5 Esempio: Il registro IF abilita o meno il processore per le interruzioni (cio`e, il processore potrebbe anche essere insensibile alle interruzioni). Questi set/reset son possibili sia via software, sia grazie all’esecuzione di particolari istruzioni
60
L’8088
Osservazione: I segmenti son allineati a 16 bit, ma gli indirizzi son a 20 bit. . . si ha quindi che nella generazione dell’indirizzo, i 4 bit meno significativi sono a zero. L’indirizzo `e quindi la somma modulo 64 Kbyte6 dei registri di segmento. Di seguito un esempio di codice assembler contenenti alcuni esempi di indirizzamento: mov Ax , 32 mov Ax , [Bx ]32 mov Ax , [Bx ][Di ]32 Da osservare che il segmento `e sempre implicito nella somma e che gli indirizzi sono relativi alla base del segmento. Non esistono indirizzi assoluti (si dice rilocazione dinamica): si possono spostare le posizioni cambiando solo i valori degli indici. Infatti, i programmi che utilizzano quelle determinate sezioni utilizzano gli indici per accedere ai dati! In questo modo si pu`o avere un compattamento della memoria. In realt`a, la rilocazione dinamica `e un’operazione lunga e costosa, e non viene eseguita mai. La protezione in realt`a nell’8088 non esiste, ma si tratta di un sistema che garantisce che un “errore” non vada a modificare del codice in maniera errata.
2.1
Modalit` a d’indirizzamento
Esistono 5 diversi modi per indirizzare7 , a seconda dei registri coinvolti: • Diretto: segmento + offset • Basato: segmento + (base + offset) • Indicizzato: segmento + (indice + offset) • Indicizzato basato: segmento + (indice + base + offset) • Indiretto: segmento + (indice + base) 6
Da ricordarsi che il riporto viene tagliato via e aggiunto il segmento, non si pu`o mai andare oltre ai 64 Kbyte; i valori oltre a 16 bit vengono troncati. Se si sbaglia nella generazione dell’indirizzo, il processore si blocca 7 Non tutte le istruzioni si possono indirizzare in tutti i modi, e l’unico modo per sapere come indirizzare `e consultare il manuale dell’8088.
7.3 Altre caratteristiche dell’8088
61
L’ultimo metodo richiede un doppio accesso alla memoria (infatti, viene calcolato questo indirizzo, a cui si riperisce non un dato, ma un ulteriore indirizzo di memoria che contiene il dato/l’istruzione necessaria). Da ricordarsi che il segmento va sempre traslato di 4 posizioni, e che devono essere eseguite prima le operazioni presenti nella parentesi.
3
Altre caratteristiche dell’8088
Come gi`a detto, il bus dei dati dell’8088 `e a 8 bit, ma i registri son a 16 bit8 . Questo quindi indica che son necessari due cicli di bus per poter riempire un registro, che vengono eseguiti autonomamente. I registri in realt`a non son tutti noti al programmatore, anzi! Nei processori moderni si ha avuto un aumento proprio dei registri non noti al programmatore, mentre quelli noti son rimasti circa uguali.9 La struttura dell’8088 non `e pipelined, ma `e possibile suddividere la rete logica in 2 grandi parti (ognuna di queste sezioni ha un suo controllo. . . ): • l’Execution Unit • La Bus Interface Unit Queste strutture cercano di lavorare il pi` u possibile in parallelo. Per esempio, l’offset viene calcolato nella ALU della EU, e quindi `e riportato alla BIU. L’8088 `e poi dotato di una Instruction Queue: questa contiene i primi 4 byte successivi all’istruzione corrente. Il sistema cerca quindi di approvviggionarsi in anticipo! Se la EU non sta facendo operazioni di memoria, la BIU `e libera di prendere dalla memoria questi byte successivi (per questo si dice che cercano di lavorare in parallelo). In tutti gli altri casi, la EU ha la priorit`a per accedere alla memoria. In questo modo comunque si sfrutta al meglio il BUS (funziona un po’ come le memorie cache, che si vedranno nel corso di Calcolatori Elettronici LS). 8
L’MDR `e un registro a 8 bit Esempio di registri noti: gli accumulatori, lo Stack Pointer, il Base Pointer, DI, SI,. . . I registri non noti son quelli temporanei (come erano TEMP, A e B) 9
62
4
L’8088
Caratteristiche del BUS
Il BUS `e multiplexato nel tempo: 1. Prima si l’indirizzo della cella a cui si vuole accedere (di memoria, o indirizzo del registro) 2. Poi si esegue il vero e proprio trasferimento 2 Il clock del BUS dell’8088 `e un po’ anomalo: `e a livello basso per , mentre 3 1 `e a livello alto per Il minimo clock di BUS `e pari a 4 clock di CPU (detti 3 T1...4 ). Da notare che solo in T1 viene attivato il segnale di ALE, che `e il segnale necessario per campionare l’indirizzo emesso dal processore proprio nel periodo T1 ! Il ciclo quindi inizia inserendo sia l’indirizzo che la tipologia dell’indirizzo (memoria o I/O) che il tipo di trasferimento (lettura o scrittura). I bit degli indirizzi son cos`ı suddivisi: • AD0 − AD7 : sono transienti, e quindi devono essere campionati • A8 − A15 : rimangono, e quindi NON devono essere campionati • A10 − A19 : In realt`a, anche questi devono essere campionati. . . La fase d’indirizzamento termina in T2 . Quando viene abbassato il segnale di ALE, il processore non pilota pi` u il bus, e si prepara a ricevere i dati (in scrittura si ha invece che il processore pilota in entrambi i casi). Nel caso di lettura dalla memoria, il segnale READ si collega all’OE* delle memorie coinvolte nel trasferimento, e quindi si ha che le memorie pilotano il bus! Come si pu`o de-multiplexare il BUS? Si utilizzano dei 373 (LATCH CD) per campionare gli indirizzi. Vengono utilizzati i 373 perch`e riproducono subito l’ingresso in uscita, e sono quindi pi` u veloci dei 374. Inoltre, i 473 sono degli amplificatori di FAN-OUT, e ci`o aumenta la capacit`a di pilotaggio. I 373 si usano appunto per avere la sicurezza di aver caricato gli indirizzi campionati, e per questo motivo che gli indirizzi vengono trasmessi attraverso AD[0 : 7] e A[8 : 15]. Per evitare dei conflitti sul BUS, `e quindi necessario mettere un 245 (son 8 transceiver bidirezionali) tra il processore e il BUS. Il segnale DEN* viene
7.5 Generazione dei segnali per pilotare il bus, i comandi
63
attivato solo quando il processore ha chiuso i suoi 3-state, e serve appunto per evitare i conflitti elettrici (va collegato all’EN* del 245). Si ha quindi che non si pu`o leggere o scrivere finch`e non si son campionati gli indirizzi sul 373.
5
Generazione dei segnali per pilotare il bus, i comandi
Di seguito son riportati i comandi necessari per pilotare il bus, e le le loro decodifiche: M W RC ∗ = IO/M ∗ + W R∗
) segnali di scrittura/lettura in memoria
M RDC ∗ = IO/M ∗ + RD∗ IOW RC ∗ = IO/M ∗ + W R∗ IORDC ∗ = IO/M ∗ + RD∗
) segnali di scrittura/lettura in I/O
C’`e per`o da considerare un fatto: all’aumentare della logica dei segnali (creando reti logiche sempre pi` u complesse) si introduce un maggior ritardo, e si ha quindi un potenziale aumento del numero degli stati di WAIT.10 La soluzione addottata dall’architettura dell’8088 `e stata quella di utilizzare 2 245 e una rete logica adeguata, in modo da ottenere due BUS distinti: uno per la memoria e uno per i dati! I 245 vengono attivati a seconda delle combinazioni dei segnali di DEN* (come si era gi`a visto) e di IO/M*, che quindi sceglie se il trasferimento `e in memoria o in I/O. L’OR di questi due segnali (nel caso del bus dei dati, con IO/M ∗) diventa l’EN* dei 245! Si `e cos`ı giunti al tezo clock di BUS, T3 . In questo clock, in caso di lettura i dati vengono campionati sul fronte di discesa del clock. Questo `e anche l’unico clock del BUS in cui il processore va a controllare se `e stato inviato il segnale di READY, che `e campionato sul fronte di salita del clock! Fino a quando il segnale di READY `e basso, non vengono campionati i dati, e si continua a ripetere il clock T3 . Gli stati ripetuti si dicono periodi di wait, TW , mentre i periodi vuoti dopo il periodo di clock T4 (ovvero finch`e non arriva un nuovo T1 ) son detti periodi 10
N.B.: gli stati di WAIT sono multipli del periodo di clock. . .
64
L’8088
di idle. Problema: chi genera per l’8088 questi segnali di clock, RESET e READY? Servono dei circuiti d’appoggio (normalmente progettati dalla stessa casa del processore. . . ) per generare questi segnali. Per esempio, l’8284 `e un cirucito d’appoggio, da anteporre all’8088, in grado di generare proprio i segnali di CLOCK, RESET e READY11
5.1
Generazione del clock e del reset
Si vede sulle slide proprio l’8284 come circuito per generare sia il clock che il reset. Nel caso venga inviato il segnale di reset, vengono eseguiti i seguenti questi passaggi: 1. La prima istruzione viene letta all’indirizzo F F F F , dove F F F F `e memorizzato nel code segment, mentre nell’instruction pointer 2. Si pone l’Interrupt Enable a 0 3. Il valore degli altri registri `e casuale. Se non si considera il diodo presente nell’8284, la rete per generare il segnale di reset `e solo un circuito RC (dotato di resistenza e condensatore, con un intereruttore: chiudendo l’interrutore, si fa scaricare il condensatore). Il compito del segnale di reset `e quello di lasciar operare il processore solo quando tutti i circuiti del calcolatore hanno raggiunto una tensione di alimentazione stabile (quindi, allo start-up il reset vale 1, e 0 quando si `e giunti alla stabilit`a). A cosa serve il diodo? Con il diodo il condensatore si scarica molto pi` u velocemente, e quindi viene attivato subito il segnale di reset! Un’altra questione interessante `e come sono alimentati questi circuiti d’appoggio: se fossero alimentati con la stessa alimentazione degli altri circuiti, subirebbero gli stessi transitori. In realt`a son alimentati anche da apposite batterie che li tengonosempre alimentati (un tempo erano in tampone, ora 11
Il processore richiede un set-up molto alto per il segnale di READY, e il comportamento del processore diventa ignoto se questo tempo di set-up non viene rispettato
7.5.2 Generazione del segnale di READY
65
sono al litio). Per generare invece il segnale di clock, serve un circuito con un oscillatore al quarzo (che si pu`o vedere sulle slide). Il quarzo infatti `e un condensatore naturale, che ha delle variazioni meccaniche solo quando giunge alla cosidetta “frequenza fondamentale”. . . `e quindi molto pi` u stabile di un solito condensatore! Nel circuito son presenti due capacit`a, che son dette capacit` a di compensazione, e servono per iniziare l’oscillazione. Da osservare che l’8088 `e un circuito che lavora a 5 MHz, ma si utilizza un quarzo con frequenza fondamentale a 15 MHz. Questo perch`e il segnale di clock viene “pulito, raddrizzato” e moltiplicato passando attraverso un apposito circuitodetto Trigger-Schimdt.
5.2
Generazione del segnale di READY
Il READY `e un segnale che deve essere sincrono con il fronte negativo del clock, e quindi `e garantito per il fronte positivo, quando viene campionato. Oltre a ci`o, a differenza degli altri segnali, il segnale READY pu`o arrivare da pi` u fonti. Il circuito lo si pu`o vedere come una serie di AND che confluiscono in un OR per poter generare il segnale di OR che `e campionato in un FF di tipo D, a cui arriva il segnale di clock negato proprio per poter campionare sul fronte negativo. Un possibile circuito per la generazione dei READY `e il 74164, che `e uno shift-register a (N+1) bit12 , a cui si collega: • “1” al segnale D • Il segnale di ALE negato al CLR* • E a seconda delle uscite considerate si ha il numero dei ritardi. I Qi sono gli stati di wait. Esempio: si possono scegliere 2 fra i Qi e collegarli rispettivame ai segnali RDY1 e RDY2 , ottenendo quindi due tipi di ready diversi. Collegando SELG∗1 12
N.B.: I contatori son binari, non sono degli shift-register!!
66
L’8088
a IO/M ∗ e SELG∗2 a IO/M ∗, si discrimina se il ready proviene da una sorgente di I/O o da una memoria.
6
Calcolo degli stati di wait nel caso di cicli di lettura dalla memoria
Si raccomanda di guardare le slide per vedere le forme d’onda dei segnali. Il campionamento dei dati avviene al termine di T3 , sul fronte negativo, e si ha che `e corretto se sono rispettati i tempi di set-up e di hold (da ricordare sempre che il segnale di ready `e campionato sul fronte positivo di T3 . L’istante di campionamento `e dato da: Tsample = (3 + n) · TCLCL
(7.1)
dove TCLCL `e un periodo di clock, mentre n `e il numero degli stati di wait presenti nel ciclo. Un ciclo di lettura viene eseguito correttamente se TSAMPLE ≥ TDATA VALID
(7.2)
Dove TDATA VALID `e l’intervallo che intercorre fra l’inizio del ciclo di BUS di lettura e l’istante in cui i dati provenienti dalla memoria sono validi e possono essere campionati dalla CPU. Altri ritardi importanti che influenzano la scelta del TSAMPLE sono: • TCLAV (max) `e il massimo ritardo con cui il processore garantisce che a partire dal fronte negativo di T1 gli indirizzi son validi • TDVCL (min) `e il minimo tempo di set-up del registro “MDR” della CPU • TCLRL (max) `e il massimo ritardo per l’attivazione del segnale di READ. • I vari ritardi introdotti dai 373 e 245 In generale, il tempo d’accesso `e il tempo pi` u lungo presente.
Capitolo 8 La gestione dell’Input/Output L’I/O non `e nient’altro che un tipo particolare di memoria, normalmente diversa (ma non sempre). Quello che si ha `e che se si scrive un dato in tali memorie si pu`o avere un’azione del dispositivo I/O.1 . Un’interfaccia di I/O ha 4 tipi di dato (scritti e letti come le altre memorie): • Comandi (dal mondo interno al mondo esterno) • Dati • Indirizzi • Stati (condizioni particolari del dispositivo) Un’interfaccia di I/O deve essere in grado di sincronizzare la CPU con l’unit`a di I/O (interlock ) Difetto fondamentale: il processore deve interrogare in continuazione il bit di stato per sapere se c’`e a disposizione un nuovo dato dal dispositivo (e ci`o vale anche per l’output). Questo sistema `e detto polling. Questo sistema `e altamente costoso, e quindi deve essere evitato. Si utilizza un sistema per cui invece viene richiamato il processore. Per far ci`o si utilizza il sistema delle interruzioni (o interrupt, in cui si usano due fili). Se il filo viene attivato, il processore (dopo aver terminato l’ultima operazione) sospende il programma corrente e viene forzato ad eseguire una “subroutine” di I/O (Si salva sullo stack l’indirizzo di ritorno! Nell’8088 viene 1
Anche qui, conviene vedere gli esempi sulle slide, e bisogna ricordarsi: il clock di un FF non deve essere attivato all’inizio della write, ma alla fine (si usa un OR, non un AND)
68
La gestione dell’Input/Output
anche salvato il registro di flag e viene azzerrato l’Interrupt Enable). Si pu`o anche avere il nesting di pi` u interrupt!
1
Le periferiche
Si pu`o associare il funzionamento di una periferica a quello di una memoria. Si leggono e scrivono: • Dati • Controlli • Stati • Indirizzi Una periferica `e utile, ma non `e strettamente necessaria: si tratta di un componente realizzato da terzi, e quindi si consegna la responsabilit`a di questo coretto funzionamento a terzi!
1.1
L’8255
` un dispositivo che si trova ancora sul mercato. E ` un dispositivo a 40 pieE dini, in grado di gestire fino a 3 porte bidirezionali parallele a 8 bit. Son presenti due registri di indirizzo nell’8255 (A0 e A1 ). Questo quindi indica che si possono coprire 4 locazioni (o si lavora su una delle 3 porte, oppure si interviene per scrivere una parola di controllo. Infatti tutti questi dispositivi possono avere pi` u modi di funzionamento, e si possono programmare). Serve quindi un software che indichi il funzionamento di queste porte. Se viene attivato il segnale di reset, tutte le porte lavorano come Input (dal ` da osservare che in realt`a la porta C `e comondo esterno al processore). E stituita da da 2 porte a 4 bit (utile per la programmazione). Per accedere al registro di controllo bisogna imporre sia A1 che A2 a 1. In questo modo si accede a questo registro interno alla periferica e si pu`o programmare il funzionamento del dispositivo. Per accdere quindi alla porta di controllo si deve utilizzare come indirizzo il (Chip Select + 3)! Quindi, per poter usare correttamente una periferica si deve:
8.1.2 Parola di controllo dell’8255
69
1. fare in modo che il programma mandi a tutte le interfaccie le corrette configurazioni perch`e funzionino correttamente 2. e quindi si possono utilizzare i dispositivi. Esistono 3 modalit`a (ma una non si studia): • Modo 0, o anche detto Basic I/O: la lettura e la scrittura con il dispositivo avvengono senza sincronizzazione con il mondo esterno (tutte e tre le porte possono lavorare in modo 0) • Modo 1, o anche detto Strobed I/O: l’I/O `e avviene tramite sincronizzazione con il mondo esterno. Da notare che la porta C pu`o lavorare solo in modo 0. Le porte si possono riprogrammare? In teoria s`ı, ma ci`o dipende dai componenti a cui son collegati. Se le porte A e B sono in modo 1, servono dei segnali per creare la sincronizzazione. Per far ci`o, si utilizzano alcuni bit della porta C, che si dice che viene requisita.
1.2
Parola di controllo dell’8255
Se il bit pi` u significativo (D7 ) `e pari a 1, gli altri bit son considerati di configurazione del dispositivo. Invece, se `e a 0, si possono modificare singolarmente i bit della porta C!2 . La programmazione del dispositivo dipende ovviamente dall’utilizzo che se ne fa. Per esempio, se i dati in arrivo dal dispositivo esterno cambiano troppo velocemente, si deve utilizzare il modo 1.3 Nel caso di lettura di dati dal dispositivo esterno, si ha che: 1. La Unit`a Esterna attiva il segnale STB*, detto Strobed Input, che funziona come un clock (indica che `e pronto per scrivere dei dati) 2. L’8255 avverte la UE che il dato `e stato accettato attivando IBF (`e un FF): 2
Infatti basta usare 3 bit per indicare quale bit modificare della porta C, e con D0 si indica se scrivere 0 o 1 3 Da osservare che, se il processore `e pi` u veloce della periferica, servono un numero adeguato di stati di wait, come nel caso delle memorie!
70
La gestione dell’Input/Output • IBF = 1: La UE non deve scrivere, la CPU deve leggere • IBF = 0: (`e avvenuta la lettura) la CPU non deve leggere, la UE pu`o scrivere.
Il segnale di STB* serve come clock per campionare il dato da parte dell’8255. I bit della porta C servono proprio per poter trasmettere/ricevere i segnali di STB* e IBF. In modo simile funziona il processo inverso, ovvero scrittura dal processore sulla UE. Si utilizzano invece come segnali OBF* (Output Buffer Full, che se messo a 0 indica alla periferica che `e presente un nuovo dato per essere scritto) e ACK* (la periferica indica che la scrittura `e terminata). Si supponga per esempio si sia programmatol’8255 come strobet output A. Tramite dei 3-state, si stacca il registro di C6 dal piedino P C6 , che viene invece utilizzato per ACKA*. Sulle slide si possono vedere appunto cosa si modifica a seconda della programmazione, e come vengono riutilizzati questi bit. Da ricordarsi per tutte le periferiche: gli Interrupt Enable vanno riferiti direttamente alle sorgenti, e quindi per generare l’IE tutte le sorgenti di Interruzione vanno in OR!
2
Le Interruzioni
Esistono due tipi di segnali per di interrupt: • Interrupt mascherabili, mediante l’Interrupt Enable • NMI (Not Maskerable Interrupt). Si tratta di Interrupt d’emergenza, e per questo non son mascherabili!
2.1
Meccanismi d’interruzione dell’8088 (stesso per tutta la famiglia)
Se il processore riconosce un’interrupt, deve capire di che tipo `e e soprattutto deve ricevere la sub-routine dell’interrupt pi` u importante che ha ricevuto in quel lasso di tempo: `e quindi necessaria una rete al di fuori del processore.
8.2.2 PIC 8259
71
Il processore, quando riconosce un’interrupt, genera due cicli di bus in cui trasmette il segnale INTA* (Interrupt Acknowledge). Al secondo INTA*, il processore si aspetta di ricevere 8 bit da un dispositivo esterno, che contengono l’Interrupt Type (ovvero il tipo dell’interruzione). Quindi il processore esegue uno shift a sinistra di due posizioni, e prende il numero ottenuto come indirizzo per accedere ai 4 byte consecutivi in memoria che contengono il Code Segment e l’Instruction Pointer dell’indirizzo della sub-routine! • Primo INTA*: Congela la catena delle priorit`a e cos`ı evita le corse critiche. • Secondo INTA*: Si ottiene l’Interrupt Type. Perch`e viene shiftato a sinistra di due (ovvero moltiplicato per 4)? Perch`e un puntatore nell’8088 usa 4 byte (2 per il Code Segment, 2 per l’Instruction Pointer), e in questo modo riesce ad ottenere l’indirizzo richiesto. Per esempio, i primi due byte contengono il CS corrispondente alla subroutine per un Interrupt Type uguale a 0, e i byte immediatamente successivi contengono l’IP.4 Si dice Interrupt Vector il puntatore n-simo alle istruzioni di Interrupt. Come si prosegue quindi? 1. Si salvano sugli stack il CS e l’IP dell’istruzione corrente 2. Si salva il registro di flag 3. Si disabilita l’Interrupt Enable
2.2
PIC 8259
Il PIC (Programmable Interrupt Controller) 8259 `e una periferica esterna che `e in grado di gestire fino a 8 richieste d’interruzioni, con priorit`a (l’interruzione collegata a IR0 `e l’interruzione con la massima prorit`a. L’8259: • Invia il segnale di INT al processore, che pu`o essere messo in OR con altre fonti di interruzione • Ha un piedino INTA* dove pu`o ricevere appunto il segnale di INTA* 4
Un KByte della memoria logica in basso nell’8088 `e riservato ai puntatori alle interruzioni!
72
La gestione dell’Input/Output
Inoltre, con l’8259 si possono mascherare selettivamente le interruzioni. Si hanno quindi fino a 8 interrupt enablem una per ogni sorgente: se uno `e disabilitato, , significa che `e stato mascherato. Ci son tre registri da considerare (A0 ): • IRR: Interrupt Request Register: `e il registro a cui son collegati le sorgenti di interrupt. Se riceve una richiesta di Interrupt da parte della sorgente collegata ad IRi , viene settato il bit corrispondente. • ISR: In-Service Register, `e il registro che dice quali interruzioni son in servizio • IMR: Interrupt Mask Register, `e il registro che indica quali istruzioni son state mascherate Il segnale d’interruzione da parte del dispositivo s’attiva se si presenta una richiesta d’interruzione con piorit`a maggiore rispetto a quelle corrente, pre` quindi necessario un meccanismo apposito per resettare i sente nell’ISR. E bit dell’ISR. In teoria, esisterebbero solo due parole di controllo (Input Control Word e Output Control Word) che si possono scrivere, ma il significato dei byte trasmessi non dipende solo dall’indirizzo, ma anche dal tempo, si tratta di una rete sequenziale! Le Input Control Word: • A0 = 0 e quarto bit a 1: corrisponde fondamentalmente a un reset, `e la prima informazione da inviare • ICW1 : viene indicata con il bit 0 a 1, e il bit 1 indica invece che questo `e l’unico 8259 presente nell’architettura. Il bit 3 invece informa se l’interruzione deve essere eseguita se c’`e un segnale a stabile (si dice che `e sensibile ai livelli ) oppure ad ogni fronte positivo (`e sensibile ai fronti ). • ICW2 : con questa parola si ottiene l’Interrupt Type: 1. Tutti gli Interrupt Tupe son consecutivi 2. I primi 5 bit (quelli pi` u significativi) vengono programmati, mentre gli altri 3 indicano la tioplogia dell’interruzione (o meglio, indica il numero dell’interruzione pi` u prioritaria) • ICW3 : viene usata solo se ci fossero pi` u 8259 nell’architettura:
8.2.2 PIC 8259
73
• ICW4 : questa parola stabilisce la zona di memoria per i puntatori alle interruzioni (sempre: A0 = 1, bit 0 a 1, bit 1,3 e 4 a 0. Il bit 2 si pu`o assumere qualunque valore) Naturalmente, si programma sempre un’unica volta: 1. Prima si configura correttamente il dispositivo 2. E quindi si attiva l’Interrupt Enable Le Output Control Word: • OCW1 : `e una parola di mascheramento (ogni bit indica per la corri` la spettiva interruzione se `e mascherata [1] oppure no [0]). A0 = 1. E quarta parola che deve essere inviata al dispositivo. • OCW2 : indica un End of Interrupt non specifico (A0 = 0, quarto bit a 0). Questo `e il comando che, inviato al dispositivo, esegue un reset dell’ISR dell’interruzione con priorit`a maggiore. Con l’8259 si possono programmare le interruzioni con rotazione di priorit`a : si possono cambiare le priorit`a, ma solo facendole ruotare tutte, attorno all’interruzione meno prioritaria (questo significa che tutte le interruzioni cambiano priorit`a!). Quello che si pu`o quindi fare `e indicare il livello meno prioritario, con un apposito comando. Esempio (sempre con A0 = 0), dando questi comandi: • 00100XXX: si indica EOI non specifico • 11000XXX: viene settata la priorit`a al livello indicato dai 3 bit XXX Se si ruota su un End Of Interrupt non specifico, si ha quindi che il livello che si sta settando diviene il meno prioritario. Trattandosi di 8 interruzioni, son necessarie 32 locazioni di memoria consecutive per le interruzioni Un Not Maskerable Interrupt (NMI) `e riconosciuto dal processore quando sul piedino corrispondente avviene una transizione da 0 a 1. Non si ha quindi nessun nuovo INTA*, ma viene generato dal processore e vale 2. Esistono istruzioni all’interno del processore per cui vengono generate interruzioni interne, che hanno Interrupt Type pari a 0. Si tratta di interruzioni predefinite, e nell’8088 sono nelle prime 32 locazioni.