Che materia stai cercando?

Anteprima

ESTRATTO DOCUMENTO

Istruzioni di salto file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

BCS offset: if Carry Set, if C then PC:=PC+offset (ed analogamente BCC if Carry Clear;

o BVS, if Overflow Set, etc.);

BLE offset: if Less or Equal, if N or Z then PC:=PC+offset (ed analogamente BGE, if Greather Than or

Equal; BE; if Equal, etc.).

Per le architetture storiche qui sono illustrate le istruzioni di salto.

2 of 2 25/01/2007 20.04

Istruzioni di salto per architetture storiche file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Architetture storiche

Per le architetture "storiche":

Qui sono presentate le architetture storiche esemplificate

Qui la legenda dei simboli per indicare la natura di un operando

1 Istruzioni di salto

1.1 Salti incondizionati

Nelle architetture storiche in esame, le istruzioni di salto semplice (tab. 9.1) esistono sia nella

forma assoluta che in quella relativa. Si noti che:

Tabella 9.1 Istruzioni di salto incondizionato

370d 1100d G20d 6800d Z8000d VAXd

Istruzione ASSOLUTI

--- --- --- JMP --- ---

PC:= im --- J TRA --- --- JMP

PC:= G RELATIVI

--- --- --- BRA --- ---

PC:= PC+im --- --- --- BRA --- BR

PC:= PC+G

· Il 370d e lo Z8000d non posseggono istruzioni di salto semplice in quanto il salto semplice è realizzato come

salto condizionato con antecedente identicamente vero;

· Le macchine più antiche usano solo salti assoluti.

In alcune architetture i salti possono essere gestiti con la tecnica dello skip.

1.2 Salti condizionati Tabella 9.2 Istruzioni di salto condizionato

370d 1100d G20d 6800d Z8000d VAXd

Istruzione Su operandi aritmetici

if A>0 then PC:= c JP --- --- --- --- ---

?? Su flag

if f then PC:= G JC JO

--- --- --- --- ---

JNC JNO

if not f then PC:= G Banch on Condition

if cc then PC:= --- --- --- --- JR ---

PC+im

if cc then PC:= R BCR --- --- --- JP ---

if cc then PC:= M BC --- --- --- --- ---

if cc then PC:= G --- --- --- --- --- B

SKIP

G :: 0 --- TP FOP --- --- ---

G :: d --- --- FGO --- --- ---

G :: A --- TG --- --- --- ---

1 of 1 25/01/2007 20.07

Collegamento con sottoprogrammi file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Qui sono presentate le architetture esemplificate

Qui la legenda dei simboli per indicare la natura di un operando

Qui i simboli generali e specifici per individuare i registri di macchina

1 Collegamento con sottoprogrammi

Le istruzioni di collegamento a sottoprogramma per le tre architetture in esame sono mostrate in tab.

10.1. Tabella 10.1 Istruzioni di collegamento a sottoprogramma

8086d 68000d RISCd

Istruzione SALTI A SUBROUTINE

Salvataggio in registro

--- --- JAL

r:=PC; PC:= im --- --- JALR

R1:=PC; PC:= R2

Salvataggio in stack pushm (SP, PC)

--- JSB ---

PC:= G --- BSR ---

PC:= PC+im CALL --- ---

PC:= PC+G

RITORNO DA SUBROUTINE

RET RTS ---

popm (SP,PC)

popm (SP,CCR) --- RTR ---

popm (SP,PC)

1.1 Salti e ritorni

L'8086d e il 68000d usano per il salvataggio la tecnica dello stack e solo il 68000d possiede

l'istruzione di salto assoluto.

Il RISCd presenta solo salti assoluti, con indirizzo cui saltare immediato e salvataggio in registro

implicito R[31] (JAL, Jump & Link, formato J-format) oppure con entrambi gli operandi di tipo

registro (JALR, formato R-format).

Per l'8086d e il 68000d, che usano lo stack, il ritorno è effettuato con le istruzioni RET (formato di

fig.3.1a) e RTS (formato di fig.3.2a), con operandi tutti impliciti. L'istruzione RTR presume che il

programmatore all'inizio della subroutine abbia salvato i flag (CCR) del programma chiamante nello

stack e quindi li ripristina. Il RISCd, non trattando lo stack a livello macchina, non possiede istruzioni

di ritorno da subroutine per la quale peraltro si può usare la JR..

1.2 Salti e ritorni condizionati

L'architettura RISCd possiede due codici di salto a sottoprogramma condizionati al confronto tra il

contenuto di un registro e lo zero (BGEZAL: Branch on Greather Than or Equal to Zero And Link,

BLTZAL: Branch on Less Than Zero And Link).

Per le architetture storiche qui sono illustrate le istruzioni di collegamento a sottoprogramma.

1 of 1 25/01/2007 20.04

Collegamento con sottoprogrammi per architetture storiche file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Architetture storiche

Per le architetture "storiche":

Qui sono presentate le architetture storiche esemplificate

Qui la legenda dei simboli per indicare la natura di un operando

1 Collegamento con sottoprogrammi

Le istruzioni di collegamento a sottoprogramma per le architetture in esame sono mostrate in tab.

10.1. Tabella 10.1 Istruzioni di collegamento a sottoprogramma

370d 1100d G20d 6800d Z8000d VAXd

Istruzione SALTI A SUBROUTINE

Salvataggio in memoria

--- SLJ TRM --- --- ---

M:=PC: PC:= M+1 Salvataggio in registro indirizzabile

BALR --- --- --- ---

R1:=PC; PC:= R2 ---

BAL --- --- --- ---

R:=PC; PC:= M ---

--- LMJ --- --- ---

R:=PC; PC:= G ---

Salvataggio in stack

--- --- --- --- CALR ---

pushm (SP, PC); PC:=PC+

im --- --- --- JSR --- ---

pushm (SP, PC); PC:= x --- --- --- --- --- JSB

pushm (SP, PC); PC:= G --- --- --- --- --- BSB

pushm (SP, PC); PC:=

PC+G RITORNO DA SUBROUTINE

--- --- --- RTS RETcc (*) RTS

popm (SP,PC)

(*): ritorno condizionato a cc

Si noti:

· Il salvataggio in memoria del 1100d e del G20d

il salvataggio in registro indirizzabile di 370d e 1100d;

·

· la comparsa del salvataggio in stack nelle architetture relativamente più moderne: 6800d, Z8000d e VAXd;

il ritorno condizionato dello Z8000d.

·

1 of 1 25/01/2007 20.08

Estensione delle istruzioni ai tipi di dato non fondamentali file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Qui sono presentate le architetture esemplificate

Qui la legenda dei simboli per indicare la natura di un operando

Qui i simboli generali e specifici per individuare i registri di macchina

1 Estensione delle istruzioni ai tipi di dato non fondamentali

Nel seguito si illustrano sinteticamente le soluzioni adottate nelle architetture in esemplificazione

per l'estensione del set dei codici operativi ai tipi non fondamentali.

1.1 Architettura 8086d

Le operazioni aritmetiche e di comparazione si applicano ai tipi byte e word, in aritmetica binaria

con e senza segno. L'aritmetica decimale sui tipi packed e unpacked, per quanto riguarda l'addizione e

la sottrazione, è implementata in due passi: le operazioni vanno prima effettuate in aritmetica binaria;

occorre poi adoperare appositi codici di "adjust" (AAA, DAA, AAS, DAS), i quali effettuano la

necessaria correzione sul risultato binario per trasformarlo in decimale (l'operazione avviene

estendendo alle due cifre comprese in 8 bit il concetto sviluppato nell'adder decimale, per il quale

occorre aggiungere 6 al risultato quando esso sia compreso fra 10 e 16 e quando l'adder binario dia

riporto: in funzione dei valori dei bit 0, 3, 4, 7 e dei riporti A (cfr.tab.2.3) fra il quarto ed il quinto bit e

C complessivo, al risultato dell'addizione va sommato 00, 06, 60, 66 ed analogamente per la

sottrazione). La moltiplicazione e la divisione si estendono allo stesso modo, ma solo per il tipo

decimale unpacked (codici di "adjust" AAM, AAD).

Per la realizzazione dell'aritmetica in virgola mobile, l'8086d opera congiuntamente al co-processore

[1]

matematico 8087 ; oltre alla virgola mobile, esso estende il tipo fondamentale ai 32 bit ed esegue

calcoli di funzioni matematiche di varia natura (radici quadrate, esponenziale, funzioni

trigonometriche, ecc.). in virgola mobile.

Il co-processore 8087 dispone di un banco di otto registri da 80 bit, gestiti come uno stack circolare,

il cui contentuo è acceduto mediante opportune operazioni di push e pop. Per dare maggiore flessibilità,

è comunque anche possibile indirizzare in maniera diretta uno qualunque degli otto registri, indicando

lo spiazzamento rispetto alla cima dello stack.

La rappresentazione in memoria della virgola mobile (vedi Rappresentazione Dati) è in singola

(short real, 32 bit) o doppia precisione (long real, 64 bit); all'interno del processore, invece, si usa

l'unico formato temporary real format ad 80 bit; questo formato interno è usato dall’8087 anche per

trattare dati interi. a 32 bit (short integer) ed a 64 bit (long integer).

1.2 Architettura 68000d

Il 68000 possiede i tipi binari Byte, Word, Longword e, con la concezione di architettura ortogonale,

il tipo è spesso codificato in un apposito campo dell’istruzione; esiste inoltre un tipo decimale. Tutti i

codici aritmetici, logici e di trasferimento si estendono ai 3 tipi binari, con eccezione della

moltiplicazione e divisione che si applicano solo a Word; per questi codici è invece distinto il caso che

la stringa di bit che rappresenta il dato sia considerata un numero naturale (Multiply, Divide Unsigned)

oppure una rappresentazione in complementi (Signed). L'addizione e sottrazione con riporto (detto

bit-eXtend), anch'essa applicabile ai 3 tipi binari, consente un’ulteriore espansione della aritmetica. Per

il tipo decimale sono previsti i codici di addizione (ABCD) e sottrazione (SBCD), limitati alla

estensione di un byte, ma operanti anch'essi con riporto.

1.3 Architettura RISCd

Il tipo fondamentale di RISCd è l’intero a 32 bit, corrispondente alla lunghezza dei registri di

macchina. Si ricorda che le operazioni aritmetiche e di comparazione sono applicabili solo ad operandi

di tipo registro e che in ogni caso l’architettura tende a limitare il numero di distinti codici operativi.

A differenza dell’8086d e del 68000d, in cui il tipo dell’operando è specificato mediante un apposito

campo “tipo”, nel RISCd è il codice operativo a determinare il tipo dell’operando; pertanto il Load

Word e lo Store Word (SW) si estendono al byte (LB, SB) ed alla mezza parola (LH, SH). I codici

aritmetici e di confronto operano solo sul tipo fondamentale, distinguendo il caso della

rappresentazione in complementi (signed) da quella dei numeri naturali; i codici ADDU, SUBU,

1 of 2 25/01/2007 20.03

Estensione delle istruzioni ai tipi di dato non fondamentali file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

MULTU, DIVU diventano per i numeri in complemento ADD, SUBU, MULT, DIV.

Per quanto riguarda l’aritmetica in virgola mobile, il processore RISCd supporta i due tipi di

- singola (32 bit) e doppia (64 bit) precisione, conformi allo standard IEEE-754.

A supporto dell’aritmetica in virgola mobile, il processore possiede il set di registri FPR a 32 bit di

cui alla tab. 2.1, che si usano in coppie per la doppia precisione. Questi registri, così come altri, sono in

effetti l'interfaccia fra il processore fondamentale e il coprocessore della virgola mobile; l'architettura

del RISCd prevede che possano esservi fino a 4 coprocessori collegati ed estende le istruzioni di load e

store da e verso i registri interfaccia dei coprocessori con istruzioni quali LWCz, SWCz (Load/Store

Word Coprocessor z), con z=1 per il coprocessore della virgola mobile.

Il repertorio dei codici operativi è quindi esteso alla virgola mobile: gli operandi sono memorizzati

nei registri FPR e le istruzioni contengono un apposito campo che specifica se si tratta d’operazioni in

singola (codici ADD.s, SUB.s, etc.) oppure in doppia precisione (ADD.d, SUB.d, etc.).

Per le architetture storiche qui sono illustrate le estensioni del set di istruzioni..

[1]

In origine si trattava di un processore indipendente, opportunamente collegato all'8086, oggi il coprocessore è realizzat

medesimo chip del processore principale.

2 of 2 25/01/2007 20.03

Estensione delle istruzioni ai tipi di dato non fondamentali per architet... file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Architetture storiche

Per le architetture "storiche":

Qui sono presentate le architetture storiche esemplificate

Qui la legenda dei simboli per indicare la natura di un operando

1 Estensione delle istruzioni ai tipi di dato non fondamentali

1.1 Architettura 370d

Il tipo fondamentale è l'intero a 32 bit ma, con qualche limitazione, il processore tratta il tipo "half"

(intero a 16 bit), estendendo ad esso i principali codici (L, ST, A, S, M, C diventano LH, STH, AH, SH,

MH, CH).

Il tipo decimale packed è implementato con i codici già visti (ZAP, AP, SP, MP, DP) e con la

comparazione CP ("P" sta per "Packed").

Sul tipo carattere e stringa di caratteri sono definiti i codici MVC (Move Characters

memoria-memoria), MVI (Move Immediate un carattere in memoria), IC (Insert Character) CLC

(Compare), CLI (Compare Immediate), STC (Store).

Sul tipo "logico in doppia lunghezza" sono definiti gli shift. ????

Sono infine disponibili codici operativi per la conversione di rappresentazione e quindi di tipo, quali

CVB (Convert Binary da decimale in memoria a binario in registro) e il codice inverso CVD (Convert

Decimal), PACK (da memoria "zoned" a memoria "packed") e l'inverso UNPACK.

Tratta infine il tipo indirizzo nel codice "Load Address" (LDA) per caricare in un registro un

indirizzo espresso come operando.

I codici di load e store (L, LR, LCR, LPR, ST di tab.6.1), quelli aritmetici (A, AR, S, SR, M, MR,

D, DR di tab. 7.1) e quelli di comparazione (C, CR di tab.8.1) sono estesi ai tipi virgola mobile a 32 bit

(LE, LER, LCER, LPER, STE, AE, AER, SE, SER, ME, MER, DE, DER, CE, CER) e virgola mobile a

64 bit (LD, LDR, LCDR, LPDR, STD, AD, ADR, SD, SDR, MD, MDR, DD, DDR, CD, CDR);

1.2 Architettura 1100d

Il tipo fondamentale è l'intero a 36 bit. Sono inoltre definite una aritmetica "half" (18 bit) ed una

"Third" (12 bit) con i codici di addizione e sottrazione.???appositi o con modi??? Le operazioni su

caratteri e di move per lunghezze inferiori a 36 bit si ottengono con particolari modi d’indirizzamento.

I codici di load e store che coinvolgono gli accumulatori (LA, LNA, LMA, SA) sono estesi alla

doppia precisione (DL, DLN, DLM, DS): gli uni e gli altri sono validi sia per la virgola fissa sia per la

mobile in quanto i registri usati sono i medesimi e il trasferimento avviene sempre bit a bit. Le

istruzioni aritmetiche (AA, ANA, MSI, DI) sono estese alla virgola mobile a 36 bit (FA, FAN, FM, FD)

ed alla virgola mobile a 72 bit (DFA, DFAN, DFM, DFD); alla doppia precisione sono anche estesi

alcuni codici di skip e jump (Double Precision Test Equal, Double Precision Jump Zero) ed i codici di

shift.

1.3 Architettura G20d

La concezione del G20 è atipica rispetto agli altri processori di tabella ed è rappresentativa di una

soluzione che privilegia le applicazioni scientifiche rispetto a quelle commerciali: l'aritmetica interna è

dimensionata, sia come parallelismo sia come organi dell'ALU, alla virgola mobile in doppia precisione

e le operazioni aritmetiche sono dunque sempre effettuate in tale aritmetica; il tipo intero e quello in

virgola mobile semplice sono casi particolari della soluzione più estesa. Solo in fase di memorizzazione

avviene la eventuale conversione di rappresentazione e pertanto gli unici codici operativi ennuplicati

sono quelli di store (Store Integer, Store Single, Store Double, Store Logical); il codice di load

aritmetico (CLA) non è esteso in quanto un bit interno alla rappresentazione indica se il dato sia in

singola o doppia precisione; unica differenza nel load è il "caricamento logico" (CAL), con il quale i 32

bit di una parola sono spostati nell’accumulatore indipendentemente dal loro significato (mantissa, ed

esponente, etc.).

1.4 Architettura 6800d

1 of 2 25/01/2007 20.09

Estensione delle istruzioni ai tipi di dato non fondamentali per architet... file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Il 6800 è uno dei primi microprocessori ad 8 bit ed opera solo sul tipo byte; le uniche estensioni

sono quelle dell’addizione e sottrazione "con carry" (ADC, SBC): d:=d+operando+C, ove C è il bit

indicatore di riporto uscente dalla operazione precedente, attraverso le quali è possibile estendere

l'aritmetica con l'uso di una sequenza di codici operativi. Anche le istruzioni di shift, come del resto

negli altri processori, coinvolgono il bit C, consentendo in tal modo una ulteriore estensione da

programma della aritmetica.

1.5 Architettura Z8000d

Il parallelismo base dello Z8000 è una parola di 16 bit, detta Word; esso peraltro tratta anche il tipo

Byte ed il tipo Long Word, sempre in virgola fissa. I codici di move, aritmetici e di comparazione (LD,

ADD, SUB, MULT, DIV, CP) si estendono al byte (LDB, ADDB, SUBB, CPB) ed alla longword

(LDL, ADDL, SUBL, MULTL, DIVL, CPL); i codici di operazioni unarie, incremento e logici si

estendono solo al byte (NEGB, INCB, DECB, COMB, ANDB, etc.). A differenza del 68000, e

similmente all'8086, l'aritmetica decimale, limitatamente all’addizione e sottrazione, è implementata

con l'uso del codice "Decimal Adjust" (DAB). Le operazioni di shift si estendono al byte ed ai due casi

in cui allo shift partecipi o non partecipi anche il bit-carry.

Lo Z8000 possiede inoltre alcuni codici operativi che operano sul singolo bit indirizzabile: con la

struttura OP a,b viene indirizzato il bit b-esimo dell'operando individuato da a con i vari modi

d’indirizzamento: si ricordano in particolare i codici RES a, b (a :=0), SET a, b (a :=1).

b b

1.6 Architettura VAXd

Più completa è l'estensione dei tipi nel VAX che possiede i tipi interi Byte, Word, Longword e i 4

tipi in virgola mobile F-floating, D-floating, G-floating, H-floating. I codici di move, aritmetici e di

comparazione sono quindi estesi ai 7 tipi di cui sopra ed assumono mnemonicamente un nome che

termina con una delle 7 lettere che individuano il tipo: ad esempio, il codice di addizione si estende ai

14 codici ADD2B, ADD3B, ADD2W, ADD3W, ADD2L, ADD3L, ADD2F, ADD3F, ADD2D, ADD3D,

ADD2G, ADD3G, ADD2H, ADD3H (la cifra nel codice mnemonicop indica il numero di operandi). I

codici che operano tipicamente su interi (INC, DEC) e quelli logici si estendono ai soli tipi interi (ad

es. INCB, INCW, INCL). I codici operativi di move, aritmetici e di comparazione si estendono anche al

tipo decimale packed (MOVP, ADDP, etc.). I codici di addizione e sottrazione con riporto (ADWC,

SUBWC) applicati all'intero "lungo" consentono di estendere la precisione alla quadrupla parola ed

oltre. Un ampio insieme d’istruzioni per la conversione di tipi (44 codici operativi per i binari fra loro,

6 per i decimali) consente di convertire comunque le rappresentazioni. Alcuni codici di comparazione e

di branch sono estesi al singolo bit indirizzabile.

2 of 2 25/01/2007 20.09

La segmentazione di memoria per l'8086d file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

La segmentazione di memoria per l'8086d

Qui sono i particolari della sezione registri dell'8086d.

La segmentazione dell'8086d è un sistema per ottenere un maggiore spazio indirizzabile di memoria

(1 Gigabyte) con pochi bit di indirizzamento (16 bit, che consentono di indirizzare solo 16 kbyte), oltre

che per una rilocazione del programma. La formula

MA:= EA + RS

viene in effetti applicata con riferimento ad uno dei quattro registri-segmento del processore (CS, DS,

SS, ES); in particolare, detto X uno dei quattro registri, si ha:

4

RS=X´2

sicché, l'indirizzo MA viene costruito secondo lo schema di fig.1.

19 3 0

4 Segmento 0 0 0 0

+ 15 0

EA

=

19 0

MA

Fig.1 Formazione di MA nell'8086d

1 of 1 25/01/2007 20.05

Legenda dei simboli file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Le tabelle che seguono mostrano i simboli usati per individuare la natura degli operandi coinvolti in

un'istruzione (per il simbolo G si veda il § 5). Per gli operandi che si riferiscono a registri speciali si

usano i simboli di tab. 1.2.

Tabella 1.1 – Simboli per individuare la natura degli operandi

Simbolo Significato

im Operando immediato

M Operando memoria

f Singolo flag implicito

r, R Registro generale implicito o indirizzabile

d, D Accumulatore implicito o registri-dati indirizzabili

a, A Registro implicito o banco indirizzabile di indirizzamento

x,X Registro implicito o banco indirizzabile di registri-indice

s, S Registro speciale implicito o indirizzabile

Operando “generale”: a seconda dei modi d’indirizzamento, è un registro,

G un operando-memoria o un operando-immediato

Tabella 1.2 registri di controllo e di stato

Simbolo

Tipo di registro Unificato

Registro di stato SR

Registro indicatori CCR

Stack pointer SP

Program Counter PC

1 of 1 25/01/2007 20.02

Istruzioni di salto: indirizzamento immediato e diretto coincidono file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Un particolare problema di interpretazione e di terminologia si ha per le istruzioni di salto. In esse

l'operando è di tipo indirizzo e quindi per indirizzamento immediato deve intendersi il fatto che O è

l'indirizzo della prossima istruzione e quindi che O è l'indirizzo dell'operando; ma, in base alla

definizione che dice "nell'indirizzamento diretto O è l'indirizzo dell'operando", ciò significa anche che

l'indirizzamento è diretto:

Nel caso di istruzioni di salto, indirizzamento immediato e diretto coincidono.

1 of 1 25/01/2007 20.02

Indirizzamento indiretto a più livelli file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

1.1 Indirizzamento indiretto a più livelli

L'indirizzamento indiretto a più livelli (o a catena) è una tecnica che generalizza quella

dell'indirizzamento indiretto: l'istruzione fa riferimento ad una locazione di memoria ove è

contenuto l'indirizzo dell'indirizzo (…dell'indirizzo) dell'operando-memoria.

Con questa tecnica, si realizzano più accessi per costruire l'indirizzo dell'operando; con riferimento

ad un livello in più rispetto alle (5.4) si avrebbe, per le tre soluzioni precedenti:

EA:=M[R ] EA:=M[M ]

EA:=M n O O

Tale tecnica consente di puntare non direttamente alla locazione ove è contenuto il valore del parametro

effettivo, ma ad una ove è contenuto ancora un indirizzo, in un modello di "puntatore a puntatore", più

flessibile di quello del semplice indirizzamento indiretto.

In alcuni processori la tecnica è implementata attraverso il cosiddetto indirizzamento a catena: EA si

suppone composta da due componenti, EA.add, che è il vero e proprio indirizzo, ed EA.f, booleana, che

indica se l'indirizzo è quello finale oppure è l'indirizzo ove è contenuto un altro indirizzo; anche

l'operando O espresso nell'istruzione ha la medesima struttura. Si ha dunque:

Algoritmo di costruzione di EA con la tecnica dell'indirizzamento a catena:

EA:=O; while EA.f do EA:= M (5.5)

EA.add

Si noti che con la tecnica esposta l'indirizzamento diretto può diventare un caso particolare di quello

indiretto: O è l'indirizzo dell'operando, altrimenti è l'indirizzo di un indirizzo e così via. Questa tecnica

è stata anche adoperata per gestire l'indirizzamento di memoria: con EA:=O si indirizza una area

ristretta di memoria (detta "pagina base") nella quale o vi è l'indirizzo dell'operando o il puntatore

all'indirizzo.

Nel § III.3 sono mostrate le tecniche d’indirizzamento adottate dai processori ivi presentati; la

casistica di cui sopra ne risulta completamente esemplificata.

1 of 1 25/01/2007 20.01

Modifica mediante alterazione dell'istruzione file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

1.1 Modifica mediante alterazione dell'istruzione

Una modifica di indirizzo si potrebbe anche ottenere operando su una istruzione come se fosse un dato

e quindi modificandola dinamicamente durante l'esecuzione del programma cui appartiene. Tale tecnica

è possibile in quanto sul piano della realizzazione fisica della macchina non esiste alcuna distinzione

fra una istruzione o un dato: entrambi sono rappresentati da una stringa di bit, che viene interpretata

come istruzione se ad essa si accede nella fase di fetch, come dato se si accede nella fase execute; la

stringa di bit può essere dunque alterata da una elaborazione, trasformando dunque l'istruzione in

un'altra che fa riferimento ad un diverso indirizzo.

Pure essendo tale tecnica tipica del modello di Von Neumann e utile soprattutto in processori che

non dispongono di grosse capacità di modifica automatica, essa è sconsigliata dalle attuali tecniche di

programmazione, in quanto dà luogo a quelle che si chiamano procedure non pure, cioè procedure che

alterano se stesse.

1 of 1 25/01/2007 20.01

Istruzioni di salto - tecnica skip file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Istruzioni di salto

tecnica skip

La tecnica di Skip, opera assumendo:

prox:= PC+2

e si ha dunque:

Una istruzione di skip produce l'effetto:

if f then PC:=PC+2 (1.10)

se applicata ad un indicatore, oppure:

if a(R)b then PC:=PC+2 (1.10')

se applicata ad una coppia di operandi aritmetici.

Lo skip, assumendo implicito l'indirizzo cui saltare, consente istruzioni più corte o comunque dà

spazio nell’istruzione ad altri operandi espliciti; tuttavia, è facile da implementare solo su processori

con istruzioni che occupano tutte una sola locazione; in tal caso, l'indirizzo dell’istruzione cui

eventualmente saltare è effettivamente PC+2. Nei calcolatori ove le istruzioni sono a lunghezza

variabile, la localizzazione dell'indirizzo dell’istruzione cui saltare richiederebbe la conoscenza della

lunghezza dell'istruzione seguente quella di skip.

Con tale struttura si provoca dunque soltanto il salto di una istruzione per una delle due diramazioni:

salvo casi eccezionali, la istruzione eventualmente saltata dovrà essere un salto semplice, tale da

rinviare per lo sviluppo della diramazione, ad uno spazio congruo. Il medesimo esempio di cui sopra

sarebbe così realizzato con una istruzione di skip:

if a (R) b then PC:=PC+2

goto c

{diramazione 2, ramo then}

.......

.......

goto fine

c: {diramazione 1, ramo else}

......

.......

fine: .......

Si noti che i termini inglesi "jump" e "skip" adoperati per classificare i due tipi di salto ricordano

coerentemente un "salto lungo" ad una posizione imprecisata e un "salto breve" rispettivamente.

Un’ampia esemplificazione di istruzioni di salto semplice (incondizionato) e condizionato, nelle

diverse soluzioni qui illustrate è presentata al § III.9 e nelle annesse tabelle.

1 of 1 25/01/2007 20.01

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Capitolo sesto

Il sistema di input/output

Gli strati del sistema I/O

1 1.1 Interfaccia I/O

1.2 Architettura I/O

1.3 Linguaggio macchina

1.4 Driver

1.5 Primitive del sistema operativo

1.6 Primitive del linguaggio

2 Il colloquio fra CPU e periferia

2.1 Il Protocollo di colloquio

2.2 Messaggi scambiati fra CPU e periferia

2.3 Parallelismo delle trasmissioni

2.4 Sincronizzazione dei messaggi elementari

2.5 Segnali di controllo

2.6 Trasmissioni a blocchi

3 Le fasi del colloquio

3.1 Apertura, corpo e chiusura

3.2 Selezione della periferia

3.3 Corpo della trasmissione

3.4 Controllo di errore

4 La sincronizzazione. Tecnica asincrona e sincrona

4.1 Tecnica asincrona

4.2 Tecnica sincrona

5 La selezione della periferia

5.1 Topologia del collegamento

5.2 Selezione per collegamenti punto-punto e multi-punto

5.3 Selezione seriale o parallela

5.4 Selezione dinamica o preselezione

6 Architettura del sottosistema I/O

6.1 Sistemi con interfacce passive

6.2 Sistemi a canale indipendente

6.2.1 Modello DMA

6.2.2 Modello di processore I/O (PIU)

7 Caratteristiche generali dei linguaggi macchina I/O

7.1 Sintassi e semantica del linguaggio

7.2 Caratteristiche generali del linguaggio macchina

8 Modello funzionale di interfaccia

9 Modello fondamentale di programmazione I/O

9.1 L'interfaccia

9.2 Le istruzioni

9.2.1 Modello I/O isolato

9.2.2 Modello memory mapped

10 La programmazione dei driver

10.1 Modello fondamentale e modelli sintattici

10.2 Il controllo dei canali indipendenti

10.3 Lo scambio degli stati

11 Istruzioni a blocchi

12 Protocollo handshake

12.1 Protocollo d’ingresso

12.2 Protocollo di uscita

13 I/O sincronizzato da interruzioni

13.1 Interruzione in ingresso

1 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

13.2 Interruzione in uscita

14 Interfacce e bus per i PC

1 Gli strati del sistema I/O

Come tutte le operazioni complesse, quelle di I/O sono studiate, progettate e realizzate in una

struttura composta da differenti livelli o strati che, procedendo dal più elementare al più complesso,

risolvono sia i problemi relativi ai dettagli elettronico-circuitali sia quelli di organizzazione del

sistema. Una trasmissione dati si divide in effetti in diversi livelli, da quello fisico-elettronico, che

affronta i problemi di forma dei segnali o di campionamento dei dati, a quello logico ad alto livello che

tratta i dati scambiati come appartenenti ad una determinata applicazione: da un estremo, infatti,

l'operazione di I/O è vista come una trasmissione di segnali, dall'altro come un’operazione che

coinvolge logicamente CPU, memoria e sottosistema di I/O.

Anche sul piano dell’architettura hardware-software, il sottosistema I/O è distribuito in diversi

"strati" o livelli, che sono schematizzati in fig. 3.1 e brevemente illustrati in seguito.

PRIMITIVE DI LINGUAGGIO

PRIMITIVE DI S.O.

DRIVER

LINGUAGGIO MACCHINA

ARCHITETTURA I/O

INTERFACCIA I/O

Figura 1.1 Strati del sistema I/O

1.1 Interfaccia I/O

Diremo in generale interfaccia di I/O l'apparecchiatura che si interpone fra periferia e processore; il

processore la vede come l'oggetto da e verso il quale si effettua l'input o l'output e nei suoi riguardi

l'interfaccia si presenta con una determinata architettura, suddivisa ad esempio in sezione d’ingresso e

sezione di uscita, con uno o più registri da e verso i quali il processore invia i suoi messaggi. Dall'altro

lato, l’interfaccia si presenta adattata alle esigenze logiche ed elettroniche della periferia.

In particolare, l'interfaccia può implementare gli aspetti più elementari del protocollo di colloquio

(cfr. § 2).

1.2 Architettura I/O

L'architettura della sezione di I/O di un processore definisce il numero e il tipo dei segnali, dei bus e

delle linee di collegamento fra CPU ed interfaccia, la loro organizzazione e struttura. Essa dipende da

un lato dalla restante architettura del sistema e dall'altro dal tipo di interfaccia che si ipotizza possa

essere collegata.

Tutte le istruzioni del linguaggio macchina sono eseguite mediante operazioni più elementari, che

abbiamo detto microoperazioni, definite dall’architettura di macchina. L'architettura I/O definisce

dunque le microoperazioni con le quali si compongono le istruzioni di I/O; tipicamente esse consistono

nello spostamento di un dato da o verso un registro dell’interfaccia, nell'analogo spostamento di un bit

di controllo o nell’interrogazione del suo stato.

1.3 Linguaggio macchina

Per la costruzione dei programmi di I/O, il processore definisce un linguaggio macchina, che

contiene alcuni codici operativi specificamente dedicati alla esecuzione delle istruzioni di I/O; per

ciascuna di esse, inoltre, ne definisce la semantica in termini di sequenza di microoperazioni del livello

architettura.

Un’istruzione del linguaggio macchina mantiene sempre un contenuto operativo molto elementare,

realizzabile con un’unica o con poche microoperazioni, ed in genere molto "distante" da quella che è la

"operazione di I/O" così come viene vista al livello applicativo.. Ad esempio, un’istruzione in

linguaggio macchina consente il trasferimento di 8 bit da un bus esterno ad un registro interno del

2 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

processore e non si occupa neanche del problema di sincronizzazione, mentre sul piano applicativo

l'operazione di I/O è il trasferimento di un dato a 32 bit (o addirittura di un blocco) da un supporto

periferico alla memoria del processore, opportunamente sincronizzato, con annessa la problematica del

controllo di errore.

1.4 Driver

A causa della ridotta potenza operativa delle istruzioni in linguaggio macchina rispetto alle

operazioni di I/O, è comunque necessaria l'interposizione di un software per il pilotaggio delle

apparecchiature periferiche. Questo software è a sua volta strutturato in distinti livelli nei quali via via

si implementa il colloquio fra sistema centrale e periferia (cfr. § 2) e si collega l'input-output con il

sistema operativo e con il linguaggio di programmazione.

Il livello più elementare di tale software è costituito dal cosiddetto driver (pilota) che effettua il

trasferimento di un messaggio completo dalla periferia ad un buffer di memoria o viceversa, ove:

"messaggio completo" è quello definito caso per caso dal sistema (può essere un carattere, un rigo

- o una pagina di stampa, un blocco di caratteri, un record fisico di una memoria di massa e così via);

- "buffer" è un'area di memoria appositamente a ciò destinata.

In tale trasferimento debbono intendersi comprese tutte le necessarie operazioni più elementari; esse

sono implementate nel driver ove non siano già implementate nei livelli inferiori. Ad esempio, il driver

o i livelli inferiori comprendono la sincronizzazione, l'invio dei comando necessari e l’interpretazione

dei messaggi di stato (cfr. § 2).

1.5 Primitive del sistema operativo

Lo strato del driver e quelli di più basso livello gestiscono essenzialmente i problemi più elementari

del colloquio, facendo avvenire l'operazione di I/O fra un buffer di memoria ed una specifica unità

periferica, entrambi in genere individuati parametricamente. Nella effettuazione delle operazioni di I/O

occorre peraltro tener conto anche di problemi più generali di gestione del sistema, come l’allocazione

dei buffer in memoria e l’associazione di unità periferiche "logiche" ad unità fisiche, problemi

tipicamente gestiti dal sistema operativo.

Il sistema operativo, pertanto, crea in genere uno strato logico ad un livello relativamente alto, nel

quale sono definite operazioni di I/O più sofisticate e complete rispetto a quelle dei driver di I/O, quali

la creazione di un buffer, l’associazione di un’unità fisica ad un’unità logica, l’esecuzione di un input o

di un output rispetto ad una data unità logica ed un dato buffer e così via.

1.6 Primitive del linguaggio

Se si pensa ad una operazione di I/O così come concepita da un linguaggio ad alto livello, essa

consiste nel trasferimento di dati identificati da variabili del programma da o verso unità periferiche o

archivi individuati logicamente con nomi mnemonici. Ciascun linguaggio di programmazione definisce

inoltre proprie istruzioni di I/O che ipotizzano particolari strutture logiche degli archivi, particolari

tecniche di accesso e così via. Le istruzioni di I/O dei singoli linguaggi richiedono pertanto un livello

ulteriore di software e di primitive, al quale fanno riferimento i traduttori di linguaggio.

2 Il colloquio fra CPU e periferia

2.1 Il Protocollo di colloquio

Lo scambio di messaggi fra due apparecchiature prende il generico nome di colloquio, la disciplina

che lo regola è il protocollo. I protocolli costituiscono un problema più ampio di quanto non interessi in

questa sede: essi, infatti, riguardano in generale la vasta problematica delle reti di calcolatori, sono

anche molto complessi e talora definiti in standard internazionali; in questa sede, invece, tratteremo

soltanto il protocollo di trasmissione fra un elaboratore e la sua immediata periferia, che, pur

ispirandosi ai medesimi principi, è molto più elementare.

Supporremo dunque che lo scambio di messaggi avviene tra il sistema centrale, ove esiste un

programma di I/O ed un’unità periferica asservita; lo scambio di messaggi, dunque, non è allo stesso

livello fra le due apparecchiature: è un processore del sistema centrale che, eseguendo il programma,

controlla le operazioni.

I protocolli variano con i bus di collegamento nonché con l'unità periferica; nel seguito tuttavia si

sottolineano gli aspetti concettuali comuni, come premessa allo studio della sezione d’ingresso/uscita

dei processori e delle annesse istruzioni in linguaggio macchina.

3 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

2.2 Messaggi scambiati fra CPU e periferia

Sul piano concettuale, un’operazione di uscita consiste nell’invio alla periferia da parte della CPU di

un insieme di messaggi (dati, comandi, segnali di controllo), tali che un blocco di dati sia trasferito

dalla memoria ad uno specifico supporto periferico, quale il foglio di carta della stampante, lo schermo

video, una memoria di massa, etc. Analogamente, un’operazione d’ingresso produce il trasferimento da

un supporto periferico (una tastiera, una memoria di massa, etc.) alla memoria.

Fra CPU e periferia fluiscono dunque dati in entrambe le direzioni: verso la periferia per le

operazioni di uscita, verso il sistema centrale per quelle d’ingresso. Ma oltre ai dati fluiscono anche

altri messaggi: poiché in ogni caso è la CPU ad eseguire il programma di I/O, questa invia comandi alla

periferia ed è "informata" sullo stato di quest'ultima, in modo da potere condizionare di conseguenza lo

sviluppo del programma.

Dalla CPU alla periferia fluiscono dunque appositi comandi, che "ordinano" l’esecuzione di una

determinata operazione, ad esempio "inizia la trasmissione", "invia il dato", "arresta il movimento",

"riavvolgi il nastro", "seleziona una determinata traccia nel disco", "vai a capo pagina", etc.

In direzione opposta fluiscono stati, cioè indicazioni che sintetizzano le condizioni di funzionamento

della periferia e gli eventi accaduti, ad esempio "sono pronta", "errore", etc. Il programma, infine, invia

i comandi e recepisce gli stati ad esempio se la periferia è pronta inizia la trasmissione dei dati, se c'è

stato un errore ripete la trasmissione e così via. Assumeremo dunque un modello di riferimento secondo

il quale i messaggi scambiati fra CPU e periferia sono così classificati:

- Messaggi in input: dato, stato

- Messaggi in output: dato, comando

2.3 Parallelismo delle trasmissioni

Il sistema centrale e la periferia sono fra loro collegati mediante appositi bus con parallelismo di un

bit, un carattere o una parola-macchina, mentre i messaggi che essi devono scambiarsi possono avere la

medesima dimensione in bit o anche quella di un più ampio blocco.

Diremo messaggio elementare quello con parallelismo pari ad un byte oppure una parola del

processore.

Eventuali messaggi o trasmissioni con parallelismo diverso (bit o blocco) saranno trattati solo

esplicitamente.

2.4 Sincronizzazione dei messaggi elementari

I messaggi inviati in entrambi le direzioni debbono essere "sincronizzati", nel senso che

l'apparecchiatura ricevente deve essere in qualche modo "informata" dell’istante in cui il messaggio è

effettivamente in arrivo. Una soluzione semplice del problema si ottiene con l'ausilio di appositi segnali

di campionamento (strobe).

Un semplice modello di riferimento si ottiene affiancando a ciascun messaggio un segnale di strobe

che definisce l'istante in cui il messaggio stesso può essere acquisito dalla stazione ricevente:

Diremo strobe-in il segnale per la sincronizzazione verso la CPU e strobe-out quello verso la

periferia.

La CPU, dunque, gestisce anche i segnali di strobe; peraltro, per le sue caratteristiche di macchina

programmabile, essa può gestire tale problema, oltre che via hardware come qualsiasi altra

apparecchiatura elettronica, anche via software, mediante apposite istruzioni per l'invio dello strobe-out

e per l’interrogazione dello strobe-in (cfr. § 12) .

2.5 Segnali di controllo

La CPU e la periferica si scambiano, oltre ai messaggi di cui sopra (dati, comandi, stati), appositi

segnali di tempificazione (strobe-in e strobe-out di cui al punto 1.4) e segnali di controllo.

Fra i segnali di controllo assumono particolare importanza i seguenti:

- ack, nack (acknowledge): indica in generale "dato riconosciuto";

4 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

- nack: dato non riconosciuto (not ack)

- err: errore

- req: richiesta di dato

- end: fine

Tali segnali assumono significati particolari nel contesto dei singoli protocolli e sono in genere

realizzati mediante singoli bit. In protocolli di rete gli stessi messaggi possono essere invece realizzati

attraverso appositi blocchi di caratteri.

2.6 Trasmissioni a blocchi

Se si escludono i casi banali, in genere occorre trasmettere un blocco di N>1 messaggi elementari

dalla memoria centrale alla periferia o viceversa; si pensi ad esempio al trasferimento di un intero

record di memoria di massa, di un rigo di stampa o, in generale, del contenuto di un buffer periferico.

Diremo in tal caso che si ha una trasmissione a blocchi. Con riferimento al modello di cui sopra, la

trasmissione a blocchi può essere una trasmissione di dati, di comandi o di stati.

Una trasmissione a blocchi è caratterizzata da un insieme di parametri che definiscono

fondamentalmente l'indirizzo di memoria iniziale (A) del blocco e la sua lunghezza (N); s’intende poi

che il blocco si sviluppa da A ad indirizzi crescenti (A, A+1,.., A+N-1) o decrescenti (A, A-1,...,

A-N+1).

3 Le fasi del colloquio

3.1 Apertura, corpo e chiusura

Il colloquio che si stabilisce tra CPU e periferia ha in generale l'obiettivo di trasmettere dati nell'una

o nell'altra direzione e realizza tale obiettivo attraverso operazioni che verificano la possibilità di

iniziare il colloquio, effettuano la trasmissione vera e propria, controllano lo stato delle apparecchiature

ed il verificarsi di errori.

Nei casi più complessi, i protocolli definiscono apposite fasi, quali apertura, corpo e chiusura e

forniscono le regole per ciascuna attività inclusa nelle singole fasi; nei casi più semplici non esiste

un’articolazione definita del colloquio, ma in ogni caso questo deve affrontare alcuni problemi tipici

che qui si pongono in evidenza.

3.2 Selezione della periferia

Alla CPU sono in generale collegati, direttamente o indirettamente, più sistemi periferici, a loro

volta connessi a più unità; i supporti di queste ultime possono consistere in aree di memoria

indirizzabili (si pensi alla memoria di massa). È pertanto necessario che nel colloquio siano inserite le

operazioni necessarie alla selezione della singola unità periferica e, al suo interno, delle posizioni del

supporto da o per il quale il movimento di dati deve avvenire. Si rinvia al seguito (cfr. § 5) per un

approfondimento del problema.

3.3 Corpo della trasmissione

Una seduta di colloquio tra CPU e periferia è in genere dedicata alla trasmissione di un certo numero

di dati elementari; a seconda dei casi, dunque, si trasmette un insieme di dati singoli, un unico blocco

di dati oppure un insieme di blocchi di dati.

3.4 Controllo di errore

Nel colloquio con periferiche più sofisticate o comunque in sistemi più completi si prevedono

operazioni di controllo su eventuali errori o funzionamenti anomali; apposite fasi del colloquio possono

essere destinate a tale scopo.

Si ricorda che il problema dei controlli di errore in trasmissione si risolve in generale trasformando i

messaggi in messaggi ridondanti ed effettuando in ricezione un controllo di compatibilità fra il

messaggio ricevuto e le regole che esso deve verificare affinché sia corretto. Il controllo più semplice è

quello con singolo bit di parità (altri sono con l'aggiunta di più bit di parità o con caratteri di controllo

appositi): ad ogni messaggio trasmesso viene aggiunto un bit che rende complessivamente pari (o

dispari) il numero di bit "1" del codice: il trasmittente, allora, deve avere la capacità di calcolare ed

aggiungere tale bit ed il ricevente di controllare la parità del codice. Il protocollo di colloquio definisce

da un lato le regole attraverso le quali il sistema individua un errore e dall'altro quali sono le azioni

5 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

conseguenti.

Alcuni protocolli localizzano alla fine del colloquio la fase di controllo di eventuali errori, da

implementare con la tecnica dello scambio di comandi e stati; altri protocolli prevedono un controllo

continuo ed un’eventuale sospensione del colloquio in caso negativo. Ad esempio, una trasmissione a

blocchi potrebbe essere sospesa per una risposta "errore" da parte della stazione ricevente, altri

controlli potrebbero essere effettuati attraverso la ricezione di uno "stato finale" della periferia.

Circa eventuali azioni da intraprendere in conseguenza di un errore, il protocollo fissa la strategia: il

caso più semplice è l'abbandono dell'operazione con comunicazione dell'errore al programma di utente,

il caso più diffuso è quello di tentare un certo numero di volte l'operazione, abbandonandola solo se

l'errore risultasse persistente.

4 La sincronizzazione. Tecnica asincrona e sincrona

Un problema fondamentale nelle operazioni di I/O è quello della sincronizzazione, che si può vedere

a tre distinti livelli:

- per individuare l'inizio di una trasmissione (o di un blocco di dati, di un "frame") su una linea seriale:

esistono due distinte tecniche, asincrona (o start/stop) e sincrona (o tipo SYNC/SYNC/.../START),

non trattate in questo capitolo;

- a livello del messaggio elementare: come si è visto al § 2, avviene a mezzo di segnali di strobe;

- a livello del colloquio, per individuare il susseguirsi di messaggi: questa tecnica, qui illustrata in

[1] .

dettaglio, può essere anch'essa asincrona oppure sincrona

4.1 Tecnica asincrona

Una diffusa tecnica con la quale si realizza il colloquio fra due apparecchiature A e B è la tecnica

asincrona.

Tecnica asincrona: ad ogni messaggio inviato da A a B segue un messaggio di risposta da B

ad A.

Ad esempio, un dato è la risposta al comando (o al segnale) req ed un ack è la risposta ad un dato.

La tecnica è detta asincrona in quanto lo sviluppo del colloquio è condizionato dall'interno del

sistema, con le risposte reciproche fra A e B. Essa ha in primo luogo funzioni di tempificazione: la

risposta fornisce infatti una informazione che condiziona l'avanzamento del colloquio, nel senso che un

ulteriore messaggio è inviato solo dopo la ricezione della risposta. Nella fig. 4.1 è ad esempio mostrato

lo schema fondamentale per lo scambio di dati con la tecnica di cui sopra: in input la CPU invia una

"richiesta dato" (req) solo dopo aver acquisito il dato precedente, in output invia il dato successivo solo

dopo aver ricevuto un "dato ricevuto" (ack) dalla periferia.

Input Output

sistema centrale periferia sistema centrale periferia

·········· ·········· ·········· ··········

invia req invia dato

invia dato acquisisce dato

acquisisce dato invia ack

invia req invia dato

invia dato acquisisce dato

acquisisce dato invia ack

·········· ·········· ·········· ··········

[2]

Figura 4.1 Schemi di colloquio asincrono

Se la risposta fornisce informazioni sul buon esito della trasmissione, la tecnica asincrona consente

inoltre un controllo del colloquio, determinandone sviluppi diversi a seconda della risposta ricevuta. Ad

esempio se in output si prevedesse oltre alla risposta ack anche una nack (non riconosciuto), il

colloquio potrebbe proseguire per una via alternativa se pervenisse quest'ultima; analogamente se in

input pervenisse, in risposta ad un req, un err. invece di un dato.

Per un corretto funzionamento di un colloquio asincrono è necessario che si tenga conto della

6 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

cosiddetta condizione di time-out.

Condizione di time-out: non perviene alcuna risposta entro limiti di tempo accettabili

prefissati.

Questa condizione si verifica per effetto di guasti o di condizioni anomale: al fine di evitare che il

sistema si blocchi in attesa della risposta, i protocolli fissano in generale un tempo limite, trascorso il

quale si prende atto che la risposta non è pervenuta e si opera di conseguenza (ad esempio ritenendo

errata la trasmissione).

4.2 Tecnica sincrona

In antitesi alla tecnica asincrona, esiste quella cosiddetta sincrona.

Tecnica sincrona: è basata esclusivamente sull'uso di un segnale esterno di tempificazione

(clock).

La tecnica si basa, quindi, sulla misura di intervalli di tempo: ad esempio, A invia a B dati a

frequenza preassegnata.

Con riferimento agli schemi di fig. 4.1, ad esempio, mancano i messaggi req ed ack; in input si

esclude dunque il controllo da parte della CPU ma la periferia invia comunque il dato

indipendentemente dalla richiesta; in output la CPU, che in genere è più veloce, deve essere rallentata

per consentire alla periferia le successive ricezioni.

In realtà, un vero e proprio colloquio si ottiene soltanto con la tecnica asincrona.

5 La selezione della periferia

5.1 Topologia del collegamento

Come si è già accennato, uno dei problemi gestiti dalle operazioni di I/O è quello della selezione

della periferia, che qui si affronta al livello di concetti generali. Uno schema topologico di principio

relativo al collegamento fra CPU e periferia è rappresentato da un albero ove la radice costituisce il

nucleo centrale della CPU e le foglie le singole unità periferiche. Ciascun nodo può essere collegato a

quelli del livello successivo con una diversa tecnica di collegamento, come di seguito specificato.

Tecniche di collegamento fra i nodi:

- punto-punto: attraverso bus dedicati (fig. 5.1a)

- multi-punto: attraverso un bus comune (fig. 5.1b)

5.2 Selezione per collegamenti punto-punto e multi-punto

Nel collegamento punto-punto (fig. 5.1a), il nodo di livello i seleziona quello di livello successivo in

modo non dissimile da come opererebbe per selezionare al suo interno distinti registri: riceve dal livello

precedente l'indirizzo del nodo (o del registro), con il quale seleziona il bus dedicato: la selezione è

interna al nodo di livello i.

Nel collegamento multi-punto (fig. 5.1b), invece, è il nodo di livello i+1 che collabora con quello di

livello i per essere selezionato; a tale scopo, riceve dal nodo di livello i il proprio indirizzo (oppure un

apposito segnale di selezione).

Si noti dunque che un indirizzo ricevuto da un’apparecchiatura può avere due significati distinti:

indica o una selezione che l'apparecchiatura deve effettuare al suo interno come nel caso punto-punto

(selezione nella apparecchiatura), oppure la sua stessa selezione come nel multi-punto (selezione della

apparecchiatura).

5.3 Selezione seriale o parallela

Nel più diffuso modello di collegamento multi-punto, la tecnica di selezione può essere parallela o

seriale. Quella parallela è basata sull'operazione simultanea su due bus, dei quali uno trasmette il

messaggio e l'altro l'indirizzo: gli schemi di fig. 5.1b rappresentano allora i bus fisici del collegamento

fra le apparecchiature.

Con la tecnica seriale non esiste invece un apposito bus per l'indirizzo, ma questo viene trasmesso

7 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

con una logica sequenziale su di un unico bus che in momenti diversi trasmette i dati; l'apparecchiatura

ricevente distingue l’indirizzo dai dati in quanto essi si susseguono nel tempo. La tecnica di selezione

può allora essere descritta attraverso un automa: l’apparecchiatura ricevente può essere in uno stato di

"riposo" RIP o in uno stato "attivo" ATT, ove trasmette o riceve dati e transita da RIP ad ATT se riceve

il proprio indirizzo Ip, ritorna allo stato di riposo se riceve il codice F di "fine stato attivo" (fig. 5.1c).

Figura 5.1 Schemi di collegamento per la selezione:

a) a bus dedicato (punto-punto); b) a bus comune (multi-punto)

5.4 Selezione dinamica o preselezione

In qualche caso la selezione avviene dinamicamente, ogni volta che si trasmette un dato; in altri,

avviene una tantum, all'inizio del colloquio, cioè l’apparecchiatura viene preselezionata e mantiene il

suo stato finché non venga esplicitamente rimosso.

La selezione dinamica si realizza agevolmente con la tecnica parallela multi-punto, che prevede

l’invio in parallelo di dati ed indirizzo. La preselezione, invece, è tipica del collegamento seriale

multipunto.

La tecnica di collegamento punto-punto può essere infine realizzata sia selezionando volta a volta il

nodo di livello i+1, sia preselezionandolo: dipende dalla struttura interna del nodo di livello i.

6 Architettura del sottosistema I/O

I sistemi di I/O si dividono in due categorie:

- sistemi con interfacce passive

- sistemi indipendenti: DMA e processori I/O

Nei primi, la CPU esegue direttamente le istruzioni di I/O operando attraverso l'interfaccia, nei

secondi le delega ad apposite apparecchiature attive, dette DMA oppure ai processori di I/O (nel

passato, venivano anche dette canali).

Per entrambi, lo schema di collegamento fra il processore centrale ed un organo periferico finale

(tastiera, stampante, disco, etc.) prevede l’interposizione di più apparecchiature che via via adattano la

logica e l'elettronica delle macchine da connettere.

6.1 Sistemi con interfacce passive

Figura 6.1- Schema di collegamento con la periferia.

8 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

In fig. 6.1 è mostrato uno schema di principio del collegamento fra CPU e periferia per un sistema

che gestisca direttamente le istruzioni di I/O: la CPU è collegata attraverso un bus a più interfacce I/O;

ciascuna a sua volta collegata con uno o più unità di controllo della periferia che si connettono con

l'unità periferica in senso stretto.

L’interfaccia di I/O è un’apparecchiatura, talora indipendente e talora allocata nel sistema centrale,

che da un lato si collega con il processore e dall'altro con la periferia. Nelle moderne architetture a

microprocessori spesso è realizzata con una "scheda" che si inserisce negli alloggiamenti a ciò

predisposti dal sistema centrale.

Le unità periferiche, dal canto loro, sono composte essenzialmente di due sezioni: l'una, di tipo

elettromeccanico, che provvede alla vera e propria immissione od emissione di dati (la tastiera, il video,

il trasportatore del disco, etc.) e l'altra, essenzialmente di tipo logico, che da un lato interfaccia con i

segnali elettromeccanici della prima e dall'altro con le linee verso il sistema centrale.

La natura ed il numero dei segnali scambiati sono diversi fra le diverse coppie di apparecchiature:

fra la CPU e le interfacce (fig. 6.1, sezione A) il collegamento avviene così come fra gli altri organi

interni del sistema quali la memoria; fra le interfacce e le unità di controllo periferico (sezione B)

fluiscono i messaggi di cui al protocollo di trasmissione; fra l'unità di controllo periferico e la parte

elettromeccanica (sezione C), infine, viaggiano segnali tipici della singola unità periferica, quali i dati

codificati secondo le regole di quest'ultima o i segnali di attuazione degli organi elettromeccanici.

6.2 Sistemi a canale indipendente

Figura 6.2. Schema temporale di funzionamento di un canale

Nei sistemi più evoluti, la CPU non gestisce direttamente le operazioni di input/output, ma le delega

[3] (cfr. §

ad una "interfaccia intelligente” o ad un altro processore, che diremo genericamente canale

6.2.1, 6.2.2), in grado di eseguire autonomamente dette operazioni, senza sottrarre tempo alla CPU. In

tal caso, la CPU gestisce direttamente operazioni di avvio, di arresto e in generale di controllo del

funzionamento del canale, mentre è quest'ultimo che esegue le vere e proprie operazioni di I/O.

In fig. 6.2 è mostrato uno schema temporale di funzionamento di CPU, memoria e canale: all'inizio

(t<a1) il canale è inattivo e la CPU esegue le sue istruzioni, accedendo alla memoria quando necessario;

al tempo a1 la CPU è chiamata ad eseguire un’istruzione di "via I/O", con la quale delega al canale

l’esecuzione delle operazioni di I/O, essenzialmente una o più trasmissioni a blocchi; al tempo a2 il

canale inizia l'esecuzione di tali operazioni mentre la CPU prosegue con l'esecuzione di altre istruzioni;

il funzionamento in parallelo di CPU e canale prosegue fino al tempo b, quando il canale completa il

suo compito.

Il collegamento fra CPU, memoria e canale è schematicamente mostrato in fig. 6.3. Il canale è

collegato direttamente con la memoria, secondo uno schema di collegamento detto DMA, Direct

Memory Access: tale schema consente il funzionamento parallelo fra CPU e canale, in quanto la

[4] . Verso la periferia, il

trasmissione a blocchi avviene in modo indipendente dai circuiti della CPU

canale è collegato, come la CPU in fig. 6.1, attraverso apposite interfacce; il canale infatti assume le

funzioni che nel modello precedente appartenevano alla CPU.

9 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 6.3- Modello con canali indipendenti: a) a bus dedicati; b) a bus comune

La CPU, dunque, gestisce istruzioni di avvio del canale, comunicando a questo i parametri necessari

alla definizione delle operazioni da eseguire; inoltre, può gestire istruzioni di arresto del canale e di

interrogazione del suo stato, ad esempio per conoscere se è disponibile per effettuare nuove operazioni,

oppure se le operazioni precedenti si sono concluse con successo o con errori.

Le capacità autonome del canale variano da quella dell’esecuzione di soltanto una singola

trasmissione a blocchi a quella dell’esecuzione di un vero e proprio programma di I/O; tratteremo i due

casi come due sottomodelli.

6.2.1 Modello DMA

Diremo semplicemente DMA, con dizione diffusa per i prodotti commerciali che sottolinea

soprattutto la sua capacità di accedere indipendentemente alla memoria, un’apparecchiatura che esegue

una trasmissione a blocchi per volta. La CPU, all'atto dell'avvio, gli comunica i parametri della

trasmissione da eseguire.

Modello di processore I/O (PIU)

6.2.2

Diremo Processore d’ingresso-uscita, PIU, un’apparecchiatura che è un vero e proprio processore

dedicato alle operazioni di I/O; in quanto tale, esso sviluppa un algoritmo di "fetch-execute" di

istruzioni, con il quale esegue un "programma di I/O". A tale scopo sono utilizzabili sia processori

costruiti ad hoc sia processori "general purpose". La prima soluzione è tipica delle architetture dei

[5]

mainframe del passato : essendo specializzati costruttivamente per l'esecuzione di operazioni di I/O,

possiedono un repertorio di codici operativi particolare; La seconda soluzione è quella che prevale

nelle architetture moderne: essa specializza il processore non costruttivamente, ma per le funzioni che

assume nel sistema.

In entrambi i casi, il PIU assume in pieno il ruolo che nel modello di interfaccia passiva era assunto

dalla CPU; esso dunque esegue trasmissione singole o a blocchi e sviluppa in generale un "programma

di I/O". La CPU, all'atto dell'avvio del PIU, gli comunica il programma da eseguire o

trasmettendoglielo integralmente (se il PIU ha una memoria-programma indipendente) oppure

fornendogli l’indirizzo di memoria ove esso inizia (se la memoria-programma del PIU è condivisa con

quella della CPU).

7 Caratteristiche generali dei linguaggi macchina I/O

7.1 Sintassi e semantica del linguaggio

Si dice in generale che un’operazione è introdotta nella sintassi di un linguaggio di programmazione

se esiste una specifica struttura (in linguaggio macchina uno specifico codice operativo) che la prevede;

se invece l'operazione va programmata usando generiche istruzioni con particolari operandi e/o

particolari sequenze di istruzioni si dice che essa è ottenibile per via semantica.

In linea di principio, la scelta sintattica è orientata ad una specifica soluzione e pertanto dovrebbe

presentare la massima efficienza possibile per quella soluzione, ma è poco flessibile. Per contro, la

scelta semantica possiede primitive più elementari e pertanto il massimo grado di flessibilità, ma può

10 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

perdere in efficienza per la realizzazione di operazioni complesse. Ovviamente, così come in tutti i

problemi dell'informatica, i modelli realizzati sintatticamente da un sistema sono in genere realizzabili

semanticamente da sistemi con primitive più elementari.

La realizzazione del colloquio di I/O avviene per mezzo di istruzioni in linguaggio macchina che, in

conformità a quanto detto finora, effettuano trasmissione di dati, di comandi e analisi degli stati della

periferia, ma ciò può avvenire a mezzo di soluzioni sintattiche o semantiche.

In linea di principio (e nel processo storico di evoluzione delle architetture) è possibile assegnare

alle istruzioni in linguaggio macchina diversa "potenza" operativa Da un estremo, ad esempio, il

linguaggio potrebbe comprendere due sole operazioni, input ed output di un dato, che assumono

soltanto ai livelli superiori significati diversi (trasmetti dato, trasmetti comando, etc.) e che ancora ai

livelli superiori siano inclusi gli elementi del protocollo di colloquio. In altri termini, la sintassi del

linguaggio macchina è estremamente povera tutte le soluzioni avvengono al livello semantico: è questa

la linea di tendenza delle architetture moderne, l'assunzione di modelli elementari semplici nel

linguaggio macchina, rinviando ai livelli superiori la soluzione dei problemi più complessi.

Dall'altro estremo è possibile che già a livello di linguaggio macchina i messaggi siano differenziati,

ad esempio, esistono distinti codici operativi per inviare dati o comandi o per ricevere stati: era questa

la tendenza nei vecchi main frame.

Le istruzioni fanno riferimento ad un modello dell’interfaccia o della periferica collegata, almeno

per quanto attiene alla loro struttura in termini di registri da e verso i quali si realizzano le trasmissioni

di dati. Nella soluzione sintattica delle vecchie architetture, tale modello è specificato al livello di

linguaggio macchina, ad esempio prevede distinti registri per trasmettere dati o comandi, in quella

delle architetture moderne ciò avviene semanticamente a livello di programma, ad esempio variabili

diverse del programma rappresentano dati o comandi.

In ogni caso, le istruzioni del linguaggio macchina sono definite in base ad un modello che "vede" il

mondo esterno in modo semplice e schematizzato; il mondo reale, costituito dalle effettive periferiche

collegate al sistema, nel quale occorre implementare il colloquio più o meno complesso, non è invece

trattato dal linguaggio macchina, ma soltanto ai diversi livelli superiori del sistema, ad esempio nel

driver della specifica periferica.

7.2 Caratteristiche generali del linguaggio macchina

Il linguaggio macchina realizza le operazioni elementari inquadrandole nel-l’architettura

complessiva del processore e nella tecnica generale di realizzazione di tutte le istruzioni in linguaggio

macchina; valgono dunque per le istruzioni di I/O tutto quanto esposto al capitolo del linguaggio

macchina in generale: la sintassi delle istruzioni, il riferimento implicito o esplicito agli operandi, la

loro natura (immediato, registro o memoria) e così via.

Le caratteristiche generali dei linguaggi macchina sono condizionate dalle scelte sintattiche o

semantiche effettuate in una serie di problemi di seguito illustrati:

· Esistenza o mancanza d’istruzioni I/O: non tutti i linguaggi macchina comprendono al livello

sintattico istruzioni di I/O. In molti casi (si veda in seguito modello “memory mapped” del § 11)

vengono usate per realizzare tali operazioni istruzioni che nascono per scopi diversi, come quelle di

load o di store. È questo un caso limite ma molto diffuso: tutte le operazioni di I/O vengono

costruite adoperando semanticamente istruzioni non specificamente costruite per l'I/O; non è

dunque predefinito alcun modello di I/O, che può essere costruito con la flessibilità del software e

prendendo spunto dai modelli sintattici degli altri linguaggi macchina.

Selezione della periferia.

· La selezione della periferia avviene in linguaggio macchina o con la tecnica della selezione dinamica oppure

con quella della preselezione (cfr. §.5.5). Nel caso dell’indirizzamento dinamico, il linguaggio macchina

prevede che in ciascuna istruzione sia inserito un operando che funge da indirizzo di selezione; quest’ultimo

viene inviato sul bus-indirizzi oppure (nelle architetture storiche) realizza una selezione interna. Nel c

preselezione, il linguaggio macchina deve consentire apposite istruzioni (in via semantica o sintattica)

selezionano la periferia; ad esse seguiranno le istruzioni per l’invio o la ricezione dei dati, che sono riv

comunque alla periferica preselezionata.

· Sincronizzazione.

Problema fondamentale per la scrittura di un programma di I/O è la sincronizzazione delle operazioni: un inp

deve essere effettuato quando il dato in ingresso è pronto, un output quando la periferica è in grado di assorbirlo

e comunque deve essere "segnalato" alla periferica affinché questa lo acquisisca. A tale scopo si adoperano

segnali strobe-in, strobe-out (cfr. § 1.4) e di controllo (cfr. § 2.5). Solo in casi particolari il linguaggio macchina

gestisce sintatticamente questi segnali; nella maggioranza dei casi essi sono trattai semanticamente da

11 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

programma di I/O (cfr. ad esempio § 12). Trasmissioni a blocchi.

· Una trasmissione a blocchi può essere realizzata o con un DMA appositamente interfacciato con la CPU,

oppure con apposite istruzioni a blocchi gestite direttamente dalla CPU oppure ancora con istruzioni gestite da

un processore di I/O.

8 Modello funzionale di interfaccia

Un’interfaccia svolge essenzialmente una funzione di transito di messaggi da o per la periferia ed

una funzione di controllo, intesa come tempificazione, controllo di errori e definizione del suo stesso

comportamento. Essa può pertanto essere schematizzata attraverso i tre registri di cui alla fig.8.1a):

RI: registro-ingresso

var

var RO: registro-uscita

var RC: registro-controllo

che sono registri di transito da o per la periferia (RI, RO) e per lo scambio con la CPU di messaggi di

controllo (RC). Figura 8.1 Modelli di interfaccia:

a) modello a 3 registri; b) modello funzionale a tre sezioni;

Più generale, l’interfaccia è costituita da tre intere sezioni, dedicate rispettivamente alle funzioni di

input, output e controllo, ciascuna delle quali composta da più registri. Assumeremo pertanto il modello

funzionale di cui alla fig.8.1b), che può così descriversi, considerando astratti i 3 registri RI, RO, RC:

tipo registro-ingresso =

cartesiano

dato: registro-dati (8.1')

stato: registro-stati

end;

tipo registro-uscita=

cartesiano

dato: registro-dati (8.1")

comando: registro-comandi

end;

tipo registro-controllo =

cartesiano

stato: registro-stati

comando: registro-comandi (8.1''')

flag: array [1..n] of bit

end

Modello funzionale di interfaccia

Un’interfaccia è composta di 3 sezioni:

- d’ingresso, con registro-dato e registro-stato

- di uscita, con registro-dato e registro-comando

12 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

- di controllo, con registro-stato, registro-comando e flip-flop di controllo.

Il modello recepisce lo schema di colloquio di cui al § 2, ove i messaggi sono suddivisi in dati,

comandi e stati. In particolare, la sezione di uscita distingue i messaggi in dati veri e propri (RO.dato)

ed in comandi (RO.comando) che l’interfaccia inoltra verso la periferia, quella d’ingresso in dati

(RI.dato) e stati (RI.stato) destinati alla CPU.

La sezione di controllo è schematizzata con alcuni flip-flop (RC.flag[i]) che svolgono funzioni

elementari e con due registri (RC.stato, RC.comando) che svolgono funzioni analoghe a quelle di

RI.stato o RO.comando, ma con riferimento al comportamento dell’interfaccia nella sua globalità e non

della periferia ad essa collegata. Ad esempio:

· un comando in RO.comando è diretto alla periferia; se questa è una stampante potrebbe significare

"vai a capo pagina";

un comando in RC.comando definisce le proprietà dell'interfaccia quali le dimensioni in bit di RI

· ed RO, o se il controllo di errore debba essere per parità o per disparità;

· uno stato in RI.stato è relativo alla periferica e potrebbe significare "carta inceppata";

· uno stato in RC.stato potrebbe indicare che l'interfaccia sta effettuando un’operazione d’ingresso,

che è libera da impegni e così via.

Interfacce che possiedono tali caratteristiche si dicono impropriamente programmabili. Il modello è

quello di principio cui si ispirano le interfacce concrete, senza necessariamente adottarlo alla lettera:

alcune interfacce possiedono solo una o due delle sezioni di cui sopra e le sezioni un numero minore di

registri. In fig.8.2 è mostrato un modello ridotto all'essenziale rispetto a quello di fig. 8.1, che sarà

ampiamente usato in seguito: le sezioni di input ed output possiedono il solo registro-dato e quella di

controllo due soli flip-flop. Il modello corrisponde allo schema fisico di interfaccia ed al modello

[6] e viene ancora oggi usato come modello semantico

sintattico usato da un'architettura del passato

nelle architetture moderne (cfr. § 12).

Fig. 8.2 - Modello funzionale di interfaccia ridotto

Questi modelli funzionali sono realizzati semanticamente nelle architetture moderne, si veda ad

dopo di avere

esempio modello a messaggi differenziati realizzato con quello a registri indirizzabili,

approfondito i due modelli (cfr. §§ 9, 10).

9 Modello fondamentale di programmazione I/O

Facciamo qui riferimento alle architetture di I/O moderne che sono dette aperte in contrapposizione

[7] del passato, alle quali si farà talora riferimento attraverso gli inserti. In

alle architetture chiuse

queste architetture il modello più diffuso è quello che è presentato in questo paragrafo e che diremo

fondamentale.

9.1 L'interfaccia

In primo luogo il modello definisce la struttura dell'interfaccia. A dispetto del modello funzionale

del paragrafo precedente (che in queste architetture è realizzato solo semanticamente), lo schema di

interfaccia “visto” dal linguaggio macchina è molto elementare (cfr. fig. 9.1): il processore vede

soltanto un insieme P di registri singolarmente indirizzabili; CPU ed interfaccia sono collegate

attraverso un unico bus bidirezionale IOD, genericamente detto bus-dati, ed un bus-indirizzi IOA che

seleziona il registro indirizzato. Il messaggio da o per l'interfaccia fa riferimento al registro P[IOA],

che può a seconda del valore di IOA diventare semanticamente il registro-dati, il registro-comandi etc.

13 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 9.1 Modello fondamentale di interfaccia

Nella realtà fisica, il processore è collegato con un insieme di interfacce, ciascuna contenente un

numero discreto di registri: lo spazio degli indirizzi è suddiviso fra le diverse interfacce. L'indirizzo su

IOA ha dunque una duplice funzione: selezione della interfaccia e selezione nella interfaccia (cfr. §

5.3).

Il modello così realizzato completa quello di fig. 6.1a) e consente di collegare apparecchiature

comunque realizzate (e non soltanto quelle di assegnata struttura interna, come avveniva per le

architetture chiuse).

9.2 Le istruzioni

In secondo luogo, il modello definisce la semantica delle istruzioni in linguaggio macchina, cioè le

microoperazioni da esse realizzate. Il modello contiene soltanto istruzioni di ricezione o trasmissione di

un dato singolo (le istruzioni a blocchi, sono presentate nel prossimo paragrafo) e, coerentemente con il

modello di interfaccia, intende un’operazione d’ingresso come quella che porta il dato da IOD

all'interno del processore, una di uscita quella che effettua il trasferimento inverso; in entrambi i casi,

un indirizzo è posto sul bus IOA e pertanto si ha::

- Input: A := IOD; IOA:= B (9.1)

- Output: IOD := A IOA:= B (9.2)

ove A, B sono due operandi, a seconda dei casi e delle tecniche di indirizzamento impliciti od espliciti,

[8] , il

operandi-registri o operandi-memoria Se IOA è l’indirizzo di uno dei registri delle interfacce

modello fondamentale evolve in quello che diremo modello a registri indirizzabili: le operazioni sono

riferite al registro P[IOA].

Modello I/O isolato

9.2.1

Nel modello I/O isolato (in contrapposizione al modello memory mapped) si assume uno spazio di

indirizzamento per l’I/O indipendente da quello di memoria e quindi le (9.1), (9.2) diventano:

Modello a registri indirizzabili (I/O isolato):

- Input: A := P[B] (9.3)

- Output: P[B] := A (9.4)

Modello memory mapped

9.2.2

Nel modello a registri indirizzabili, le istruzioni assumono per il processore un significato simile a

quelle di move da o per la memoria: rispettivamente l'input è simile al load, l'output allo store. Alcuni

processori, sulla base di tale considerazione, non possiedono un’apposita sezione di collegamento con

l'I/O, ma assumono a tale scopo la sezione di collegamento con la memoria, facendo fisicamente e

logicamente coincidere il bus IOA con il bus MA che porta l'indirizzo di memoria ed il bus IOD con il

bus MB del memory buffer (fig. 9.2). Un apposito selettore, decodificando l'indirizzo posto su MA e

riconoscendolo appartenente alla memoria oppure ad uno dei registri di I/O, abilita all’operazione una

delle due apparecchiature.

14 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 9.2. Architettura del modello memory mapped

Il modello è detto memory mapped in quanto i registri di I/O appartengono allo stesso spazio

indirizzabile di memoria: alcuni degli indirizzi di memoria sono "sostituiti" da indirizzi dei registri di

I/O, secondo il modello che segue.

Modello memory mapped:

- Input = load: A := M[B] (9.5)

- Output = store: M[B] := A (9..6)

ove:

- A è un operando-registro, destinazione dell'input o sorgente dell'output;

- B è un indirizzo appartenente allo spazio indirizzabile di memoria ma fisicamente coincidente con

uno dei registri di interfaccia. secondo il modello fondamentale è mostrato

Una esemplificazione di istruzioni semplici di I/O

nell'inserto.

10 La programmazione dei driver

10.1 Modello fondamentale e modelli sintattici

Il modello fondamentale e quello a registri indirizzabili non avanzano nessuna ipotesi sul piano

sintattico sul significato dei dati scambiati fra la CPU e l'interfaccia: a seconda dei casi essi sono veri e

propri dati in transito attraverso l’interfaccia da o per la periferia, comandi inviati alla periferia oppure

stati di questa. Inoltre, i problemi di sincronizzazione non sono gestiti sintatticamente: nessun segnale

di controllo o di tempificazione è sintatticamente affiancato al bus IOD (che invece è di solito

fisicamente affiancato da uno strobe-in ed uno strobe-out per determinare gli istanti in cui

l’apparecchiatura ricevente deve memorizzare il messaggio). A questi problema occorre provvedere per

via semantica.

Per le architetture storiche, viceversa, sono stati usati altri modelli; a due di questi facciamo

particolare riferimento:

· il modello a messaggi differenziati, nel quale la sintassi distingue le nozioni di dato, comando e

stato e prevede codici operativi diversi a seconda dei casi;

il modello a sincronizzazione programmata, nel quale la sintassi definisce una struttura della

· interfaccia e fornisce i codici operativi per la sincronizzazione.; in questo paragrafo è illustrato il

modello fondamentale,

A questi modelli si fa ancora oggi riferimento nella costruzione dei driver di I/O, assumendo a livello

semantico le ipotesi in essi definite sintatticamente.

Per la programmazione del modello a messaggi differenziati con quello a registri indirizzabili si

veda l'inserto. Per la programmazione del modello a sincronizzazione programmata si veda il protocollo

handshake (cfr. § 12).

10.2 Il controllo dei canali indipendenti

Le architetture del passato spesso assumevano sintatticamente l'esistenza di canali indipendenti

15 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

collegati alla CPU e prevedevano apposite istruzioni nel linguaggio macchina per il loro avvio, arresto

e controllo, riservando invece al linguaggio macchina del canale l'esecuzione delle vere e proprie

istruzioni di I/O. Questo modello è sintetizzato in I/O: i canali del passato.

Nelle architetture moderne, invece, per il processore non esiste una sintassi che individua un canale

(un DMA o una PIU) come sottosistema, ma il canale è "semantico": l'apparecchiatura è vista come una

generica periferica (nel caso di modello memory mapped addirittura come un insieme di locazioni di

memoria) e ad essa va inviato un insieme di messaggi, che nei suoi riguardi assumono il significato dei

vecchi modelli, anche se per il processore rappresentano altrettanti "dati" trasmessi. Una istruzione di

"avvio di canale", ad esempio, può essere sostituita da una trasmissione a blocchi in registri di

determinato indirizzo, quale ad esempio:

for k:= 1 to N do P[i+k]:= A[j+k]

I parametri della trasmissione, A[j+k], sono quindi inviati nei registri indirizzabili P[i+k] e

l'apparecchiatura è "avviata". Se l’apparecchiatura è un DMA, ad esempio, le vengono trasmessi i dati

che caratterizzano lunghezza, inizio del blocco di dati da trasmettere e direzione della trasmissione ed il

DMA “parte” per la trasmissione a blocchi, liberando il processore centrale.

Il modelli del passato, pertanto, non hanno soltanto interesse storico ma spesso costituiscono le linee

guida entro le quali individuare i contenuti del software per la costruzione dei driver per il controllo dei

canali.

10.3 Lo scambio degli stati

La ricezione da parte del processore dello stato della periferia e la possibilità di interrogarlo per

condizionare lo sviluppo del programma di I/O è essenziale in ogni sistema che debba implementare un

sia pur minimo protocollo di colloquio. Le architetture chiuse "storiche" risolvevano il problema con

soluzioni hardware, nel senso che le stesse istruzioni di I/O definivano un comportamento che teneva

conto del problema, mentre le architetture aperte che adottano il modello fondamentale lo risolvono via

software, nel driver per la gestione della periferia: un particolare registro del banco P è lo stato della

periferia ed apposite istruzioni di input da P[s] fungono da input di stato.

Per stato della periferia si può intendere un’informazione globale adattabile a qualsiasi periferica,

come "apparecchiatura pronta" o "impegnata in altre operazioni", oppure informazioni di maggior

dettaglio specifiche di ciascuna apparecchiatura, come "dischetto non montato" oppure "carta

inceppata"; la struttura ad albero del collegamento con la periferia (interfaccia o canale, sottocanale,

unità di controllo locale, singole unità periferiche) rende più complesso il problema, in quanto occorre

trattare lo stato dei diversi nodi dell’albero. Il protocollo di colloquio, d’altro canto, è opportuno che

tenga conto di tale classificazione; ad esempio, il comportamento del sistema se la periferica è “non

pronta” potrebbe dipendere dallo stato di maggior dettaglio: è occupata in altra stampa, la carta è

inceppata, la carta è esaurita, etc.

L’acquisizione dello stato può essere quindi gestita su più livelli: ad un primo si acquisiscono

informazioni abbastanza generali per essere comuni a qualsiasi operazione di I/O, ai livelli successivi,

interrogati se necessario, informazioni via via specifiche della singola unità

Per le architetture aperte, ciò significa mettere a disposizione del programmatore di sistema più

registri di stato che rappresentano i diversi livelli e che sono interrogati nelle diverse fasi del

[9]

colloquio .

Un riferimento alle soluzioni adottate al livello sintattica dalle architetture storiche per il problema

dello scambio degli stati fornisce idee di soluzioni.

11 Istruzioni a blocchi

Per istruzione a blocchi si intende un’istruzione che realizza la trasmissione di un blocco di dati da

un supporto periferico alla memoria o viceversa.

In quanto segue supporremo che un’apposita interfaccia gestisca l’operazione, ricevendo dal (o

trasmettendo al) supporto periferico i successivi dati del blocco, che transitano sempre per il medesimo

registro dell’interfaccia. Il modello assume una interfaccia a registri indirizzabili e ipotizza che

l'istruzione definisca:

- l’indirizzo di selezione B,

- l'indirizzo di memoria A del primo dei dati del blocco,

- la lunghezza N del blocco, espressa in numero di dati elementari

16 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

e realizzi l'algoritmo che segue.

- Istruzione a blocchi:

i:=0 ; k:=N; (11.1)

while k>0 do

begin IOA := B;

IOD :=M[A+i] {M[A+i]:= IOD per l'input}

i:=i+1; k:=k-1

end

Nel modello proposto, dunque, un blocco di dati, con indirizzo di memoria da A in poi, viene

trasferito all'indirizzo del registro di interfaccia B o viceversa; nelle architetture reali, invero, la

semantica delle istruzioni può essere più articolata:

- alla trasmissione del dato IOD:=M[A+i] è tipicamente affiancato un segnale di strobe-out;

- la trasmissione può essere resa asincrona (cfr. § 4) con l'impiego di appositi segnali hardware del

ciclo di macchina; in un colloquio sincrono, viceversa sarebbe necessario che la periferia "seguisse"

la frequenza di trasmissioni del processore;

- le istruzioni possono essere completate da informazioni ausiliarie che ne definiscono un

comportamento più articolato; ad esempio, comprendono un’indicazione sul fatto che l'accesso in

memoria sia in senso ascendente o discendente.

È da notare che nel modello memory mapped non esistono istruzioni a blocchi, in quanto

[10] . D’altro canto, nelle architetture

difficilmente ricavabili da analoghe istruzioni di move a blocchi

moderne le trasmissioni a blocchi sono tipicamente realizzate attraverso DMA.

12 Protocollo handshake

La tecnica fondamentale del colloquio asincrono (cfr. fig. 4.1) prevede per l'input un messaggio

"richiesta dato" (req) da parte del processore ed una risposta dato da parte della periferia; la tecnica

elementare di sincronizzazione prevede inoltre che al dato in input sia associato un segnale strobe-in

(cfr. § 2.4). Per l'output, analogamente, ad un dato segue il messaggio di "riconosciuto" (ack) e la

sincronizzazione avviene con uno strobe-out. Un protocollo elementare nel quale il dato sia un dato

elementare (ad esempio un singolo carattere) e i messaggi req, ack semplici segnali binari è detto

handshake.

I passi fondamentali del colloquio sono tipicamente contenuti in appositi programmi che

costituiscono il nucleo del driver di I/O. Tratteremo dunque in questo paragrafo il nucleo dei driver più

elementari, cioè quelli che operano sulla base del protocollo handshake; faremo a tale scopo riferimento

ad un modello detto a sincronizzazione programmata che nel passato è stato usato come modello

sintattico in alcune architetture e che oggi è diffuso a livello semantico. Esso suppone l'interfaccia

realizzata secondo il modello di fig. 8.2.

12.1 Protocollo d’ingresso

Il protocollo handshake d’ingresso avviene con lo scambio dei segnali binari req e strobe-in come

illustrato in fig.13.1, ove lo schema di interfaccia è quello di fig. 8.2, con i due flip-flop C ed F ed un

registro di ingresso, RI[i]. I segnali da e per la periferia sono:

17 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 13.1 Protocollo handshake d’ingresso

- req, segnale collegato al flip-flop C: agisce sulla periferia attraverso il fronte di salita; sul piano della

programmazione, si ottiene la richiesta req ponendo in set il flip-flop C;

- strobe-in, segnale proveniente dalla periferia: agisce come strobe elettronico, consentendo la

memorizzazione del dato in RI ed inoltre svolge una funzione logica, posizionando il flip-flop F, che

può essere interrogato dal programma.

Schematicamente, il colloquio avviene con la sequenza che segue:

- set C (richiesta dato: via dell'input)

- reset F

- repeat read F until F (attesa di strobe) (13.1)

- read dato (input in senso stretto)

- reset C

Con tale sequenza il processore dapprima lancia la richiesta di un dato, quindi si pone in attesa del

suo arrivo ed infine lo acquisisce. Il tempo che il processore deve attendere dal via all'arrivo dello

strobe dipende dalla velocità del sistema periferico e può anche essere notevole se confrontato con i

tempi di funzionamento del processore; durante il tempo di attesa il processore resta inattivo e due

tecniche fondamentali sono adoperate per ridurre questa inattività: il funzionamento in sovrapposizione

(overlay) fra due input e le interruzioni.

La tecnica dell'overlay (sovrapposizione) consiste nell’organizzare il driver in modo che esso operi

su di un singolo carattere e nel fare in modo che il programma principale, fra una chiamata e la

successiva di questo, esegua alcune altre operazioni, purché esse occupino un tempo inferiore a quello

che passa fra una richiesta e l'arrivo del dato corrispondente. In particolare, la sequenza per la

trasmissione di N caratteri si può organizzare come segue:

Inizializzazione:

- set C (via input del primo dato)

- reset F

- ...

Ripetizione in ciclo per i da 1 a N-1

- reset C

- repeat read F until F (attesa di strobe i-esimo)

- read dato (input i-esimo) (13.2)

- set C (via input del dato (i+1)-esimo)

- reset F

- ...

- ...

Ultima trasmissione

- reset C

- repeat read F until F (attesa di strobe N-esimo)

- read dato (input N-esimo)

e, trascurando il primo e l’ultimo dato, la parte centrale della sequenza costituisce il driver. La tecnica

delle interruzioni sarà esaminata al paragrafo successivo. il modello fondamentale

In alcune architetture del passato la (13.2) era programmata sintatticamente;

assunto dalle architetture moderne (cfr.§10), invece, non riconosce sintatticamente né RI né tantomeno

i bit C ed F. Si usa allora assumere a tale scopo alcuni registri dell'insieme P per contenere da un lato

RI e dall'altro i bit C ed F, ad esempio P[k] come rappresentativo di RI e due bit di P[j] come

rappresentativi di C ed F; tipicamente rispettivamente i bit più e meno significativi (in tal modo, C=1 si

ottiene ponendo P[j]=1 mentre l'arrivo dello strobe-in rende negativo il contenuto di P[j], in quanto

pone ad 1 il suo bit-segno). Detto allora R un registro con il quale effettuare il transito di un dato

[11]

dall'interfaccia di I/O alla memoria nel quale sia trasferito l'input , il nucleo della (13.2) diventa:

Ripetizione in ciclo per i da 1 a N-1

- R:=0; P[j]:=R reset C, F

- R:=P[j] R<0 attesa di strobe i-esimo

repeat until

- R:= P[k]; dato:=R read dato (input i-esimo) (13.3)

- P[j]:=1 set C, reset F

- ...

18 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Negli inserti sono presentate esemplificazioni per la realizzazione di quanto sopra sia nelle

sia per quelle storiche con il modello a

architetture che adottano il modello fondamentale

sincronizzazione programmata.

12.2 Protocollo di uscita

Analogo a quello d’ingresso è il protocollo di uscita; il segnale C assume allora il significato di

strobe-out ed F quello di ack (fig.13.2). La sequenza, analoga a quella di input, si può esprimere con lo

schema che sovrappone l'ack del carattere precedente con l'invio di quello attuale:

Figura 13.2. Protocollo handshake in uscita

- reset C, F

- attesa di ack precedente (interroga F)

- output in senso stretto (13.4)

- invio di strobe-out (set C)

e, con le stesse ipotesi del protocollo di input, si ha per il modello fondamentale:

- R:=0; P[j]:=R reset C,F

- repeat R:=P[j] until R<0 attesa di ack i-esimo

- R:=dato P[k]:=R; read dato (input i-esimo) (13.3)

- P[j]:=1 set C, reset

- ...

Negli inserti già citati sono presentate esemplificazioni dei protocolli, oltre che di input, anche di

sia per quelle storiche con il modello

output sia nelle architetture che adottano il modello fondamentale

a sincronizzazione programmata.

Per concludere, si noti che un'unica interfaccia potrebbe svolgere entrambe le funzioni di input e di

output: il bus-dati è allora bidirezionale, il segnale req opera come strobe-out in uscita, ack come

strobe-in in ingresso,

13 I/O sincronizzato da interruzioni

La fase in cui il processore resta inattivo in attesa dello strobe-in (in input) o dell'ack (in output) può

essere eliminata con l'uso appropriato del sistema delle interruzioni. A tale scopo si associ il segnale C

con una "maschera" ed F con una "richiesta" di interruzione; essendo allora abilitato il sistema delle

interruzioni, l’invio del segnale C dal processore alla periferia (req in input, strobe-out in output) rende

quest’ultimo sensibile alla risposta associata che viaggia su F (strobe-in in input, ack in output) e che si

presenta come un’interruzione. Il processore, dunque, in attesa di quest'ultima, non deve

necessariamente effettuare un ciclo a vuoto come nel paragrafo precedente, ma può effettuare altre

operazioni.

13.1 Interruzione in ingresso

La sequenza (13.2) viene implementata sostituendo il set di C[i] con l'abilitazione del flip-flop M[i],

che assume un duplice ruolo: maschera delle interruzioni per il processore, req per la periferia. In luogo

dell'attesa il processore può svolgere altre operazioni, mentre la periferica, non appena ha pronto il

dato, segnala tale evento ponendo ad 1 il flip-flop i-esimo del registro richiesta di interruzioni. Il

servizio di questa causa di interruzione provvede alla effettuazione dell'operazione di input. Si ha, cioè,

lo schema di programma:

19 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

AG:=1 abilitazione interruzioni

M[i]:=1 set C: via primo input

...

altre operazioni

...

mentre nella Interrupt Service Routine sarà realizzato l'input vero e proprio:

ISR:

- ...

- M[i]:=0 reset C

- dato:= RI input dato

- M[i]:=1 set C; via altro input

- ...

- ritorno da interruzione

13.2 Interruzione in uscita

Analoga è l'operazione di output: la maschera delle interruzioni svolge anche la funzione di

strobe-out mentre la richiesta di interruzione generata dalla periferica è interpretato come ack del dato

trasmesso e richiesta di trasmissione di un nuovo dato. Si ha dunque (non è evidenziato l'algoritmo per

la fine della trasmissione):

AG:=1; abilitazione interruzioni

RO:= dato output primo dato

M[i]:=1 strobe-out

altre operazioni

...

e il servizio delle interruzioni:

ISR:

- ...

- M[i]:=0 reset C

- RO:= dato output altro dato

- M[i]:=1 strobe-out

- ... *

* *

Con la sincronizzazione a mezzo dell’interruzione si ottiene dunque il vantaggio che il processore è

utilmente impegnato nell'attesa che la periferia sia pronta per eseguire l'operazione: il processore di

conseguenza svolge complessivamente una quantità di lavoro maggiore nell'unità di tempo o, come si

dice in linguaggio tecnico, ha un troughput migliore. Per contro, il tempo che trascorre dall'istante in

cui la periferia è effettivamente pronta (ed alza quindi il segnale strobe-in o ack) e l'istante in cui viene

servita (dato:=RI oppure RO:=dato) è maggiore di quello della soluzione del paragrafo precedente: lì

era dell'ordine di grandezza del tempo per eseguire 1 o 2 istruzioni, qui è il tempo necessario per

eseguire la parte di testa delle ISR. Ne segue, che per operazioni di I/O veloci è preferibile la soluzione

del paragrafo precedente.

14 Interfacce e bus per i PC

Le unità di I/O sono tipicamente collegate al processore attraverso appositi bus che ne caratterizzano

il comportamento sia dal punto di vista del colloquio sia da quello delle prestazioni, tipicamente la

velocità di trasferimento dati, sia infine da quello elettrico. Il bus di cui si è detto ai §§ 9 in uscita dalla

CPU verso la memoria e la periferia (cfr. ad esempio figg. 9.1, 9.2) costituisce in effetti il cosiddetto

[12] , che è caratterizzato dal colloquio elementare ivi studiato e dalla velocità di

bus interno

trasferimento dati verso la memoria.

In quella sede si è ipotizzato per semplicità che la periferica fosse collegata direttamente al bus

interno, ma ciò non accade in realtà. Nell’architettura dei PC, spesso ripresa anche dai sistemi più

evoluti, al bus interno sono connessi altri bus attraverso appositi bridge (per adattarne caratteristiche

20 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

elettriche) o interfacce, per adattarne anche caratteristiche logico-funzionali e definirne nuovi

protocolli di colloquio.

In primo luogo, al bus interno sono connessi appositi “bus di espansione”, che permettono di inserire

all’interno del computer apparecchiature aggiuntive, quali adattatori video, acceleratori grafici, sound

card e modem interni (expansion boards).

I primi PC facevano uso di un bus di espansione chiamato bus AT o bus ISA (Industry Standard

Architecture), dotato di una frequenza di 8 MHz ed un parallelismo di 16 bit, poi evoluto

nell’Enhanced ISA (EISA) a 32 bit. Per motivi storici, citiamo anche il bus MCA (Micro Channel

Architecture) proprietario su macchine IBM. Questi bus, tuttavia, sono stati rapidamente superati in

quanto la loro velocità di trasferimento costituiva un vero e proprio collo di bottiglia a seguito delle

sempre migliori prestazioni delle periferiche.

L’evoluzione tecnologica ha fatto sì che, a partire dal 1992, fossero proposte soluzioni radicali che

sostituivano il bus di espansione con i più veloci bus locali, dando vita allo standard VESA Local Bus

(da Video Electronics Standards Association), o VL Bus e poi all’attuale (1999) più flessibile bus PCI

(Peripheral Component Interconnect). Il bus ISA tipicamente permane, collegato con un bridge al PCI,

per motivi di compatibilità con dispositivi più lenti che ben si adattavano alla vecchia tecnologia (cfr.

fig. 14.1).

Il bus PCI ha prestazioni elevate: è dotato infatti di un parallelismo a 64 bit, anche se spesso viene

proposto nella versione a 32; ha una frequenza di 33 o 66 MHz: per dare un esempio delle prestazioni

ottenibili con tali dati, con semplici calcoli è possibile ricavare che con un parallelismo a 32 bit e

frequenza pari a 33 MHz , la velocità del bus è di 132 MB/s. Una delle ragioni del grande successo del

bus PCI è che esso viene popolato da adattatori con velocità che sono prossime a quelle del bus locale

della CPU. Figura 14.1: Architettura basata su bus PCI.

Nel seguito si propone una breve sintesi (solo parzialmente estesa negli inserti di approfondimento)

delle principali interfacce collegabili al PCI o alle espansioni ad esso attaccate:

Porta seriale, storica interfaccia seriale collegata al bus ISA;

· Porta parallela, storica interfaccia parallela, anch'essa collegata ad ISA;

·

· Interfacce IDE/ATA, naturale e storica espansione del bus ISA per il collegamento a dischi magnetici, ogg

ancora in uso;

· Interfaccia SCSI (pronuncia scasi), per il collegamento di svariati dispositivi (dischi, cassette, dischi ottici,

dischi rimovibili, sottosistemi RAID, scanner, stampanti, plotter, etc.) in impianti complessi.

· Interfaccia USB, in via di massima espansione, per il collegamento delle periferiche più moderne;

Interfaccia IEEE 1394, in particolare adatta per il collegamento isocrono di apparecchiature multimediali;

·

· Interfaccia PCMCIA, diffusa negli anni '90 per sostenere la tecnologia delle "PC cards", dispositivi di I/O per i

PC portatili.

Altre interfacce proprietarie oppure legate a gruppi di Aziende produttrici esistono o sono esistite

21 of 22 25/01/2007 20.15

Il sistema di input/output file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

nel passato (si citano le interfacce SSA, Serial Storage Architecture, e il progetto Fibre Channel), ma

per esse si rinvia ai cataloghi dei produttori.

[1]

Si consiglia un attento uso dei termini "sincrono" ed "asincrono", ai quali sono attribuiti significati diversi in diversi contesti.

[2] Nel seguito (§12) ack e req e

sono ipotizzati come segnali binari e la tecnica è riproposta in dettaglio per il protocollo handshake, ma in questa sede

presentata in generale: ack e req potrebbero anche essere blocchi messaggi realizzati come blocchi di dati.

[3]

Usiamo qui un termine oggi in disuso, ma molto usato nel passato per individuare questa classe di apparecchiature ch

comprende i DMA e i processori di I/O.

[4]

Eventuali conflitti, derivanti dal fatto che simultaneamente CPU e canali richiedono l'accesso in memoria, sono risolti, in base

a criteri di priorità, da apposite apparecchiature dette "arbitri".

[5] Classici sono rimasti i channel dell'architettura IBM 370.

[6] I calcolatori della serie HP 2100

[7]

Nel passato la strategia di produzione delle apparecchiature era quella di far sì che alla CPU di un produttore si collegass

soltanto quelle periferiche che aderivano ad un modello chiuso e predefinito proprio del costruttore: ne derivava una c

definizione del modello che era poi assunto a livello di linguaggio macchina.

[8]

Il modello può essere adoperato in questa versione originale, senza che IOA assuma il significato di indirizzo; questa soluzione

è adottata come una delle vie di collegamento con l'esterno (oltre a quella attraverso canali) da alcuni grossi sistemi a

architettura chiusa (cfr. esempio 370 § 10); in tal caso, il bus IOA è detto IOC (I/O Control) ed invia un generico comando alla

periferia, opportunamente interpretato da questa; IOC non ha funzioni di indirizzamento in quanto l'apparecchiatura cos

collegata è unica.

[9]

Le architetture chiuse, viceversa, fissavano le regole del colloquio una volta per tutte nel linguaggio macchina ed affidavano in

gran parte a questo la soluzione del problema.

[10]

La trasmissione a blocchi richiede che IOA sia costante nei vari passi del ciclo (cfr. 10.5), mentre un move a blocchi, ove

esista, richiede che tanto IOD quanto IOA si incrementino nel ciclo.

[11] Si suppone che l'istruzione di I/O trasferisce un dato dall'interfaccia ad un registro di macchina.

[12]

In qualche caso, nelle architetture più moderne, è anche detto bus esterno alla CPU, per porre in evidenza ancora un altro

livello nella gerarchia dei bus e delle memorie.

22 of 22 25/01/2007 20.15

Il modello a registri indirizzabili: istruzioni di I/O semplici file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Il modello a registri indirizzabili

Istruzioni di I/O semplici

Qui sono presentate le architetture esemplificate

Qui la legenda dei simboli per indicare la natura di un operando

Qui i simboli generali e specifici per individuare i registri di macchina

1 Architetture con modello fondamentale

Fra le architetture esemplificate, il solo 8086d opera con I/O isolato, le altre due con il modello

memory mapped. I codici dell'8086d fanno riferimento alle (10.3, 10.4):

- l'operando A, origine o destinazione interna del dato, è l'Accumulatore implicito AX;

- l'operando B, indirizzo di selezione, è un immediato, o un registro implicito.

Tabella 10.1

Codici operativi per istruzioni d’ingresso-uscita

(Modello fondamentale)

Istruzione 8086d 68000d RISCd

Input

d:= P[im] IN

d:= P[r] IN

R:= P[G] ---

M:= P[R] ---

a blocchi INS

Output

P[im]:= d OUT

P[r] := d OUT

P[G] := R ---

P[R] := M ---

a blocchi OUTS

Le istruzioni a blocchi dell'8086d, implementata in alcuni processori da questo derivati (80186) sono

relative a memorizzazioni discendenti ed in un caso tutti gli operandi sono individuati da registri

impliciti, nell'altro sono istruzioni a tre operandi tutti espliciti.

2 Architetture con I/O memory mapped

Come si è detto, aderiscono al modello memory mapped, che fu introdotto dal PDP-11, il 68000d e il

RISCd. Per esse si vedano dunque le istruzioni di trasferimento dati.

Ad esempio, nel 68000d, l'output della costante 1 verso la periferica il cui registro dato sia

"mappato" all'indirizzo di memoria i, si realizza con normali operazioni di move:

{ }

MOVE.B #1,i P[i]:=1

Per le architetture "storiche si veda l'inserto Istruzioni di I/O storiche.

1 of 1 25/01/2007 20.15

Il modello di I/O semplice per le architetture storiche file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Il modello di I/O semplice

per le architetture storiche

Qui sono presentate le architetture storiche esemplificate

Qui la legenda dei simboli per indicare la natura di un operando

Qui i simboli generali e specifici per i registri di macchina.

1 Architetture con I/O isolato

Fra le architetture esemplificate aderiscono al modello fondamentale con I/O isolato lo Z8000d e il

370d per alcune istruzioni particolari: vedi tabella. I codici di Z8000d fanno riferimento alle (9.3, 9.4):

- l'operando A, origine o destinazione interna del dato, è un registro indirizzabile (Z8000d: IN, OUT),

o direttamente la memoria (370d: IND, OUTD, I/O Direct);

- l'operando B, indirizzo di selezione, è un registro indirizzabile oppure un operando qualsiasi G

specificato dal modo di indirizzamento per lo Z8000d.

Tabella 10.1

Istruzioni d’ingresso-uscita

(Modello fondamentale)

Istruzione 370d Z8000d

Input

R:= P[G] --- IN

M:= P[R] RDD IND

a blocchi --- INDR

Output

P[G] := R --- OUT

P[R] := M WRD OUTD

a blocchi --- OTDR

I codici del 370d (ReaD, WRite Direct, RDD e WRD) implementano le (9.1, 9.2): il codice inviato

su IOA con determinata tempificazione è assunto dall’interfaccia come generico codice di controllo e

non come indirizzo di selezione; A è un operando-memoria, B è un operando-registro.

Le istruzioni a blocchi dello Z8000 (INDR, OUTDR, INput o OUTput, Decrement & Repeat) sono

relative a memorizzazioni discendenti ed in un caso tutti gli operandi sono individuati da registri

impliciti, nell'altro sono istruzioni a tre operandi tutti espliciti.

2 Architetture con I/O memory mapped

Fra le architetture esemplificate aderiscono al modello memory mapped, che fu introdotto dal

PDP-11, il 6800d, e il VAXd. Per esse si vedano dunque le istruzioni di trasferimento dati.

Ad esempio, nel 6800d, l'output della costante 1 verso la periferica il cui registro dato sia "mappato"

all'indirizzo di memoria i, si realizza con normali operazioni di load e store:

{ }

LDA #1 d:=1

{ }

STA i P[i]:=d

1 of 1 25/01/2007 20.18

Programmazione di dati, comandi e stati nel modello a registri indirizz... file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Programmazione di dati, comandi e stati

nel modello a registri indirizzabili

Si supponga di volere programmare nel modello a registri indirizzabili

una interfaccia come quella del modello di fig. 8.1 b), qui riproposta.

Ai registri del modello si assegna un indirizzo (come in figura) in

modo che la differenziazione fra dati, comandi e stati possa essere

semanticamente progettata: P[0] significherà registro-dato della sezione di

ingresso, P[1] registro-stato e così via.

1 of 1 25/01/2007 20.15

Programmazione del protocollo handshake nel modello a sincronizzaz... file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Programmazione del protocollo handshake

nel modello a sincronizzazione programmata

Con il modello a sincronizzazione programmata, detto i l'indirizzo dell’interfaccia, la (12.2) sarebbe

così programmata:

CLC i C[i]:=0 reset C

A: SFS i skip if F=1 attesa strobe-in

JMP A goto A

LIA i a:= RI[i] input dato

STA dato dato:=a memorizzazione dato

STC i C[i]:=1 set C: via input

CLF i F[i]:=0 reset F

Analogamente l'output (protocollo 12. 4) diventa:

CLC i C[i]:=0 reset C

CLF i F[i]:=0 reset F

LDA dato a:=dato prepara dato in a

A: SFS i skip if F=1 attesa ack in F

JMP A goto A

OTA i RI[i]:= a output dato

STC i C[i]:=1 strobe-out

1 of 1 25/01/2007 20.15

Programmazione del protocollo handshake nel modello fondamentale file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Programmazione del protocollo handshake

nel modello fondamentale

1 Input

Per realizzare semanticamente il modello a sincronizzazione programmata con quello fondamentale a

registri indirizzabili si assegnano i registri P alle diverse funzioni. In un sistema che adotti il modello

memory mapped, i registri P dell’interfaccia sono nello spazio di indirizzamento della memoria. Si

supponga allora che il registro IFDATA all’indirizzo k rappresenti RI, ed il registro IFCTRL

all’indirizzo j contenga C ed F, rispettivamente come bit meno e più significativo. In tal modo, C=1 ed

F=0 si ottiene ponendo IFCTRL ad 1, mentre l'arrivo dello strobe-in rende negativo il contenuto di

IFCTRL, in quanto pone ad 1 il suo bit-segno.

Per un tale sistema, assumendo i codici dell’architettura 68000d e supponendo che si adoperi il

registro D0 come transito del dato da e per la memoria, si ha (semplificando le notazioni al fine di

presentare la sequenza concettuale):

; Protocollo di input

ORG k

IFCTRL DS.B 1

IFDATA DS.B 1

ORG INPUT_DRIVER

MOVE.B #1,IFCTRL set C, reset F

LOOP TST.B IFCTRL repeat read F

BPL WAIT until F

MOVE.B IFDATA,D0 input dato

ANDI.B #$FE,IFCTRL reset C

RTS

Nel caso si adoperi la tecnica dell’overlay, il corpo principale del driver è:

; Protocollo di input con overlay

ORG k

IFCTRL DS.B 1

IFDATA DS.B 1

ORG INPUT_DRIVER_OV

ANDI.B #$FE,IFCTRL reset C

LOOP TST.B IFCTRL repeat read F

BPL WAIT until F

MOVE.B IFDATA,D0 input dato

MOVE.B #1,IFCTRL set C, reset F

RTS

2 Output

Nelle stesse ipotesi assunte del paragrafo precedente, per il modello memory mapped del 68000d il

[1] si realizza come segue:

protocollo di output con overlay

; Protocollo di output con overlay

ORG k

IFCTRL DS.B 1

IFDATA DS.B 1

ORG OUTPUT_DRIVER_OV

ANDI.B #$FE,IFCTRL reset C

LOOP TST.B IFCTRL repeat read F

BPL WAIT until F

MOVE.B D0,IFDATA output dato

MOVE.B #1,IFCTRL set C, reset F

RTS

1 of 2 25/01/2007 20.14

Programmazione del protocollo handshake nel modello fondamentale file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

[1] Si osservi, che, nel caso di I/O sincronizzato da programma, l’output si realizza quasi sempre con la tecnica dell’overlay:

una volta inviato il dato, è necessario attendere l’ack solo prima di inviare un altro dato.

2 of 2 25/01/2007 20.14

Il modello chiuso delle architetture storiche file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Il modello chiuso delle architetture storiche

In contrapposizione al modello aperto, il modello chiuso delle vecchie architetture consentiva

soltanto il collegamento di periferiche sintatticamente compatibili con il linguaggio macchina, che vede

inglobate nell’elaboratore le interfacce, estendendosi fino alla sezione B della fig. 6.1.

Figura 1 Modello chiuso: sezione I/O a selezione interna.

In particolare, il modello chiuso vede sintatticamente un insieme limitato di k (ad esempio 16 o 64)

interfacce realizzate secondo uno specifico modello (uno di quelli di fig.8.1 oppure di suoi derivati), la

cui selezione avviene con tecnica interna al processore: è anche detto modello a selezione interna. Se la

CPU gestisce direttamente l'I/O, gli oggetti da selezionare (#1, #2, etc. in figura) sono interfacce

passive, se le delega a specifici canali o subprocessori di I/O, allora gli oggetti sono questi ultimi. Il

modello è chiuso in quanto le scelte sui modelli di interfaccia sono effettuate al livello di progetto del

linguaggio macchina (vedi come esempi modelli "a messaggi differenziati” del e "a sincronizzazione

programmata").

1 of 1 25/01/2007 20.18

I modelli sintattici - Il modello a messaggi differenziati file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

I modelli sintattici

Il modello a messaggi differenziati

Il modello

1 1.1 Premessa

1.2 Collegamento interfaccia-processsore

1.3 Istruzioni semplici

1.4 Istruzioni a blocchi

1 Il modello

1.1 Premessa

In antitesi al modello fondamentale (a registri indirizzabili isolati e memory mapped) adottato dalle

architetture più moderne, esistono modelli adottati da architetture più antiche che affidano alla sintassi

del linguaggio una visione della periferia. L’inconveniente di tali soluzioni è che esse sono “chiuse”: il

linguaggio macchina “vede” un’architettura già completamente definita e che quindi mal si adatta a

periferie che non siano omogenee con il modello assunto.

In questo inserto si illustra in particolare un modello, che diremo a messaggi differenziati, il quale è

caratterizzato dal “vedere” a livello sintattico la differenza fra dati, comandi e stati (cfr. fig. 8.1).

Nei processori che adottano i modelli fondamentali, la soluzione semantica equivalente a quella

sintattica qui illustrata è semplicemente quella di assegnare a ciascuno dei registri della periferia (e

quindi a ciascun indirizzo) il significato di registro-dati, registro-istruzioni o registro-stati (cfr.

l'esempio modello a messaggi differenziati con quello a registri indirizzabili).

Questo approfondimento ha dunque un interesse prevalentemente storico.

1.2 Collegamento interfaccia-processore

I modelli che assumono sintatticamente diversi dati, comandi e stati assumono anche bus distinti per

trasportarli o comunque segnali distinti per identificarli. In particolare, limitandoci per brevità alla sola

sezione di uscita, in fig. 1 sono mostrate due distinte soluzioni adottate da architetture storiche: una

soluzione “a bus differenziati” e l’altra “a strobe differenziati”.

Figura 1 Modello a messaggi differenziati: a) a bus differenziati; b) a strobe differenziati

Nel modello a bus differenziati (fig. 1 a) sono adoperati tanti bus quanti sono i registri, sicché

l'interfaccia è collegata con la CPU attraverso un bus-dati e un bus-comandi, ciascuno affiancato dal

proprio strobe.

Nel modello a strobe differenziati (fig.1 b) il bus è fisicamente unico, ma segnali di strobe differenti

individuano la natura del messaggio: è questa una soluzione fisicamente ma non logicamente diversa

dalla prima.

1.3 Istruzioni semplici

Coerentemente con il modello sintattico assunto, le istruzioni a livello macchina di I/O sono dunque

quelle del quadro che segue.

1 of 2 25/01/2007 20.17

I modelli sintattici - Il modello a messaggi differenziati file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Modello a messaggi differenziati:

- Input di dato: A := RI.dato

- Input di stato: A := RI.stato

- Output di dato: RO.dato := A

- Output di comando: RO.comando := A

ove A è un operando-registro oppure operando-memoria a seconda dell’architettura specifica ed il

processore invia il dato o il comando su bus distinti (fig. 1a) oppure sul medesimo bus,

differenziandolo con lo strobe (fig. 1b). Analogamente per l'input (non disegnato).

Le istruzioni si riferiscono ad interfacce chiuse e preselezionate, nel senso che agiscono su quella

fra le interfacce che è stata precedentemente selezionata mediante apposite istruzioni, ad esempio

all'atto dell’avvio del canale (cfr. Istruzioni per la programmazione dei canali) oppure mediante un uso

appropriato di un’istruzione di "output di comando".

1.4 Istruzioni a blocchi

Le trasmissioni a blocchi sono analogamente suddivise in:

- input di un blocco di dati,

- input di un blocco di stati,

- output di un blocco di dati,

- output di un blocco di comandi.

e possiedono:

- un operando-sorgente o destinazione in memoria,

- un operando che definisce la lunghezza del blocco,

- eventuali operandi per la definizione di parametri ausiliari.

La trasmissione a blocchi opera in genere con un colloquio a domanda e risposta e gestisce i

problemi connessi di controllo d'errore e di time-out.

Sono quindi riportati alcuni esempi di architetture con modello a messaggi differenziati.

2 of 2 25/01/2007 20.17

Esempi di architetture con modello I/O a messaggi differenziati file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Esempi di architetture

con modello I/O a messaggi differenziati

In tabella sono riportate alcuni processori che assumono il modello a messaggi differenziati: il G20d

come processore centrale e il canale del 370d come processore autonomo di I/O.

Nel caso del G20 le istruzioni sono classificate come:

- trasmissione di dati,

- trasmissione di comandi,

- ricezione di dati.

ed esistono nella versione di:

- trasmissione singola (Transmit Data Character, TDC, Transmit Line Command, TLC),

- trasmissione a blocchi (Block Transmit Data, BTD, Block Transmit Command: BTC, Block Receive

Data, BRD, la ricezione è solo a blocchi).

L'acquisizione e l'interrogazione dello stato avvengono con tecniche particolari qui non illustrate

(cfr. Scambio degli stati).

Attraverso la trasmissione di comandi è possibile inviare verso la periferia un indirizzo di selezione,

realizzando così una preselezione seriale (cfr. § 5.3).

Il colloquio avviene con tecnica asincrona (cfr. § 4), nel senso che ad ogni messaggio inviato dalla

CPU alla periferia o viceversa segue una risposta in direzione opposta.

Tabella

Istruzioni d’ingresso-uscita

(Modello a messaggi differenziati)

Istruzione can.370d G20d

I/O singolo

RO.dato:= G --- TDC

RO.comm:= G --- TLC

Input a blocchi

da RI.dato read BRD

da RI.stato sense ---

Output a blocchi

in RO.dato write BTD

in RO.comando control BTC

Nel caso del 370d, l'esempio fa riferimento alle istruzioni del “canale”, un processore indipendente,

con un repertorio di codici operativi limitato ed orientato all'I/O; dette CCW (Channel Command

Word); si tratta di sei distinti codici operativi:

- output di dati (write),

- input di dati (read),

- output di comandi (control: i comandi verso la periferia sono detti "control"),

- input di stato (sense: per quest'ultima ulteriori approfondimenti saranno illustrati altrove (cfr.

Scambio degli stati).

ed inoltre:

- read backward, simile al "read" ma con memorizzazione discendente;

- transfer in channel, equivalente ad un salto incondizionato all'interno del programma di canale.

Una particolare tecnica è adoperata per indicare la fine del programma: un bit, detto di "chaining" in

ciascuna delle CCW indica se questa è l'ultima o se il programma prosegue con altre istruzioni.

In realtà i codici operativi non sono solo sei, ma sei classi, in quanto un apposito campo aggiunto

alle istruzioni definisce in maggior dettaglio l'operazione da compiere, in funzione della particolare

unità periferica cui la trasmissione è destinata. Ad esempio si può specificare la densità di registrazione

su un supporto magnetico o il tipo di controllo di parità da effettuare. La selezione della periferia è

effettuata all'atto dell'avvio del canale.

1 of 1 25/01/2007 20.13

Modello a sincronizzazione programmata file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Modello a sincronizzazione programmata

Generalità

1

2 Esempi di linguaggi macchina

1 Generalità

Il modello che segue, detto anche di I/O programmato, prevede a livello sintattico apposite

istruzioni per effettuare da programma la sincronizzazione delle operazioni di I/O. Pur riferendosi ad

uno schema chiuso di architetture di vecchia generazione, la sua importanza risiede nel fatto che il

modello presenta uno schema di sincronizzazione, che oggi viene realizzato nelle interfacce moderne e

semanticamente nei programmi di I/O (cfr. protocollo handshake, § 12).

2 L'interfaccia

Faremo dunque riferimento ad un modello chiuso nel quale ciascuna interfaccia è strutturata come in

fig.8.2, con un registro per l'input (RI), uno per l'output (RO) e due flip-flop per il controllo e la

sincronizzazione delle operazioni: C (Control) ed F (Flag); C viaggia verso la periferia, F verso la

CPU, entrambi possono essere posizionati da programma ed F può essere anche interrogato (cfr. figura

1). Figura 1 Modello a sincronizzazione programmata

Le istruzioni di I/O fanno riferimento implicito ai registri RO, RI, C, F; in modo analogo al modello

fondamentale; in particolare, le istruzioni di input ed output in senso stretto assumono il significato:

- Input: A := RI[B] (1)

- Output: RO[B] := A (2)

ove l'operando B indirizza l’interfaccia e l'operando A è la destinazione o l'origine del dato. Alle

istruzioni di input ed output in senso stretto si aggiungono quelle per il posizionamento di C ed F e

quelle d’interrogazione di F, con semantica analoga a quella delle istruzioni di skip (cfr. cap.5).

Modello a sincronizzazione programmata

- Posizionamenti: (3)

Set o Clear Control: C[B]:= 1, C[B]:= 0

Set o Clear Flag: F[B]:= 1, F[B]:= 0

- Interrogazioni: (4)

Skip if Flag set: if F[B] then PC:= PC+2

Skip if Flag clear: if not F[B] then PC:= PC+2

In output, C assume il significato di strobe-out ed F quello di ack: la periferia riceve C per acquisire

il dato e risponde con F per indicare la ricezione avvenuta. Il colloquio si può costruire dunque

inviando il dato seguito dallo strobe, attendendo poi il flag per proseguire con l'invio di altri dati:

RO[B] := A Istruzione di output

C[B] := 1 Set Control (invio strobe)

SF: if F[B] then PC:= PC+2 Skip if Flag set

goto SF Se F=0 cicla

- Se F=1 invio altro dato

1 of 2 25/01/2007 20.17

Modello a sincronizzazione programmata file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Analogamente, in input C è il req (richiesta dato) ed F lo strobe-in: la periferia, dunque, risponde

alla ricezione di C con un dato accompagnato da F e la CPU interroga F per sincronizzarsi in ingresso,

rilevando così quando è possibile effettuare l'operazione di input.

Si ricorda che lo schema di sincronizzazione, qui sviluppato come modello sintattico, è solo

raramente realizzato in hardware all'interno di istruzioni più potenti del linguaggio macchina. Nelle

architetture che adottano il modello fondamentale, la sincronizzazione deve essere programmata

semanticamente, ad esempio assegnando ad alcuni bit di un registro I/O le funzioni di flag e control.

Un esempio di tal genere è sviluppato a proposito del protocollo handshake (cfr. §12).

3 Esempi di linguaggi macchina

Il modello è ispirato a quello di alcuni processori della Hewlett & Packard, che diremo

genericamente HPd, riassunto in tabella. Tabella

Istruzioni d’ingresso-uscita

(Modello a sincronizzazione programmata)

Istruzione HPd

Input/output

d:=RI LIA, LIB

RO:=d OTA, OTB

Posizionamenti

f:=1 STC, STF

f:=0 CLC, CLF

Interrogazioni

skip if flag SFS, SFC

Tutte le istruzioni indirizzano l'interfaccia attraverso un operando B; quelle di input ed output in

senso stretto agiscono come le (1), (2) su un operando A che è uno dei due accumulatori (LIA, LIB,

OTA, OTB, acronimi di Load Input e OuTput hanno, appunto il significato di trasferimento fra il

registro di I/O ed uno degli accumulatori a oppure b). Oltre a queste istruzioni "semplici", ne esistono

alcune simili, che producono l'input unitamente con alcune elaborazioni elementari: ad esempio MIA,

MIB, "merge input into Accumulator", cioè d:= d or RI.

Le istruzioni di posizionamento ed interrogazione operano come nelle (3), (4): SeT Control, STC,

CLear Control, CLC; SeT Flag, STF, CLear Flag, CLF; Skip if Flag Set, SFS, Skip if Flag Clear, SFC.

2 of 2 25/01/2007 20.17

Controllo dei canali indipendenti file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Controllo dei canali indipendenti

Istruzioni per architetture con soluzioni sintattiche

Controllo dei canali indipendenti

Istruzioni per architetture con soluzioni sintattiche

1 Avvio del canale

2 Arresto del canale

3 Acquisizione dello stato, test e jump

Trattiamo in questo paragrafo il linguaggio macchina delle CPU che assumono sintatticamente

l'esistenza di un canale indipendente e dunque le operazioni elementari per il suo avvio, arresto o

controllo. Si ricorda invece che il linguaggio macchina del canale, che esegue le vere e proprie

istruzioni di I/O, è simile a quello della CPU che tratta direttamente l'I/O ed è trattato altrove (cfr. ad

esempio Istruzioni del modello a messaggi differenziati).

Diremo genericamente "canale" il processore periferico; allorché vorremo distinguere i sottocasi,

secondo la classificazione introdotta (cfr. § 6), diremo DMA quei canali che svolgono solo singole

operazioni di trasmissioni a blocchi, PIU i processori di I/O che, in quanto tali, eseguono programmi di

I/O (detti anche programmi di canale).

Il canale riceve dalla CPU i parametri delle operazioni da compiere e le invia il suo stato.

Supporremo allora che il canale si colleghi alla CPU attraverso una sezione di controllo costituita come

nello schema funzionale a tre sezioni (cfr. 8.1''' e fig.8.1b): i parametri sono ricevuti in RC.comando, lo

stato è memorizzato in RC.stato e informazioni ausiliarie da e per la CPU nei flag RC[i].flag.

Dei due operandi delle istruzioni, si suppone che B sia un indirizzo di selezione, mentre A definisce

i parametri delle operazioni che il canale deve eseguire. Schematizzeremo allora le istruzioni

fondamentali come segue.

1 Avvio del canale

Queste istruzioni "lanciano" il funzionamento autonomo del canale e possono in generale essere

schematizzate come:

RC[B].comando := A (2)

ove B seleziona il canale ed A è un dato strutturato costituito da più componenti, ciascuna contenente

uno dei parametri dell’operazione che il canale deve eseguire. Esse hanno un comportamento più o

meno complesso a seconda che si riferiscono ad un semplice canale DMA oppure ad un processore di

I/O e sono anche abbastanza diverse fra sistema e sistema.

Il DMA riceve in RC.comando i parametri della trasmissione da effettuare, quali l'indirizzo di

memoria iniziale del blocco, la sua lunghezza ed eventuali parametri ausiliari; altre specifiche della

trasmissione, ad esempio se la trasmissione è in input o in output, se è di dati o di comandi, possono

essere memorizzate nei flag.

Il PIU deve essere informato sul programma da eseguire fra quelli preventivamente memorizzati (a

seconda dei casi, nella memoria centrale del sistema oppure in una memoria ad hoc); in RC.comando è

dunque trasmesso l'indirizzo della prima istruzione del programma di canale. Informazioni ausiliarie

sono legate alle ulteriori operazioni che eventualmente il canale deve effettuare all'atto dell'avvio e

sono variabili da sistema a sistema.

2 Arresto del canale

Queste istruzioni hanno il compito di arrestare l’evoluzione della trasmissione a blocchi del DMA

oppure del programma di canale. Hanno la forma:

Stop B (3)

ove B seleziona il canale.

3 Acquisizione dello stato, test e jump

La necessità di effettuare nel programma di I/O salti condizionati dallo stato del canale è

implementata nei diversi linguaggi macchina, coerentemente con l’impostazione generale del

processore, attraverso istruzioni di skip, di jump, oppure di trasferimento dello stato nel registro CC

della CPU (cfr. cap. 5) che può poi essere interrogato da normali istruzioni di salto. Si possono dunque

avere istruzioni quali:

1 of 2 25/01/2007 20.17

Controllo dei canali indipendenti file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

- Skip sullo stato:

if RC[B].stato = A then PC:= PC+2 (4')

- Jump sullo stato:

if RC[B].stato = A then PC:= C (4'')

- Skip (o jump) su un indicatore:

if F[B, A].flag then PC:= PC+2 (4''')

(B, A sta per A-esimo bit della B-esima sezione)

- Acquisizione dello stato: IV

CC := RC[B].stato (4 )

I modelli generali qui presentati sono esemplificati in "esempi di istruzioni per il controllo dei

canali"

2 of 2 25/01/2007 20.17

Istruzioni per il controllo dei canali file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Istruzioni per il controllo dei canali

Esempio DMA

1

2 Esempio PIU

Nella tabella che segue sono illustrati due esempi per i modelli sintattici, l'uno per un DMA e l'altro

per un PIU. Tabella

Istruzioni d’ingresso-uscita

(Modello a processore indipendente)

Istruzione 370d 1100d

Modello DMA

ICR:=G --- LIC

OCR:=G;d:=1 --- LOC

OCR:=G;d:=0 --- LFC

Stop --- DIC, DOC

Modello PIU

Via START ---

Stop HALT ---

Test e jump

Test TEST ---

jump on busy --- JIC,JOC

jump on function --- JFC

1 Esempio DMA

Il modello DMA illustrato è adottato nelle versioni più elementari del sistema 1100 (in quelle più

sofisticate si adotta un modello a processore indipendente), con il nome specifico di I/O Control

Section. Questa possiede due sezioni, una d’ingresso e l'altra di uscita, che possono operare

simultaneamente; quindi anche i registri-comandi ove vengono recepiti i parametri della trasmissione a

blocchi sono due: ICR ed OCR (Input ed Output Control Register). Inoltre, il canale distingue fra una

trasmissione a blocchi di dati ed una di comandi (detti nel caso specifico "funzioni"), differenziati

attraverso un valore binario assegnato ad un flag che diremo F. Le istruzioni di avvio sono dunque:

- Load Input Channel, LIC: ICR[B] := A

- Load Output Channel, LOC: OCR[B] := A; F:=0

- Load Function Channel, LFC: OCR[B] := A; F:=1

L'operando A è detto "Access Control Word" e definisce la trasmissione a blocchi: primo indirizzo di

memoria, lunghezza del blocco, ordine ascendente o discendente degli accessi in memoria.

I codici DIC e DOC (Disconnect I/O Channel) hanno la funzione di arrestare la trasmissione in input

o in output sul canale selezionato.

Le istruzioni di controllo dello stato sono del tipo "jump su indicatore" e a tale scopo particolari

condizioni sono memorizzate in appositi flag del canale. In particolare, JIC e JOC saltano se

rispettivamente la sezione d’ingresso o di uscita sono "occupate", l’istruzione JFC se il canale sta

trasmettendo funzioni.

2 Esempio PIU

Il modello PIU illustrato è quello fondamentale dell’architettura 370, adottato anche da molti altri

processori e dallo stesso 1100 in versioni diverse da quelle di cui al precedente esempio. Il canale

indipendente gestisce le istruzioni, dette CCW (Channel Command Word) già illustrate nel modello a

messaggi differenziati e riceve dalla CPU informazioni circa il programma da eseguire. Il canale

possiede essenzialmente due registri, corrispondenti rispettivamente a RC.comando e RC.stato: CAR

(Channel Address Register), che è come un "program counter" del canale, e CSWR (Channel Status

Word Register), che ne memorizza lo stato.

L’istruzione di avvio del canale (START I/O) è schematicamente coincidente con la (2):

1 of 2 25/01/2007 20.14

Istruzioni per il controllo dei canali file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

essenzialmente un operando esplicito B indica l'indirizzo del canale e un operando implicito A, detto

CAW, Channel Address Word (in alcune versioni posto ad una locazione fissa di memoria) indica

l'indirizzo di memoria della prima istruzione del programma di canale:

CAR[B] := CAW

In realtà l'istruzione presenta un comportamento più complesso di quello schematizzato ed, oltre ai

parametri fondamentali di cui sopra, richiede anche alcuni parametri ausiliari; in particolare, essa

esegue la fase iniziale del colloquio, selezionando oltre al canale anche l'unità periferica connessa:

l'indirizzo dell’unità periferica è contenuto in B unitamente con l'indirizzo del canale.

L’istruzione HALT I/O arresta il funzionamento del canale ed è del tipo (3). L’istruzione TEST I/O

IV ); di essa sono fornite altre caratteristiche in acquisizione degli stati: esempi.

è del tipo della (4

2 of 2 25/01/2007 20.14

Scambio degli stati: Soluzioni sintattiche in architetture storiche file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Scambio degli stati

Soluzioni sintattiche in architetture storiche

I processori che curano a livello sintattico la problematica dello scambio degli stati introducono nel

linguaggio macchina i comportamenti necessari a distinguere i diversi livelli dello stato.

Come gestione degli stati di primo livello si possono individuare le seguenti tecniche fondamentali.

La prima consiste nell'ottenere, come effetto dell’esecuzione di un’istruzione di I/O, la

memorizzazione nel registro CC (Condition Code, cfr. cap. 4) dello "stato globale" della periferia: ad

esempio, il 370d, al termine dell’esecuzione dell’istruzione START I/O (cfr. "esempi di istruzioni per

il controllo dei canali") memorizza in CC uno dei quattro stati "operazione iniziata ok", "generica

anomalia", "stato specifico memorizzato", "non operante"; un’interrogazione di CC con un codice di

comparazione eseguita dopo l'istruzione di start fornisce dunque al programma tale informazione.

Un'altra tecnica, adoperata dal G20 e da alcune versioni del 1100, è quella di definire, per ciascun

codice di I/O, una "risposta" della periferia "normale" ed una "anomala" e, quindi, inglobare nella

esecuzione dell’istruzione un comportamento come quello delle istruzioni di skip: in un caso viene

saltata un’istruzione, nell'altro si prosegue in sequenza; un’apposita sequenza delle istruzioni dopo

quella di I/O individua, dunque, il comportamento da assumere nelle due evenienze.

In qualche caso, tipicamente nel modello a canale indipendente, apposite istruzioni consentono

un’interrogazione dello "stato globale": in tal senso vanno viste le istruzioni del gruppo "test e jump"

dell'inserto "esempi di istruzioni per il controllo dei canali": l'istruzione TEST I/O trasmette al registro

CC uno degli stati "disponibile", "generica anomalia", "stato specifico memorizzato", "non operante".

Come soluzione alternativa, le istruzioni JIC, JOC, JFC provocano un salto condizionato,

rispettivamente, ai fatti "canale occupato: è in corso un’operazione di input", "canale occupato per

output", "il canale sta trasmettendo comandi".

Un secondo livello della gerarchia prevede uno stato di maggior dettaglio memorizzato in apposito

registro o locazione di memoria. Ad esempio, il G20 possiede un registro speciale, detto "di linea", che

raccoglie in ogni caso la "risposta" della periferia e quindi l'interrogazione di tale registro consente di

ricercare le cause di una generica anomalia segnalata genericamente al primo livello gerarchico.

Analogamente, nel modello PIU (vedi 370d o 1100d), una locazione di memoria o un registro, detto

"Channel Status Word" (CSW) è associato a ciascun canale e riceve dal canale stesso lo stato della

periferia; l’indicazione al primo livello di "stato specifico memorizzato" indica, appunto, che in CSW

sono memorizzate informazioni quali "l'indirizzo indicato da CCW è scorretto", "errore di parità",

"errore nel chaining" oppure stati della specifica unità periferica, quali ad esempio "comando di stampa

eseguito", "operazione di stampa eseguita", "condizione di errore".

Solo ad un terzo livello gerarchico è utilizzabile l’istruzione "sense" (cfr."esempi di istruzioni a

messaggi differenziati"), che trasferisce in memoria informazioni di stato provenienti dall’unità

periferica, e quindi specializzate caso per caso; ad esempio, con una generica informazione nella CSW

di "condizione di errore nella periferica", l’esecuzione dell’istruzione consente di memorizzare

indicazioni di maggior dettaglio, quali "un martelletto della stampante non funziona", "manca la carta"

etc.

1 of 1 25/01/2007 20.17

libro Fadini-Savy file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Porta seriale e parallela

Le più antiche interfacce di collegamento verso l’esterno dei PC sono la porta seriale e la

porta parallela, collegate sul bus di espansione ISA.

La porta seriale implementa lo standard RS-232 C o RS-422 e viene usata per comunicazioni in cui

viene trasmesso un bit per volta. Costituisce una interfaccia general purpose che può essere usata per

svariate tipologie di dispositivi, come modem, mouse, stampanti, collegamento ad altri computer.

La porta parallela implementa di solito lo standard di fatto Centronics, usa connettori a 25 pin detti

DB-25 e viene usata per connettere stampanti. Porte parallele più veloci di circa 10 volte rispetto alla

Centronics sono la EPP (Enhanced Parallel Port) e la ECP (Extended Capabilities Port), che

supportano comunicazione bidirezionale.

Sia la porta parallela sia quella seriale hanno ormai quasi completamente ceduto il passo ai bus

esterni tipo USB e IEEE 13914.

1 of 1 25/01/2007 20.17

Interfacce IDE/ATA file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Interfacce IDE/ATA

La famiglia di interfacce in questione viene chiamata IDE (Intelligent Drive Electronics o, secondo

altri, Integrated Drive Electronics) oppure ATA (AT Attach, cioè “attaccata” ad un AT, il PC di

seconda generazione, essendo quelli di prima ad 8 bit denominati XT) ed ha un parallelismo di 16 bit,

esattamente come il bus di I/O dell’AT IBM originario.

L’interfaccia è una estensione naturale del bus di sistema ISA, in quanto la maggior parte dei segnali

e della circuiteria necessari sono già presenti nella CPU; ne segue che uscite IDE/ATA sono spesso

presenti sulla “scheda-madre” del PC, senza hardware aggiuntivo. Essa riproduce il concetto dei vecchi

mainframe di “periferica interna” al sistema; l’interfaccia standard prevede un singolo canale condiviso

da due dischi, in modalità master/slave.

Il sistema ATA, peraltro, definisce un apposito protocollo di comunicazione, inizialmente rivolto ai

soli dischi, poi ampliato a nastri e CD-ROM. In esso sono definiti i comandi ad alto livello dell’host, le

risposte di stato da parte della periferica circa il completamento dell’operazione o eventuali condizioni

di errore, le modalità di trasferimento a blocchi (DMA) e così via. Il protocollo è del tipo programmed

I/O, o PIO (cfr. § VII.10); ovviamente, il drive della periferica contiene un’apposita unità di controllo

locale progettata secondo le regole del protocollo ATA (sui manuali si legge che il drive è

“intelligente” oppure che “possiede un controllore built-in”).

La famiglia in esame, oltre ad ATA originario, possiede le evoluzioni ATA-2, ATA-3, Ultra-ATA,

Fast-ATA, ATAPI, EIDE, che presentano diversi miglioramenti nella velocità, nell’indirizzamento dei

blocchi, nell’affidabilità, nell’analisi dei guasti. Si segnala in particolare che Ultra ATA raggiunge

velocità elevate (33.3 MB/s), usando a tale scopo una particolare logica di rilevazione e correzione di

errore.

1 of 1 25/01/2007 20.17

Interfaccia SCSI file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Interfaccia SCSI

L'interfaccia SCSI, Small Computer System Interface, definisce un protocollo e presenta in uscita un

bus di I/O parallelo (cfr. figura 1) su cui possono essere collegati svariati dispositivi e diverse unità di

controllo locale (controller). Progettata attorno al 1985, SCSI è il più vecchio sistema di

interconnessione per apparecchiature “esterne” attualmente in uso e serve una grossa varietà di

dispostivi: dischi, cassette, dischi ottici (inclusi CD-ROM, DVD, WORM e magneto-ottici), dischi

rimovibili, sottosistemi RAID, scanner, stampanti e plotter.

Figura 1: Il bus SCSI

Il primo standard SCSI, parallel SCSI o SCSI1, fu standardizzato nel 1986 e progettato per

interconnettere fino a 7 dispositivi alla velocità di 5MB/s, con 8 linee dati + 1 di parità e con l’uso di

un connettore a 50 pin. Ne furono implementate due differenti versioni, incompatibili tra loro,

caratterizzate da distinte tecniche di pilotaggio elettrico del bus: Single Ended (SE) e High Voltage

Differential (HVD) o semplicemente Differenziale; quest’ultima, essendo meno sensibile al rumore, può

essere utilizzata su distanze e velocità di bus più elevate.

Successivamente si sono avute le seguenti principali evoluzioni dello SCSI, ottenute anche

attraverso tecnologie avanzate di tipo elettrico, quali la Low Voltage Differential (LVD):

- SCSI-2 (1992), con 10 MB/s per parallelismo di 1 byte, ma con la possibilità di raddoppiare il

parallelismo (16 bit-dati + 2 di parità, detta Wide SCSI) arrivando così a 20 MB/s;

- Ultra SCSI, con 20 MB/s su 1 byte, 40 MB/s nella versione a 2 byte (Wide Ultra SCSI, o Fast 40);

- Ultra 2 SCSI, con 40 MB/s su 1 byte, 80 MB/s nella versione wide (Wide Ultra 2 SCSI o Fast 80);

- Ultra 3 SCSI, detta anche SPI-3 (SCSI Parallel Interface 3), in fase di sviluppo. Una versione

implementata è detta Ultra160 SCSI e, introducendo nuove tecnologie, arriva ad una velocità di 160

MB/s, solo nella versione wide bus;

- SPI-4, detta anche Ultra 320 SCSI,. E’ lo standard ultra160 con velocità doppia, fino a 320 MB/s, Ad

oggi (inizio 2003) quasi tutte le nuove periferiche SCSI vengono prodotte ultra320.

- SPI-5, detta anche Ultra 640 SCSI,. E’ stata promulgata come standard all’inizio del 2003 (INCITS

367-2003) ed è conosciuto anche con il nome di fast ultra320. Al solito viene raddoppiato il transfer

rate fino a 640 MB/s.

1 of 1 25/01/2007 20.17

Bus esterno: USB file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Bus esterno: USB

L’interfaccia USB (Universal Serial Bus) fu sviluppata nel 1995 con l’idea di individuare un

meccanismo semplice di installazione di una periferica, a basso costo e semplice da usare, avente

caratteristiche “Plug and Play” e di connessione “a caldo”. Oggi è uno standard che supporta

trasferimenti di dati a 12 Mbit per secondo e che può connettere per ciascuna porta fino a 127

dispositivi, compresi modem, mouse, tastiere, "penne digitali", etc.; quasi tutti i PC di nuova

produzione hanno una o più porte USB.

La release 2.0 della specifica USB individua tre diversi transfer rate: 1.5 MB/s e 12 MB/s per

prodotti a bassa velocità – ed in questo caso si parla semplicemente di USB - e 480 MB/s per prodotti

ad elevata velocità, detti anche “Hi-Speed USB”. Il motivo di questa scelta sta nella volontà di

mantenere piena compatibilità con la precedente versione di USB e nel contempo di provvedere la

maggiore velocità prevista nella nuova raccomandazione.

1 of 1 25/01/2007 20.16

Lo standard IEEE 1394 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Lo standard IEEE 1394

Lo standard IEEE 1394 consente connessioni a larga banda isocrona fra calcolatori, periferiche e

apparecchiature dell'elettronica di consumo come videocamere o macchine fotogrfiche digitali; il

protocollo definito è anche usato per connessioni dirette fra tali apparrecchiature e stampanti,

L’interfaccia (che assume anche nomi commerciali FireWire, I Link e Lynx) ha una velocità di 400

Mbit per secondo nella versione 1394a ed 800 Mb/s nella versione 1394b, una sua porta connette fino a

63 apparati e supporta anch’esso ‘Plug and Play’ e connessione a caldo.

Come si è detto, lo standard supporta anche il trasferimento isocrono, ovvero fornisce garanzie che

un flusso di dati sia trasmesso in un determinato tempo. Questa caratteristica rende il bus ideale per

periferiche che richiedono trasferimento dati real time, come dispositivi video. Anche a causa del suo

maggior costo rispetto all’USB, IEEE 1394 è utilizzato principalmente per la connessione digitale di

video camere a Personal Computer.

1 of 1 25/01/2007 20.16

Interfaccia PCMCIA file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Interfaccia PCMCIA

PCMCIA sta per Personal Computer Memory Card International Association, e rappresenta una

associazione con circa 500 società che ha sviluppato uno standard per dispositivi piccoli, di forma

simile a carte di credito, chiamati anche PC cards.

Originariamente, PCMCIA è stato progettato per aggiungere memoria ai PC portatili; è stato poi

espanso più volte ed ora può essere usato per diversi dispostivi. Vi sono tre tipi di carte PCMCIA, tutte

di forma rettangolare (85.6×53 mm), ma di differente spessore:

- tipo I: spesse 3.3 mm, usate principalmente per collegare RAM o ROM, cioè memorie a stato solido

usate come periferiche;

- tipo II: spesse 5.0 mm, usate per modem, schede di rete (anche wireless) ed altre periferiche a PC

portatili;

- tipo III: spesse 10.5 mm, usate per dischi portabili (hard disk miniaturizzati).

PCMCIA Tipo I PCMCIA Tipo II PCMCIA Tipo III

Figura 1: Formati di schede PCMCIA

1 of 1 25/01/2007 20.16

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Capitolo settimo

Le memorie

Modello di unità di memoria

1 1.1 Modello generale

1.2 Memorie indirizzabili

1.3 Memorie associative

1.4 Memorie meccanicamente statiche e dinamiche

2 Celle elementari. Parametri di una memoria.

2.1 Celle elementari

2.2 Parametri di una memoria

3 Memorie e selezioni associative

4 Metodi di selezione

4.1 Selezione lineare e a più dimensioni

4.2 Selezione spaziale, temporale e con chiave

5 Gerarchia di memorie

6 Memorie RAM

6.1 Capacità e parallelismo

6.2 Memorie SRAM e DRAM

6.3 Buchi di memoria

6.4 Controllo di errore:parità ed ECC

7 Memorie a sola lettura

7.1 ROM

7.2 Memorie scrivibili una volta

7.3 Memorie riscrivibili

8 Architettura fondamentale delle memorie RAM

8.1 Interfaccia verso l’esterno

8.2 Celle di memoria e loro selezione

8.2.1 Selezione lineare

8.2.2 Semiselezione

9 Architettura di un sistema di memoria RAM

10 Collegamento CPU-memoria

10.1 Collegamento asincrono

10.2 Collegamento sincrono: memorie SDRAM

11 Cenno alla tecnologia delle RAM

11.1 SRAM bipolari

11.2 DRAM basata su MOS

Premessa

Componente fondamentale del modello di elaboratore è la memoria, che si presenta nelle due

versioni di memoria centrale o di lavoro e di memoria di massa. In questo capitolo si introducono i

concetti e i parametri che definiscono in generale una memoria e si presenta in particolare il modello

della memoria di lavoro, detta anche comunemente RAM (nello stesso capitolo si capirà perché).

1 Modello di unità di memoria

1.1 Modello generale

Con il termine unità di memoria o semplicemente memoria ci si riferisce in generale ad un sistema

organizzato con un insieme di registri (nel senso generale del concetto) che sia in grado di effettuare le

operazioni di:

- scrittura, cioè posizionamento di un registro in un determinato stato o, in altre parole, registrazione

1 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

del valore di un dato;

- lettura, cioè rilievo dello stato di un registro o, in altre parole, prelievo dalla memoria del valore

registrato;

- selezione, cioè individuazione di un registro fra tutti quelli costituenti la memoria, al fine di

effettuare su di esso una delle operazione di cui sopra.

Da un punto di vista del tutto generale, pertanto, ciascuna operazione di scrittura o lettura avviene su

un registro della memoria: a seconda dei casi, il registro contiene un carattere o una parola-macchina o,

per le memorie di massa, un blocco (o record fisico). Porremo in generale:

tipo registro-memoria = T

e riterremo la memoria rappresentata dal modello di fig.1.1, ove:

- MS (Memory Select), di tipo TS, è un dato che individua il registro di memoria da selezionare; si

vedrà in seguito che TS può essere integer, per le memorie indirizzabili e qualsiasi per le memorie

associative.

- M è l'insieme dei registri di memoria ed è espresso da:

var M: array[TS] of registro-memoria; (1.1)

- MB (Memory Buffer), dello stesso tipo T dei registri di memoria, è il dato in transito verso la

memoria (per la scrittura) o dalla memoria (per la lettura).

- RE (Read Enable), WE (Write Enable) sono due segnali binari che abilitano, rispettivamente, le

operazioni di lettura o di scrittura; essi, ovviamente, non possono essere concomitanti.

La memoria nella sua interezza può essere così schematizzata:

procedure memoria (MS:TS; RE,WE: boolean; var MB:T);

var array of

M: [TS] T;

begin if RE then MB:= M[MS] (1.2)

else if then

WE M[MS]:= MB

end Figura 1.1 - Modello di memoria

Sul piano delle tecniche di selezione, le memorie si possono funzionalmente classificare in memorie

indirizzabili ed associative.

1.2 Memorie indirizzabili

Nelle memorie indirizzabili, ogni registro è univocamente individuato da un numero intero, da 0 a

N-1 se la memoria possiede N registri. Il tipo di MS è dunque integer e il registro MS assume il nome di

memory address, MA; si ha dunque nella (1.1):

var M:= array[0..N-1] of registro-memoria; (1.3)

2 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

e la notazione M[MS] diviene quella di un elemento di array individuato da un intero.

Tipica memoria indirizzabile è la memoria centrale di un calcolatore.

1.3 Memorie associative

Nelle memorie associative, la registrazione in memoria è strutturata, in quanto composta dal dato

propriamente detto (anch'esso in genere strutturato) e da una informazione associata, detta chiave, atta

ad individuare univocamente la registrazione stessa (cfr. fig. 1.2):

tipo registrazione

cartesiano

chiave: TS; (1.4)

dato: T

end

e la notazione M[MS] individua il dato associato alla chiave di valore MS: in fase di lettura si seleziona

l'unica registrazione (se esiste) con la chiave associata, in fase di scrittura si registrano chiave e dato.

chiave dato

……………………….

…………. ……………………….

…………. ……………………….

………….

Fig.1.2 Memoria associativa

1.4 Memorie meccanicamente statiche e dinamiche

Le operazioni di lettura, scrittura e selezione avvengono con tecniche diverse dipendenti

dall'elemento fisico costituente la cella elementare e dalle caratteristiche tecniche richieste. Dal punto

di vista meccanico, le memorie possono essere statiche o dinamiche. Nelle prime, sia il supporto fisico

sia il dato sono fermi rispetto al sistema di lettura-scrittura ed un dato è individuato esclusivamente

dalla sua posizione spaziale: le operazioni di accesso alla memoria avvengono staticamente, nel senso

che non esistono organi in movimento.

Nelle memorie meccanicamente dinamiche, viceversa, il supporto, o comunque il dato in esso

memorizzato è in movimento rispetto al sistema di lettura-scrittura e tale movimento viene sfruttato per

l'operazione di selezione e/o per quella di lettura- scrittura.

Giova ricordare fin d’ora che i termini “statico” e “dinamico” applicati comunemente alle memorie

nella pratica corrente non si riferiscono tuttavia alle loro caratteristiche meccaniche, bensì a quelle

elettroniche (cf. § 6.2).

2 Celle elementari - Parametri di una memoria

2.1 Celle elementari

Una memoria è costituita da un lato di celle elementari, intese come dispositivi atti a memorizzare il

singolo bit e dall'altro dai sistemi di lettura, scrittura e selezione o, più in generale, dalla sua

architettura.

La cella elementare può essere costituita, in linea di principio, da un qualsiasi mezzo fisico bistabile

nel quale si associ convenzionalmente a ciascuno dei due stati uno dei due valori del bit da

memorizzare. I più diffusi elementi elettronici impiegati a tale scopo sono oggi:

- circuiti a stato solido (chip integrati), basati su multivibratori bistabili (flip-flop), apparecchiature

costituite da coppie di transistori bipolari (elettronicamente statiche, SRAM) oppure su transistori

MOSFET dei quali si adopera la capacità interelettrodica (elettronicamente dinamiche, DRAM);

- superfici magnetiche, sulle quali si sfruttano i metodi di registrazione magnetica basati sul

movimento reciproco della superficie rispetto ad apposite "testine di lettura-scrittura";

- memorie ottiche, nelle quali la scrittura è ottenuta mediante apposita “incisione” su una superficie

metallizzata (o mezzi analoghi) e la lettura mediante la differente riflessione di una raggio laser.

Altri elementi, come tubi elettrostatici, nuclei magnetici, diodi tunnel, materiale superconduttivo,

pellicole magnetiche, sono stati o sono tuttora impiegati come elementi di memoria, anche se meno

3 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

frequentemente e in applicazioni particolari.

Dal punto di vista meccanico, le memorie a chip di circuiti integrati sono statiche mentre sono

dinamiche quelle magnetiche ed ottiche, che adoperano supporti a forma di nastri o dischi.

Sul piano dell’architettura, si individuano due principali funzioni delle memorie, costituenti due

sistemi distinti:

- Il sistema di memoria centrale, realizzato con memorie meccanicamente statiche, tipicamente a

circuiti integrati: ad esso accede direttamente (o, come si vedrà, attraverso memorie intermedie dette

cache) il processore centrale per attingervi singolarmente istruzioni e dati.

- I sistemi di memoria di massa, in genere meccanicamente dinamici, nelle varie configurazioni di

nastri, dischi, dischetti: in essi le informazioni sono strutturate in blocchi che vengono spostati

integralmente nella memoria centrale prima di essere elaborati.

Come si vedrà, queste due classi di memoria costituiscono solo due componenti di una più ampia

"gerarchia di memorie".

2.2 Parametri di una memoria

I principali parametri di una memoria si possono così schematizzare.

A) Capacità

È il numero di dati che può contenere la memoria; si esprime indicando da un lato il numero N

complessivo di registri della memoria e dall'altro la lunghezza in bit dei singoli registri.

Per le memorie centrali, la capacità si esprime oggi in byte (8 bit), indipendentemente da quale sia

l'organizzazione interna della stessa (a byte, a parole di 16 o di 32 bit, etc.) e soltanto ad un secondo

livello di specifica tale organizzazione viene messa in evidenza. Per una vecchia consuetudine che

deriva dal fatto che tipicamente dette capacità sono uguali a numeri che coincidono con potenze di 2, si

usa assumere

10

1 kilo= 2 =1024 [1]

, Si ha ad esempio una memoria (o

e di conseguenza vengono valutati gli altri multipli del byte (Mega, Giga, etc.)

meglio un modulo di memoria) di:

· 1MB (1M×8 bit),

· 4MB (4M×8 bit),

4MB (1M×32 bit),

· 32MB (8 M×32 bit)

·

· etc.

Per le memorie di massa, la capacità si esprime ancora in multipli del byte, ma stavolta è

3

1 kilo= 10 =1000

Si hanno ad esempio nastri da 40 GB, dischi da 500 MB o dischetti da 1,4 MB.

B) Tempo di accesso

È il tempo necessario per compiere un’operazione di lettura o scrittura; nel caso più generale si

compone di due tempi distinti: il tempo per operare la selezione e quello per effettuare l'operazione vera

e propria di scrittura o lettura. È inoltre da distinguere il tempo netto per effettuare una singola

operazione fisica e il tempo per effettuare un’operazione completa dal punto di vista logico:

quest'ultimo è in generale maggiore del tempo fisico e viene detto tempo di ciclo.

C) Casualità di accesso

Mentre in alcune memorie il tempo necessario per la selezione di un dato è costante, in altre risulta

variabile con la posizione che il dato stesso assume all'interno del supporto di memoria. Le memorie del

primo tipo, dette ad accesso casuale o random, sono in genere quelle in cui il sistema di

lettura-scrittura opera staticamente, mentre quello del secondo tipo, dette ad accesso non causale, sono

meccanicamente dinamiche; in queste ultime, infatti, il tempo per la selezione dipende dalla distanza fra

il sistema di lettura-scrittura e la posizione del dato sul supporto. Il tempo di accesso è dunque costante

per le memorie casuali, variabile per quelle non casuali; alcune memorie, infine, in cui il tempo di

accesso è poco variabile con la posizione dell'informazione, vengono dette ad accesso quasi casuale o

4 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

ad accesso diretto. Sono tipicamente casuali le memorie realizzate con circuiti integrati, non casuali le

altre. In linea di massima, sono ad accesso sequenziale le memorie a nastro magnetico e ad accesso

diretto quelle a dischi.

D) Volatilità

Si dicono volatili quelle memorie in cui l'informazione tende a distruggersi con il tempo oppure con

la mancanza delle tensioni di alimentazione, permanenti le altre; esempi di volatilità del primo tipo

sono le memorie basate sulla carica di capacità (come le memorie DRAM a tecnologia MOSFET),

esempi del secondo tipo le memorie a flip-flop, mentre le memorie magnetiche ed ottiche sono in

genere permanenti (cfr. § 6.2).

Nella Tabella 2.1 sono indicate le caratteristiche tecniche tipiche delle principali memorie ad oggi

(2003); per i dettagli si veda in seguito. Si noti tuttavia che tali parametri sono fortemente variabili nel

tempo. Tabella 2.1 - Principali parametri delle memorie

Capacità

Tempo di Velocità di (1 modulo o

Tipo Casualità Volatilità

accesso trasferimento volume)

RAM 2-20 ns ------- 16MB - 1GB casuale si

Dischi 10 – 100 ms .4-50 GB diretto no

dipende

da interfaccia

Nastri 30 s .100 GB sequenziale no

3 Memorie e selezioni associative

Il modello di memoria associativa definito al § 1 ha una duplice valenza: da un lato rappresenta

memorie meccanicamente statiche per le quali effettivamente si applica una selezione di tal genere

(come ad esempio le memorie cache e le memorie virtuali) oppure tabelle di supporto a queste,

dall'altro rappresenta una tecnica di selezione diffusa nelle memorie a dischi sia dinamiche sia

statiche.(cfr. cap.8) Figura 3.1 - Memoria associativa (schema di principio)

Per approfondire tale argomento, si consideri che una memoria associativa i cui registri siano del

[2] :

tipo definito in (1.4) si può descrivere come segue nelle sue linee fondamentali (cfr.fig.3.1)

var A: array [0..N-1] of registrazione

for i:= 0 to N-1 do

if A[j].chiave = MS then do

begin

if RE then MB:= A[j].dato

else if WE then A[j].dato := MB

end

In altri termini, si può pensare ad una memoria associativa realizzata attraverso un algoritmo di

ricerca tabellare della chiave ed un’operazione di lettura o scrittura associata. I confronti fra MS e le

diverse chiavi registrate A[j].chiave si possono realizzare, con soluzione parallela, in altrettanti

comparatori (cfr. § III-18) oppure, con soluzione seriale, in sequenza l'uno dopo l'altro (così come nella

5 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

interpretazione alla lettera dell'algoritmo), con un solo comparatore che è investito nel tempo dai

successivi confronti, oppure infine con soluzioni intermedie.

In ogni caso, appositi algoritmi debbono essere realizzati per risolvere i possibili conflitti (memoria

piena all'atto della scrittura di una nuova chiave, chave non trovata all'atto della lettura, etc.).

4 Metodi di selezione

4.1 Selezione lineare e a più dimensioni

Un sistema di selezione si dice lineare se è unico e seleziona direttamente e singolarmente ciascuno

degli N registri; si dice invece a più dimensioni se è costituito da più sottosistemi, ciascuno dei quali

seleziona un sottoinsieme degli N registri e la selezione di un singolo registro si ottiene dall’azione

combinata dei diversi sottosistemi. Se i sistemi di selezione sono due, la tecnica si dice anche di

semiselezione.

4.2 Selezione spaziale, temporale e con chiave

La selezione spaziale consiste nell'individuare la posizione fisica in cui è allocato il registro da

selezionare.

Per le memorie statiche, tale metodo richiede altrettanti circuiti di accesso ai singoli registri (o ai

sottoinsiemi di selezione multipla) ed appositi selettori o decodificatori che individuino di volta in

volta il registro da selezionare. Il sistema di selezione, pertanto, si irradia verso tutti i registri della

memoria ed un apposito decodificatore (fig.4.1a), ricevendone l'indirizzo MS, individua da quale

registro deve prelevare (o in quale registro deve immettere) il dato da trasferire in MB (o da MB).

Per le memorie dinamiche, il metodo è in uso in sottosistemi di selezione, ad esempio per la

selezione di una traccia di un disco, e richiede lo spostamento del sistema di lettura-scrittura fino a

raggiungere il posto richiesto. Dicesi allora tempo di seek il tempo necessario a che il sistema di

lettura-scrittura raggiunga il registro da selezionare; esso è variabile in funzione della distanza da

percorrere. Figura 4.1 - Metodi di selezione: a) spaziale; b) temporale

Nella selezione temporale (fig.4.1b) il sistema di lettura-scrittura L è fermo ed accede fisicamente ad

un'unica posizione, dinamicamente attraversata dai singoli registri della memoria: allorché il selettore

riconosce il passaggio del registro da selezionare ne trasferisce il contenuto in MB. Il tempo necessario

a che il registro da selezionare raggiunga il sistema di lettura-scrittura è detto tempo di latenza e

dipende dalla velocità di spostamento e dalla posizione reciproca fra L ed il record fisico da

selezionare.

Per accedere al registro i è necessario contare, dopo il passaggio sotto L di un "punto di riferimento"

(p nella figura), il trascorrere di un determinato tempo t oppure il passaggio di (i-1) registri. In qualche

modo il selettore effettua detto conteggio ma la prima tecnica è poco affidabile ed entrambe hanno dei

limiti: il tempo di latenza massimo è quello di 2 giri (uno per attendere P, uno per accedere al registro)

e non sono facilmente gestibili errori o guasti della memoria.

Per superare gli inconvenienti esposti, nella selezione temporale spesso si adopera una tecnica

associativa o con informazioni di riferimento: insieme alle informazioni utili viene registrata anche una

chiave che identifica univocamente la registrazione stessa (ad esempio, viene registrato il numero

d'ordine i o "indirizzo" della registrazione). L'accesso al registro desiderato viene dunque controllato da

6 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

un confronto fra la chiave della registrazione richiesta e quelle registrate: il selettore legge

sequenzialmente tutte le chiavi ed effettua la lettura o scrittura del registro associato a quella

coincidente con la chiave data, come illustrato al § 3 (selezione associativa).

5 Gerarchia di memorie

I parametri tecnico-economici di una memoria sono la capacità, il tempo di accesso e il costo per bit.

Problemi tecnici e di mercato fanno sì che, per restare in fasce di costi accettabili, le memorie

disponibili o possiedono buone caratteristiche di capacità ma sono relativamente lente o sono veloci ma

poco capaci. Tali considerazioni hanno suggerito, fin dai primi elaboratori, l’articolazione della

memoria nei due principali sistemi, quello centrale, con requisiti medi di capacità e buone

caratteristiche di velocità e quello di massa, con più elevate capacità e minore velocità operativa.

Le differenti velocità operative e funzionalità hanno suggerito una strategia di uso dei due sistemi di

memoria che può essere così descritta:

- un programma è archiviato in memoria di massa e da questa viene spostato in memoria centrale per

essere eseguito;

- l’elaborazione dei dati di un file avviene spostandone un record in memoria centrale e quindi

effettuando l'elaborazione su di esso.

Strategie analoghe si adoperano anche per:

- La segmentazione: se un programma non entra integralmente in memoria centrale, se ne pone un

segmento e lo si esegue; quando da questo si fa riferimento ad istruzioni contenute in altro segmento,

quest'ultimo viene prelevato dalla memoria di massa e va a sostituire il primo (questa tecnica è oggi

poco usata, vista la grande capacità delle memorie attuali).

- La memoria virtuale: il sistema "vede" una memoria virtuale più ampia di quella centrale fisica, ove

risiedono solo alcune "pagine" (insiemi di istruzioni e/o dati di predefinite dimensioni di memoria, ad

esempio 32 kB) prelevate dalla memoria di massa. All'atto dell'accesso in memoria centrale, ove la

pagina richiesta non sia ivi presente, questa viene prelevata dalla memoria di massa andando a

rimpiazzare un'altra pagina (la tecnica è attuale e serve anche per problemi di rilocazione).

In tutti i casi di cui sopra, la strategia è quella di tenere nella memoria più veloce segmenti di

programmi e dati per i quali si prevede una elevata frequenza di accessi e di tenere viceversa nella

memoria più capace ma più lenta quelli meno movimentati; appositi algoritmi, gestiti a seconda dei casi

dal software applicativo, da quello di base o dall'architettura del sistema, trasferiscono, quando

necessario, i segmenti da una memoria all'altra; questo trasferimento, avvenendo a blocchi di dati, è

molto più veloce che non il trasferimento individuale dei dati coinvolti.

La strategia di cui sopra rende più efficiente il sistema nel suo complesso e la disponibilità di sistemi

di memoria differenti suggerisce di estenderla anche ad altri livelli; in particolare, a valle di una

memoria (centrale o di massa) si inserisce spesso una memoria cache, di questa più veloce ma meno

capace, nella quale vengono riversati segmenti di programmi e/o dati e alla quale accede direttamente

l'organo che li deve usare.

Funzione analoga alle memorie cache, ma più semplici nella gestione, svolgono le memorie di

transito (o buffer), tipiche di apparecchiature periferiche e delle stesse memorie di massa; in esse i dati

vengono provvisoriamente registrati per essere poi inviati altrove; talora si tratta di singoli registri che

svolgono tale funzione, come ad esempio il "memory buffer" che interfaccia una memoria indirizzabile

con il processore; in altri casi si tratta di sistemi di memoria che hanno la funzione di rendere più

semplici i problemi di interfacciamento con il calcolatore centrale e più rapido il funzionamento. Una

tastiera dotata di memoria di transito, ad esempio, piuttosto che inviare verso il sistema un carattere per

volta, prima memorizza un insieme di caratteri (ad esempio una riga) e poi effettua la trasmissione. Un

esempio più evoluto e vicino alla memoria cache è il buffer di 1 o 2 MB interposto fra una unità a

nastro magnetico ed il sistema centrale.

In definitiva. le memorie sono organizzate in gerarchie, che contengono da un estremo sistemi di

memoria di piccola capacità e grossa velocità, dall’altro memorie capaci ma relativamente lente. Dal

punto di vista delle caratteristiche hardware, la gerarchia comprende essenzialmente:

- nastri magnetici

- dischi ottici o magnetici

- memorie a stato solido

7 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Dal punto di vista funzionale, un sistema di calcolo pone ai diversi livelli gerarchici, nell’ordine le

seguenti esigenze:

- Memorie di backup, cioè memorie atte a salvare ed archiviare i file residenti nelle memorie di massa

in linea; si usano a tale scopo nastri e dischi magnetici rimovibili, in qualche caso dischi ottici.

- Memorie di massa per l’archiviazione di programmi e dati di non frequente consultazioni, da montare

all’occorrenza trasferendone i contenuti nelle memorie di massa in linea; si usano a tale scopo gli

stessi supporti che nelle memorie di backup.

- Memorie di massa per trasferire dati fra macchine; si usano a tale scopo dischi rimovibili anche a

stato solido (cfr. cap. 8), dal dischetto ad appositi hard disk oppure nastri.

- Memorie di massa in linea, cioè memorie di grossa capacità atte a memorizzare il file system,

contenente le biblioteche di programmi e sottoprogrammi di uso comune nonché il sistema operativo e

tutti gli archivi-dati di frequente consultazione; si usano i cosiddetti hard disk.

- Memoria di lavoro o memoria centrale, che contiene i programmi o le parti di essi in corso di

esecuzione e i record-dati in corso di elaborazione; si usano circuiti a stato solido (memorie volatili).

- Registri generali di macchina (si pensi, ad esempio, ad un registro con funzioni di accumulatore; ad

esso si accede con notevole frequenza durante il calcolo di una espressione); si usano memorie a stato

solido molto veloci.

Fra i diversi livelli della gerarchia spesso sono interposte memorie cache e buffer, come ad esempio:

- 1 o 2 livelli di cache di sistema fra la memoria centrale e il processore (realizzata con memoria a

stato solido);

- una cache a stato solido fra l’unità a dischi e la memoria centrale;

- una cache a dischi fra una memoria a nastro e il sistema centrale.

- un buffer a stato solido fra nastro e CPU.

6 Memorie RAM

6.1 Capacità e parallelismo

Le memorie a stato solido indirizzabili, essendo ad accesso casuale, vengono genericamente dette

RAM (Random Access Memory); per esse la selezione avviene attraverso l'indirizzo MA e il selettore è

un decodificatore (cfr. §§ 1.2, 4.2). Detti N, p il numero di bit rispettivamente di MA ed MB è evidente

che: N

- la capacità di memoria è di 2 bit;

- il parallelismo di memoria è di p bit.

Per motivi di vincoli costruttivi da un lato e di flessibilità dall’altro, le memorie si producono in

moduli (che a loro volta assemblano più chip); il sistema di memoria si costruisce poi montando su di

una scheda più moduli per realizzare un’unica unità di memoria. Le relazioni di cui sopra si applicano

sia al singolo modulo (sia al chip) sia alla memoria nella sua interezza.

In particolare, i chip sono messi insieme in primo luogo per aumentare il parallelismo, nel senso che

una memoria di parallelismo p può essere realizzata con l'impiego di N moduli di parallelismo p con:

i

.

Analogamente, una memoria di capacità C può essere realizzata con l'impiego di N moduli, tutti con

il medesimo parallelismo p e capacità C con: . Un apposito selettore allora seleziona il modulo

i

e, all'interno del modulo, il singolo registro.

6.2 Memorie SRAM e DRAM

Una memoria è costituita da celle, ciascuna per la memorizzazione di un bit. Come si è accennato

(cfr. § 2.1), le celle elementari possono essere di due tipi: realizzate con una coppia di transistori

oppure con un unico transistore, del quale si adopera la capacità interelettrodica per la memorizzazione

del bit.

Nel primo caso, ogni cella di memoria occupa sul chip uno spazio maggiore che nel secondo e quindi

è possibile realizzare memorie sul chip di minore capacità, ma i tempi di accesso sono ottimi: le

8 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

memorie sono dette SRAM (RAM statiche) in quanto elettronicamente non soggette ai fenomeni di cui

al secondo caso.

Nel secondo caso, l’elemento di memoria è in effetti la capacità, che con il suo stato di “carica” o

“scarica” determina il valore del bit memorizzato. Ma una capacità, per una nota legge elettrica, tende

con il tempo a scaricarsi e dunque a perdere l'informazione in essa memorizzata: la memoria è

doppiamente volatile (si scarica con il tempo oltre che perdere informazione per mancanza di

alimentazione). Fortunatamente, la costante di tempo per la scarica della capacità è molti ordini di

grandezza maggiore del tempo di accesso (millisecondi contro nanosecondi) ed è possibile intervenire

dinamicamente e periodicamente sulla memoria per “rinfrescarne” (refresh) il contenuto, effettuando un

ciclo che legge e riscrive la memoria. Da questa tecnica deriva il nome di memoria dinamica o DRAM.

Le memorie DRAM sono più lente (non per la presenza del refreshing, ma perché i transistori usati

sono più lenti) e più capaci e costituiscono una gerarchia con le SRAM. Tipicamente, le DRAM si

usano come memoria centrale, le SRAM come cache.

6.3 Buchi di memoria

Talora nasce l'esigenza di sostituire un certo numero di registri ad indirizzi consecutivi di una

memoria A con altri di pari numero e parallelismo costituenti un modulo B fisicamente diverso. Tipico

esempio è quello in cui si sostituisce una piccola parte di RAM con una ROM oppure con un'altra RAM

con tempi di accesso migliori o, ancora, con registri fisicamente allocati in una unità diversa della

memoria quale, ad esempio, un’interfaccia di ingresso/uscita (cfr. modello "memory mapped" di I/O, §

VI-9.2.2).

Si crea allora nella memoria A un "buco logico" che ne rende inattivi alcuni registri, sostituendoli

con gli altri nel senso che il selettore accede all'uno o all'altro blocco fisico a seconda dell'indirizzo MA

(fig. 6.1). Figura 6.1 - Buco di memoria

6.4 Controllo di errore:parità ed ECC

Tipicamente, in una memoria RAM vengono svolte funzioni ausiliarie per il controllo ed

eventualmente per la correzione di errori: la memoria contiene un numero di bit ridondanti ed all'atto

della scrittura il dato da registrare viene arricchito con un bit di parità (solo controllo di errore) oppure

di un codice ECC (controllo e correzione). In fase di lettura, viene controllata la parità del dato ed

eventualmente segnalato l'errore oppure, in caso di ridondanza maggiore, viene corretto, su basi

probabilistiche, l'errore rilevato.

Ad esempio, un modulo di memoria con controllo di parità si presenta come:

4MB (1M×36 bit)

·

cioè con 4 bit di parità per ogni parola utile di 32 bit (un bit di parità per byte), mentre un modulo con

ECC è:

· 4MB (1M×40 bit)

cioè con un codice ECC di 8 bit per ogni 32 bit utili.

7 Memorie a sola lettura

9 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

7.1 ROM

Le memorie a sola lettura (ROM, Read Only Memory o ROS, Read Only Storage) sono memorie che

in funzionamento normale non consentono l'operazione di scrittura, ma soltanto quella di lettura;

l'operazione di scrittura è effettuata prima del montaggio della memoria nel sistema e consiste in

un’operazione che registra i dati in forma non volatile.

Il fatto che la memoria sia a sola lettura può dipendere da scelte strategiche di sistema, allorché si

desiderino programmi o dati che non si vuole correre il rischio di cancellare riscrivendovi sopra, oppure

da limiti tecnologici: di alcune memorie, peraltro vantaggiose sotto altri aspetti, non si riesce a

[3]

realizzare un sistema di scrittura efficiente e rapido come quello di lettura .

Sono tecnologicamente a sola lettura alcune memorie a stato solido, per le quali il processo di

scrittura viene effettuata una tantum dal costruttore, su richiesta dell'utente che definisce la maschera di

"1" e "0" della memoria: vengono anche dette ROM programmabili a maschera. Esse sono usate come

elemento circuitale oppure per contenere programmi fissi da eseguire a notevole frequenza (sotto questo

aspetto, è ad un estremo della gerarchia di memoria): tipicamente, i microprogrammi del processore

centrale (i programmi per l'esecuzione delle singole istruzioni in linguaggio macchina), alcune parti

invarianti del sistema operativo (ad esempio il caricatore di sistema), tabelle di costanti utili per

l'esecuzione di algoritmi di sistema o anche parti di software più evoluto (ad esempio l'interprete di un

linguaggio).

Sono anche a sola lettura alcune memorie ottiche, nelle quali il processo di scrittura o “stampa” della

memoria è effettuato soltanto una tantum in laboratorio: tipicamente i CD-ROM di prima generazione.

7.2 Memorie scrivibili una volta

In altri casi, una memoria può essere scritta, ma una sola volta, in esercizio. Si tratta in genere di

memorie tecnologicamente simili alle ROM, ma per le quali la tecnologia ha superato il vincolo di

scrittura, riportando tale operazione a livello di utente.

Per le memorie a stato solido si hanno ad esempio le cosiddette PROM, Programmabile ROM:

l'utente stesso, con una apposita apparecchiatura da laboratorio, definisce i contenuti della ROM.

Funzionalmente analoghe sono alcune memorie dette genericamente WORM, Write Once Read Many,

come ad esempio i CD-R, CD-ROM scrivibili dall’utente (una sola volta), oppure apposite memorie

magneto-ottiche dette appunto WORM.

7.3 Memorie riscrivibili

Si tratta di vere e proprie memorie complete, dotate cioè sia di capacità di lettura sia di scrittura.

Assumono questo nome in quanto derivano da tecnologie che fino a poco tempo prima erano a sola

lettura oppure riscrivibili una sola volta. Un esempio per tutti è costituito dai CD-RW, gli ex CD-ROM

che ora è possibile anche riscrivere più volte.

Fra le memorie a stato solido, appartengono a questa categoria le cosiddette EPROM (Erasable

PROM), simili alle PROM ma che possono essere cancellate, sempre con l’aiuto di apposita

apparecchiatura, e quindi riscritte.

8 Architettura fondamentale delle memorie RAM

Si ricorda (cfr. § IV-4) che il modello assunto di unità di memoria si interfaccia con il processore

attraverso i due registri MA (memory address) ed MB (memory buffer) ed i segnali di controllo RE

(read enable) e WE (write enable). Una unità di memoria RAM è di solito realizzata assemblando più

moduli (cfr. esempi di § 6.1) e ciascun modulo è realizzato collegando fra loro più chip di memoria.

N ) e

Esamineremo in questa sede l’architettura di un singolo chip con MA di N bit (capacità k=2

parallelismo p (numero di bit di MB).

Esamineremo dapprima un chip con p=1 (un solo bit di parallelismo), estendendo poi all'occorrenza

al caso p>1.

8.1 Interfaccia verso l’esterno

In primo luogo giova far presente che, oltre ai segnali di cui sopra, in input al singolo chip esiste un

segnale di abilitazione generale dello stesso, tipicamente detto CS (Chip Select), la cui funzione è

appunto quella di abilitare il chip: nel caso che CS non sia attivo il chip non opera e quindi se

sollecitato per la scrittura (WE) non altera il contenuto di nessuna delle sue celle, se in lettura, l'uscita

10 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

MB resterà neutra. Questo è importante soprattutto per quanto si vedrà al paragrafo successivo.

Il bus MB è unico sia per l'input che per l'output dal modulo e l'interfaccia della memoria verso

ed uno

l'esterno deve provvedere a renderlo bidirezionale, traendo da questo un bus interno di input D i

di output D . Inoltre il bus MB deve essere disaccoppiato dai bus D e D sia dal punto di vista

o i o

elettronico sia da quello logico: a tale scopo spesso si usa un "buffer" interno al chip nel quale viene

memorizzato il dato proveniente da MB prima che esso sia effettivamente scritto in memoria oppure il

dato proveniente dalla memoria dopo di essere stato letto. Nel caso p=1 il bufffer è costituito da un

flip-flop interno mb atto a memorizzare il bit di MB corrispondente, nel caso di p>1, lo schema si ripete

per ogni bit. In fig, 8.1 è mostrato uno schema di riferimento per p=1, il quale opera come segue:

· In caso di lettura (RE=1) e sempre che sia CS=1 l'interfaccia genera in sequenza due segnali:

R, che abilita il chip a leggere, e poi

o R', che memorizza il bit letto in mb (l'operazione sarà meglio analizzata nei prossimi

o sottoparagrafi).

· In caso di scrittura, analogamente, WE genera

W' che memorizza in mb, e poi

o W che scrive in memoria.

o

· l'input di mb è multiplexato fra il dato proveniente da MB (abilitato da W') e quello dalla

memoria (abilitato da R, cfr. §§ 8.2, 8.3).

· l'output di mb è demultiplexato fra il dato destinato a MB (abilitato da R') e quello destinato

alla memoria (abilitato da W, cfr. §§ 8.2, 8.3). termina con un tristate

È da notare che il circuito di lettura che proviene dalla memoria sul bus D o

diretto verso mb e che, viceversa, il circuito di scrittura che si dirige verso la memoria con il bus Di

inizia con un tristate diretto verso la memoria (cfr. figg. 8.2, 8.4).

Figura 8.1 Interfaccia di un chip di memoria

8.2 Celle di memoria e loro selezione

La cella di memoria, quella cioè atta a memorizzare un singolo bit, può essere logicamente

schematizzata come un flip-flop con un input di abilitazione ed un terminale che ha la duplice funzione

di input e output del bit .(i flip-flop normali, come mb, distinguono il pin di input da quello di output,

quelli di memoria li unificano per minimizzare il numero di fili che attraversa il chip, cfr. § 10); in fig.

8.2a) è schematizzata la cella di memoria.

Selezione lineare

8.2.1

Le operazioni di lettura e scrittura sono rispettivamente operazioni di trasferimento del bit in

(proveniente da MB) sulla cella selezionata oppure, viceversa, da questo sul bus di uscita

ingresso D i

che “raccoglie” il bit e lo invia verso MB. La selezione, se di tipo lineare, è effettuata da un decoder

D o

1/k che, a partire dagli N bit di MA, individua una delle k celle elementari.

11 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Fig. 8.2. a) Cella di memoria; b) Architettura interna di un chip di memoria a selezione lineare

La selezione lineare richiede di distribuire sul chip tanti conduttori di selezione quanta è la capacità

del chip: nel caso, ad esempio, di un chip da 1 Mbit, circa un milione di conduttori (per l’esattezzza,

20

1M=2 = 1.048.576). Inoltre, le celle sono distribuite linearmente (si sviluppano in una sola

dimensione) sull’area del chip, mentre per sfruttare al massimo il silicio sarebbe opportuno uno schema

che occupasse con qualche regolarità le due dimensioni di un piano.

Unico vantaggio di questa tecnica (che è in realtà soltanto una tecnica di riferimento oppure usata

per memorie di piccole dimensioni) è quello di consentire una semplice realizzazione di un chip con

p>1. È infatti sufficiente usare la seconda dimensione del piano per distribuirvi le p celle di una parola

di memoria: i conduttori che escono dal decodificatore investono in parallelo le p celle e tutto lo

schema di figura si ripete p volte, una per ciascun bit della parola.

8.2.2 Semiselezione

Molto più efficiente è una soluzione con tecnica a semiselezione basata sul seguente concetto: gli N

bit dell’indirizzo si dividono in due gruppi di N/2 (supposto N pari), dei quali l’uno fa capo ad un

decoder di riga, l’altro ad uno di colonna (cfr. fig. 8.3, con N=16). Le celle di memoria si dispongono

in un array N/2 ´ N/2, in modo che ciascuna cella appartenga ad una riga e ad una colonna. La selezione

di una cella avviene allorché ne sia stata selezionata la riga e la colonna cui appartiene. Questa è una

tecnica generale per tutti i problemi di selezione o di decodifica e non soltanto per le memorie: essa

N

riduce il numero dei conduttori da 2 a 2N (nel caso di 1 Mbit da 1 milione a 2000).

Figura 8.3 Organizzazione di un chip RAM a semiselezione

In concreto, con riferimento a memorie RAM con p=1, il decodificatore orizzontale seleziona una

riga di celle (cfr. fig. 8.4), mentre la selezione verticale rende attiva un solo bus verticale. La cella è

tale che può essere scritta soltanto se ne sono selezionate riga e colonna di appartenenza e legge,

analogamente, soltanto la cella selezionata.

Se ad esempio è selezionata la i-esima riga e j-esima colonna, il comportamento è il seguente:

· In scrittura, tutte le celle della riga i sono selezionate ed il dato in input, D , demultiplexato fra tutte le colonne,

i

12 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

rende attiva la sola colonna j e neutre tutte le altre. Ne segue che solo M , selezionate e con ingresso attivo,

ij

viene riscritta al valore D ..

i

In lettura tutte le celle della riga i inviano i loro valori sui rispettivi bus-dati di colonna, che, attraverso i tristate

· . Essendo soltanto la colonna j attiva, il solo valore di M viene trasferito

di lettura, sono multiplexati verso D

o ij

.

in D

o Figura 8.4. Architettura di un chip a semiselezione

Nel caso esaminato della semiselezione e p>1 occorre ripetere lo schema di fig. 8.4 p volte, una per

ciascun bit della parola di memoria: i bit omologhi sono raggiunti dai medesimi segnali di selezione di

riga e di colonna; lo schema globale può avere uno sviluppo planare (occupando ogni bit un’area

diversa della superficie) oppure spaziale (usando ad esempio chip multistrato). In figura 8.5 è mostrato

lo schema di principio delle due soluzioni.

13 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 8.5 Memorie a semiselezione con parallelismo maggiore di uno:

a) schema planare; b) schema spaziale

9 Architettura di un sistema di memoria RAM

Una memoria di capacità C è tipicamente realizzata collegando opportunamente m moduli a capacità

C'=C/m, con m potenza di 2. Si supponga allora che sia (C, C' ed m sono potenze di 2):

c= log C q=log C' k= log m c=q+k

2 2 2

L'indirizzo complessivo MA della locazione di memoria può essere visto allora come composto di

chip (k bit) ed un indirizzo nel chip (q bit) e i diversi moduli possono essere

due parti: un indirizzo del

collegati secondo lo schema di fig. 9.1:

un decodificatore 1/m decodifica l'indirizzo del chip e abilita attraverso il chip select uno solo

· fra gli m moduli;

· gli altri q bit dell'indirizzo sono applicati in parallelo a tutti gli m moduli: soltanto quello

selezionato ne sarà influenzato;

I memory buffer di tutti i moduli sono posti in parallelo: soltanto quello abilitato produrrà il

· dato in uscita (gli altri danno uscita neutra) oppure recepirà il dato in ingresso.

Figura 9.1 Collegamento di moduli di memoria per aumentare la capacità

1.10 Collegamento CPU-memoria

Un modello semplice del collegamento CPU-memoria. che fa riferimento allo schema di

collegamento del § IV-4, è illustrato in. fig. 10.1. CPU e memoria sono collegati attraverso:

14 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 10.1. Collegamento CPU-Memoria

un bus-dati, collegato al registro MB del processore, sul quale viaggiano bidirezionalmente i dati

-· dalla memoria alla CPU in lettura o viceversa in scrittura;

-· un bus-indirizzi, proveniente dal registro MA del processore e diretto verso la memoria;

un bus-controllo, ove viaggiano i segnali di controllo della trasmissione.

· La tempificazione del collegamento può essere:

asincrona: esiste un colloquio fra le apparecchiature, in base al quale ad una richiesta di lettura o

· scrittura la memoria risponde con un segnale quando l'operazione è terminata;

sincrona, cioè basata solo sul clock: l' operazione in memoria avviene in un tempo precisato.

· La soluzione asincrona è più complessa, ma preferita per le memorie tradizionali in quanto rende

indipendente il progetto della memoria da quello della CPU e rende possibile il collegamento ad una

CPU di memorie a differenti velocità. La soluzione sincrona è viceversa più veloce ed è preferita nelle

architetture veloci moderne.

10.1 Collegamento asincrono

Il collegamento classico fra CPU e memoria è di tipo asincrono e viene gestito con tecnica analoga a

quella già vista per l'I/O (cfr. § V-xx, colloquio handshake). Per fissare le idee, supporremo che il

colloquio avvenga con l'uso dei seguenti segnali di controllo:

RE (read enable), dalla CPU alla memoria, che chiede un'operazione di lettura;

· WE (write enable) che chiede analogamente una operazione di scrittura;

·

· ACK, "risposta della memoria alla CPU,

Per illustrare i dettagli della tempificazione si usano diagrammi come quello di fig. 10.1:

per i segnali di controllo sono indicati espressamente i valori 0 ed 1 (ad esempio, al tempo t

· 2

passa da 1 a 0)

per gli indirizzi si indicano solo le variazioni (ad esempio, al tempo t il bus ADDR cambia

· 1

valore);

per i dati si indica con un'unica linea il valore neutro (alta impedenza), con una coppia di linee un

· valore attivo (ad esempio, al tempo t3 il bus-dati assume un valore valido.

In particolare, la fig. 10.1 illustrata la tempificazione per una operazione di lettura e si ha:

al tempo t il processore pone un indirizzo sul bus apposito;

-· 1

al tempo t il processore invia alla memoria il segnale RE;

-· 2

al tempo t la memoria pone il dato letto sul bus;

-· 3

al tempo t la memoria comunica l'ACK al processore.

-· 4

15 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 10.1 Tempificazione asincrona per una operazione di lettura

Si noti che il protocollo usa una tempificazione sui fronti dei segnali di comando: la variazione 1®0

segnala alla memoria la richiesta di una lettura, mentre la variazione 0®1 del segnale

del segnale

ACK segnala al processore che la memoria ha posto un dato valido sul bus-dati (agendo così da strobe

per il caricamento del registro MB del processore).

10.2 Collegamento sincrono: memorie SDRAM

Nelle architetture moderne più veloci la memoria principale viene usata con operazioni di

trasferimento dati a blocchi da e per la memoria cache: ad esempio, un blocco di dati di determinata

lunghezza viene letto a partire da un determinato indirizzo. Questo tipo di operazione tipicamente si

adatta ad una tempificazione sincrona: viene effettuata una sola selezione in memoria per tutto il blocco

ed il trasferimento avviene velocemente controllato esclusivamente dal clock.

Una tecnologia di questo tipo è stata introdotta agli inizi degli anni 2000 con le memorie SDRAM

(Synchronous DRAM), che presentano tempi di accesso (in modalità di trasferimento a blocchi)

dell'ordine di 4-12 ns.

11 Cenno alla tecnologia delle RAM

11.1 SRAM bipolari

Con riferimento alla tecnologia TTL (esistono invero altre tecnologie più moderne), una cella di

memoria si basa sullo schema di un flip-flop RS.

In tale tecnologia, la porta fondamentale è la NAND, uno schema fondamentale della quale è

mostrato in fig. 11.1, ove un primo transistore multiemettitore realizza una AND ed il successivo un

NOT, con ingresso in base della and e uscita sul collettore.

Fig. 11.1 Schema di NAND in TTL

È noto che un flip-flop si realizza con due nand a incrocio: lo schema di fig. 11.2 presenta una

[4]

possibile soluzione: gli ingressi sono ancora sulla base dei transistori “a incrocio” .

16 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Fig. 11.2 Schema di flip-flop NAND in TTL

Per la cella di memoria è peraltro necessario avere i bus di input e di output coincidenti; si può allora

adottare lo schema di fig. 11.3. La and è realizzata in modo atipico, con un ingresso (set o reset) su

emettitore ed uno (il collettore a incrocio) in base:sempre che la cella sia abilitata (s alto) se è Y alto

0

(Q non conduce) e S basso il transistore Q conduce ed è Y basso ( ) e viceversa ( ). Ma

2 1 1

la cosa importante è che lo stato della cella può essere rilevato dagli stessi punti set-reset se collegati ad

apposito amplificatore: nel flip-flop abilitato (s=1) la corrente fluisce in quello dei due emettitori che

corrisponde al transistore in conduzione.

Fig. 11.3 Schema di cella di memoria RAM in TTL

11.2 DRAM basata su MOS

Lo schema logico-elettronico di un dispositivo atto a funzionare da cella di memoria dinamica è

mostrato in fig.11.4a.

17 of 18 25/01/2007 20.18

Le memorie file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Fig. 11.4 Schema di cella di memoria dinamica:

a) schema di principio; b) refreshing; c) realizzazione in MOS

La scrittura della cella si ottiene applicando sul punto D una tensione E oppure 0 (massa) e la

1

capacità C di conseguenza si carica oppure si scarica purché l’interruttore s sia chiuso, cioè la cella sia

abilitata; la lettura avviene poi, se abilitata, rilevando la tensione su D. In realtà, la capacità tende a

scaricarsi e, dopo un tempo t (dipendente dalla costante di tempo del circuito) la tensione E 1

scenderebbe ad un valore di soglia E al disotto del quale si perderebbe l’informazione (cfr. fig.

1min

11.3b); un apposito circuito, allora, detto di refreshing, genera un segnale a e, attraverso un

amplificatore riporta la tensione sulla capacità.

La realizzazione concreta avviene in tecnologia MOS attraverso un transistore (fig. 11.4c) del quale

si adopera la capacità interelettrodica fra source e drain, mentre la gate funge da interruttore (rispetto

, D ; s,

alla figura 8.4, i segnali i, u, D’, F’ di figura 11.4 corrispondono rispettivamente a W, R. D i o

infine, corrisponde agli ingressi di abilitazione orizzontali).

[1] 3 6 9 12 15

Si ricordano i prefissi definiti dal sistema di misure: kilo=10 ; Mega=10 ; Giga=10 ; Tera=10 ; Peta=10 . Talora, in

10 3

Informatica si misura per potenze di 2: il "kilo" diventa allora 2 =1024 invece di 10 e di conseguenza variano gli altri

multipli.

[2] L'algoritmo andrebbe completato per tener conto dei seguenti fatti:

- l'inserzione di una nuova coppia chiave-dato;

- la gestione delle eccezioni (memoria piena, chiave da leggere inesistente, nuova chiave da scrivere già esistente, etc.).

[3]

Talora, una memoria (o una parte si essa) è resa "logicamente" a sola lettura in quanto se ne disinibisce l'operazione di scrittura con

mezzi meccanici vari (ad esempio, spostando una levetta sul supporto magnetico oppure operando un foro in determinata posizione, si

pensi ai sistemi di sicurezza dei video-tape) oppure mediante software (in Windows, ad esempio, un file può apparire a sola lettura per

una classe di utenti).

[4]

Lo schema è di tipo introduttivo. Strutture più semplici in termini di componenti usati sono di più difficile intendimento a livello introduttivo.

18 of 18 25/01/2007 20.18

Selezione temporale file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Selezione temporale

Per identificare l'istante utile per il trasferimento del registro si può operare come segue. I dati si

muovono a velocità costante rispetto ad L, di v registri/s, con movimento lineare (ad esempio, quello di

un nastro magnetico) oppure circolare come in figura (la traccia di un disco). Diremo P la posizione in

cui è allocato il primo dato; nel primo caso, essa è l'origine fisica del supporto, nel secondo è

convenzionalmente individuata da apposito segnale, generato dal supporto stesso in sincronismo col

passaggio di P sotto L (ad esempio segnale di inizio traccia di un disco). Il registro i-esimo passa

dunque per L dopo un tempo t dal passaggio di P, con: t =(i-1)/v.

i i

Per il riconoscimento del registro occorre dunque far riferimento al passaggio di P e quindi attendere

oppure contare il passaggio sotto L di (i-1) registri.

un tempo t i

1 of 1 25/01/2007 20.19

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Capitolo ottavo

La memoria di massa

Capitolo ottavo

La memoria di massa

Premessa

1 La registrazione su superfici magnetiche

2 Pre-e post-elaborazioni; sincronizzazione

2.1 Controllo della sequenza di bit

2.2 Compressione

2.3 Rilevazione e correzione di errore

2.4 La sincronizzazione dei blocchi

3 Architettura delle memorie di massa

4 Memorie a nastro

4.1 Bobine, cartridge e cassette

4.2 Blocchi, file e tape marker

4.3 ECC e compressione

4.4 Nastri longitudinali, elicoidali e trasversali

5 Memorie a dischi: caratteristiche meccaniche

6 Dischi magnetici: organizzazione dei dati

6.1 Cilindro, superficie, settore

6.2 Tempo di accesso al settore

6.3 Struttura del settore

6.4 Formattazione

6.5 Densità di registrazione. Tecniche CAV, CLV e ZCAV.

6.6 Il drive

7 Caratteristiche delle unità a disco magnetico

7.1 Hard disk

7.2 Array di dischi

7.3 Dischi rimovibili

7.3.1 Floppy disk

7.3.2 HD rimovibili - Zip e Jaz

8 Dischi ottici e magneto-ottici

8.1 Dischi ottici

8.2 Dischi magneto-ottici

9 Memorie esterne e dischi a stato solido

9.1 Schede di memoria

9.2 SSD

10 Sistemi di memorie di massa. Biblioteche

1 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Premessa

I vertiginosi cambiamenti nella tecnologia delle memorie di massa, hanno portato sul mercato

soluzioni tecnologiche a costi sempre più bassi, a dispositivi sempre più veloci e con elevata larghezza

di banda. Il risultato di tutto ciò è la grande esplosione dei supporti di memorizzazione e di

input/output.

È difficile seguire questa dinamica in un testo come questo, il cui obiettivo primario resta quello di

introdurre i concetti fondamentali sui quali si basa l’ingegneria informatica. Pertanto, in questo

capitolo si presentano da un lato i fondamenti delle memorie di massa, senza inseguire le innumerevoli

varianti che ne hanno perfezionate le prestazioni, per le quali non basterebbe un apposito volume, e

dall’altro si offre una panoramica dell’attuale produzione (2003), con particolare riferimento ai prodotti

per PC.

1 La registrazione su superfici magnetiche

Il principio fisico delle memorie con registrazione su superfici magnetiche (nastri e dischi) è

analogo a quello della registrazione audio/video analogica, benché dal punto di vista tecnico vi siano

differenze a causa del fatto che occorre realizzare solo due distinti stati di magnetizzazione,

corrispondenti ai due valori del bit e che ai requisiti di fedeltà vanno sostituite quelli di capacità e

velocità.

In fig.1.1 è mostrato lo schema di principio di un gruppo testina-superficie magnetica; in fase di

scrittura, nell'avvolgimento apposito viene inviato un impulso di corrente mentre la superficie è in

movimento relativo rispetto alle testine con velocità costante; le linee di flusso che si stabiliscono nel

circuito magnetico della testina si chiudono attraverso la superficie che, essendo costituita da un

materiale ad alto valore di induzione residua e bassa forza coercitiva, resta così magnetizzata. Sulla

superficie ne risulta allora una distribuzione delle linee di flusso del tipo di fig.1.1c) e si forma una

piccola zona che si comporta come una sottile barretta di materiale ferromagnetico; la distribuzione

della densità di flusso lungo la superficie B(l) assume un andamento del tipo indicato in fig.1.2b),

supposto che l'impulso di corrente sia di tipo rettangolare (fig. 1.2a). La zona così magnetizzata viene

detta cella elementare. Figura 1.1 - Registrazione su superficie magnetica

In fase di lettura, allorché la cella elementare transita con velocità costante sotto la testina, la

variazione del flusso B(l)=B(t) che si determina nel circuito magnetico induce nell'avvolgimento

apposito una tensione v che assume nel tempo la forma della derivata della funzione B(t) (fig. 1.2c) e

che identifica in qualche modo l'impulso di corrente che ha causato la magnetizzazione (teoricamente,

mediante integrazione elettronica della tensione v(t), si ottiene una curva che riproduce la funzione B(t)

e quindi la i(t)). La registrazione di un "1" potrebbe essere distinta da quella di uno "0" usando segnali

di registrazione di polarità opposta (come si vedrà, questa è soltanto una delle tecniche possibili).

Sul piano tecnico, la lunghezza della cella elementare determina la densità di registrazione, intesa

come numero di bit per unità di lunghezza. Questa è vincolata dalle caratteristiche elettromagnetiche

del sistema superficie-testina ed in primo luogo dal fatto che, in presenza di celle adiacenti molto

vicine, magnetizzate alla medesima polarità, si determina una distribuzione complessiva della densità di

flusso del tipo illustrato in fig.1.2d), che tende a rimanere costante e dalla quale, quindi, risulta

difficile trarre un segnale di rilevazione utile. Sol tanto in seconda istanza il limite alla densità di

2 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

registrazione è dato dal limite al numero di inversioni di flusso per unità di lunghezza determinato dal

materiale magnetico.

Diversi sono i metodi di registrazione adoperati; quelli fondamentali si possono così classificare:

- metodi a modulazione di ampiezza, modulazione di fase o modulazione di frequenza, a seconda della

grandezza elettrica che viene usata per distinguere il segnale di registrazione di un 1 da quello di uno

0 (si tratta, peraltro in ogni caso di segnali impulsivi e quindi le grandezze elettriche non sono quelle

relative a segnali continui analogici, ma la loro trasposizione nel discreto);

Figura 1.2 - Principi di funzionamento della memoria a superficie magnetica

metodi RZ o NRZ (Ritorno o Non-Ritorno a Zero) a seconda che, nell'intervallo fra due escursioni

- successive, il segnale ritorna o non ad un livello di riferimento (ad esempio 0 ampère).

In fig.1.3 sono esemplificati i metodi fondamentali di registrazione. Il metodo RZ a modulazione di

ampiezza (fig.1.3a) è il primo, caratterizzato da impulsi di polarità opposta per l'1 e lo 0, sempre di

durata inferiore a quella della cella; la rilevazione avviene come già illustrato.

3 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Fig.1.3.Metodi di registrazione su superficie magnetica con diversi tipi di modulazione: a) ampiezza,

RZ; b) ampiezza, NRZ; c) fase; d) frequenza.

Il corrispondente metodo NRZ (fig.1.3b) dà per scontato che in corrispondenza di stringhe di egual

valore si tende a non ottenere variazione di flusso e quindi, in tal caso, mantiene costante il segnale di

registrazione. La tecnica di lettura è basata sul fatto che il sistema di lettura tiene memoria del bit letto

precedentemente e lo assume costante mentre il circuito di rilevazione segnala (con la corrispondente

variazione di flusso) la eventuale variazione da 1 a 0 o viceversa,

I metodi a modulazione di fase e di frequenza (e NRZ), prendendo atto delle difficoltà derivanti da

magnetizzazioni costanti in celle consecutive, impongono comunque variazioni di polarità nella

registrazione.

Il metodo a modulazione di fase (PE: Phase Encoder), con tecnica NRZ, pone in ogni cella sempre

un segnale di doppia polarità, in differente fase se per l'1 o per lo 0 (fig.1.3c).

Il metodo a modulazione di frequenza (fig.1.3d, sempre di tipo NRZ) prevede due segnali di polarità

diversa per l'1, un unico segnale per lo 0, ma in ogni caso il primo segnale di una cella ha polarità

opposta dell'ultimo della cella precedente. In sede di rilevazione, è possibile estrarre dalla registrazione

un segnale che, opportunamente filtrato, fornisce da un lato il sincronismo e dall'altro il bit 1 o 0.

I metodi fondamentali sono stati poi variamente sviluppati. In particolare, con l'uso di materiali

magnetici con particolari caratteristiche (p.e. materiali anisotropi) e con l’uso di particolari testine di

lettura-scrittura (testine a film magnetico, testine magnetoresistive etc) si raggiungono oggi (1999)

densità di registrazione longitudinale (cioè lungo la traccia di registrazione) di centinaia di migliaia di

bit/pollice (bpi) a fronte dei 6.400 bpi dei nastri magnetici della generazione dei mainframe.

2 Pre-e post-elaborazioni; sincronizzazione

2.1 Controllo della sequenza di bit

I metodi di registrazione non consentono particolari sequenze di bit in quanto risulterebbero

irriconoscibili alla lettura, ad esempio non consentono una stringa di oltre n bit eguali.

Per fare in modo che la stringa registrata non contenga le sequenze vietate, in fase di scrittura

appositi algoritmi trasformano la stringa originaria aggiungendovi alcuni bit strategicamente

posizionati; in fase di lettura avviene la trasformazione opposta.

I moderni drive di dischi e nastri sono tutti dotati di almeno un microprocessore all’interno

dell’unità di controllo; a questo è affidato il compito di pre- e post-elaborazione della stringa di bit.

Ad esempio, lo standard di registrazione dei CD-ROM prevede che ogni byte venga registrato su 14 bit rielaborati secondo

un algoritmo detto Reed Salomon e che fra un byte ed un altro vengano inoltre aggiunti altri 3 bit detti di merging: agli 8

bit originari se ne aggiungono così altri 9.

2.2 Compressione

Effettuare una compressione dei dati significa rappresentarli con un numero di bit inferiore a quello

derivante dalla loro normale rappresentazione carattere per carattere (se è un testo), pixel per pixel (se

è una immagine), scena per scena (se è un film) e così via.

Ovviamente, le tecniche di compressione ben si adattano alle memorie di massa che possono essere

in tal modo usate in modo più efficiente; esse sono anche raccomandate se bisogna trasmettere in rete

4 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

un grosso file, in quanto si risparmia in tal modo tempo di trasmissione.

Appositi algoritmi si possono applicare alla stringa di bit originaria per comprimerla oppure,

viceversa, per decomprimere la stringa compressa; essi peraltro esorbitano dai limiti di questo testo e

pertanto ci limiteremo soltanto ad accennarne l’esistenza.

Gli algoritmi possono essere realizzati via software, usando appositi pacchetti di utilità (tipico è

WinZip operante sotto Windows) oppure via hardware, ed è quello che spesso viene realizzato dalle

memorie di massa: l’hardware del drive effettua la compressione e decompressione dei dati.

Un algoritmo di compressione si dice distruttivo se non rende possibile la decompressione: sono

tipicamente distruttivi gli algoritmi che si applicano alle immagini per memorizzarle, riducendone

anche di un fattore 200 lo spazio necessario senza ridurne significativamente la qualità (ad esempio

riducendone la scala dei grigi).

Per la trasmissione e la memorizzazione di dati si adoperano viceversa tecniche di compressione non

distruttive, con le quali si riduce di un fattore 2 o 3 lo spazio di memoria (o il tempo di trasmissione)

necessario.

2.3 Rilevazione e correzione di errore

Nelle memorie di massa è diffuso l'uso di codici a correzione di errore (ECC, Error Correcting

Code): codici di checksum e codici ECC sono tipicamente apposti in coda a ciascun blocco ed il drive

dell'apparecchiatura è in grado di correggere i bit del blocco che risultassero errati.

2.4 La sincronizzazione dei blocchi

L'inizio e la fine di un blocco sono individuati dal sistema di lettura-scrittura attraverso apposite

registrazioni di controllo; in particolare, l'inizio è individuato da una particolare sequenza di caratteri,

detta "di sincronismo", ad esempio un carattere speciale, detto SYNC ripetuto più volte e seguito da un

carattere START. Analogamente, la fine può essere individuata da un particolare carattere, che diremo

EOB (End Of Block). La struttura di un blocco assume dunque in generale il seguente aspetto:

SYNC-..-SYNC -START- (dati utili) -EOB- LRC- ECC

Il sistema di scrittura registra dunque i caratteri di controllo di cui sopra, quello di lettura li

riconosce ed opera di conseguenza. La tecnica è concettualmente simile a quella usata per trasmettere

un blocco di dati in rete.

3 Architettura delle memorie di massa

Dal punto di vista dell'architettura generale del sistema di elaborazione, una memoria di massa è una

unità periferica ed è pertanto collegata al processore che la gestisce con uno degli schemi di cui al cap.

VI, in particolare attraverso una interfaccia (cfr. § VI-14) ed un’apposita unità di controllo della

periferia; quest'ultima è fondamentalmente composta da due sezioni, talora anche fisicamente distinte e

costituenti altrettante unità parzialmente autonome: il trasportatore e l'unità di controllo (o governo)

propriamente detta.

Il trasportatore contiene le parti meccaniche per realizzare il moto testina-superficie e i circuiti per

le operazioni di scrittura e lettura; esso riceve ed esegue i comandi per l'avvio e l'arresto del moto, la

lettura e la scrittura.

L'unità di controllo costituisce un'interfaccia logico-elettronica fra il trasportatore e l’interfaccia; le

sue funzioni sono molteplici e più o meno complesse; fondamentalmente essa:

- riceve dal processore i comandi relativi all’operazione da compiere, li decodifica e li invia al

trasportatore, trasformandoli eventualmente in sequenza di comandi più elementari;

- controlla il transito dei dati, trasformandoli dalla forma fornita dalla CPU a quella propria del

trasportatore e viceversa;

- comprime e decomprime i dati e in genere li pre-elabora e post-elabora;

- corregge eventuali errori in caso di codici ECC;

- riconosce le condizioni di malfunzionamento del trasportatore o della trasmissione (o, più in

generale, lo "stato" della periferica) e le trasmette al processore con le regole del colloquio fra

processore e periferia;

- adatta i livelli logico-elettronici dei segnali, controlla la tempificazione delle trasmissioni e

sincronizza le due unità in connessione;

- in qualche caso svolge in hardware operazioni di selezione dei dati;

5 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

- in qualche caso gestisce una cache della memoria di massa.

Inoltre, un'unica unità di controllo può da un lato governare più trasportatori e dall’altro essere

collegata a più processori; le sue funzioni comprendono allora la selezione del trasportatore e la

gestione del collegamento con le CPU.

Spesso l’unità di controllo è strutturata come un vero e proprio sistema di elaborazione, con un

processore per la pre- e post-elaborazione, una memoria "centrale" con funzioni di buffer o di cache e

addirittura una memoria di massa, per esempio in una unità a nastri con cache a dischi.

L'unità di registrazione su memoria di massa è il record fisico o blocco: una singola operazione di

lettura, scrittura o selezione avviene, infatti, dal punto di vista hardware, su un insieme di caratteri,

detti appunto record fisico o blocco.

Le dimensioni del blocco sono dettate da esigenze, talora contrastanti, di ottimizzazione delle

prestazioni, quali:

- limiti fisici del supporto di registrazione;

- dimensioni del buffer di memoria centrale nel (dal) quale trasferire il blocco;

- probabilità crescente di riscontrare un errore di registrazione al crescere della dimensione del blocco;

- diminuzione dei tempi complessivi di lettura e scrittura per blocchi di dimensioni crescenti.

Sul piano software o più in generale su quello delle applicazioni, dove è necessario far riferimento

ad aspetti logici invece che fisici, si fa riferimento come unità di registrazione, invece, ad un record

logico, le cui dimensioni sono definite dalle stesse applicazioni. Più record logici costituiscono un file

(logico), che è l'entità cui fanno riferimento le applicazioni.

In genere, k record logici sono registrati in un blocco e k è detto fattore di bloccaggio; il software di

base consente di trasformare le operazioni di accesso a record logici richieste dall'applicazione in

operazioni di accesso ai blocchi.

Il supporto magnetico sul quale sono registrati i blocchi (bobina di nastro, disco, etc.) è detto

volume. Un file può occupare parte di un volume oppure anche più volumi (file multivolume).

In una memoria di massa più che negli altri sistemi si sente l'esigenza di risolvere la problematica di

gestione in un'architettura a livelli nella quale si procede da macchine semplici via via a macchine più

complesse, l'una innestata nell'altra, quali tipicamente:

- trasportatore e unità di controllo locale, che costituiscono nel loro complesso il drive hardware

dell’apparecchiatura;

- driver di gestione della periferica: è un sottoprogramma operante nella CPU, che esegue una singola

operazione di lettura o scrittura, trasformandola in generale nella sequenza di codici necessari per la

specifica unità di controllo;

- metodo di accesso: è un insieme di sottoprogrammi che consentono, mediante una o più chiamate al

driver e ad altri eventuali sottoprogrammi di servizio, di "vedere" gli archivi organizzati logicamente

secondo regole che ne semplificano le operazioni di selezione;

- sistema operativo: si interfaccia con i metodi di accesso da un lato e con tutto il sistema dall'altro,

gestendo lo sfruttamento delle risorse necessarie alle operazioni su file e record (assegnazione di

buffer, allocazione dei file, etc.);

- sistema di programmazione: al livello del singolo linguaggio o a livelli più elevati (ad esempio

sistema data-base) definisce le operazioni di ingresso/uscita su memoria di massa dal punto di vista

delle applicazioni.

Un'operazione di selezione, lettura o scrittura richiede quindi un complesso funzionamento

interlacciato di gran parte del sistema calcolatore, sia come hardware che come software; tale

complessità deriva dal numero notevole di operazioni elementari necessario per l'effettuazione di

un’operazione completa di ingresso o uscita e dalla necessità di rendere completamente automatica la

procedura di collegamento, scambio di messaggi, controllo di errori e sincronizzazione. Nei paragrafi

che seguono si illustrano soltanto gli aspetti più elementari dei livelli inferiori dell'architettura.

4 Memorie a nastro

Le memorie a nastro costituiscono le più classiche memorie ad accesso sequenziale. In esse, il

supporto magnetico è costituito da una striscia di materia plastica ricoperta da uno strato di materiale

magnetico, di lunghezza e larghezza variabile nei diversi modelli (oggi, larghezza da 4 a 19 mm,

6 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

lunghezza di qualche centinaia di metri o di 1 chilometro). Il nastro è inizialmente avvolto su una

bobina e, nei modelli più moderni, è incapsulato in un supporto (cartridge).

Le unità a nastro magnetico sono fra le memorie quelle che hanno subito le più grosse trasformazioni

con lo sviluppo della tecnologia. Dal punto di vista funzionale, pur avendo sempre occupato il vertice

della gerarchia di memorie, si sono via via trasformate da memorie di lavoro “in linea” (negli anni ’60

si usavano come supporto alle operazioni di ordinamento dei file) a supporti per le operazioni di

backup. Dal punto di vista meccanico, alle grosse bobine di 12” di diametro dei modelli dei vecchi

mainframe si è passati a strutture molto simili alle audiocassette (e le stesse audiocassette sono state

adoperate come unità a nastro).

4.1 Bobine, cartridge e cassette

Una classificazione di tipo meccanico distingue le unità in:

- cartridge (ma per qualcuno questo termine è usato in senso più generale), che contengono la sola

bobina alimentatrice e che, come le vecchie bobine aperte, devono essere riavvolte per essere

smontate;

- cassette a due ruote, che, come le audiocassette, possono essere rimosse senza la necessità di

riavvolgerle.

4.2 Blocchi, file e tape marker

Su un nastro, i dati sono suddivisi in blocchi (record fisici) strutturati ciascuno con una testata

(header), i dati veri e propri, una coda (trailer) ed appositi spazi fra i blocchi detti inter-block gap o

inter-record gap. In qualche caso si usano blocchi a lunghezza fissa (tipicamente 512 byte), in altri

variabili (da 1 a 64k, raramente più lunghi).

Si usano appositi blocchi detti tape marker per indicare la fine di un file. All’atto della lettura,

all’unità di controllo del nastro si può chiedere di posizionarsi (locate è l’istruzione che si usa nello

standard SCSI-2) all’inizio dello i-esimo file e quindi il posizionamento avviene in base al conteggio

dei tape-marker. In alternativa, alcuni modelli di nastro prevedono informazioni per la localizzazione

dei file registrate fra i blocchi di dati oppure su apposite tracce percorse a grande velocità.

La maggioranza dei nastri è del tipo “append-only”, nel senso che su un nastro scritto non è

possibile riscrivere da un certo punto in poi, aggiungendovi altri file.

Le caratteristiche meccaniche e strutturali del nastro lo rendono adatto alla lettura in sequenza dei

blocchi ed al trasferimento, anche a buone velocità, di flussi di dati. Se il flusso di trasferimento è

sospeso, la necessità di fermarsi, riallocarsi e riprendere il trasferimento peggiora anche di due ordini

di grandezza la velocità di trasferimento dei dati. Altri limiti nell’uso dei nastri derivano dal fatto che

esiste un tempo non indifferente per il caricamento del supporto, a causa di una notevole sequenza di

operazioni preliminari di aggiustaggio meccanico ed elettronico che vengono avviate automaticamente.

4.3 ECC e compressione

I nastri usano intensivamente tecniche di codici a correzione di errori (ECC) per migliorare da un

lato la velocità e dall’altro l’affidabilità.

Ad esempio, il blocco del nastro Exabyte 8505 contiene 14 byte di header, 1024 byte di dati utili, 2 byte per il checksum e

400 byte di ECC.

I nastri usano spesso tecniche di compressione dei dati, tipicamente in un fattore da 2 a 3. Di questa

evenienza si deve tener conto in quanto talora i dati di targa delle apparecchiature riportano capacità e

data transfer rate riferiti a blocchi compressi piuttosto che a quelli originari (detti anche parametri

“nativi”), inducendo in errore l’utente.

4.4 Nastri longitudinali, elicoidali e trasversali

I nastri possono essere classificati in base all’orientamento delle tracce di registrazione rispetto al

nastro stesso nonché alle tecniche meccaniche di registrazione:

· Nastri a 9 tracce: è la soluzione storica, oggi praticamente in disuso: si trattava di bobine di 12"

con un nastro largo ½ pollice, che registrava i dati su 9 tracce longitudinali parallele (1 byte+1 bit

di parità);

· Nastri longitudinali a serpentina, nei quali la registrazione è ancora longitudinale, ma al termine

della lunghezza del nastro si sposta trasversalmente e continua con direzione invertita.

Appartengono a questa categoria i cartridge DLT, Digital Linear Tape, nella fascia di prodotti-top

fra le unità a nastro, con capacità nativa oltre i 300 GB, data transfer rate di 36 MB/s.

7 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

· Nastri a scansione elicoidale, che combinano il movimento trasversale di una testina rotante con

quello longitudinale del nastro (le tracce si dispongono diagonalmente). Appartengono a questa

categoria i DAT (Digital Audio Tape), derivati dalla tecnologia delle audiocassette

Nastri con tracce trasversali. Sono stati prodotti, ma poi non più commercializzati, nastri ottici con

· tracce disposte trasversalmente al nastro.

5 Memorie a dischi: caratteristiche meccaniche

I modelli di unità a disco variano dagli economici dischetti flosci (floppy) dei PC, ai dischi rigidi

(hard disk, HD) degli stessi PC, delle workstation oppure anche dei grossi sistemi, composti da uno o

più piatti montati coassialmente, di dimensioni variabili e che tendono sempre più a miniaturizzarsi.

Il supporto è in materiale metallico, vetro o plastico ricoperto da un film sottile di materiale

magnetico su una o su entrambe le facce, con le tracce per la registrazione di forma circolare e

concentriche. Il numero di tracce ed il numero di bit per traccia sono variabili con le dimensioni ed i

modelli: le capacità complessive vanno dall'ordine di grandezza del Mbyte per i più piccoli dischetti

alle centinaia di Gbyte o al Terabyte per i grossi sistemi RAID.

Sul piano funzionale, le unità a dischi sono rimovibili (i dischetti e alcune unità realizzate per il

backup) oppure fissi: nel primo caso, il disco è asportabile e funge da archivio fuori-linea, nel secondo

è incorporato nel sistema di calcolo ed occorre un altro sistema di memoria di massa per l’

archiviazione.

In ogni caso, è disponibile in genere una testina di lettura-scrittura per ciascuna superficie, e quindi

1 per sistemi monodisco a singola faccia, 18-20 per i sistemi con 10 piatti impilati (per motivi

meccanici talora si preferisce non usare le superfici esterne della pila). Le testine di lettura-scrittura,

pilotate da un sistema di selezione, sono mobili radialmente, in modo da poter raggiungere le singole

tracce. Come si vedrà meglio in seguito, questo movimento delle testine costituisce un vincolo alla

realizzazione di sistemi veloci (vedi seek, § .7.1).

Figura 5.1 - Dischi a testine mobili

Nel caso di dischi rimovibili il meccanismo deve anche spostarsi al di fuori della pila di dischi per

permetterne la sostituzione (fig.5.1). Le unità a dischi fissi, invece, non dovendo curare la meccanica

del blocco lettura-scrittura per la rimovibilità del supporto, possono realizzare prestazioni migliori in

termini di tempi di accesso e capacità. In particolare, per i dischi rigidi è possibile realizzare un sistema

secondo il quale le testine “volano” su un cuscino d’aria creato fra superficie e testina dalla rapida

rotazione del disco (principio di Bernoulli)

In ogni caso, la migliore affidabilità del sistema dovuta alla rigidità della superficie magnetica

consente l'impiego di densità di registrazione, di velocità meccaniche e di velocità di trasferimento dei

[1]

dati più elevate rispetto ai nastri . Rispetto a questi, inoltre il sistema di selezione è migliore in

quanto quasi casuale.

Il sistema di registrazione più diffuso è quello in cui i dati sono registrati serialmente su ciascuna

traccia, suddivisi in record fisici o settori. Tipicamente, un settore contiene 512 byte (ma esistono

anche sistemi a lunghezza di settore variabile), una traccia qualche decina di settori. In genere, un

settore è anche l’unità fisica di trasferimento dati, in qualche caso invece un blocco (unità di

trasferimento) è costituito da più settori consecutivi associati in un cluster.

La pila di dischi o il singolo disco sono in genere in continua rotazione sul proprio asse; invero,

talora si arrestano fra una serie di operazioni e l'altra per diminuirne l'usura, ma quando operano

restano comunque in rotazione. Ciò consente di ridurre notevolmente il gap necessario fra una

registrazione e la successiva ed elimina la problematica dell'inter-block-gap, esistente sui nastri qualora

si volesse effettuare un posizionamento a livello di blocco.

8 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

6 Dischi magnetici: organizzazione dei dati

6.1 Cilindro, superficie, settore

Dal punto di vista della selezione, una registrazione è identificata da:

- un cilindro, che è l'insieme delle tracce di egual raggio disposte sulle diverse superfici;

- una superficie, che è una delle facce degli n dischi;

- un settore, cioè l'arco di circonferenza con i dati.

Il sistema di selezione è dunque un sistema multiplo ed in particolare (cfr. § VII-4.2):

- il cilindro è identificato da un "indirizzo di cilindro" ed è selezionato con spostamento radiale del

blocco di testine (selezione spaziale dinamica): il tempo di accesso associato è il tempo di seek,

- la superficie, anch'essa individuata da un indirizzo, è selezionata elettronicamente fra le n testine

(selezione spaziale statica);

- il settore è selezionato con una delle tecniche per la selezione dinamica; il tempo associato determina

un tempo di latenza.

L’indirizzo di un settore è dunque dato dalla tripla (n.ro di cilindro; n.ro di superficie, detto anche

n.ro di traccia; n.ro di settore); negli ultimi tempi va diffondendosi una tecnica per un indirizzamento

dei settori con un unico indirizzo non distinto nelle tre componenti.

6.2 Tempo di accesso al settore

Il tempo di accesso ad un settore si compone dunque di tre componenti:

- tempo di ricerca del cilindro (tempo di seek), se può dare un valore medio TS;

- tempo di posizionamento sul settore (tempo di latenza), valore medio TL;

- tempo di selezione della superficie, trascurabile rispetto agli altri.

Il tempo medio di accesso al settore è dunque

TA = TS + TL

al quale va aggiunto il

- tempo di trasferimento del blocco, TT=B/V, ove B è il numero di byte del blocco e V il data transfer

rate, espresso in Mbyte/s.

6.3 Struttura del settore

Per la registrazione di un settore si usa in prevalenza la tecnica già indicata per i nastri (cfr. § 4.2):

dopo lo inter-sector gap è registrato un header, contenente byte di sincronizzazione ed indirizzo, al

quale seguono i bit utili e una coda (trailer) contenente checksum e codice ECC.

Questa tecnica di registrazione è anche detta di dischi a settori software (soft sectorized), in

contrapposizione con una tecnica ormai abbandonata di dischi a settori hardware (hard sectorized),

nella quale le tracce erano fisicamente divise in settori attraverso appositi segnali ottenuti su tracce di

riferimento, che indicavano altresì la marca di “inizio traccia”. La tecnica software fa riferimento alla

selezione con informazioni di riferimento, quella hardware al metodo della selezione temporale (cfr. §

VII-4.2).

Con la tecnica software è possibile realizzare settori di lunghezza sia fissa sia variabile; essa è

inoltre flessibile e veloce: la flessibilità le deriva dal fatto che nella testata del settore possono essere

anche registrate informazioni quali "settore guasto", "prossimo settore", etc.; la velocità deriva dal fatto

di essere una tecnica associativa (cfr. § VII-3) e quindi di essere caratterizzata da un tempo massimo di

latenza corrispondente ad 1 periodo di rivoluzione piuttosto che a 2 (cfr. § VII-.4.2).

6.4 Formattazione

Un disco, prima di essere usato, va "inizializzato" o "preparato" o "formattato"; questa operazione

consiste nel registrare sulla superficie tutte le informazioni ausiliarie necessarie. Per la tecnica soft

sectorized vanno in particolare definiti i settori, individuati i settori e le tracce eventualmente guaste e

così via. In dipendenza, inoltre, dagli standard e dal sistema operativo, in fase di formattazione possono

essere registrate altre informazioni utili, come ad esempio il nome del volume, l'ampiezza dei settori, le

caratteristiche logico-elettroniche del supporto.

9 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

6.5 Densità di registrazione. Tecniche CAV, CLV e ZCAV.

Il miglioramento delle prestazioni dei dischi è legato alla densità di registrazione sostenibile: da un

lato interessa migliorare la densità lineare di registrazione (bit per pollice, bpi) per migliorarne la

velocità di trasmissione, dall’altro la densità radiale (tracce per pollice, tpi) per migliorarne la capacità.

2

Si usa anche indicare la densità superficiale, espressa in bit/cm .

Per quanto attiene alla distribuzione delle densità di registrazione lungo la superficie del disco,

occorre considerare quanto segue. Molti dischi (hard, floppy e ottici) operano in modalità CAV

(Constant AngularVelocity), con le tracce interne ed esterne contenenti il medesimo numero di settori:

le tracce più esterne sono quindi a minore densità lineare di registrazione, presentando in qualche modo

uno spreco di spazio.

I CD ed i primi floppy Macintosh, invece, operano in modalità CLV (Constant Linear Velocity), cioè

la cella-bit è dovunque quasi della medesima dimensione e la velocità angolare varia con la posizione

della testina. Ciò produce la migliore densità superficiale in bit, sacrificando i tempi di seek poiché

ogni seek richiede un aggiustamento della velocità di rotazione.

Infine, con la modalità ZCAV (Zoned Constant Angular Velocity): sul disco sono definite alcune

zone ed il numero di settori per traccia è diverso in ogni zona; in questo modo, i dati sono impacchettati

a maggiore densità, trovando un buon equilibrio fra CAV e CLV. Nello ZCAV il transfer rate varia in

quanto il tempo/traccia è costante e i bit/traccia variano (p.e. il drive Seagate ST12450W Barracuda

varia da 68 a 113 Mbits/s).

6.6 Il drive

Il drive dell’unità a disco comprende, come per quella a nastro, unità di controllo e trasportatore. La

prima comprende tipicamente un microprocessore che ne gestisce la cache, gestisce l’indirizzamento

dei record, ottimizza l’allocazione dei settori sul disco e così via.

7 Caratteristiche delle unità a disco magnetico

7.1 Hard disk

Gli hard disk singoli (in contrapposizione con i RAID, di cui alla voce seguente) sono

apparecchiature essenziali, presenti in tutti i sistemi di calcolo, dai portatili ai grossi sistemi. Le loro

prestazioni coprono un ampio raggio e sono comunque in rapida crescita; per fissare le idee, si

forniscono i seguenti parametri:

· Capacità: 40 - 200 GB

Velocità di rotazione: 5400 - 7200 rpm,

· Tempo di seek 7-12 ms,

·

· cache di 512 kB

· Costo: 20 Euro/GB.

7.2 Array di dischi

Un array di dischi è una schiera di dischi opportunamente organizzati in modo da essere un sistema

di dischi. In particolare, il più diffuso sistema, definito anche dagli stndard, è il RAID (Redundant

Array of Inexpensive Disks), che è appunto un array di dischi visto come un unico volume di dati dal

sistema centrale, ma in effetti composto da qualche decina di dischi (di 5.25” o 3.5”) pilotati da una

unità di controllo “intelligente”. Il sistema è realizzato secondo possibili “livelli” di RAID” che vanno

dal più semplice (livello 0) nel quale un file è distribuito su più dischi e viene utilizzato il parallelismo

fra i rispettivi drive per migliorare i tempi di accesso, a quelli più sofisticati, nei quali si utilizza la

ridondanza fra i dati per consentire la massima affidabilità al sistema. In particolare, si usa la tecnica

del mirroring (livello 1), secondo la quale ogni file è duplicato su un diverso disco e diverse tecniche

di codici ECC (livelli 2-5), che con una minore ridondanza (20-30%) consentono affidabilità anche

superiori. Spesso questi sistemi sono inoltre dotati della proprietà dello hot swapping, cioè la

possibilità di sostituire in esercizio un drive. Altri livelli (RAID6, RAID7) sono evoluzioni di quelli

fondamentali sopra definiti oppure sigle commerciali

Ad esempio, il sistema SUN StorEdge A5000 realizza un RAID di 509 GB mettendo insieme 14 dischi da 36 GB ciascuno.

56 dischi da 9.1 GB ciascuno.

Esistono anche soluzioni software che realizzano la tecnica RAID, ovviamente con minori

prestazioni e costi.

10 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

7.3 Dischi rimovibili

7.3.1 Floppy disk

Fra i dischi rimovibili vanno in primo luogo annoverati i classici dischetti da PC nei loro formati:

- 8”, con rivestimento di plastica, floscio, in disuso da tempo;

- 5.25”, con analogo rivestimento, in disuso;

- 3.5”, con rivestimento rigido, ma pur sempre di materiale floscio.

La capacità standard dei dischetti da 3.5” è di 1.4 MB, la struttura è di un’unica superficie a doppia

faccia. Tipicamente sono caratterizzati da una densità di traccia di 135 tpi ed una densità lineare di 0.8

MB/s, una velocità angolare di 300 rpm e tempo medio di accesso di 500 ms.

Le minori prestazione rispetto ai dischi rigidi dipendono dal fatto che sono più lenti in quanto le

testine di lettura-scrittura non “volano” sulla superficie del disco, ma vi si pongono a contatto.

La loro capacità, un tempo notevole, oggi è insufficiente per usarli, come una volta, come supporti

per la distribuzione di software (oggi in gran parte sostituiti dai CD-ROM) oppure come supporti da

backup (sostituiti dai nastrini oppure dagli HD rimovibili); anche l'uso, fino a poco fa indiscusso, come

supporto per trasferire dati fra i sistemi o per piccoli archivi, sta oggi cedendo il passo alle "penne

digitali". sono stati e sono tuttora prodotti.

Floppy disk speciali

HD rimovibili - Zip e Jaz

7.3.2

La storia degli hard dischi rimovibili è interessante. Negli anni ’60 e’70 si può dire che tutti gli hard

dischi erano rimovibili: si trattava di grossi padelloni (disk-pack) estraibili che avevano tanto la

funzione di archivi in linea quanto quella di archivi di backup. I dischi rimovibili furono poi sostituiti

dai dischi fissi, più efficienti, ed ai nastri fu data la funzione di memorie di backup. Successivamente,

sono stati rilanciati gli HD con funzioni di backup. I più diffusi sono allo stato i cosiddetti Zip e Jaz

della Iomega e i Syquest, con capacità di 100-750 MB.

Il prodotto Iomega di ultima generazione è il nuovo Zip di 750 MB, al costo di 249 Euro per drive e circa 49 Euro per

cartucce di 3 dischi.

8 Dischi ottici e magneto-ottici

8.1 Dischi ottici

Un disco ottico è una apparecchiatura simile al disco magnetico, salvo l’uso di principi ottici

piuttosto che magnetici per la registrazione e rilevazione dei bit registrati: i bit sono registrati in forma

di “macchie nere” dette pit, lette da un raggio laser e misurando l’intensità della luce riflessa

I dischi possono essere di tipo:

- ROM (cfr. § VI-7.1): usano una superficie che funziona come uno specchio, con apposite fossette o

buchi “stampate" su di essa;

- WORM (§ VI-7.2): scrivono un pit per ablazione, bruciandolo sulla superficie attraverso un raggio

laser;

- read/write (§ VI-7.3): usano tecnologie reversibili di registrazione, quali quella del phase change

(che distingue la registrazione in una forma cristallina ed una amorfa, commutabili con l’effetto laser)

o quella del dye-polimer (che gioca sulla espansione di un polimero che copre una sostanza

colorante).

Vengono usate due tecniche di organizzazione delle tracce (cfr. § 6.5): quella a tracce concentriche e

velocità angolare costante (CAV) tipica dei dischi magnetici, con le varianti dell’organizzazione a zona

(ZCAV) e quella a velocità lineare costante (CLV), nella quale esiste un’unica traccia a spirale che si

sviluppa su tutta la superficie.

I più diffusi tra i dischi ottici sono i CD-ROM (per il loro uso sui PC) e quelli da questi derivati,

CD-R e CD-RW. La tecnologia, il costo dei complessi di masterizzazione e stampa dei dischi e quello

dei supporti "vergini" sono diversi:

- Il CD-ROM è composto di uno strato di alluminio sul quale vengono “stampati” i pit; sono

caratterizzati da un alto costo del complesso masterizzatore (la macchina che ne produce il master) e

stampante (la macchina che ne realizza le copie) e da un basso costo delle copie se stampate in

numero elevato); è un supporto ampiamente usato per la distribuzione di software, enciclopedie

11 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

multimediali, etc.

- Nei CD-R (Recordable) il foglio di alluminio è sostituito da uno strato d’oro ricoperto di pittura

traslucida che viene “bruciata” in fase di scrittura; la macchina per scrivere i CD-R si dice ancora

masterizzatore, anche se produce direttamente il dischetto; il suo costo è contenuto, il costo dei dschi

vergini è maggiore di quelli a sola lettura; sono particolarmente adatti per operazioni di archiviazione

e per riproduzioni in poche copie.

- I CD-RW (ReWritable) usano la tecnologia del phase-change;

Le velocità di trasferimento dati sono usualmente espresse in multipli della velocità della porta

parallela del PC (150 kB/s), ad esempio una unità a 16x Ha un data transfer rate di 16´150=2400 kB/s.

si trovano alcuni dati e qualche esempio.

Nell'inserto sui CD-ROM

I DVD (Digital Versatile Disk o Digital Video Disk), derivati dalla tecnologia video, costituiscono i

CD-ROM del futuro. A uno o due strati, singola o doppia faccia, possono essere, come i CD, di tipo

read-only (DVD-R), recordable (DVD-RAM) oppure rewritable (DVD-RW, DVD+RW). Le capacità e

le velocità sono maggiori, tanto che quest'ultima si misura in multipli questa volta di 1250 kB/s,

equivalente circa a 8x circa per un CD: un sistema di 20x equivale ad un transfer rate di 2500 kB/s.

si trovano alcuni dati e qualche esempio.

Nell'inserto sui DVD

8.2 Dischi magneto-ottici

La tecnologia magneto-ottica (MO) usa dischi di plastica o vetro rivestiti di un materiale (spesso

TbFeCo) che gode di proprietà speciali. Il disco è letto mediante un laser a bassa intensità ed

esaminando la polarizzazione della luce riflessa. Per scrivere, si usa una maggiore intensità per

riscaldare il materiale oltre il suo punto di Curie, ove esso è sensibile ad un campo magnetico; quando

il materiale si raffredda nuovamente, il suo stato è “congelato”. La polarità della luce riflessa durante la

lettura dipende dalla polarità del campo magnetico sotto il quale il materiale fu raffreddato l’ultima

volta, Una volta raffreddato, il materiale non è più sensibile ai campi magnetici, sicché esso può essere

comparato in un certo senso con il paleomagnetismo. Per migliorare le prestazioni, spesso si usano

sistemi con più testine e più raggi laser che oprano in parallelo.

La soluzione magneto-ottica è oggi la preferita per la memorizzazione di grosse capacità con le

caratteristiche di accesso diretto, stabilità e durata. Le grosse capacità e le velocità che tendono a

raggiungere quelle dei dischi magnetici (almeno per la lettura, mentre per la scrittura il processo

richiede in generale tempi maggiori) rendono gli MO particolarmente adatti ad applicazioni “data

intensive”, quali quelle audio-video. In particolare, le migliorate prestazioni in termini di velocità dei

prodotti moderni (3000-3600 rpm, transfer rate >5 MB/s) forniscono accesso veloce a grossi file tipici

delle applicazioni di grafica, multimedialità, immagini mediche ed editing audio/video.

I dischi sono organizzati in tracce e settori, spesso con tecnica ZCAV (cfr. § 6.5), su molti formati

diversi (14”, 12”, 5.25”, 3.5”, 2.5”), nelle due versioni di WORM e riscrivibili. Si noti che la versione

WORM può essere funzionalmente preferita nel caso si vogliano archiviare dati che non si vuole

rischiare di perdere. I drive scrivono i dischi riscrivibili e leggono anche i WORM.

Nell'inserto sui dischi magneto-ottici si trovano alcuni dati e qualche esempio.

9 Memorie esterne e dischi a stato solido

9.1 Schede di memoria

Le schede di memoria (Memory card) sono memorie a stato solido esterne rese non volatili

attraverso tecnologie tipo EPROM oppure mediante batterie di alimentazione e dischi di backup.

Vengono anche dette memorie flash per la tecnica adoperata per la memorizzazione non volatile.

usate per applicazioni speciali oppure

Per i PC sono diffuse le schede con interfaccia PCMCIA,

come supporti per lo scambio di dati con apparecchiature speciali. Delle dimensioni di una carta di

credito ma di maggior spessore, sono usate ad esempio per videocamere digitali, registratori audio e

telefoni portatili.

Esiste in realtà una varietà notevole di memorie a stato solido sulle quali non è possibile

soffermarci.

9.2 SSD

Con il nome di dischi a stato solido (SSD) sono individuati alcuni dispositivi che emulano il

12 of 13 25/01/2007 21.21

La memoria di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

funzionamento dei dischi, essendo peraltro realizzati con tecnologie a stato solido. Si tratta quindi di

supporti RAM esterni che operano funzionalmente come i dischi, con prestazioni di velocità delle

memorie meccanicamente statiche.

Il sistema SSD emula in tutto e per tutto i dischi e quindi si collega ad esempio ad interfacce SCSI,

IDE/ATA e Fibre channel. Una versione particolare di SSD è quella detta Disk On Key in inglese e

Penna digitale in italiano, con capacità anche di 1 GB (2003), che sta oggi sostituendo i dischetti come

sistema per il trasferimento di file fra PC.

Il mercato dei dischi a stato solido è in crescita in quanto, a fronte di un costo maggiore ma ancora

contenuto, presenta rispetto ai dischi meccanici un notevole miglioramento delle prestazioni.

10 Sistemi di memorie di massa. Biblioteche

Esistono svariati sistemi che, mettendo insieme più volumi di nastri o dischi, magnetici oppure

ottici, meccanici o a stato solido, realizzano sistemi di memorie a grosse capacità, con funzioni di

archivi di backup o comunque di memoria “terziaria” (secondo questa classificazione, la memoria

primaria è quella centrale, la secondaria è quella dei dischi in linea, la terziaria è quella degli archivi ad

un livello gerarchico sopra le memorie secondarie).

I sistemi sono formati da una schiera di drive ed una schiera ancora maggiore di nastri o dischi, con

un sistema automatico che seleziona e preleva dalla biblioteca il supporto desiderato, Sono in proposito

adoperati sistemi robotizzati che automaticamente caricano le cassette o i dischi nei drive ed avviano la

trasmissione dati: vengono detti appunto biblioteche (library), robot, juke-box o autoloader. Sistemi di

questo genere operano come memorie terziarie “quasi in linea” con il sistema centrale.

si trovano alcuni dati e qualche esempio.

Nell'inserto sulle biblioteche di massa

[1]

Invero, vincoli alla velocità di trasmissione dei dati sono spesso dettati dalle caratteristiche dell’interfaccia cui ima memori

massa è collegata.

13 of 13 25/01/2007 21.21

Nastri a 9 tracce file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Nastri a 9 tracce

È questo il modello originario (o quasi) dei nastri, nato negli anni ’60 per i mainframe,

sopravvissuto fino agli inizi degli anni ’90, molto popolari perché spettacolari nei loro movimenti,

tanto da essere stati spesso riprodotti in spettacoli cinematografici e televisivi.

Il modello, a bobina aperta di 12" e nastro largo ½ ", registra i dati su 9 tracce parallele (1 byte + 1

bit di parità), sviluppate nel senso longitudinale, ciascuna facente capo ad un circuito di

lettura/scrittura.

Le densità di registrazione erano di 800, 1600, 6250 bpi , la capacità di una bobina (2400 piedi) di

circa 140 MB. Poiché all’epoca i nastri venivano anche usati come memorie in linea, e quindi l’accesso

era tipicamente al singolo blocco, particolari accorgimenti meccanici erano usati per garantire buone

prestazioni (rispetto alla tecnologia dell’epoca) sulle proprietà start-stop del sistema (dimensionamento

dell’inter-record gap, sistema di controllo a vuoto spinto per attenuare l’effetto delle forti

accelerazioni, sistema per tenere il nastro a minima distanza dalle testine senza toccarle, etc.).

1 of 1 25/01/2007 21.24

Nastri a serpentina file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Nastri a serpentina

Nastri a serpentina

1 I nastri classici

2 DLT

3 LTO

4 QIC

La tecnica di registrazione a serpentina è una evoluzione di quella longitudinale a 9 tracce:

l'operazione (di lettura o scrittura) si sviluppa longitudinalmente lungo un gruppo di tracce (banda);

una volta raggiunta l’estremità del nastro, le testine di lettura-scrittura vengono spostate

trasversalmente, e la direzione di avvolgimento del nastro viene invertita. Sul nastro si contano dunque

parecchie tracce (ad esempio 48 oppure 256); in qualche caso esistono più gruppi di lettura-scrittura, in

modo da ridurre l’escursione trasversale delle stesse. In ogni caso, si riducono così i tempi di accesso ai

file.

1 I nastri classici

I primi prodotti di questo tipo nascono presso i venditori di mainframe (IBM, Fujitsu, Storage Tek,

etc.). Oggi sono ancora prodotti dagli stessi, ma anche da altri produttori specializzati.

Ad esempio, un “classico” è il nastro IBM 3480, del 1984, con 18 tracce, 200 MB. Nell’attuale produzione, il prodotto-top

della IBM è la serie Magstar 3590 (nata nel 1995), a 128 o 256 tracce e testina magnetoresistiva che legge 16 tracce in

parallelo, con capacità fino a 20 GB nativi e data tranfer rate fino a 14 MB/s, destinata alla fascia alta di computer, dai

mainframe fino ai server Windows NT.

2 DLT

La tecnologia DLT, Digital Linear Tape, usa nastri da 0,5” (12,65 mm) di larghezza ed è stata

originariamente sviluppata da Digital. I produttori che attualmente supportano la tecnologia DLT sono

Quantum e Tandberg Data.

I drive DLT usano cartridge a singola bobina (cfr. § 4.1): il nastro è estratto ed avvolto su una

seconda bobina motorizzata all’interno del drive. Esistono diversi tipi di cartridge DLT, denominati

DLTtape III, IIIxt e IV, che differiscono per lunghezza e caratteristiche magnetiche. I nastri di tipo IV

supportano maggiori densità di registrazione e, quindi, offrono maggiori capacità. Si noti, comunque,

che la densità di registrazione è determinata dal drive utilizzato, e, quindi, lo stesso cartridge ha

diverse capacità a seconda del sistema di registrazione utilizzato.

Nel 1998, la Quantum ha introdotto un’evoluzione della tecnologia DLT, denominata Super DLT (o

SDLT). I cartridge SDLT sono disponibili in due formati: Super DLTtape I e II.

La seguente tabella riporta le caratteristiche di alcuni dei principali drive DLT e SDLT prodotti dalla Quantum. I drive

DLT sono di solito dotati di interfaccia SCSI o SCSI-2. I drive SDLT sono invece dotati di interfaccia Ultra-SCSI o Ultra 2

SCSI. Il drive SDLT 600 è anche disponibile con interfaccia Fibre Channel.

Data

Formati Capacità N.ro Densità

Modello Tranfer Compress.

supportati nativa tracce registr.

Rate

DLTtape III, 40 GB 6 MB/s 2:1 208 98 kbpi

DLT 8000 IIIxt e IV

DLT1 DLTtape IV 40 GB 3 MB/s 2:1 168 123 kbpi

DLT VS80 DLTtape IV 40 GB 3 MB/s 2:1 168 123 kbpi

Super DLTtape 110 GB 11 MB/s 2:1 448 133 kbpi

SDLT 220 I

Super DLTtape 160 GB 16 MB/s 2:1 448 193 kbpi

SDLT 320 I

Super DLTtape 300 GB 36 MB/s 2:1 640 233 kbpi

SDLT 600 II

3 LTO

Linear Tape Open (LTO) è una tecnologia sviluppata da un consorzio formato da IBM, HP e

1 of 3 25/01/2007 21.24

Nastri a serpentina file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Seagate. I prodotti LTO attualmente in commercio rispondono alla specifiche denominate Utrium-1 ed

Utrium-2, ed utilizzano nastri da mezzo pollice. I drive conformi alle specifiche Utrium-1 usano un

formato di registrazione lineare a serpentina con 384 tracce organizzate in 4 bande (da 96 tracce

ciascuna) ed offrono una capacità nativa di 100 GB con un transfer rate fino a 20 MB/s. I drive

Utrium-2, introdotti nel 2003, hanno una capacità nativa di 200 GB ed un transfer rate fino a 40 MB/s.

Il consorzio LTO prevede successive versioni delle specifiche Utrium, con un raddoppio delle

prestazioni (capacità e transfer-rate) ad ogni nuova versione.

Una particolarità dei cartridge LTO è la presenza di un chip di memoria (LTO-CM) da 4 KBytes, che

può essere letto mediante un dispositivo a radio-frequenza senza inserire il cartridge nel drive. Questo

chip di memoria contiene informazioni sul contenuto del nastro ed è utilizzato, in particolare, nelle

librerie di nastri che usano il formato LTO.

4 QIC

Nel 1972 la 3M introdusse un formato di nastri da un quarto di pollice di larghezza, in cassette a due

ruote (dual-reel cartridge, cfr. § 4.1) dalla forma simile a quella delle cassette audio. Questo formato,

noto come QIC (Quarter Inch Cartridge), ha riscosso notevole successo negli anni ’80 e ’90,

prevalentemente (ma non solo) come memoria di backup per PC.

Attualmente, il formato QIC è supportato da un consorzio formato da HP, Sony, Imation e Tandberg

Data. Negli anni dal 1988 al 1997 il consorzio QIC ha definito oltre un centinaio di differenti standard

di registrazione. In particolare, alla dimensione di un quarto di pollice è stata aggiunta la dimensione

da 0,315", usata da un prodotto detto di tecnologia Travan (™ di 3M, ora Imation).

I drive QIC usano cartridge che esternamente si presentano di due dimensioni: 5.25” e 3.5”. Nella

[1] . Si noti la compatibilità

tabella che segue sono illustrati alcuni esemplari di drive di prodotti QIC

con i floppy disk e con la porta parallela ed il fatto che la creazione e la compressione è in molti casi

realizzata via software. capacità data

nativa

Ditta Nome interfaccia standard compressione

transfer

(compr. rate

2:1)

Ditto Easy 9.5

Iomega Floppy 500 MB QIC-80 MC software

800 MB/min

Tape*Stor porta 9.5

Seagate 400 MB QIC-80 MC software

800 parallela MB/min

19 QIC-3020

Aiwa TD-S320 Floppy 2,2 GB software

MB/min MC

Surestore QIC-3095

HP SCSI 4 GB 1 MB/s software

T4 MC

Tandberg QIC-5210

MLR3 SCSI 25 GB 4 MB/s hardware

Data DC

Certance Travan 40 USB 2.0 20 GB 4 MB/s TR-7 hardware

Tandberg SLR 140 SCSI 70 GB 6 MB/s 192 tracce hardware

Data

Alcuni standard di registrazione usati dai prodotti di cui sopra sono sintetizzati nella tabella che

segue. capacità (*)

densità largh. n.ro tracce

Standard anno MB - piedi

(bpi) nastro

.25" 28 400 –1000

QIC-80 1996 14.700

MC .315 36 500 - 1000

.25" 40 1700 –1000

QIC-3020 1996 44.250

MC .315 50 1600 - 750

.25" 40 1700 –1000

QIC-3095 1996 44.250

MC .315 50 1600 - 750

QIC-5010 1996 101.600 .25" 144 25000-1500

DC

(*) La capacità è data per determinate lunghezze (in piedi) del

nastro- Qui ne sono riportate solo alcune

2 of 3 25/01/2007 21.24

Nastri a serpentina file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

[1] La citata tecnologia Travan e quella SLR della Tandberg sono qui assimilate alla tecnologia QIC

3 of 3 25/01/2007 21.24

Nastri a scansione elicoidale file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Nastri a scansione elicoidale

Queste apparecchiature, derivate da tecnologie audio e video, sono realizzate mediante una testina

costituita da un cilindro che ruota velocemente in direzione trasversale del nastro, mentre questo si

muove longitudinalmente; l’effetto è che le tracce si dispongono diagonalmente lungo il nastro. La

velocità di rotazione della testina contribuisce a rendere elevata la velocità di trasferimento dei dati, il

relativamente lento movimento longitudinale preserva il nastro dalla usura.

Appositi artifici sono inoltre usati per rendere veloce il tempo di ricerca di un file lungo il nastro:

vengono a tale scopo adoperate apposite tracce longitudinali oppure appositi indici scritti sulle tracce

diagonali, che in ogni caso vengono letti a velocità di 50-100 volte superiori a quella di lettura dei dati.

Nati attorno al 1990, questi nastri ebbero subito un gran successo a causa del basso costo ed alta

capacità, sono stati superati dai DLT per qualche tempo, ma restano competitivi con questi.

1 DAT – 4 mm

I primi drive di questo genere sono i DAT (Digital Audio Tape), derivati appunto dalle audiocassette,

poi standardizzati come DDS (Digital Data Storagge), e classificati in differenti classi (DDS-DC,

DDS-2, DDS-3, DDS-4, DDS-5, sempre con nastri di 4 mm di larghezza). Il prodotto originale aveva

1.3 GB su un nastro di 60 metri a circa 180 kB/s; nel seguito sono riportati alcuni prodotti oggi in

commercio. capacità data lungh.

Ditta nome interfaccia standard

nativa transfer nastro

(compr. 2:1) rate

SureStore SCSI 12 GB 1,1 MB/s DDS-3 125 m

HP DAT 12/24

Sony DDS-4 SCSI 20 GB 2,4 MB/s DDS-4 150 m

CertanceDAT SCSI 36 GB 3 MB/s DDS-5 170 m

Seagate 72

2 Nastri 8 mm

I nastri “8 mm” derivano dalla tecnologia video e costituiscono un prodotto con prestazioni superiori

rispetto ai sistemi basati su natri da 4 mm. Attualmente, due tecnologie adoperano nastri da 8 mm:

“Mammoth” della Exabyte, ed AIT della Sony e Seagate.

La tecnologia Mammoth presenta nella sue versione attuale (seconda generazione, denominata anche

M2) una capacità nativa di 60 GB ed un transfer rate di 12 MB/s.

La tecnologia AIT è giunta nel 2002 alla sua terza generazione. I drive AIT di prima generazione

(AIT-1) offrivano una capacità nativa di 25 GB (successivamente incrementata a 35 GB, grazie all’uso

di nastri di maggiore lunghezza) ed un transfer rate di 3 MB/s. I drive AIT-2 presentano una capacità

nativa di 50 GB ed un transfer rate di 6 MB/s. I drive AIT-3 presentano una capacità nativa di 100 GB

ed un transfer rate di 12 MB/s. Nel 2003 Sony ha introdotto una nuova versione della tecnologia AIT,

denominata S-AIT, i cui drive presentano una capacità nativa di 500 GB ed un transfer rate di 30 MB/s,

e sono dotati di interfacce Ultra Wide SCSI o Fibre Channel.

I cartridge AIT presentano una memoria da 64 Kbit (denominata MIC, Memory-In-Cassette), che è

usata per mantenere informazioni utili per la ricerca dei file.

3 Nastri più larghi

Nel 1994, Sony sviluppò un trasportatore inizialmente destinato al mercato video professionale,

basato su un nastro a 19 mm, tratto dalla tecnologia broadcast televisiva ed adattato alle esigenze

digitali con l’aggiunta di una traccia di controllo longitudinale e di codici ECC. Nacque così la classe

delle memorie a nastro a 19 mm, destinata al mercato dei supercomputer, con capacità dell’ordine di

25-175 GB e velocità di trasferimento dell’ordine di 8-50 MB/s.. Furono anche definiti dall'ANSI

alcuni standard (D-1, D-2, etc.), ma ad oggi non sembra che questa soluzione abbia avuto significativo

successo.

1 of 1 25/01/2007 21.24

Nastri a scansione elicoidale file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Nastri a scansione elicoidale

Queste apparecchiature, derivate da tecnologie audio e video, sono realizzate mediante una testina

costituita da un cilindro che ruota velocemente in direzione trasversale del nastro, mentre questo si

muove longitudinalmente; l’effetto è che le tracce si dispongono diagonalmente lungo il nastro. La

velocità di rotazione della testina contribuisce a rendere elevata la velocità di trasferimento dei dati, il

relativamente lento movimento longitudinale preserva il nastro dalla usura.

Appositi artifici sono inoltre usati per rendere veloce il tempo di ricerca di un file lungo il nastro:

vengono a tale scopo adoperate apposite tracce longitudinali oppure appositi indici scritti sulle tracce

diagonali, che in ogni caso vengono letti a velocità di 50-100 volte superiori a quella di lettura dei dati.

Nati attorno al 1990, questi nastri ebbero subito un gran successo a causa del basso costo ed alta

capacità, sono stati superati dai DLT per qualche tempo, ma restano competitivi con questi.

1 DAT – 4 mm

I primi drive di questo genere sono i DAT (Digital Audio Tape), derivati appunto dalle audiocassette,

poi standardizzati come DDS (Digital Data Storagge), e classificati in differenti classi (DDS-DC,

DDS-2, DDS-3, DDS-4, DDS-5, sempre con nastri di 4 mm di larghezza). Il prodotto originale aveva

1.3 GB su un nastro di 60 metri a circa 180 kB/s; nel seguito sono riportati alcuni prodotti oggi in

commercio. capacità data lungh.

Ditta nome interfaccia standard

nativa transfer nastro

(compr. 2:1) rate

SureStore SCSI 12 GB 1,1 MB/s DDS-3 125 m

HP DAT 12/24

Sony DDS-4 SCSI 20 GB 2,4 MB/s DDS-4 150 m

CertanceDAT SCSI 36 GB 3 MB/s DDS-5 170 m

Seagate 72

2 Nastri 8 mm

I nastri “8 mm” derivano dalla tecnologia video e costituiscono un prodotto con prestazioni superiori

rispetto ai sistemi basati su natri da 4 mm. Attualmente, due tecnologie adoperano nastri da 8 mm:

“Mammoth” della Exabyte, ed AIT della Sony e Seagate.

La tecnologia Mammoth presenta nella sue versione attuale (seconda generazione, denominata anche

M2) una capacità nativa di 60 GB ed un transfer rate di 12 MB/s.

La tecnologia AIT è giunta nel 2002 alla sua terza generazione. I drive AIT di prima generazione

(AIT-1) offrivano una capacità nativa di 25 GB (successivamente incrementata a 35 GB, grazie all’uso

di nastri di maggiore lunghezza) ed un transfer rate di 3 MB/s. I drive AIT-2 presentano una capacità

nativa di 50 GB ed un transfer rate di 6 MB/s. I drive AIT-3 presentano una capacità nativa di 100 GB

ed un transfer rate di 12 MB/s. Nel 2003 Sony ha introdotto una nuova versione della tecnologia AIT,

denominata S-AIT, i cui drive presentano una capacità nativa di 500 GB ed un transfer rate di 30 MB/s,

e sono dotati di interfacce Ultra Wide SCSI o Fibre Channel.

I cartridge AIT presentano una memoria da 64 Kbit (denominata MIC, Memory-In-Cassette), che è

usata per mantenere informazioni utili per la ricerca dei file.

3 Nastri più larghi

Nel 1994, Sony sviluppò un trasportatore inizialmente destinato al mercato video professionale,

basato su un nastro a 19 mm, tratto dalla tecnologia broadcast televisiva ed adattato alle esigenze

digitali con l’aggiunta di una traccia di controllo longitudinale e di codici ECC. Nacque così la classe

delle memorie a nastro a 19 mm, destinata al mercato dei supercomputer, con capacità dell’ordine di

25-175 GB e velocità di trasferimento dell’ordine di 8-50 MB/s.. Furono anche definiti dall'ANSI

alcuni standard (D-1, D-2, etc.), ma ad oggi non sembra che questa soluzione abbia avuto significativo

successo.

1 of 1 25/01/2007 21.24

Nastri ottici trasversali file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Nastri ottici trasversali

Nella fascia alta di costo e di prestazioni si trova fu prodotto alla fine degli anni '90 un nastro a

tecnologia ottica e tracce disposte trasversalmente sul nastro: il movimento longitudinale era solo per le

operazioni di posizionamento, quello trasversale delle testine per la scrittura e lettura.

In particolare, si trattava del drive EMASS/CREO, un nastro di 35 mm con capacità di 1 TB e velocità di 3 MB/s, oggi non

più in commercio.

1 of 1 25/01/2007 21.24

Accesso a settore file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Tempo di accesso al settore

Il tempo di accesso ad un settore si compone di tre componenti:

- tempo di ricerca del cilindro (tempo di seek);

- tempo di posizionamento sul settore (tempo di latenza);

- tempo di selezione della superficie, trascurabile rispetto agli altri.

Al tempo di accesso va poi aggiunto il:

- tempo di trasferimento del blocco.

In particolare, vengono definiti i seguenti parametri:

: è il tempo necessario allo spostamento delle testine da un cilindro a

- Tempo minimo di seek TS min

quello adiacente, composto da una costante a, dipendente dalla inerzia, e da un tempo, b, del moto fra

le due tracce:

= a + b

TS min : è il tempo necessario allo spostamento dal primo all'ultimo cilindro;

- Tempo massimo di seek TS max

se n sono i cilindri, è pari a:

= a + (n-1)b (8.1)

TS max [1] :

- Tempo medio di seek TS: è il tempo medio di spostamento radiale, convenzionalmente fissato in

TS= a + bn/2 (8.2)

, espressa in giri/min (rpm); ovviamente, il periodo di rivoluzione t è:

- Velocità di rotazione n 0 rot

t = 1/n

rot 0.

- Tempo medio di latenza TL: è il tempo necessario per raggiungere il settore, funzione della velocità e

della tecnica di selezione angolare; per una tecnica associativa (cfr.§ V.4.4), può essere assunto pari

alla metà del periodo di rivoluzione.

TL = t /2 = 1/ (2 n ) (8.3)

rot 0

- Velocità di trasferimento dati V, espressa in Mbyte/s detta anche data transfer rate; ovviamente, il

tempo di trasferimento di un settore di B byte è:

TT = B/V (8.4)

- Tempo medio di accesso: è la somma dei tempi medi di seek e di latenza

TA = TS + TL (8.5)

[1]

Si è a lungo discusso e si discute ancora sul modo migliore di calcolare questo valore medio: il caso migliore è 0 (la testina sta

sul cilindro desiderato), un caso abbastanza favorevole è quello del tempo minimo, il caso peggiore è quello della escursione

massima. Una teoria sostiene che la media debba ritenersi pari all’escursione di 1/3 delle tracce, in quanto la differenza attesa

fra due variabili aleatorie uniformemente distribuite iun un intervallo di tempo è appunto 1/3.

1 of 1 25/01/2007 21.23

Hard Disk file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Hard Disk

Gli hard disk singoli (in contrapposizione con i RAID) si costruiscono in versione interna ed esterna

alla CPU ed hanno le dimensioni fisiche di 5.25”, 3.5” e 2.5”.

I modelli per PC e server o workstation di medie dimensioni variano oggi (2003) da 40 a 200 GB di

capacità, con 5400-7200 rpm, tempo di seek 7-12 ms, cache di 512 kB e costo di 20 Euro/GB.

ù

Ad esempio:

nella produzione Seagate si trova il drive Medalist 17240, interfaccia Ultra ATA, capacità di 17.2 GB, 5400 rpm,

· tempo medio di seek di 9.3 ms ed

il Medalist Pro, interfaccia Ultra SCSI, capacità di 9.1 GB, 7200 rpm, tempo medio di seek di 9.5 ms, destinato a

· server e workstation di medie dimensioni.

il drive Barracuda 7200.7 Plus, interfaccia Ultra ATA/100, capacità di 200 GB, 7200 rpm, tempo medio di seek di 8.5

· ms e

la serie Cheetah con interfaccia UltraSCSI, come il Cheetah 10k.6 di sesta generazione, capacità di 147GB, Ultra320

· SCSI, 10000 rpm, tempo medio di seek di 4.7 ms.

Le prestazioni dei dischi per grossi sistemi e file server non si discostano sostanzialmente da quelle per i PC, ma

si raggiungono i 50 GB di capacità, i 5 ms di seek time, i 10.000 rpm e i 4MB per la cache. È da segnalar

significativa crescita della densità superficiale di registrazione, che negli ultimi anni è aumentata anche del 6

2 2

all’anno. È del 1999 un annuncio IBM che ha raggiunto i 20 GB/inch (contro i 3-5 GB/inch attuali), con 490.000

bpi e 41.400 tpi. È ancora da notare che la velocità di trasferimento dati è fissata dall’interfaccia e varia da 3 a

MB/s.

Ad esempio, il drive Ultrastar 36ZX della IBM presenta diverse interfacce, capacità di 136.7 GB (su 10 piatti e e 20

testine), 10.000 rpm, tempo medio di seek di 5.4 ms

Per i vecchi mainframe si usava tipicamente l’acronimo DASD (Direct Access Storage Device), ma ne è poi

stato coniato un altro: SLED: Single Large Expensive Disk.

1 of 1 25/01/2007 21.23

Floppy Speciali file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Floppy disk speciali

Il declino dei flopy disk tradizionali ha suggerito ad alcuni produttori la produzione di dischetti ad

elevata capacità, che mantengono la compatibilità in lettura dei floppy da 1.4 MB, con tecnologie varie

che consentono di aumentare la densità di registrazione. Fra questi, si segnalano alcuni prodotti detti

floptical per l’uso di tecnologie miste magnetiche ed ottiche, che tuttavia fino ad ora non hanno avuto

la diffusione prevista a causa dell’elevato costo. Sono però recenti annunci di prodotti a prezzi

competitivi con le altre memoria di backup.

Ad esempio, un floppy disk di tal genere da 120 MB è prodotto da Iomega con data tranfer rate di 4

MB/s e costo di circa 150 Euro.

1 of 1 25/01/2007 21.23

CD-ROM file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

CD-ROM

La capacità tipica di un CD è di 650 MB, i tempi di accesso sono lenti (50-150 ms), le velocità di

trasferimento dati, usualmente espresse in multipli della velocità della porta parallela del PC (150 kB/s)

sono da 16x a 52x. (i tempi di scrittura sono maggiori di quelli di lettura, quelli di riscrittura ancora

maggiori). Le prestazioni più ridotte in termini di capacità e velocità rispetto ai dischi magnetici sono

ripagate dalla rimovibilità del supporto (soltanto di recente si sono sviluppati dischi magnetici

rimovibili con elevate capacità (cfr. Zip e Jaz, § 7.3.2), ma questa è una competizione tuttora in atto.

Ad esempio:

lo HP CD-Writer 8100i Plus ha 4x in scrittura su CD-RW e CD-R, 2x in riscrittura, 24x in lettura; il tempo di

· accesso medio è di 150 ms.

· lo HP CD-Writer 9710i Plus ha 40x in lettura su CD-R e 20x su CD-RW, 16x in scrittura su CD-R e 10x su CD-RW.

1 of 1 25/01/2007 21.23

DVD file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

DVD

I DVD (Digital Versatile Disk o Digital Video Disk) sono ad uno o due strati, singola o doppia

faccia.

Hanno capacità che assumono valori che vanno dai 4 ai 17 GB, velocità di trasferimento di 6x (cioè

6´1250 kB/s) ed oltre

Esistono attualmente quattro versioni di DVD:

DVD-R (il primo formato disponibile sul mercato nel 1997, a sola lettura),

· DVD-RAM (il primo formato registrabile presentato nel 1998),

·

· DVD-RW e DVD+RW (anche questi ultimi riscrivibili, presenti sul mercato dal 1999 e dal 2001),

con un formato di registrazione differente per –RW e +RW, ma entrambi particolarmente usati in

ambiente video).

Ad esempio:

il lettore DVD Korea 6X ha capacità di 3.95-5.2 GB, transfer rate di 7.2 MB/s , tempo di accesso di 90 ms.

·

· Il driver DVD-RW Pioneer DVR 106D A06 ha velocità di scrittura di

4x per dischi DVD-R,

o 2x con dischi DVD-RW,

o 4x con dischi +R

o 2.4x con dischi +RW

o

In laboratorio era allo studio la tecnologia “GIANT CD-ROMs”, che si prevedeva avesse luce nel

2000, ma che finora (2003) non è stata annunciata: avrebbe dovuto avere una capacità di oltre 165 GB

su un singolo disco e l’aumento di capacità gli sarebbe derivato da un miglioramento della tecnologia

laser.

1 of 1 25/01/2007 21.23

Biblioteche di massa file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Biblioteche di nastri e dischi

Alcuni esempi di biblioteche:

Una biblioteca potrebbe essere costituita da 25 dischi MO di 2.5 GB formando così un sistema

· iniziale che può poi essere ampliato aggiungendovi ancora altri dischi.

· Un'altra biblioteca potrebbe essere costituita da uno “stacker” (un rack motorizzato) che raccoglie

10 cassette di 4mm, 8mm oppure DLT oppure caroselli di 100 cassette e 4 drive.

· Esistono anche sistemi con centinaia di silos e migliaia di cassette.

Il controllo dei sistemi più complessi è spesso effettuato via software e le cassette portano una

etichetta, leggibile ad esempio attraverso codice a barre, che ne identifica la data di ingresso nella

biblioteca. Gli algoritmi di distribuzione, riordino, indirizzamento, smontaggio e caricamento dei

supporti non sono banali e tendono ad ottimizzare i tempi di accesso ai dati di un supporto, che sono

comunque di parecchi secondi per dischi ottici veloci, decine di secondi per le unità a nastro di buone

prestazioni e minuti per le unità a nastro economiche.

Ad esempio:

- HP SureStore CD/DVD-ROM Server U4152A è un server da collegare su Ethernet di 18 GB (20 CD-ROM), che gestice

CD e DVD-ROM elettronicamente (senza robot, con 7 drive ed una memoria propria di 18 GB ove i CD sono riversati.

- Quantum DLT 4700 è un autoloader con interfaccia SCSI che gestisce 7 cartridge DLT con 1 drive, raggiungendo 140 GB

nativi (280 compressi); si può realizzare un sistema di autoloader.

- TimberWolf 9740 di StorageTek è una libreria automatizzata che monta fino a 10 drive DLT 4000 o 7000 e 494 “slot” per

le cartridge, per una capacità complessiva di 395 GB nativi per cartridge di 800 MB, che diventano 25 TB per cartridge di

50 GB.

- Tera-RamSan della Texas Memory System è un SSD che contiene da 192 a 1024 GB di memoria SDRAM costituiti da

fino a 16 SSD indipendenti, ciascuno di 64 GB

1 of 1 25/01/2007 21.22

Capitolo nono

Le macchine aritmetiche

1 Addizionatore modulo-M

2 Addizionatori “diminuiti”

3 Addizionatori parallelo e seriale

3.1 Addizionatore binario

3.2 Addizionatore decimale

3.3 Addizionatore per potenze di b

4 Addizionatori binari. I riporti

4.1 La propagazione dei riporti

4.2 Adder con carry look-ahead

4.3 Adder con controllo asincrono

5 Sottrattori e loro realizzazione con addizionatori

6 Addizionatori algebrici in virgola fissa

6.1 Numeri naturali (unsigned)

6.2 Numeri relativi in complementi alla base (signed)

6.3 Numeri relativi in complementi diminuiti

6.4 Numeri rappresentati in segno e modulo

6.5 Numeri frazionari

6.6 Numeri rappresentati per eccessi (polarizzati) ??verifica??

7 Moltiplicatore in astratto

7.1 Moltiplicatore modulo-M

7.2 Aritmetica di numeri naturali

7.3 Aritmetica dei frazionari

7.4 Aritmetica in complementi

8 Algoritmo della moltiplicazione

8.1 L’algoritmo in generale

8.2 Schema di architettura parallela

8.3 Schema di architettura seriale

9 Moltiplicatori binari seriali

9.1 Algoritmo fondamentale

9.2 Algoritmi di Booth (moltiplicatori per stringhe)

10 Moltiplicatori decimali

11 Divisore in astratto

11.1 Divisore modulo-M

11.2 Divisore di interi

11.3 Divisore di frazionari

11.4 Divisore di numeri relativi

12 Algoritmi per la divisione

12.1 L’algoritmo in generale

12.2 Schema di architettura seriale

13 Divisori binari e decimali

13.1 Metodo di addizione e sottrazione (restoring)

13.2 Metodo del restoring modificato

13.3 Metodo di divisione per eccessi (non restoring)

14 Aritmetica in virgola mobile: macchine ausiliarie

14.1 Operazioni componenti

14.2 Underflow, denormalizzazione e normalizzazione

15 Aritmetica in virgola mobile: algoritmi fondamentali

15.1 Addizione e sottrazione

15.2 Moltiplicazione

15.3 Divisione

15.4 Altre operazioni

Premessa

???

1 Addizionatore modulo-M

Sul piano astratto, introdurremo una macchina detta “Addizionatore Modulo-M” così definita:

macchina Add-mod-M (IN X,Y: resti-M; r:bit;

(OUTOUT S: resti-M; R:bit)

}

{S=|X+Y+r| ; R=[(X+Y+r)/M]

M

ove:

· resti-M = 0..M-1 rappresenta un tipo di numeri naturali minori di M

· bit è un tipo di dato 0=falso, 1=vero che può essere trattato come numerico (come in questo caso) o logico

· r è il “riporto entrante” (carry-in)

S è la somma modulomod-M degli addendi X, Y e del riporto entrante r

·

· R è il “riporto uscente” (carry-out), che è 0 se X+Y+r<M, 1 altrimenti (tale è, infat ti la parte intera del rapporto che definisce R

Posto

Z=X+Y+r

nell’adder modulomod M sono valide le seguenti eguaglianze:

if (Z<M) R=0 else R=1 (perché R è la parte intera del rapporto Z//M ed è Z<2M)

· if else M di Z)

· (Z<M) S=Z S=Z-M (perché S è il resto-modulomod

· Z= MR+S (per definizione di S e R

La macchina così definita è l’apparecchiatura fondamentale per le addizioni e di per tutta

l’aritmetica e la sua definizione prescinde dalla base di numerazione.. Come si vedrà, i, anche se i suoi

sono caratterizzati a differentiverse interpretazioni, a seconda del tipo di

input ed output richiedono

quale la macchina è usatada realizzare (numeri naturali o rappresentati in

aritmetica per la

complementi, in virgola fissa o mobile, di numeri naturali, di numeri rappresentati in complementi,

etc.). mostrata e gli schemi realizzativi che seguiranno prescindono dalla base di numerazione:

La macchina

Restando per il momento al caso più semplice dei numeri naturali, sono ad esempio addizionatori in

modulo:

§ un “addizionatore di cifra” decimale, che calcola cifra-somme e riporto (es.: 8+7=15, scrivo 5 ed 1

riporto),

§ un “addizionatore di cifra” binaria (bit), che opera analogamente in aritmetica binaria,

8 8

un addizionatore mod-10 , che in un’aritmetica 0£x£ 10 calcola la somma e segnala l’eventuale

overflow 8 8

§ un addizionatore mod- 2 , per un’aritmetica con 0£x£ 2 .

8

ad esempio, un addizionatore modulo-10 è composto da 8 addizionatori di cifra decimale, ciascuno dei

64

quali è un addizionatore modulo-10, così come un addizionatore modulo-2 è composto da 64

addizionatori modulo-2.

Si dice semiaddizionatore (half adder) È interessante notare la relazione che sussiste fra un

addizionatore e un semiaddizionatore, definito come un addizionatore senza riporto entrante:

half-add-mod-M (X.Y.S,R) Û add-mod-M (X,Y,0,S,R). :

Û

half-add-mod-M (X,Y,S,R) add-mod-M (X,Y,0,S,R)

Applicando infatti la proprietà associativa dell'addizione si ha che: Un un add-mod-M si può realizzare

usando due semiaddizionatori in cascata per calcolare S e ponendone in or le uscite dei riporti per

come mostrato in half-adder.

calcolare la R,

.

2 Addizionatori “diminuiti”

Talora accade che, disponendo di un addizionatore modulo mod-M’, si voglia realizzare attraverso di

esso un addizionatore modulomod-M, con

M = M’-k realizzato attraverso un addizionatore

È questo ad esempio il caso di un addizionatore modulomod-10 n

(cfr, § 5) oppure di un addizionatore modulomod-(b -1) realizzato attraverso uno

modulomod-16

n (cfr, § 7.3),

modulomod-b

Si voglia dunque realizzare un attraverso un

add-mod-M(X,Y,r,S,R)

add-mod-M’(X,Y,r,S’,R’).

Detto Z=X+Y+r, si ha dalle definizioni di addizionatori:

Per il riporto R si ha:

Per la somma S si ha:

Per R=0, essendo Z minore sia di M che di M’:

·

· Per R=1, essendo Z ³M si ha:

Dunque si ha: (2.1)

(2.2)

si può allora costruire come segue:

L’addizionatore modulomod-M

· si calcola con un addizionatore modulomod-M’ la somma S’ ed il riporto R’;

si calcola il riporto R con le (2.1);

·

· si effettua su S’ la “correzione” con q=0 se R=0. q=k se R=1

L’architettura dell’addizionatore è mostrata in fig. 2.1. Si tratta ovviamente di uno schema di

principio che si particolarizza poi a seconda dei valori di M ed M’

Fig. 2.1 Schema di principio di un addizionatore diminuito

il blocco R calcola R con la (2.1);

·

· il blocco gen-q calcola in funzione di R 0 oppure k;

l’half-adder (half in quanto non richiede riporto entrante) calcola S addizionando a S’ 0 oppure k,

· secondo le (2.2).

3 Addizionatori parallelo e seriale n

n

Diremo (si noti b al posto di M) l’addizionatore in modulo nel quale,

macchina add-mod-b

considerando i dati rappresentati in cifre, si mette in evidenza la struttura interna. Operando come si fa

manualmente, una addizione per due numeri di n cifre si può esprimere con il seguente algoritmo (con

, Y , S si indicano le cifre i-esime di X,Y,S ed i vettori in genere si intendono con indici da 0 a n-1

X i i i

se contengono n elementi):

n n

macchina add-mod-b (IN X,Y: resti-b ; c: bit

n

(OUTOUT S: resti-b ; C: bit)

r,R: bit[n[

{for (i=0; i<n; i++) do

{if (i==0)r =c else r =R

i i i-1

add-mod-b (X ,Y ,r ,S ,R )}

i i i i i

C=R }

n-1

In altri termini, l’addizione su n cifre si realizza mediante n “addizioni di cifra”, , dei quali quello

relativo alla cifra meno significativa preleva il suo riporto entrante da quello c dell’addizionatore

completo, il riporto uscente C della cifra più significativa diventa il riporto uscente complessivo ed i

riporti intermedi vengono trasmessi dall’una all’altra cifra (r =R ).

i i-1

il riporto entrante diventa il riporto entrante della cifra meno significativa, il riporto uscente di quella

più significativa diventa il riporto uscente complessivo ed i riporti intermedi vengono trasmessi

dall’una all’altra cifra.Anche questo modello va inteso nel senso più generale: ad esempio, un

8

addizionatore mod-10 composto da 8 addizionatori di cifra decimale (mod-10), così come un

64

addizionatore mod-2 composto da 64 addizionatori mod-2. ma anche questo stesso adder in modulo

64 16

2 =16 composto da 16 adder mod-16 (cifra esadecimale).

Sul piano dell’architettura, sono possibili due modelli diversi per realizzare quanto descritto dal

suddetto algoritmo. Questo, infatti, così come algoritmi analoghi, può essere interpretato come

descrizione di una architettura parallela, se al ciclo in i si dà il significato di struttura che si ripete n

volte nello spazio,oppure come descrizione di una struttura seriale se il ciclo in i si intende sviluppato

nel tempo. Fig 3.1 Architettura parallela di un addizionatore in modulo

a)b) Fig 3.1 Architettura di un addizionatore in modulo: a) parallelo; b) seriale

Sono in realtà possibili due architetture diverse. L’algoritmo di cui sopra, infatti, così come

algoritmi analoghi, può essere interpretato come descrizione di una architettura parallela, se al ciclo in

i si dà il significato di struttura che si ripete n volte nello spazio,oppure come descrizione di una

struttura seriale, se il ciclo in i si intende sviluppato nel tempo.

La struttura parallela di fig. 3.1a) adopera n addizionatori mod-b ed è una classica rete logica

combinatoria. Fig 3.2 Architettura seriale di un addizionatore in modulo

; la La struttura seriale di fig. 3.,1b)2 adopera un unico adder-mod-b, investito nel tempo in successione

temporale dai bit degli addendi ed è una classica rete sequenziale.

Nel seguito se ne approfondiranno le proprietà, ma fin da ora si può anticipare che in generale

l’architettura la architettura parallela è più veloce e costosa di quella seriale e va preferita salvo che

non si frappongano vincoli economici. Per gli addizionatori i vincoli economici non sono tali da far

rinunciare all’architettura parallela.

3.1 Addizionatore binario

L’addizionatore modulomod-2 deve realizzare la somma e il riporto dell'aritmetica binaria di cui alla

tabella 3.1 che, come è noto, definisce il cosiddetto full-adder, realizzabile con la rete logica

combinatoria: Tabella 3.1– Somma s e riporto uscente R in funzione

dei bit-addendi x,y e del riporto entrante r

x y r s R

0 0 0 0 0

0 0 1 1 0

0 1 0 1 0

0 1 1 0 1

1 0 0 1 0

1 0 1 0 1

1 1 0 9 1

1 1 1 1 1

Dalla tabella /e dalle espressioni booleane) si evince che la somma è 1 se fra x, y e r vi è un solo 1

oppure se ve ne sono 3 (la somma è anche la funzione di disparità dei 3 ingressi) mentre il riporto

uscente è 1 se almeno 2 degli input sono 1.

Il riporto si può però anche esprimere in una forma diversa, che torna utile nella realizzazione

dell’addizionatore. Infatti si ha R=1 in due distinte circostanze: 1) R viene generato nell’addizionatore

perché è x=y=1 (indipendentemente dal fatto che sia r=0 o r=1) oppure 2) essendo x ed y l’uno 0 e

l’altro 1, il riporto r viene “propagato” in R. Posto allora

(condizione di generazione del riporto)

(condizione di propagazione del riporto)

si ha: (3.1)

3.2 Addizionatore decimale

Per b=10, l’addizionatore dovrebbe realizzare le tabelline di somma e riporti di 200 voci (10 cifre ´

10 cifre ´2 riporti). A livello di maggior dettaglio, noti che siano i codici per la rappresentazione delle

cifre, l’addizionatore dovrebbe calcolare il codice C(S) della cifra-somme in funzione dei codici C(X),

C(Y) delle cifre-addendi e del riporto r; supposto a 4 bit il codice (p.es. codice 8-4-2-1) si potrebbero

costruire 4 funzioni booleane di 9 variabili l’una (con molti punti di indifferenza). La rete logica

sarebbe complessa ma fattibile.

In alternativa, si può ricorrere ad un addizionatore modulomod-16 e adottare la tecnica

dell’addizionatore diminuito, come mostrato in "Addizionatore decimale".

3.3 Addizionatore per potenze di b k

Ogni gruppo di k addizionatori mod-b è un addizionatore mod-b (cfr. fig.3.1) e, d’altro canto, un

k . Posto allora n=kq, un

insieme di k cifre di base b può essere visto come una “megacifra” di base b

n k

si può ottenere collegando, come in fig. 3.1a), q Ad esempio, due

add-mod b .

add-mod-b

addizionatori mod-16 collegati in cascata realizzano un addizionatore mod-256, così come tre

6

addizionatori mod-100 realizzano un addizionatore mod-10 .

4 Addizionatori binari. I riporti

4.1 La propagazione dei riporti

In un addizionatore parallelo binario, per ciascuno stadio i vale la (3.1), ma, per studiare il problema

della propagazione dei riporti, alle condizioni di generazione e propagazione, ne va aggiunta un’altra,

la condizione di “uccisione” (kill) del riporto, che si ha se entrambi i bit-addendi sono nulli: in tal caso,

si ha infatti R =0 indipendentemente dal valore di r . Si ha pertanto:

i i

: il riporto è generato nello stadio i-esimo

: il riporto è propagato nello stadio i-esimo

: il riporto è ucciso nello stadio i-esimo

e si ha:

Detto dunque e il tempo di propagazione del riporto in uno stadio, il tempo di ritardo complessivo di

un addizionatore parallelo di n bit è ke (con k£n) ove k è la più lunga catena di condizioni di

propagazione. Se in uno stadio vi è la condizione di generazione, la propagazione inizia in quello stadio

in parallelo con l’inizio di altri fenomeni di propagazione lungo tutta la catena; se viceversa in uno

stadio vi è la condizione di uccisione, la propagazione si arresta.

Il tempo di ritardo dell’addizionatore parallelo è dunque variabile con gli addendi ed ha come limite

superiore ne. Per rendere più veloce l’addizionatore sono possibili due tecniche:

· tecnica sincrona o dell’anticipatore di riporto (carry look-ahead): usa appositi circuiti per rendere

più veloce la propagazione, ma il sistema di controllo dell’addizionatore è sempre commisurato al

caso peggiore (che comunque è reso inferiore ad ne);

tecnica asincrona: appositi circuiti riconoscono la fine del fenomeno di propagazione; il tempo di

· propagazione non migliora, ma il sistema di controllo dell’addizionatore è commisurato al caso

effettivo (che varia fino ad un massimo di ne);

4.2 Adder con carry look-ahead

Il fenomeno della propagazione dei riporti in una catena di addizionatori lunga j elementi può essere

dal riporto uscente

eliminato se, per ogni stadio i, dal (k+1)-esimo al (k+j)-esimo, invece di ottenere r i

R , lo si ottiene direttamente dai bit degli addendi X ed Y e dal riporto entrante nella catena:

i-1 (4.1)

l’ultimo rigo così calcolato “dice” che il riporto uscente r è uguale al riporto entrante nell’anticipatore

Si noti che k+j

r se questo viene propagato in tutti gli stadi (ultimo termine della somma) oppure alla condizione di generazione

k

G

k

se questa viene propagata dagli stadi dal (k+1)-esimo fino all’ultimo (penultimo termine), oppure…oppure se vi è la

condizione di generazione nell’ultimo stadio (primo termine). Questa conclusione poteva trarsi anche senza

sviluppare le espressioni booleane.

La rete logica che realizza quanto sopra è detta anticipatore di riporti (carry look-ahead) e,

…r in funzione delle G e P (k+1 £ i

applicata a j stadi di un addizionatore, calcola i riporti r k+1 k+j i i

<k+j),. Essa che può ricevere dagli addizionatori le condizioni G e P degli stadi della catena e ;

i i

calcola tutti i riporti della catena sono calcolati dall’anticipatore con una rete a due soli livelli in

funzione di queste, e quindi più velocemente di ciò quella che si avrebbe dalla rete di propagazione

dell’adder.. a k=4 bit:

In figura 4.1 è mostrata l’architettura di un addizionatore a 64 bit con anticipatori di riporto

le celle dell’adder calcolano le P e le G e le trasferiscono all’anticipatore, dal quale ricevono le r ; le

i i i

celle sono raggruppate a 4 a 4 in quanto, crescendo j, le equazioni diventano troppo complesse.

Si noti che il risultato che così si ottiene dice, con riferimento all’ultimo rigo, che il riporto uscente

r è uguale al riporto entrante nell’anticipatore r se questo viene propagato in tutti gli stadi (ultimo

k+j k

termine della somma) oppure alla condizione di generazione G se questa viene propagata dagli stadi

k

dal (k+1)-esimo fino all’ultimo (penultimo termine), oppure…oppure se vi è la condizione di

generazione nell’ultimo stadio (primo termine). Questa conclusione poteva trarsi anche senza

sviluppare le espressioni booleane.

Fig. 4-1 Adder con anticipatore di riporti

In figura 4.1 è mostrato lo schema di un addizionatore a 64 bit con anticipatore di riporto: le celle

dell’Adder calcolano le P e le G e le trasferiscono all’anticipatore, dal quale ricevono le r ; le celle

i i i

sono raggruppate a 4 a 4 in quanto, crescendo j, le equazioni diventano troppo complesse.

Si noti che la propagazione dei riporti avviene ora tra i blocchi del carry-look-ahead (16 per un

adder di 64 bit), mentre i riporti entranti in ciascun adder sono definiti quasi simultaneamente dai

blocchi dell’anticipatore dalle (4.1).

Si realizza quindi un fenomeno di propagazione dei riporti fra i blocchi dell'anticipatore, non

dissimile da quello che originariamente si verificava fra i full-adder. Si può allora migliorare ancora il

tempo di propagazione realizzando blocchi di anticipazione dei riporti fra gli anticipatori e così via, in

uno schema di anticipatore a più livelli.

4.3 Adder con controllo asincrono

La tecnica asincrona per migliorare la tempificazione dell'addizionatore è illustrata in adder con

controllo asincrono

5 Sottrattori e loro realizzazione con addizionatori

Analogamente all’addizionatore, si può definire il sottrattore:

macchina Sub-mod-M (IN X,Y: resti-M; p:bit;

D: resti-M; P:bit)

(OUTOUT

; P=ç[(X-Y-p)/M]ç}

{D=|X-Y-p| M

ove:

· p è il “prestito entrante” (borrow-in)

· D è la differenza modulomod-M degli addendi X, Y e del prestito entrante p

· P è il “prestito uscente” (borrow-out), che è 0 se X-Y-p>0, 1 altrimenti (tale è, inf atti il modulo della parte intera del rapporto che

definisce P)

ed il semisottrattore Half-sub-mod-M (X,Y,D,P).

Si noti che, ancora analogamente all’addizionatore, posto Z=X-Y-p, si ha:

Si noti ancora che invertendo il minuendo con il sottraendo si ha (per X¹Y):

half-sub-mod-M(X,Y,D,P)Ûhalf-sub-mod-M(Y,X,M-D,ØP) (5.1)

cioè invertendo X con Y si ottiene il complemento ad M della differenza ed il complemento booleano

del prestito. Le uscite del secondo semisottrattore sono infatti

Il sottrattore potrebbe costruirsi analogamente all’addizionatore, ma conviene usare un’unica

macchina, l’addizionatore, per calcolare somme e differenze ed in generale per calcolare la somma

algebrica di due numeri. Ciò può semplicemente realizzarsi usando le proprietà dei complementi. Detto

il complemento ad M di Y e P il complemento booleano di P:

Y c c

(aritmeticamente )

la principale relazione fra addizionatore e sottrattore è:

half-sub-mod-M(X,Y,D,P)Ûhalf-add-mod-M(X,Y ,D,P ) (5.2)

C C

Le uscite dell’half-adder sono infatti

Si ha dunque: : si ottiene D ed il

Per calcolare la differenza D=X-Y si può effettuare la somma di X con Y C

complemento P del prestito.

C per fissare le idee.

Si veda esempi di sottrazioni

La relazione sopra evidenziata è quella che in pratica interessa; comunque, essa si può estendere ai

sottrattori completi.

Riprendiamo ora la proprietà sopra illustrata e diciamo Y =M-1-Y il complemento diminuito di Y.

d

Essendo

si può anche affermare che: e

Per calcolare la differenza D=X-Y si può effettuare la somma di X con il complemento Y d

quindi sommarvi 1: (5.3) è più facile da

La relazione di cui sopra è interessante perché il complemento diminuito Y d

(basta complementare tutte le cifre di Y) e perché l’aggiunta di 1 si effettua

realizzare che non Y c

semplicemente ponendo ad 1 il riporto entrante dell’addizionatore. È con questa tecnica che spesso si

realizza la sottrazione nelle unità aritmetiche.

6 Addizionatori algebrici in virgola fissa

Per realizzare un addizionatore in una architettura di sistema di elaborazione occorre:

definire l’aritmetica, cioè l’intervallo dei numeri trattati e la rappresentazione adottata;

· calcolare la somma;

· calcolare le eccezioni quali overflow, underflow, etc.

· Nel seguito limiteremo la nostra analisi all’eccezione di overflow e diremo

l’addizionatore, ove indica il tipo di

add-aritmetica-M(X,Y,r,S,ovflow) aritmetica

aritmetica (di numeri naturali, rappresentati in complemento, etc., r il riporto entrante, ovflow

l’eccezione.

6.1 Numeri naturali (unsigned)

In un’aritmetica di interi x, con

0£x<M e l’overflow coincide con il riporto

l’addizionatore coincide con l’addizionatore modulomod-M

[1] :

uscente Û

add-nat-M (X,Y,r,S,ovflow) add-mod-M (X,Y,r,S,R)

L’ovvietà di quanto esposto ci esime da ulteriori commenti

6.2 Numeri relativi in complementi alla base (signed)

In un’aritmetica di interi relativi x, con

-

rappresentati in complementi

essendo

(la rappresentazione della somma è la somma delle rappresentazioni), la somma si può ancora ottenere con

n

l’addizionatore in modulo. Se è in particolare M=b

(complementi alla base, detti anche complementi a 2 per b=2), l’addizionatore si realizza banalmente con lo schema

di fig.3.1.

Nel caso dei numeri rappresentati in complementi, però, l’overflow non è dato dal riporto uscente,

che non assume nessun significato particolare. Per calcolare l’overflow invece occorre far riferimento

alle regole della rappresentazione del numero ed alla considerazione che la somma Z è inclusa

nell’intervallo (-M,. M); un overflow positivo (derivante dai due addendi entrambi positivi) è incluso

è quella di un numero

allora nell’intervallo [M/2,M), la cui rappresentazione in resti-modulomod-M

negativo (vedi figura 6.1); analogamente, un overflow negativo genera una somma modulomod-M che è

la rappresentazione di un numero positivo.

Fig. 6.1 Overflow per numeri in complementi

Si ha dunque in generale:

ovflo= x>0 and y>0 and s<0 or x<0 and y<0 and s>0 (6.1)

o, con riferimento alla cifra-segno:

ovflo= X <b/2andY <b/2andS ³b/2or X ³b/2 Y ³b/2 S <b/2

and and

n-1 n-1 n-1 n-1 n-1 n-1

(6.1’)

che, in caso di aritmetica binaria, si trasforma nell’equazione logica : (6.1”)

In conclusione si può porre: Û

add-compl2-M (X,Y,r,S,ovflow)

add-mod-M (X,Y,r,S ( )

6.3 Numeri relativi in complementi diminuiti

n

Per M=b -1 (complementi diminuiti, detti anche complementi a 1 per b=2), occorrerebbe un

n -1) ma, con la tecnica dell'addizionatore "diminuito" (cfr. § 2), si può adoperare

addizionatore mod-(b n opportunamente modificato. In particolare, dalle (2.1), (2.2) si ha:

ancora l'addizionatore mod-b

(infatti è essendo )

(2.2)

La correzione andrebbe dunque effettuata, oltre che nel caso di R’=1, nel solo caso

(coincidente con il cosiddetto “0 negativo”), trasformando detto valore nello “0 positivo”

; ma tale correzione può essere evitata, lasciando in tal caso lo 0 rappresentato come

: il fatto che esso sia comunque congruo con 0 rende lecita tale semplificazione. Si ha dunque:

n al quale viene aggiunta 1 unità se lo

L’addizionatore si può allora realizzare con un add-mod-b

stesso produce un riporto uscente R; l’aggiunta dell’unità si può poi realizzare ponendo r=1. Si ottiene

dunque lo schema di fig. 6.2, detto anche di riporto fine-inizio (end around carry), in quanto la linea

uscente di riporto finale viene collegata con il riporto entrante.

Fig, 6.2: Addizionatore in complementi diminuiti

Si noti che il riporto R per gli addizionatori in complementi non ha altri usi, essendo la condizione

di overflow calcolata in modo diverso. In particolare, anche per l’addizionatore in complementi

diminuiti valgono in proposito le (6.1): si ha overflow se addizionando due numeri positivi si ottiene la

rappresentazione di un numero negativo o viceversa.

Si veda addizionatore in complementi diminuiti per uno studio più approfondito.

6.4 Numeri rappresentati in segno e modulo

Un numero x rappresentato in segno e modulo è costituito da un segno X.segno e da un valore

assoluto X.abs e per l’addizione dovrebbe realizzare il seguente algoritmo, corrispondente a quello

manuale:

if (X.segno==Y.segno)

{half-add-mod-M(X.abs,Y.abs,S.abs,ovflow); S.segno=X.segno}

else if (X.abs³Y.abs)

{half-sub-mod-M(X.abs,Y.abs,S.abs,ovflo); S.segno=X.segno}

else

{half-sub-mod-M(Y.abs,X.abs,S.abs,ovflo);S.segno=Y.segno}

Questo algoritmo può essere semplificato come segue:

effettuare, nei due casi in cui i segni sono discordi, sempre l’operazione X.abs-Y.abs e

· complementare poi S se è ovflo=1),

· sostituire il semisottrattore con un semiaddizionatore con il complemento.

Nonostante le semplificazioni, tuttavia, l’algoritmo resta comunque più complesso di quello per

complementi e dunque si usa anche la tecnica:

si trasforma la rappresentazione in quella per complementi,

· si realizza l’addizione,

·

· si trasforma il risultato in segno e modulo, eventualmente, complementandolo.

6.5 Numeri frazionari

L’introduzione dell’aritmetica dei frazionari è utile in quanto spesso sono frazionarie le mantisse dei

numeri in virgola mobile.

Quanto detto per i numeri interi, signed oppure unsigned, vale anche se i numeri in gioco sono

frazionari

0£x<1 (unsigned)

oppure

- (signed)

Infatti, per l’addizione (contrariamente alla moltiplicazione) l’aritmetica dei frazionari coincide con

-n

b (p.es:

quella degli interi: basta semplicemente leggere il numero intero con il fattore di scalescala

345+148 = 493 diventa 345/1000 + 148/1000 = 493/1000, 0010+ 0101 = 0111 diventa 3/8+5/8=7/8).

6.6 Numeri rappresentati per eccessi (polarizzati) ??verifica??

La rappresentazione per eccessi è quella tipica degli esponenti nella virgola mobile:un numero x è

s e lL'addizione si atore si ottiene facilmente sottraendo bias alla somma da

rappresentato da X=x+bia.

quello in modulo, semplice operazione considerando quale sia il valore di bias effettuando piccole

correzioni alla somma. Si veda addizionatore per eccessi per i dettagli.

7 Moltiplicatore in astratto

7.1 Moltiplicatore modulomod-M

In analogia all’addizionatore, porremo sul piano astratto:

macchina Molt-mod-M (IN X,Y: resti-M;

Q,P: resti-M; (7.1)

(OUTOUT

; Q=[(X´Y)/M]}

{P=|X´Y| M

Posto

Z=X´Y (7.2)

si ha, per definizione di P e Q:

Z= QM+P (7.3)

Si noti che:

P, come S per l’addizionatore, è il resto in modulo di Z ed è quindi 0£P<M (di tipo resti-M);

· Q, come R per l’addizionatore, è la parte intera del rapporto Z/M e si ha anche 0£Q<M, in quanto è

· 2 ;

Z<M n

se M=b , i fattori X,Y hanno n cifre (eventualmente nulle), altrettante ne hanno P,Q, mentre il

· prodotto Z ne ha 2n;

· il numero formato dalle cifre di Q seguite da quelle di P è, per la (7.2), il numero Z.

Per fissare le idee, si veda Esempi di moltiplicazioni.

Così come l’add-mod per l’addizione, il molt-mod è l’apparecchiatura fondamentale per

l’effettuazione delle moltiplicazioni.

7.2 Aritmetica di numeri naturali

In particolare, per un’aritmetica di numeri naturali in [0.M), P è il prodotto e Q è un indicatore di

overflow se diverso da 0:

macchina Molt-nat-M (IN X,Y: resti-M;

(OUTOUT PROD: resti-M; ovflo:bit

{Molt-mod-M (X,Y,Q,P) (7.4)

PROD=P

ovflow= Q¹0}

Per fissare le idee, si veda ancora Esempi di moltiplicazioni.

7.3 Aritmetica dei frazionari

Per un’aritmetica dei frazionari, invece, detti x’,y’ i fattori frazionari rappresentati da X e Y (interi),

Z la rappresentazione del loro prodotto z’=x’y’, si ha:

x'=X/M y’=Y/M

2 2

z’=x’y’=XY/M =Q/M+P/M

e dunque:

non si ha mai overflow;

·

· le cifre più significative del prodotto sono quelle di Q e quindi il prodotto rappresentato su n cifre è Q (e

non P come nel caso degli interi);

2

P/M è l’approssimazione del prodotto.

·

Il moltiplicatore, allora fornirà prodotto PROD e approssimazione EPS e si ha

macchina Molt-fraz-M (IN X,Y: resti-M;

PROD,EPS: resti-M)

(OUTOUT

{Molt-mod-M(X,Y,Q,P) (7.5)

PROD=Q

EPS=P}

Per un esempio si veda ancora Esempi di moltiplicazioni.

In conclusione, il moltiplicatore in modulo fornisce in ogni caso il prodotto in due registri da n cifre,

Q e P:

· per gli interi, P è il prodotto e Q rappresenta l’overflow;

· per i frazionari, Q è il prodotto e P rappresenta l’approssimazione.

7.4 Aritmetica in complementi

Per l’aritmetica in complementi, similmente alla somma, vale la proprietà

e quindi l’uscita P rappresenta ancora il prodotto intero in assenza di overflow. Tuttavia, perderebbe

perde di significato l’uscita Q che non sarebbe è più significativa della condizione di overflow nel caso

rappresenta per i frazionari la parte più significativa del prodotto. Non

degli interi né rappresenterebbe

sarebbe è neppure possibile usare, come per l’addizionatore, altre condizioni di overflow, in quanto il

si estende in zone contigue con rappresentazioni tanto positive quanto negative.

prodotto che lo genera

Pertanto il molt-mod-M non è utilizzabile (si veda ancora, per fissare le idee, Esempi di

moltiplicazioni.). semplice: il segno viene calcolato

D’altro canto, il calcolo del prodotto in segno e modulo .è come nella

indipendentemente dal prodotto dei moduli ed in parallelo con questo, l’overflow eventuale

(7.4). La soluzione spesso adottata è allora quella di trasformare la rappresentazione in segno e modulo,

eseguire la moltiplicazione e quindi riportare se necessario la rappresentazione in complementi

2

il modulo M , estendendo la

Una soluzione alternativa è quella di usare per la moltiplicazione

rappresentazione dei fattori al doppio delle cifre: si ottiene così un prodotto di 4n cifre la cui parte

meno significativa, considerata a sua volta suddivisa in Q ed in P, contiene i valori corretti (in

del prodotto. È anche possibile individuare l'overflow per il prodotto intero: un valore

complemento)i del segno (in binario, tutti 0 per numeri positivi o tutti 1

di Q che non sia una pura estensione coerente

per i negativi: nel caso binario). Si ha infatti, per l'aritmetica binaria:

n

ovflo=(P =0) and (Q¹0) or (P =1) and (Q¹2 -1)

n-1 n-1

In Moltiplicazione per complementi la dimostrazione dell'asserto, in Esempi di moltiplicazioni alcuni

esempi.

8 Algoritmo della moltiplicazione

8.1 L’algoritmo in generale

Così come per l’addizione, l’algoritmo per realizzare il molt-mod-M (e quindi tutti i moltiplicatori di

e Y le cifre di X eY si ha:

cui sopra) si trae dal classico algoritmo manuale: Dette X i i

n n

macchina molt-mod-b (IN X,Y: resti-b ;

2n

Z: resti-b )

(OUTOUT

{Z=0;

for (i=0; i<n; i++) do

;

{C=X*Y i i

Z=Z+C b } }

}

L’unica differenza rispetto all’algoritmo manuale è che, come è tipico per l’informatica, la somma

viene calcolata accumulando in Z.la somma parziale precedente con il prodotto C di ciascuna cifra di Y

per il moltiplicando X. Questo prodotto

C=X*Y i

è l’operazione componente fondamentale della moltiplicazione e la riterremo essere effettuata in una

[2]

apposita macchina elementare: n

macchina molt-cifra(IN X: resti-b ; g: cifra;

n+1

C: resti-b )

(OUTOUT

{C=X*g }

L’addizione richiederebbe un addizionatore dimensionato al numero di cifre di Z, ma se si considera

Z composto delle due componenti Q e P di cui al paragrafo precedente, si può semplificare lo schema

come segue (per fare mente locale si faccia riferimento ad Esempio di algoritmo di

moltiplicazione-esempio 1) formato dalle

Al ciclo i-esimo dell’algoritmo resta calcolato in Z il prodotto di X per il numero

(i+1) cifre di Y e che, essendo (l’apice i individua il valore alla i-esima iterazione), si può

porre, in analogia alla (7.3): (8.1)

ove è

In altri termini, come mostrato dall’esempio, l’algoritmo si può modificare facendo sì che esso

calcoli iterativamente P e Q piuttosto che Z. Si noti in particolare che in ogni ciclo si può effettuare la

somma fra il vecchio Q (la parte di sinistra di Z) e il prodotto C

R=Q+C

mentre P (la parte di destra) resta inalterata; successivamente, il nuovo Q si ottiene staccando da destra

l’ultima cifra di R (cioè calcolando la parte intera di R/b): (8.2)

ed il nuovo P aggiungendo in testa al vecchio tale cifra:

oppure (8.3)

a seconda che si voglia ricalcolare P in ogni ciclo oppure costruirlo cifra per cifra: L’algoritmo dunque

diventa: n n

macchina molt-mod-b (IN X,Y: resti-b ; n

(OUTOUT Q, P: resti-b )

n+1

resti b : C,R

{Q=0; P=0;

for (i=0; i<n; i++) do

,C); (8.4)

{molt-cifra (X,Y i

n+1

add-int-b (Q,C,R,ovflo); overflow ignorato

Q=[R/b];

P =R }

i 0

}

8.2 Schema di architettura parallela

L’algoritmo fondamentale della (8.4), interpretato con il ciclo in i che si sviluppa nello spazio, dà

luogo allo schema di architettura parallela di fig. 8.1. Rispetto alla (8.4), è stata eliminato Q=0 ed il

(0) .

primo adder, sostituito semplicemente da un blocco che stacca l’ultima cifra di C

Fig. 8.1 Schema di moltiplicatore parallelo

Lo schema di figura può poi evolversi verso schemi concettualmente più sofisticati ma

circuitalmente più semplici qualora si considerino particolari proprietà del prodotto.

8.3 Schema di architettura seriale

Per realizzare lo schema seriale, conviene porre il prodotto Z in un unico registro di 2n cifre, delle

quali le prime n rappresentano Q e le successive P (in realtà, Q ha una cifra in più, vedi in seguito).

Con riferimento alla fig.8.2, si ha allora:

Fig. 8.2 Schema di moltiplicatore seriale

l’addizione fra Q e C avviene in un unico adder, calcolando la somma R, che viene ricondotta nella

· parte Q del registro (che perciò ha le dimensioni di R, n+1 cifre, cfr. nota 2);

· l’operazione Q=[R/b] avviene successivamente mediante uno scorrimento a destra del registro Q ;

si estende lo scorrimento a tutto il doppio registro “staccando” così l’ultima cifra di R e cedendola

· (i)

=R ): P contiene allora alla sua sinistra i successivi valori P della

alla testa del registro P (P i 0 valore di P;

(8.1) e, alla fine, tutto il moltiplicatore

di conseguenza, al ciclo i, n-i+1 cifre di P resterebbero inutilizzate alla sua destra;

·

· il registro P viene inizialmente caricato con il moltiplicatore Y, utilizzandone così la parte destra:

sarà così disponibile sempre nell’ultima posizione

partecipando Y allo scorrimento, la cifra Y i

di P, semplificando la realizzazione del moltiplicatore di cifra.

L’algoritmo (8.4) così si modifica:

n n

macchina serial-molt-mod-b (IN X,Y: resti-b ; n+1

Z:??? struct {Q: resti-b ;

(OUTOUT n

P: resti-b }

n+1

C,R: resti b

{Z.Q=0; Z.P=Y;

for (i=0; i<n; i++) do

{molt-cifra (X,Z ,C); (8.5)

0

n+1

add-int-b (Z.Q,C,R,ovflo); overflow ignorato

a: Z.Q=R;

s: Shr(Z,0)}

Nell’algoritmo sono posti in evidenza, in forma di label, i segnali di controllo del moltiplicatore:

· a: memorizza in Q la somma R dell’addizionatore

· s: effettua lo scorrimento a destra del registro Q-P (prodotto Z);

Essi, fatte salve le semplificazioni che presenteremo in seguito, si alternano negli n cicli

dell’algoritmo.

Per fissare le idee si veda in Esempio di algoritmo di moltiplicazione-esempio 2).

9 Moltiplicatori binari seriali

9.1 Algoritmo fondamentale

Per b=2 si ottengono notevoli semplificazioni (fig.9.1):

Fig. 9.1 Moltiplicatore binario seriale fondamentale

· il prodotto C assume solo i valori 0 e X e pertanto, invece del blocco molt-cifra, si può realizzare

¹0;

un’addizione solo con X, facendo in modo che la somma R sia memorizzata in Q solo per Z 0

· l’adder si estende su n bit, il risultato R su n+1 (R include il riporto uscente).

La struttura di controllo, allora, sviluppa il seguente algoritmo:

for (i=0; i<n; i++) do

a;

{ if (Z ==1)

0

}

s

cioè genera n segnali s e tanti segnali a quanti sono gli “1” di Y. 3).

Un esempio in Esempio di algoritmo di moltiplicazione-esempio

9.2 Algoritmi di Booth (moltiplicatori per stringhe)

Una classe di algoritmi più efficienti di quello fondamentale si ottiene considerando la relazione:

che si ottiene banalmente moltiplicando per l’ovvia proprietà (ad esempio 111=1000-1 in binario,

corrispondente al decimale 999=1000-1).

Essa infatti consente di trattare una stringa di “1” nel corpo di un numero come indicativa della differenza di due

potenze di 2. Se infatti si ha

allora si può porre

trasformando dunque una stringa di “1” in una di “0” preceduta da un “1” e chiusa da un “-1”; diremo stringa

trasformata la stringa così ottenuta. Al di là del dettaglio realizzativi, che comunque è illustrato in Algoritmi di

Booth, l'algoritmo effettua un numero in generale inferiore di somme algebriche rispetto all'algoritmo fondamentale

ed è dunque più efficiente di questo. 4).

Un esempio in Esempio di algoritmo di moltiplicazione-esempio

10 Moltiplicatori decimali

Sebbene il loro interesse sia diminuito negli ultimi tempi (le unità aritmetiche sono oggi in

prevalenza binarie, contrariamente a quanto accadeva nel passato), la moltiplicazione decimale merita

qualche cenno.

La maggiore difficoltà consiste nella realizzazione del blocco molt-cifra. Nell'inserto Moltiplicatori

decimali si illustrano alcuni metodi.

11 Divisore in astratto

11.1 Divisore modulomod-M [3]

Il divisore modulomod-M astratto si può così definire :

2

macchina Div-mod-M (IN D:resti-M ; Y: resti-M;

Q,R: resti-M; (11.1)

(OUTOUT

{Q=[D/Y]; R=|D| }

Y

Si noti che la macchina ha una struttura diversa da quella delle altre macchine, alle quali la divisione

ha fornito i concetti di resto e quoto. Essa calcola Q, R tali che:

D=Q×Y+R con 0£R<Y (11.2)

e quindi, per R=0, effettua l’operazione inversa del moltiplicatore, assumendo D il ruolo della Z e Q

quello di X.

Per fissare le idee, si veda Esempi di divisioni.

In particolare, il quoziente intero Q è anche una approssimazione del rapporto (reale) D/Y; posto

infatti e=R/Y, si ha:

Q=D/Y-R/Y=D/Y- e con e < 1 (11.3)

Pertanto, il divisore in modulo fornisce da un lato il quoziente Q della divisione intera, dall’altro un

risultato Q ed una approssimazione R del rapporto D/Y. Di questo, come si vedrà, è possibile fornire

risultati ed approssimazioni diversi.

11.2 Divisore di interi

In una aritmetica di interi in [0.M), ove cioè anche il dividendo X appartiene all’intervallo, le prime

cifre di D sono nulle (X assume il ruolo della P del moltiplicatore, ove è Q=0 in assenza di overflow),

non vi è mai overflow (è infatti X<Y×M, X/Y<M) e si ha:

e) Û

div-int-M (X,Y,Q, div-mod-M (X,Y,Q,R/Y)

Si noti che il quoziente Q è nullo non soltanto per X=0, ma anche sempre che sia X<Y.

Per fissare le idee, si veda ancora Esempi di divisioni.

11.3 Divisore di frazionari

Per un’aritmetica dei frazionari, al contrario di quella di interi, deve essere X<Y perché non vi sia

overflow e si può egualmente definire un rapporto ed un’approssimazione, ma non si può usare il

medesimo divisore di interi del paragrafo precedente, che fornirebbe un risultato sempre nullo in

assenza di overflow. D’altro canto, se si considera il divisore come inverso del moltiplicatore, nel caso

dei frazionari le cifre più significative del dividendo si aspetterebbero nella parte di sinistra di D e non

in quella di destra come avviene nel divisore di interi.

Sul piano matematico, tale spostamento del dividendo equivale a moltiplicarlo per M: D=XM.

Allora, nella macchina x’, y’, q’, r’ i numeri frazionari

Div-mod.M(XM,Y,Q,R),detti

rappresentati (ciascuno uguale alla sua rappresentazione diviso M), dalla (11.3) si ha:

e quindi si ottiene in Q un valore ben approssimato (e=r'/M) del rapporto x’/y’. Considerando anche la

generazione della eccezione di overflow si ha infine:

macchina Div-fraz-M (IN X,Y:resti-M;

OUT Q,R:resti-M; ovflo: bit)

{Ovflo= X³Y;

Div-mod.M (XM,Y,Q,R) }

Per fissare le idee, si veda ancora Esempi di divisioni.

11.4 Divisore di numeri relativi

Per la divisione di numeri relativi occorre in primo luogo definire il quoziente ed il resto. La

definizione finora adottata di quoziente come parte intera del rapporto comporta come conseguenza il

fatto che il resto assuma il segno del divisore. Essa può essere estesa anche ai numeri relativi, ma in tal

caso si otterrebbe un quoziente in modulo diverso a seconda del suo segno. Ad esempio si avrebbe:

dividendo divisore quoziente resto

7 2 3 1 7= 2´ 3+1

7 -2 -4 -1 7=-2´-4-1

-7 2 -4 1 -7= 2´-4+1

-7 -2 3 -1 -7=-2´ 3-1

Una diversa definizione è quella di imporre al quoziente negativo il medesimo modulo di quello che

si avrebbe nella divisione fra i moduli di dividendo e divisore e di conseguenza un resto con il segno

del dividendo: dividendo divisore quoziente resto

7 2 3 1 7= 2´ 3+1

7 -2 -3 1 7=-2´-3+1

-7 2 -3 -1 -7= 2´-3-1

-7 -2 3 -1 -7=-2´ 3-1

Questa seconda definizione, oltre ad essere in linea con le più diffuse convenzioni aritmetiche, è

anche più facile da trattare a livello circuitale se i numeri sono rappresentati in segno e modulo: il

calcolo del quoziente si sviluppa sui moduli ed i segni di quoziente e resto vengono determinati dai

segni di dividendo e divisore.

Il secondo problema da affrontare è come operare in caso di rappresentazione per complementi.

Questa invero produce alcune difficoltà e pertanto si preferisce in genere convertire prima gli operandi

in segno e modulo e poi effettuare la divisione.

È anche possibile, ma con minore efficienza, operare direttamente in complementi, come sarà

mostrato in seguito.

12 Algoritmi per la divisione

12.1 L’algoritmo in generale

Esaminiamo l’algoritmo manuale di divisione di un numero D di m cifre (per gli interi, m=n, per i

frazionari m=2n delle quali le ultime n eguali a 0) per un numero Y a n cifre (vedi Algoritmo di

(i)

divisione – algoritmo manuale). Detto D il numero formato dalle prime i cifre di D, l’algoritmo

(i) (i)

ed il resto R parziali:

calcola, al passo i-esimo, il quoziente Q

con

che sono nulli per i=0 e raggiungono i valori finali per i=m. A tale scopo l’algoritmo costruisce via via un

(i) (i)

“dividendo parziale” P affiancando al resto corrente R una nuova cifra di D e calcola da questo una nuova cifra

q di Q.

In particolare, per generare n cifre del quoziente (tutte per gli interi, le prime dopo la virgola per i

frazionari), si opera come segue: (0) (0)

L’operazione si inizializza considerando un primo quoziente Q =0 ottenuto da un dividendo D formato dal

· (0) (0) ( (0) (0)

=D D =0Y+R ); si ha dunque:

massimo numero possibile di cifre e dal resto R

[4]

(0) (0)

Per gli interi D =R =0 ;

o [5]

(0) (0)

Per i frazionari D = R =X .

o al ciclo i-esimo (per i da 1 a n) si calcola:

· il nuovo dividendo, “arricchendo” il resto con una nuova cifra di D:

o (12.1)

la cifra q di Q e Q stesso,

o , (12.2)

il resto:

o (12.3)

Se in particolare diciamo Q il numero formato dalle cifre di coda di D (X per gli interi, tutti 0 per i

frazionari, l’algoritmo fondamentale è dunque il seguente:

n n

macchina Div-mod-b (IN X,Y:resti-b ; int: bit;

n n+1

; R:resti-b )

OUT Q:resti-b

n+1

P: resti-b

{ if(int){R=0;Q=X} else{R=X;Q=0} (12.4)

for (i=0; i<n; i++) do

P=R*b+Q ;

n-i

q=[P/Y];

R=P-q*Y;

Q=Q*b+q }

}

12.2 Schema di architettura seriale

Lo schema di divisore seriale (fig.12.1) ricalca (all’inverso) quello del moltiplicatore (cfr.fig.9.1):

Fig. 12.1 Schema di divisore seriale

· un unico “registro doppio” D che contiene a sinistra i dividendi parziali e a destra le cifre di Q non

ancora esaminate; in ogni ciclo, per realizzare le (12.1), si effettua uno scorrimento a sinistra del

doppio registro; (i) (i)

i calcoli delle cifre del quoto q e del resto R si effettuano in una macchina speciale:

· calcola-quoto-resto(P,Y,q,R)

che si compone delle macchine

· div-molt-cifra(P,Y,q,C), che calcola la cifra-quoziente q e calcola il prodotto C=qY;

n+1

sub-mod-b (D.P,C,R,ignora) , che calcola la differenza R=P-C

·

· liberandosi ad ogni ciclo una cifra di D, il calcolo di Q (cfr. le 12.2) è effettuato con lo

scorrimento a sinistra: Q si forma dunque via via alla destra del doppio registro (donde appunto il

nome Q assegnatogli);

L’algoritmo (12.4), considerando anche l’overflow ed operando con il registro D così come per lo Z

– divisore seriale ):

del moltiplicatore, diventa allora (vedi Algoritmo di divisione

n n

macchina Div-mod-b (IN X,Y:resti-b ; int: bit;

n+1

OUT D: struct{ P: resti-b ;

n

Q: resti-b })

n+1

R: resti-b

{ if(int){D.P=0;D.Q=X} else{ D.P=X; D.Q=0} (12.4)

for (i=0; i<n; i++) do

s: shl (D,0);

a: Q =q; D.P=R}

0

}

Così come per il moltiplicatore, nell’algoritmo sono posti in evidenza, in forma di label, i segnali di

controllo:

· a: memorizza in P la differenza R calcolata nel sottrattore e in Q la nuova cifra del quoziente;

s: effettua lo scorrimento a sinistra del registro P-Q (=D, dividendo-quoziente);

· Si noti che il calcolo del quoto e del resto avviene in questo algoritmo, come nel caso manuale, in

una macchina ideale (calcola-quoto-resto) che effettua prima la divisione ricavando q e calcolando il

prodotto di q per il divisore (macchina div-molt) e che effettua poi la sottrazione tra il divisore parziale

e questo prodotto (macchina sub-mod). Nel dettaglio, come si vedrà in seguito, si preferiscono

soluzioni diverse.

13 Divisori binari e decimali

L’algoritmo fondamentale della divisione dà luogo a differenti realizzazioni a seconda di come si

particolarizza il blocco calcola-quoto-resto

13.1 Metodo di addizione e sottrazione (restoring)

La sottrazione R=P-qY può essere effettuata mediante q sottrazioni P=P-Y, finché non risulti P<0:

allora il numero di sottrazioni effettuate sarebbe una in più di quelle necessarie e il risultato si

ripristinerebbe effettuando l’addizione P=P+Y (donde il nome del metodo: restore=ripristino).

q=0;

do

{R=P-Y;

b: P=R; q=q+1} (13.1)

while (R>0);

R=P+Y

b:P=R; q=q-1

Si noti che, dovendo essere comunque q<b, il ciclo può essere arrestato a q=b evitando anche il restoring in questo

caso (si veda lo sviluppo per b=2).

L'algoritmo si realizza con lo schema di fig. 13.1:

il contatore scatta con il segnale b, è up-down ed è controllato (+ o -) dalla sezione di controllo;

§

§ lo add/sub esegue addizioni o sottrazioni a seconda del segnale di controllo up, down;

la memorizzazione in P, così come l'effettivo avanzamento del contatore, avviene al tempo b.

§ Fig. 13.1 Metodo del restoring

Per b=10 il metodo è stato adoperato nelle prime macchine calcolatrici meccaniche a mano, poi

evolutesi in quelle elettromeccaniche. Si veda Divisore meccanico.

Per b=2 basta effettuare una sola sottrazione e quindi si risparmia il contatore: se il risultato è

negativo, si realizza il restoring ed è q=0, altrimenti è q=1. Si ha dunque:

R=P-Y;

b: P=R; q=1} (13.2)

if (R<0) { R=P+Y

b: P=R; q=0 }

13.2 Metodo del restoring modificato

Si può far avvenire la memorizzazione in P e l'incremento di q soltanto per R>0:

q=0;

do

{R=P-Y; (13.3)

{b:

if (R>0) P=R; q=q+1}}

while (R>0);

e si ottiene così il metodo del restorig modificato.

e considerando che, a valle dell’operazione di shift è D =0 (e

Per b=2, operando direttamente su D 0 0

quindi il valore corretto per R<0) si ha:

R=P-Y; (13.4)

if =1; }

(R³0) {b: P=R; D 0

13.3 Metodo di divisione per eccessi (non restoring)

Con riferimento all’algoritmo (13.1), se al termine del ciclo di sottrazioni relativo alla prima cifra

del quoziente si lasciasse il resto negativo (purché non sia q=b), si assumerebbe un quoziente in eccesso

di una unità, con resto negativo:

con

Se si continua l’algoritmo, al resto negativo si affianca la cifra “da abbassare” tenendo conto dei

segni: si costruisce così un divisore parziale negativo (vedi Algoritmo di divisione – divisione per

eccessi); la nuova cifra che così si ottiene è una “cifra negativa” che, se viene individuata per difetto

(fatto salvo ancora il caso q=-b, nel quale si fissa, ancora per eccesso, q=-b+1), dà luogo questa volta

ad un resto positivo e così via. Il tutto è giustificato dal fatto che le (12.1 - 12.3) valgono anche per

numeri relativi.

Per ricostruire il quoziente, si consideri che si ha ora con le q positive e negative; detto

i

allora Q’ il numero formato dalle cifre positive e Q” quello dalle negative, si ha:

Q=Q’-Q” (13.5)

come illustrato negli esempi.

L’algoritmo termina con un resto positivo e quoziente per difetto oppure con un resto negativo ed un

quoziente per eccesso (come negli esempi); si può eventualmente correggere questo risultato

sottraendovi 1.

In ogni caso l’algoritmo, fatta salva la necessità della ricostruzione del quoziente (cfr. 13.5),

conduce ad un risultato corretto in modo più semplice dell’algoritmo del restoring.

Per b=2, in particolare, si può porre q Î{0, 1} (e quindi la cifra negativa –1 valutata anche essa in

[6]

eccesso) e si ottiene il semplice algoritmo :

if (segno(P)=1) R=P-Y else R=P+Y;

P=R; (1513.6)

[7]

=1

if (R³0)D 0

Peraltro, se l'algoritmo si chiude con R<0, occorre procedere ad una correzione in quanto, fermo

restando il quoziente, è R=R+Y.

L'algoritmo si estende anche ai numeri relativi (rappresentati in complemento), ma il gioco delle

correzioni diventa più complesso. Se ne può ottenere una semplificazione modificando leggermente

l'algoritmo come illustrato in Algoritmo non-restoring binario.

14 Aritmetica in virgola mobile: macchine ausiliarie

Si ricorda che un numero in virgola mobile è rappresentato da una coppia (M,E) di mantissa ed

esponente, con mantissa in segno e modulo e “bit nascosto” ed esponente in eccessi (vedi standard

IEEE 754).

Gli algoritmi per l’esecuzione delle operazioni operano separatamente su mantissa ed esponente e

provvedono in generale a mantenere normalizzato il risultato, per conservarne la massima precisione

possibile. Con riferimento allo standard IEEE, devono inoltre gestire le eccezioni e la rappresentazione

μ

dello 0, dei numeri denormalizzati, dello e del NaN.

14.1 Operazioni componenti

Alla base delle operazioni in virgola mobile occorre porre alcune considerazioni ed operazioni

elementari.

Data una coppia (M,E) si può effettuare una variazione di rappresentazione mediante uno shift a

destra della mantissa ed un incremento di una unità dell'esponente, sempre che E+1 sia rappresentabile.

[8]

Diremo tale operazione di

Float shift right:

e viceversa, sempre che siano rappresentabili E-1 e bM (e quindi sempre che E non sia il minimo ed M

non sia normalizzato) si può avere l'operazione di

Float shift left:

Faremo riferimento ad operazioni in virgola fissa sulle mantisse del tipo di quelle già trattate nei

paragrafi precedenti. In particolare supporremo definite le seguenti macchine che operano su mantisse

ed esponenti:

- add-fraz (X.m,Y.m,Z.m,fixov): calcola Z.m =X.m +Y.m e segnala con fixov=true l'eventuale overflow;

in caso di overflow, peraltro, Z.m è la somma estesa (il primo bit è l'overflow);

- molt-fraz (X.m,Y.m,Z.m): calcola il prodotto frazionario; essendo questo minore di 1, non si ha

overflow;

- div-fraz (X.m,Y.m,Z.m):calcola il quoziente frazionario con X.m<Y.m e quindi senza overflow.

Analogamente per gli esponenti supporremo definite le operazioni:

- add-exp (X.e,Y.e,Z,e): effettua la somma;

- sub-exp (X.e,Y.e,Z,e): effettua la differenza; [9]

con somma e differenza estese, come per la somma delle mantisse.

Riterremo inoltre definite le operazioni elementari di float-shift a destra e sinistra;

Float-shift-right (X, eccezione)

Float-shift-left (X)

In particolare, quella di shift a destra, se applicata alla mantissa estesa, è usata per assorbire

0 ove l’1 iniziale indica overflow,

l'overflow di virgola fissa (p.es. in binario la mantissa 1,0010´2

1 ). Inoltre essa include l’ap-prossimazione (troncamento se ultima cifra <b/2, mantissa

diventa 0,1001´2 [10]

incrementa di 1 se maggiore) . Infine, indica nella variabile booleana "eccezione" l'eventualità che

l'esponente, per effetto dell'incremento, sia diventato maggiore del massimo.

Underflow, denormalizzazione e normalizzazione

14.2

L'aritmetica in virgola mobile richiede un controllo di underflow e deve riconoscere il caso in cui un

risultato sia denormalizzato, Ciò si verifica quando un esponente risulta minore del minimo consentito

(vedi algoritmi che seguono) e può essere controllato da una apposita "macchina":

macchina checkunder(IN X:virgola-mobile;

OUT undflo, denorm:boolean)

{while((X.e<min) &&(X.m!=0))float-shift-right(X,ignora);

if (X.m==0) {undflo=VERO;denorm=FALSO}

else {denorm=VERO; undflo =FALSO}

Nell'aritmetica in virgola mobile è anche necessario normalizzare il risultato, cosa che può essere

effettuate con un float-shift-left sempre che la prima cifra della mantissa sia nulla. All'atto della

normalizzazione, peraltro, devono essere anche controllati underflow e denormalizzazione: se infatti il

ciclo di normalizzazione si arresta (o non parte proprio) perché è stato raggiunto il limite inferiore

dell'esponente essendo ancora non normalizzata la mantissa, si verificherebbe il caso di underflow se la

mantissa è 0, di numero denormalizzato altrimenti. Si può allora ritenere definita la macchina:

macchina normalizza(IN X:virgola-mobile:

OUT undflo, denorm:boolean)

while((X.m<1/2) && (X.e>min))do float-shift-left(X);

if(X.m<1/2) && X.e==min) checkunder(X,undflow,denorm)

15 Aritmetica in virgola mobile: algoritmi fondamentali

Nel seguito si illustrano gli algoritmi fondamentali delle 4 operazioni, sviluppati nelle seguenti

ipotesi:

§ a monte degli algoritmi gli operandi vengono trasformati con mantissa frazionaria, recuperando il

bit nascosto;

sempre a monte degli algoritmi, si gestiscono le rappresentazioni speciali (0, infinito, NaN) ed i

§ casi particolari (come la somma o il prodotto per 0, operazioni che generano lo 0, etc.);

§ a valle degli algoritmi, i risultati sono trasformati nel formato dello standard, con il bit nascosto;

gli algoritmi segnalano il caso di risultato denormalizzato (variabile booleana denorm), ma,

§ coerentemente con il punto precedente, la generazione della rappresentazione avviene a valle;

delle eccezioni previste dallo standard tratteremo solo le seguenti

§ expov: overflow (di esponente),

o undov: underflow,

o

15.1 Addizione e sottrazione

Anche se la rappresentazione è in segno e modulo, riterremo gli operandi in input all'algoritmo

trasformati (banalmente) in una rappresentazione per complementi. Per effettuare la somma algebrica

occorre ovviamente che gli esponenti siano eguali; se ciò non fosse, essendo le due mantisse

normalizzate, occorre far scorrere a destra quella con esponente minore, fino a che non si raggiunga tale

[11]

eguaglianza . Eseguita quindi l'addizione e se questa non ha generato un overflow di virgola fissa

(fixov=FALSE) il risultato deve essere normalizzato (infatti, la somma di due addendi di segno

discorde può generare un risultato con degli 0 in testa). Se viceversa è fixov=VERO, uno shif-right del

risultato esteso può farlo assorbire, a meno che non si sia già al limite con gli esponenti. Ne segue

l'algoritmo:

while (A.e !=B.e) do

{if (A.e > B.e) float-shift-right (B,ignora);

else float-shift-right (A,ignora) }

add-fraz (A.m, B.m, C.m, fixov)

C.e=A.e;

if (!fixov) normalizza(C,undflo,denorm)

else {float-shift-right(C. expov); [12]

if (C.m >= 1) float-shift-right (C,expov);

15.2 Moltiplicazione

Per la moltiplicazione, è ovvio che occorre calcolare il prodotto delle mantisse e la somma degli

esponenti. Poiché la rappresentazione è in segno e modulo e date le difficoltà del calcolo per

complementi, i segni possono essere calcolati a parte. Per quanto attiene alle eccezioni si ha che:

§ poiché X.m,Y.m³1/2, si ha Z.m³1/4 e potrebbe essere Z.m<1/2; ne segue che la prima cifra

potrebbe essere nulla ed è sufficiente un solo shift-left per normalizzare; si può allora generare,

come caso limite, un risultato denormalizzato (non un underflow).

§ nella somma di esponenti positivi e molto grandi potrebbe andare in overflow l'esponente; questo

non può essere recuperato se la mantissa è normalizzata e quindi in tal caso deve aversi

expov=VERO;

§ nella somma di esponenti negativi molto piccoli (negativi e grandi in modulo) può andare in

underflow l'esponente: la situazione si può recuperare con una rappresentazione denormalizzata

oppure degenera in underflow.

Ne segue l'algoritmo che segue (per la normalizzazione è stato adoperato normalizza, ancorché esso

funzionerà per un solo ciclo)

molt-fraz (A.m,B.m,C.m);

add-exp (A.e, B.e, C.e); //in modalità estesa

normalizza (C,ignora,denorm);

if(C.e>max) expov=VERO; else expov=FALSO;

undov=FALSO;

if(C.e<min) checkunder(C,undov, denorm);

15.3 Divisione

Per la divisione occorre calcolare il quoziente delle mantisse e la differenza degli esponenti e,

similmente alla moltiplicazione, calcolare a parte i segni.

Se le mantisse sono frazionarie e normalizzate, ed è A.m<B.m, essendo , si ha anche:

e dunque il risultato è già normalizzato. Se viceversa è A.m³B.m, è sufficiente effettuare un solo

scorrimento a destra di A (il loro rapporto sarebbe compreso fra 1 e b prima dello shift, fra 1/b e 1

dopo). Si ha inoltre:

nella differenza fra esponenti discordi potrebbe aversi un overflow di esponente; questo non può

§ essere recuperato se la mantissa è normalizzata e quindi in tal caso deve aversi expov=VERO,

come per la moltiplicazione;

§ è anche possibile, in alternativa, che l'esponente vada in underflow: si richiede quindi un check di

underflow o denormalizzazione.

Si ottiene dunque il seguente algoritmo: [13]

if (A.m >= B.m) float-shift-right (A, ignora);

div-fraz (A.m, B.m, C.m);

sub-exp (A.e, B.e, C.e);

if (C.e > max) expov=VERO; else expov=FALSO;

{undov=FALSO;

if (C.e >= min) denorm=FALSO}

else checkunder(C,undov,denorm);

15.4 Altre operazioni

Altre operazioni in virgola mobile sono quelle per il calcolo delle funzioni matematiche elementari

(radice quadrata, elevazione a potenza, logaritmo, funzioni trigonometriche, etc.). Gli algoritmi che

definiscono tali operazioni derivano da metodi classici del calcolo numerico ma i limiti di questo testo

non ci consentono di illustrarli.

[1]

Se non si considerano applicazioni speciali, l'addizionatore, avendo identicamente r=0, potrebbe essere realizzato con un half

adder, ma la maggiore generalità che ne consegue suggerisce di avere a disposizione una macchina per la quale sia r qualsiasi.

[2] n+1

C, per b>2, ha una cifra in più di X, da cui il tipo resti-b

[3] Circa la definizione di Q, si noti che potrebbe risultare Q³M, ma in effetti i valori di D sono tali da evitare questa evenienza

oppure appositi controlli la eviteranno (vedi in seguito).

[4] Infatti, le prossime n cifre da “abbassare” saranno tutte le n cifre del dividendo, eventualmente nulle.

[5]

Infatti, dovendo essere X<Y (altrimenti è overflow), “abbassando” tutte le cifre del dividendo X, si ottiene la parte intera (0,)

del quoziente, cui seguiranno le n cifre ottenute dagli n 0 di coda di XM (eventualmente nulle).

[6]

Per il non-restoring si può ragionare diversamente, senza far riferimento alla divisione per eccessi: partendo dal restoring, si

può notare che l'operazione del ripristino è inutile perché nella prosecuzione dell'algoritmo si otterrebbe di nuovo il medesimo

resto e si assume dunque la cifra-quoto uguale a 0 (e non –1)

[7] Si ricorda che dopo lo shift è D =0.

0

[8] In questa operazione il numero può perdere in precisione a causa del troncamento o dell'arrotondamento della mantissa.

[9]

Questa ipotesi è necessaria per gli algoritmi che seguono: consentono di "assorbire" l'overflow e di trattare underflow e

denormalizzazione.

[10]

In fase di arrotondamento, in un caso molto particolare lo shift potrebbe non riuscire ad eliminare l’overflow. Il caso si verifica

0 1 1

=0,1111´2 =1,0000´2 .

in binario se il numero ha per mantissa una stringa di tutti 1: si ha ad esempio 1,1111´2

Occorre allora effettuare una nuova operazione di shift senza overflow)

[11]

In questo caso, l'operando potrebbe anche andare in underflow e l'addzione perderebbe di significato (A+B=A); questo

controllo non è stato inserito negli algoritmi mostrati.

[12]

Vedi nota su float-shift-right: nel caso eccezionale ivi indicato si effettua un altro shift right. Nel caso ancora più eccezionale

che ciò si verifichi con l’esponente massimo, si ha ancora expov=VERO.

[13]

Poiché si pera in aritmetica estesa, il fatto che l’esponente di A raggiunga il massimo non è ostativo al regolare proseguimento

delle operazioni: successivamente verrà eseguito A.e-B.e.

Esempi di sottrattori in modulo

In fig. 1 è esemplificato, per un'aritmetica modulo-100, il concetto di equivalenza fra semisottrattori

e semiaddizionatori.

Si noti in particolare che dalla (5.1) si deduce che la sottrazione si può anche effettuare con un

half-add-mod-M (X , Y, D , P).

C C

Fig .1 Esempi di equivalenza fra semisottrattori e semiaddizionatori

Esempi di moltiplicazioni

(suddivisione del prodotto in Q e P)

Moltiplicatore in modulo per numeri unsigned

1

2 I problemi per la rappresentazione in complementi

2

3 La rappresentazione mod-M

1 Moltiplicatore in modulo per numeri naturali (unsigned)

Il concetto di molt-mod-M è esemplificato, per b=10 e n=4, dalla tabella che segue:

X Y Q P Z

0025 0152 0000 3800 3800

2222 4444 0987 4568 9.874.568

La sua interpretazione per una aritmetica di numeri naturali è: PROD ovflo

X Y Q P (naturali) No

0025 0152 0000 3800 3800 (Q=0)

Si

2222 4444 0987 4568 4.568 (Q¹0)

mentre le stesse operazioni, interpretate in una aritmetica dei frazionari, sono:

PROD

X Y Q P EPS

(frazionario)

0025 0152 0000 3800

0000 3800

(0,0025) (0,0152) (0,0000) (0,00003800)

2222 4444 0987 4568

0987 4568

(0,2222) (0,4444) (0,0987) (0,00004568)

2 I problemi per la rappresentazione in complementi

La tabella che segue mostra alcuni prodotti di numeri rappresentati in complemento, per b=10 e n=2.

Si premette che in caso di risultati negativi il valore approssimato del prodotto frazionario, in analogia

ai numeri positivi ed alle regole del resto intero, dovrebbe essere quello per difetto: ad esempio:

· il prodotto 0,05´-0,05=-0,0005 0025 (2° rigo) dovrebbe essere troncato a –0,01 (rappresentato da

99);

il prodotto 0,30´-0,02=-0,0060 (5° rigo) dovrebbe essere troncato a –0,01 (rappresentato ancora da

· 99);

· il prodotto 0,25´-0,25=0,0625 (8° rigo) dovrebbe essere troncato a –0,07 (rappresentato da 93);

il prodotto -0,25´0,41=-0,1025 (9° rigo)dovrebbe essere troncato a –0,11 (rappresentato da 89).

· La tabella pone in evidenza come, pur essendo sempre P il resto in modulo-100 del prodotto intero,

gli overflow non sono distinguibili e i valori Q ottenuti non sono le cifre più significative del prodotto

frazionario (nei casi sopra elencati sono rispettivamente 04, 29, 18, 30).

P ovflo Prod

X Y Q (=prod intero) (intero) (frazionario)

05 05 00 25 00

no

(5) (5) (0) (25) (0,00)

05 95 04 75 99

no

(5) (-5) (04) (-25) (-0,01)

95 95 90 25 00

no

(-5) (-5) (-10) (25) (0,00)

30 02 00 60 si 00

(30) (2) (00) (-40) (indistinguibile) (00)

30 98 29 40 si 00

(30) (-2) (29) (-60) (indistinguibile) (00)

75 75 56 25 si 06

(-25) (-25) (-44) (25) (indistinguibile) (0,06)

75 59 44 25 si 10

(-25) (-41) (44) (25) (indistinguibile) (0,10)

75 25 18 75 si 93

(-25) (25) (18) (-25) (indistinguibile) (-0.07)

75 41 30 75 si 89

(-25) (41) (30) (-25) (indistinguibile) (-0,11)

2

3 La rappresentazione mod-M

Gli stessi prodotti della tabella precedente sono qui mostrati avendo "esteso" i fattori

(rappresentazione modulo-10000) e prelevando come P e Q rispettivamente le ultime due e le penultime

due cifre (era n=2) del prodotto su 8 cifre. Si può verificare la validità generale della formula

ovflo=(P<M/2) and (Q¹0) or (P³M/2) and (Q¹M-1)

e come ormai l’overflow sia sempre distinguibile (in tabella la condizione su P è espressa come p>0

oppure p<0). Si notino in particolare:

il caso in cui la rappresentazione del prodotto sia di segno opposto a quello previsto (4° e 5° rigo

1) in tabella): si tratta di prodotti in modulo minori di 100, per i quali P raggiunge l'estremo opposto

dell'intervallo [0,100));

2) il caso in cui Q non sia 00 né 99, non rappresenti cioè "pura estensione" del numero formato dalle

cifre di Q e di P.

X Y P ovflo prod

Q' P' Q

Esteso esteso (=prod intero) (intero) (frazi.)

0005 0005 00 25 00

0000 0025 no

(5) (5) (0) (25) (0,00)

0005 9995 99 75 99

0004 9975 no

(5) (-5) (-01) (-25) (-0,01)

9995 9995 25

00 00

9990 0025 no

(-5) (-5) (00) (25) (0,00)

0030 0002 00 60 si 00

0000 0060

(30) (2) (00) (-40) (p<0 and Q¹99) (00)

0030 9998 99 40 si 99

0029 9940

(30) (-2) (-01) (40) (p>0 and Q¹0) (-01)

9975 9975 06 25 si 06

9950 0625

(-25) (-25) (06) (25) (p>0 and Q¹0) (0,06)

9975 9959 10 25 si 10

9934 1025

(-25) (-41) (10) (25) (p>0 and Q¹0) (0,10)

9975 0025 93 75 si 93

0024 9375

(-25) (25) (-07) (-25) (p>0 and Q¹99) (-0.07)

89

9975 0041 89 75 si

0040 8975

(-25) (41) (-11) (-25) (p<0 and Q¹99) (-0,11)

Esempi di moltiplicazioni

(algoritmo)

Esempio 1: l'algoritmo manuale e le quantità C, Q, P

1

2 Esempio 2: algoritmo sull'architettura del moltiplicatore

3 Esempio 3: algoritmo in aritmetica binaria

4 Esempio 4: algoritmo di Booth

1 Esempio 1: l'algoritmo manuale e le quantità C, Q, P

L'esempio che segue mostra una moltiplicazione manuale ed i valori successivamente assunti da Q, P

e C così come definiti al § 8:

La suddivisione fra Q e P di Z è evidenziata con uno sfondo, che individua anche le cifre di Z (la parte Q) che

costituisce un addendo dell'addizionatore.

Fig.1 Esempio di moltiplicazione

2 Esempio 2: algoritmo sull'architettura del moltiplicatore

Per fissare le idee, l'algoritmo (8.5) è qui esemplificato per una unità aritmetica decimale e per gli

stessi dati dell'esempio 1. Si pongono in evidenza le configurazioni successive della coppia di registri

(Q,P) X= 3 2 3 5

Q P

Inzializzazione 0 0 0 0 0 1 5 3 5

C=3235´5 1 6 1 7 5

Z.Q=Z.Q+C 1 6 1 7 5 1 5 3 5

Shr(Z,0) 0 1 6 1 7 5 1 5 3

C=3235´3 0 9 7 0 5

Z.Q=Z.Q+C 1 1 3 2 2 5 1 5 3

Shr(Z,0) 0 1 1 3 2 2 5 1 5

C=3235´5 1 6 1 7 5

Z.Q=Z.Q+C 1 7 3 0 7 2 5 1 5

Shr(Z,0) 0 1 7 3 0 7 2 5 1

C=3235´1 0 3 2 3 5

Z.Q=Z.Q+C 0 4 9 6 5 7 2 5 1

Shr(Z,0) 0 4 9 6 5 7 2 5

3 Esempio 3: algoritmo in aritmetica binaria X= 0 0 1 1

Q P

Inzializzazione 0 0 0 0 0 1 0 1

Z =1 0 0 1 1

0

Z.Q=Z.Q+X 0 0 1 1 0 1 0 1

Shr(Z,0) 0 0 0 1 1 0 1 0

Z =0

0

Shr(Z,0) 0 0 0 0 1 1 0 1

Z =1 0 0 1 1

0

Z.Q=Z.Q+X 0 0 1 1 1 1 0 1

Shr(Z,0) 0 0 0 1 1 1 1 0

Z =0

0

Shr(Z,0) 0 0 0 0 1 1 1 1

4 Esempio : algoritmo di Booth

Si esemplifica l’algoritmo di cui alla tabella 2 dell’inserto sugli Algoritmi di Booth.

X= 0 0 0 1 0

Q P

Stato=O Z Z =11 0 0 0 0 0 0 0 0 1 0 1 1

1 0 1 0

-X, D2, CS 1 1 1 1 1 0 0 0 1 0 1 1

Stato=T Z =10 1 1 1 1 1 1 1 0 0 0 1 0

1 0 1 0

-X, D2 1 1 1 1 0 1 1 0 0 0 1 0

Stato=T Z =00 1 1 1 1 1 1 0 1 1 0 0 0

1 0 1 0

+X, D2, CS 0 0 0 0 0 1 0 1 1 0 0 0

Stato=T FINE 0 0 0 0 0 0 0 1 0 1 1 0

Esempi di divisioni

Divisore in modulo

1

1 Divisore in modulo

Il concetto di div-mod-M è esemplificato, per b=10 e n=4, dalla tabella che segue:

N D Y Q R

1 3800 152 25 0 3800=152´25

2 3900 152 25 100 3900=152´25+100

3 9999 2 4999 1 9999=2´4999+1

4 0039 152 0 39 39=152´0+39

4 4 4 4

5 152 0

3800´10 =152´25´10

25´10 3800´10

4 4

6 152 256578 144

3900´10 3900´10 =152´256578+144

4 4

7 3333 3333 1111 =3333´3333+1111

1111´10 1111´10

4 4

8 152 2565 120

0039´10 39´10 =152´2565+120

Sono riportati 8 esempi, numerati per il riferimento che ad essi verrà fatto in seguito. D è al massimo

di 8 cifre, coerentemente con le definizioni della macchina, ma di esse le prime o le seconde 4 sono

nulle, perché in pratica, come si vedrà, così sarà utilizzato il divisore in modulo.

I primi 4 righi rappresentano anche l'uso che si può fare del divisore per una aritmetica di interi, ove

è: e) Û

div-int-M (X,Y,Q, div-mod-M (X,Y,Q,R/Y)

Nella tabella che segue gli esempi sono riproposti, considerando il dividendo (X=D).il divisore (Y)

ed i risultati (Q, R) posti in altrettanti registri a 4 cifre, Si noti in particolare:

l'esempio 3, che produce un quoto con 4 cifre significative,

· l'esempio 4, che produce, come tutti i casi in cui sia X<Y, un quoto nullo.

· N X Y Q R

1 3800 0152 0025 0000

2 3900 0152 0025 0100

3 9999 0002 4999 0001

4 0039 0152 0000 0039

Seguono 4 esempi relativi ad un'aritmetica dei frazionari, ove è:

macchina Div-fraz-M (IN X,Y:resti-M;

OUT Q,R:resti-M; ovflo: bit)

{Ovflo= X³Y;

Div-mod.M (XM,Y,Q,R) }

Alcuni di questi sono in effetti uguali ai primi 4, fatta salva l’interpretazione dei risultati; si noti in

particolare:

· Gli esempi 5 e 6 (corrispondenti agli esempi 1 e 2), essendo X>Y, producono overflow; il

quoziente Q eventualmente generato non ha senso.

L'esempio 7 (che non trova corrispondenti fra i primi 4) produce un quoziente ed un resto.

·

· L'esempio 8 (corrispondente al 4) produce qui con la scalatura (D=XM) un quoziente

significativo, mentre la Q per gli interi era nulla (essendo lì X<Y)

[1] R

X Y

4 Q e=r'/M

N overflow

D=X´10 (r')

(x') (y') (q')

3800 0152 si 25 0000

5 3800 0000 0 .3800=.0152´25

(.3800) (.0152) (X>Y) (25) .3900=.0152´25.6578+

0152 si 256578

3900 144

39000000

6 -4

(.0152) (X>Y) (25,6578)

(.3900) +0,0144´10

.1111=.3333´.3333+

1111 3333 3333 1111

7 11110000 no -4

(.1111) (.3333) (.3333) (.1111) +.1111´10

.0039=.0152´.2565+

0039 0152 2565 0120

8 00390000 no -4

(.0039) (.0152) (,2565) (.0120) +.0120´10

[1] In caso di overflow, i valori ottenuti di Q e R dipendono dall'algoritmo usato per il loro calcolo.

Esempi di algoritmi di divisione

Algoritmo manuale

1

2 Divisore seriale

3 Algoritmo di divisione per eccessi

1 Algoritmo manuale

In fig. 1 è riportato l'algoritmo per una divisione intera, con b=10 e n=5. Si noti che:

(0) (0)

L’algoritmo si inizializza con D =R =0;

· i D P q Q R

7 3 0 9 2 0 0 0 8 2

: 1 7 7 0 0 7

- 6 5 6 - - 8 9 1 2 73 73 0 0 73

0 7 4 9 3 730 730 8 8 74

- 7 3 8 4 7309 749 9 89 11

0 1 1 2 5 73902 112 1 891 30

- 8 2

3 0

Fig. 1. Esempio di divisione manuale intera: 73092=82´891+30

al ciclo i-esimo (per i da 1 a 5) si calcola:

· il nuovo dividendo, “arricchendo” il resto con una nuova cifra:

o la cifra q di Q e Q stesso, ,

o il resto:

o

In fig. 2 è riportato l'algoritmo per una divisione di frazionari, con b=10, n=5 m=2n=10. Si noti che:

(0) (0)

L’algoritmo si inizializza con D =R =73092;

· : 8 2 0 0 0

7 3 0 9 2 0 0 0 0 0

6 5 6 0 0 0

- 8 9 1 3 6

7 4 9 0 0 0

7 3 8 0 0 0

- 1 1 2 0 0 0

8 2 0 0 0

- 0 3 0 0 0 0 0

2 4 6 0 0 0

- 5 4 0 0 0 0

4 9 2 0 0 0

- 4 8 0 0 0

I D P q Q R

1 730920 730920 8 8 74900

2 7309200 749000 9 89 11200

3 73092000 112000 1 891 30000

4 730920000 300000 3 8913 54000

5 7309200000 540000 6 89136 48000

Fig. 2 Esempio di divisione manuale frazionaria: 0,73092=0,89136 ´0.82000+0,0000048

il resto si arricchisce con nuove cifre sempre nulle,

· tutti i calcoli si effettuano come nel caso degli interi.

·

2 Divisore seriale

Nelle figure 3 e 4 sono mostrati i medesimi esempi delle figure 1 e 2, presentati come si sviluppano

in una architettura seriale (cfr. algoritmo (12.4).

C q

D.P D.Q Operazioni

I 0 0 0 0 0 0 7 3 0 9 2

Iniz. D.P=0; D-Q=X

0 0 0 0 0 7 3 0 9 2 0 0 0 0 0 0 0 0 shl,div-molt

1 0 0 0 0 0 7 3 0 9 2 0 sub,D.P=R, D0=q

0 0 0 0 7 3 0 9 2 0 0 0 0 0 0 0 0 0 shl,div-molt

2 0 0 0 0 7 3 0 9 2 0 0 sub,D.P=R, D0=q

0 0 0 7 3 0 9 2 0 0 0 0 0 0 6 5 6 8 shl,div-molt

3 0 0 0 0 7 4 9 2 0 0 8 sub,D.P=R, D0=q

0 0 0 7 4 9 2 0 0 8 0 0 0 0 7 3 8 9 shl,div-molt

4 0 0 0 0 1 1 2 0 0 8 9 sub,D.P=R, D0=q

0 0 0 1 1 2 0 0 8 9 0 0 0 0 0 8 2 1 shl,div-molt

5 0 0 0 0 3 0 0 0 8 9 1 sub,D.P=R, D0=q

Fig. 3 Esempio di divisione intera:per b=10, n=5

(73092=82´891+30)

Si noti che l'unica differenza è nelle inizializzazione.

C q

D.P D.Q Operazioni

I 0 7 3 0 9 2 0 0 0 0 0

Iniz. D.P=X; D-Q=0

7 3 0 9 2 0 0 0 0 0 0 6 5 6 0 0 0 8 shl,div-molt

1 0 7 4 9 2 0 0 0 0 0 8 sub,D.P=R, D0=q

7 4 9 2 0 0 0 0 0 8 0 7 3 8 0 0 0 9 shl,div-molt

2 0 1 1 2 0 0 0 0 0 8 9 sub,D.P=R, D0=q

1 1 2 0 0 0 0 0 8 9 0 0 8 2 0 0 0 1 shl,div-molt

3 0 3 0 0 0 0 0 0 8 9 1 sub,D.P=R, D0=q

3 0 0 0 0 0 0 8 9 1 0 2 4 6 0 0 0 3 shl,div-molt

4 0 5 4 0 0 0 0 8 9 1 3 sub,D.P=R, D0=q

5 4 0 0 0 0 8 9 1 3 0 4 9 2 0 0 0 6 shl,div-molt

5 0 4 8 0 0 0 8 9 1 3 6 sub,D.P=R, D0=q

Fig. 4 Esempio di divisione frazionaria:per b=10, n=5

(0,73092=0,82´0,89136+0,0000048)

3 Algoritmo di divisione per eccessi

Nelle figure 5 e 6 sono presentate le medesime divisioni dei paragrafi precedenti, sviluppate con

algoritmo di divisione per eccessi.

: 0 0 0 8 2

7 3 0 9 2

8 2

- 1 -9 -2 9 2

-7 5 0

3

+ 1 0 0 9 2

0 9 2 0 0

-7 4 7 -

7 3 8 0 0 8 9 2

- 9 0

0

- 9 0

+ 1 6 4

+ 7 4 0

9

+ +7 4 9

-7 3 8

+ 1 1 0

+ 2

+ 1 1 2

1 6 4

- -5 2 Fig. 5 Esempio di divisioni per eccessi:

73092=82´892-52

8 2 0 0 0

:

7 3 0 9 2 0 0 0 0 0

7 3 8 0 0 0

- 9 -1 2 -7 7

- 0 7 0 8 0 0

0 8 2 0 0 0

+ 9 0 2 0 7

0 1 0 7 0

+ 1 1 2 0 0 0 -

1 6 4 0 0 0

- 8 9 1 3 7

- 5 2 0 0 0 0

5 7 4 0 0 0

+ + 5 4 0 0 0 0

5 7 4 0 0 0

- - 3 4 0 0 0 Fig. 6 Esempio di divisioni per eccessi:

0,73092=0,89137´0.82000+0,0000034

Half adder

Dicesi semiaddizionatore (half adder) un addizionatore senza riporto entrante:

Û

half-add-mod-M (X,Y,S,R) add-mod-M (X,Y,0,S,R)

Se si pensa ad un addizionatore di cifra, un semiaddizionatore è quello che opera sulla cifra meno

significativa, se si pensa ad un addizionatore di numeri a più cifre, la macchina che esegue l'addizione è

essa stessa un semiaddizionatore (cfr. § 7).

È interessante notare la relazione che sussiste fra un addizionatore e un semiaddizionatore,

Applicando infatti la proprietà associativa dell'addizione si ha:

Un add-mod-M si può realizzare usando due semiaddizionatori in cascata per calcolare S e

ponendone in or le uscite dei riporti per calcolare la R.

macchina Add-mod-M (IN X,Y: resti-M; r:bit;

(OUT S: resti-M; R:bit)

S':resti-M; R',R":bit;

{half-add-mod-M (X,Y,S’,R’);

half-add-mod-M (S’,r,S,R”);

R=R’ or R”}

Si può infatti agevolmente dimostrare che:

La proprietà associativa dell’addizione si estende alla somma in modulo:

·

· Si ha X+Y+r³M se è X+Y³M oppure è S’+r³M (la seconda condizione coglie il caso di X+Y=M-1,

r=1):

La relazione di cui sopra viene talora adoperata nei full-adder binari, che possono appunto essere

realizzati attraverso due half-adder binari.

Addizionatori decimali

Come si è accennato al § 3.2, un addizionatore decimale può essere realizzato autonomamente

oppure attraverso un addizionatore mod-16. In questo inserto si approfondisce questa seconda tecnica.

La realizzazione pratica dell'addizionatore ed il modo come si specializza lo schema di principio di fig.

2.1 dipendono dal codice adottato per rappresentare le cifre decimali. In particolare, considereremo due

distinti codici: l'8-4-2-1 e lo eccesso-3.

1 Addizionatore 8-4-2-1

Se il codice delle cifre è lo 8–4-2-1, le rappresentazioni delle cifre coincidono con i numeri binari

associati; lo schema di fig. 2.1 opera dunque su X, Y, S’, S (oltre che su R, R’) che sono le

rappresentazioni di x, y, s’, s, coincidenti con i primi (ciò non accade per altri codici). Si può dunque

operare con un normale add-mod-16 senza ulteriori accorgimenti. , S’ , S’ , S’ che

La condizione (2.1), , espressa in funzione dei bit S’ 1 2 4 8

compongono S’, diventa (in notazione booleana): (1)

come si può facilmente evincere considerando i codici delle cifre esadecimali corrispondenti ai numeri

10 ,11 ,…15. La (2.2) diventa banalmente (2)

Per realizzare gen-q, occorre ricordare che se R=0, si deve produrre un addendo 0 (in bit 0000), se

R=1 si deve produrre l’addendo k=6 (in bit 0110): è allora sufficiente che i bit degli addendi siano

nell’ordine 0RR0, donde la rete logica di fig. 1. L’half adder di correzione si semplifica poi nello

schema illustrato in figura: Figura 1. Addizionatore 8-4-2-1 con un adder-mod-16

l’ultimo bit di S’ diventa l’ultimo di S (il bit da aggiungervi è comunque 0);

·

· l’adder meno significativo ha come addendi S e R: è dunque un half-adder (H);

2

l’adder di peso 4 è l’unico full adder, con addendi il riporto, S’ e R;

· 4

l’adder di peso 8 deve generare la sola somma S di S’ e il riporto: è dunque semplicemente un or

· 8 8

esclusivo.

2 Addizionatore eccesso-3

Se X, Y, S sono i numeri associati ai codici delle cifre x, y, s, si ha:

L’addizionatore mod-16 opera su X, Y, Z, rappresentazioni di x, y, z, calcolando

ed occorre esprimere in funzione di R’, S’ il riporto R:

e la somma S, rappresentazione in eccesso-3 di s:

Dunque si ha (3)

invece della (1). Per quanto attiene alla somma, essendo gli addendi X, Y in eccesso-3, la somma S

risulta in eccesso-6 e va ricondotta ad eccesso-3 sottraendovi 3; la (2.2) allora diventa:

Considerando peraltro che , si ha infine:

(4)

Rispetto alla fig. 1, l’addizionatore, allora, così si modifica:

· Il blocco R si riduce semplicemente a R=R’

Gen-q deve generare 13 (1101 in binario) per R=0. 3 (0011) per R=1 e quindi la stringa di bit

·

· L’addizionatore di correzione si realizza come segue:

per il bit di peso 1 si ha (S’ +1 equivale a );

o 1

il bit di peso 2 si ha dalla somma di S’ ,R e S’ , che è il riporto dell’addizionatore di peso 1

o 2 1

+1);

(S’ 1

il bit di peso 4 si ottiene da un full-adder di S’ , ed il riporto;

o 4

il bit di peso 8 si ottiene da un full-adder di S’ , ed il riporto.

o 8

Anticipatore a più livelli

In un carry look-ahead semplice, come quello di fig. 4.1, ciascun blocco anticipatore propaga il

riporto entrante r se in esso sussiste la condizione di propagazione

k (1)

(ad esempio, , , etc.

Viceversa, il blocco genera riporto con la condizione: (2)

(ad esempio )

Se i blocchi anticipatori generano le (1), (2) – come avviene per i look-ahead commerciali – allora è

possibile realizzare un altro livello di anticipatori (4 nello schema in esame) che funge da anticipatore

per la propagazione dei riporti nel primo livello di anticipatori.

Fig. 1 Anticipatore a più livelli

In figura 1 è mostrato lo schema di un anticipatore a 2 livelli, limitatamente ai primi 16 bit

dell’adder. Si hanno dunque, per un adder a 64 bit, 16 blocchi da 4 bit al primo livello e 4 blocchi al

secondo.

È anche possibile aggiungere un terzo livello, composto nel caso specifico da un solo blocco, che

anticipa il riporto nel secondo livello di anticipatori.

Adder con controllo asincrono

Nel § 4.1 si è osservato come il tempo di risposta di un adder è variabile e quindi, qualora si

costruisca un segnale in grado di indicare la fine del fenomeno di propagazione, si può costruire un

adder a controllo asincrono che ottimizza i tempi di risposta. Ebbene, tale segnale si può costruire come

segue.

Si consideri per ogni stadio un segnale di “non-riporto entrante” n ed uno di “non-riporto uscente”

i

. Per essi si ha, in analogia ai riporti:

N i

e si costruisca fisicamente per ogni stadio il circuito di cui sopra e la corrispondente catena di

il tempo di partenza dell’addizione (quando si

propagazione, simile a quella dei riporti. Inoltre, detto t 0

riporto e non-riporto entranti complessivi (c,n)

applicano all’adder gli addendi), si pongano per t<t 0

(p.es. r=0, n=1). Si ha allora:

entrambi nulli, salvo a porli al loro valore per t= t 0

: segnale di fine propagazione nello stadio i-esimo

: segnale di fine propagazione in tutto l’adder di n bit

=1 oppure Z =1, al tempo t +e si ha R = 1 oppure N =1 e quindi

Infatti, per tutti gli stadi ove sia G i i 0 i i

=1, mentre laddove sia P =1, resta F =0 finché non si verifichi r =1 oppure n =1, cioè al tempo t +ke

F i i i i i 0

è dunque il segnale di fine propagazione nello stadio i-esimo

se la catena di propagazione è lunga k. F i

ed F (= la propagazione è finita in tutti gli stadi) indica la fine dell’addizione.

Relazione fra sottrattori e addizionatori completi

(estensione di quella fra i semi-)

Le relazioni fra semisottrattore e semiaddizionatore (cfr.5.1, 5.2) si estendono ai sottrattori

completi, purché si complementi il riporto entrante all’atto dell’inversione di X con Y oppure nel

passaggio da sottrattori ad addizionatori; si devono allora considerare i complementi a M-1 (cioè i

il complemento diminuito di X e si ha:

complementi diminuiti). piuttosto che ad M. Diremo allora X d

sub-mod-M(X,Y,p,D,P)Ûsub-mod-M(Y,X,p ,D ,P )

c d c

,p ,D,P )

sub-mod-M(X,Y,p,D,P)Ûadd-mod-M(X,Y d c c

L’uscita del secondo semisottrattore è infatti

e quella dell’addizionatore: Addizionatori in complementi diminuiti

(analisi della rete sequenziale)

Lo schema di fig. 6.2 è quello di una rete sequenziale fondamentale (asincrona) con il riporto

fine-inizio corrispondente ad una variabile di stato e la rete stessa caratterizzata da 2 stati: r=R=0,

r=R=1. Per studiare tale rete (e valutare se, essendo caratterizzata da una tabella degli stati asincrona, è

stabile e funziona), consideriamo che gli ingressi si possono suddividere in 3 classi:

n

S>b -1

a) n

b) S=b -1

n

S<b -1

c)

i cui elementi, ai fini del comportamento dinamico della rete, sono equivalenti. Li analizziamo

separatamente (cfr. figura):

Figura Diagramma di stato dell'addizionatore in complementi diminuiti

n -1 e dunque conduce la rete nello stato 1 indipendentemente

per ingressi della classe a) la somma eccede b

dallo stato di partenza;

analogamente per ingressi della classe c) la somma non dà comunque riporto (se anche partisse dallo stato 1,

n

nel transitorio sarebbe comunque S<b ed il riporto diventerebbe 0);

particolare è il comportamento nel caso b), ove S è la rappresentazione dello ’0 negativo" (tutti bit 1 nel caso

binario):

se la rete è nello stato 0, è e il riporto resta 0

se la rete è nello stato 1, è e il riporto resta 1.

La rete, dunque, ha un diagramma di stato (equivalente alla tabella di stato) asincrono e funziona

correttamente. Vi è solo da notare che, in caso di risultato 0, ne fornisce la rappresentazione positiva o

negativa a seconda dello stato di partenza e quindi dell’addizione effettuata precedentemente.

Addizionatori per eccessi

(esponenti della virgola mobile)

La rappresentazione per eccessi è quella tipica degli esponenti nella virgola mobile:un numero x è

rappresentato da:

X=x+bias

È allora evidente che la rappresentazione S della somma s=x+y che deriva da un addizionatore sarà

× bias e va corretta sottraendovi bias.

s+2 n -1 (come nello standard IEEE 754) si ha che la rappresentazione

Nel caso binario su n bit e bias=2

S della somma è:

e dunque la somma modulo-M va corretta aggiungendovi un bit 1 in coda ed uno in testa; il primo si

ottiene facilmente ponendo ad 1 il riporto entrante, il secondo invertendo il bit più significativo.

Moltiplicazione per complementi

2

(in modulo M )

Moltiplicazione per complement

2

(in modulo M ) 2 è di

Se i fattori di una moltiplicazione sono di n cifre (n bit per l'aritmetica binaria), il modulo M

2n cifre e si ottiene facilmente estendendo la rappresentazione con l'inserimento in testa di n cifre nulle

se il numero è positivo, uguali a b-1 se è negativo; per b=2 basta estendere il bit-segno sui primi n bit.

Il prodotto dei fattori estesi è costituito da due parti, entrambe di 2n cifre: una più significativa Q’,

2

che si può trascurare ed una meno significativa P' che è il resto mod-M del prodotto e che, ritornando

ai resti mod-M si può a sua volta porre nella forma:

P’=P+QM

suddividendo ancora questo risultato in due parti di n cifre ciascuna.

Per l’aritmetica dei frazionari, essendo P’ il prodotto esteso, Q è la parte più significativa del

risultato modulo-M e P è l'approssimazione, così come già avveniva per l'aritmetica dei frazionari non

in complementi.

Analogamente per l’aritmetica degli interi, P è il risultato mod-M, mentre dall'analisi di Q si può

2 del prodotto e, affinché P ne sia il resto

dedurre l'eventuale overflow. Infatti, P' è il resto mod-M

mod-M è necessario che P' sia una pura estensione di P: dovrà dunque essere Q=0 per risultati positivi,

Q=M-1 per risultati negativi (tutti 0 e tutti 1 per il binario). Si ha dunque:

ovflo=(P<M/2) and (Q¹0) or (P³M/2) and (Q¹M-1)

che per l'aritmetica binaria diventa: n

=0) and (Q¹0) or (P =1) and (Q¹2 -1)

ovflo=(P n-1 n-1

Per fissare le idee, si veda ancora Esempi di moltiplicazioni.

Algoritmi di Booth

(Moltiplicatori binari seriali veloci)

In una moltiplicazione Z=XY si può porre: (1)

trasformando dunque una stringa di “1” in una stringa, detta trasformata, di “0” preceduta da un “1” e

chiusa da un “-1”; diremo stringa trasformata primaria la stringa così ottenuta, in quanto essa

potrebbe ancora essere trasformata. Ad esempio, si ha:

Stringa originaria 0 1 0 1 0 0 1 1 1 1 0 0 1 0 0 1

Stringa trasformata primaria 0 1 0 1 0 1 0 0 0 -1 0 0 1 0 0 1

L’applicazione ricorrente della (1) può condurre a successive trasformazioni, che diremo secondarie, come ad

esempio: Stringa originaria 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 1

Stringa trasformata primaria 1 0 0 1 1 1 0 0 0 -1 0 0 1 0 0 1

Stringa trasformata secondaria 1 0 1 0 0 -1 0 0 0 -1 0 0 1 0 0 1

Se consideriamo il moltiplicatore Y così trasformato (e quindi costituito di cifre 0, 1 e “-1”) il

diventa 0, X o -X e, disponendo di un sottrattore in alternativa all’addizionatore, la

prodotto C=XY i

macchina potrà effettuare soltanto una addizione ed una sottrazione in corrispondenza di una stringa di

1. L’algoritmo così ottenuto (detto di Booth) corrisponde ad un nuovo controllo della macchina. Esso

non trasforma fisicamente la stringa ma opera, come una macchina sequenziale, in due stati distinti

(diremo nel seguito s.t. una stringa trasformata):

stato originario (O): la stringa è quella originaria;

· stato trasformato (T): la stringa va considerata come trasformata

·

e, con riferimento alla fig. 9.1, in ogni ciclo analizza gli ultimi due bit di Y ed effettua le operazioni di tabella 1. In

particolare, questo algoritmo effettua ancora, come quello fondamentale, shift di una sola posizione e quindi:

Legenda

Ultimi Stato stato D1: shift right 1 posizione

bit di Y O T +X: addiziona X

00 D1 +X, D1,CS -X: sottrai X

01 +X, D1 D1 CS: cambia stato

10 D1 -X, D1

11 -X, D1, CS D1

Tabella 1 Algoritmo di Booth

· in stato O, in funzione dell'ultimo bit:

se è 0, si effettua solo lo shift;

o se è 1, inoltre si effettua, a seconda del penultimo bit:

o § se è 0, la somma +X (come nell'algoritmo fondamentale):

se è 1, -X e si entra in una s.t. (CS)

§

· in stato T, dualmente, in funzione dell'ultimo bit:

se è 1, si effettua solo lo shift (si resta nella s.t., ove l'1 è trattato come lo 0 della stringa

o originaria);

se è 0 si effettua, a seconda del penultimo bit:

o § se anche lui è 0, la somma +X (la s.t. è finita, si ritorna allo stato originario):

§ se è 1, -X e si resta in stato T (l'1 che chiude la s.t. primaria, con l'altro 1 genera

una s.t. secondaria).

Un esempio in Esempio di algoritmo di moltiplicazione-esempio 4).

Sulla base delle osservazioni di cui sopra, è possibile costruire una classe di algoritmi, detti di

moltiplicazione per stringhe, che arricchiscono la disponibilità di operazioni elementari e migliorano

ancora i tempi di effettuazione della moltiplicazione. Nel seguito sono mostrati due esempi.

Il primo (tabella 2) effettua lo shift fisso di 2 posizioni, introducendo l’operazione +2X. Si notino le

particolarità dello stato T: Legenda

Ultimi Stato stato D2: shift right 2 posizione

bit di Y O T +X: addiziona X

00 D2 +X, D2, CS +2X addiziona 2X

01 +X, D2 -2X, D2 -X: sottrai X

10 +2X, D2 -X, D2 CS: cambia stato

11 -X, D2, CS D2

Tabella 2 Moltiplicazione per stringhe con scorrimento fisso di 2 bit

input 10: la s.t. finisce sul bit di destra, ma se ne apre una secondaria, la stringa diventa (0,-1);

· input 01: la s.t. finisce sul bit di sinistra, la coppia diventa (1,0) e non si sa se se ne aprirà

o [1]

una secondaria; l'algoritmo ipotizza che ciò avvenga e trasforma la coppia in (–1,0) .

Il secondo (tabella 3) effettua uno shift variabile di 1, 2 o 3 posizioni in funzione della lunghezza

della stringa di “1” o di “0”, ma non prevede operazioni come 2X, -2X, 4X o –4X.

Legenda

Ultimi Stato Stato D1: shift right 1 posizione

bit di Y O T D2: shift right 2 posizioni

000 D3 +X, D3, CS D3: shift right 3 posizioni

001 +X, D3 D1 +X: addiziona X

010 D1 -X, D2 -X:; sottrai X

011 -X, D2, CS D2 CS: cambia stato

100 D2 +X, D2, CS

101 +X, D2 D1

110 D1 -X, D3

111 -X, D3, CS D3

Tabella 3 Moltiplicazione per stringhe con scorrimento variabile

Si noti che in ogni caso le tabelle sono “emiduali”, nel senso che la colonna “T” ha in ogni rigo le

operazioni dei bit duali della “O”, invertendo i segni + e -.

[1]

Se invece la s.t. non ne generasse una secondaria, poco male, perché l'algoritmo avrebbe trasformato il singolo bit di chiusura

(0010) in due bit (01-10) trattandolo come una stringa; il risultato sarebbe corretto, anche se ottenuto con un'operazione in più.

Se poi la stringa originaria fosse (0101), l'algoritmo la trasformerebbe in (-10-10) trattando in modo ottimale il primo bit di

destra e riproponendo iterativamente il procedimento per il secondo,

Moltiplicatori decimali

Moltiplicazione per selezione di multipli

1

2 Moltiplicazione per addizioni ripetute

3 Moltiplicazione binaria

4 Moltiplicazione per raddoppi e dimezzamenti

Il principale problema del moltiplicatore decimale è la realizzazione del “moltiplicatore di cifra”. Si

accenna ad alcune soluzioni realizzate nel passato o in alcune macchine specializzate anche moderne.

1 Moltiplicazione per selezione di multipli

All’inizio dell’algoritmo vengono generai e memorizzati i 10 multipli di X (per Y da 0 a 9); il

i

moltiplicatore di cifra opera quindi una selezione fra questi.

2 Moltiplicazione per addizioni ripetute

Per ciascuna cifra, viene effettuata Y volte l’addizione Q=Q+X.

i

3 Moltiplicazione binaria

Il moltiplicatore Y viene trasformato in binario, in modo che da adoperare un moltiplicatore di cifra

binario, mentre addizione e shift restano decimali. Occorre però in tal caso riorganizzare i registri ed

effettuare le correzioni classiche dell’addizionatore decimale (cfr. § 3.2).

4 Moltiplicazione per raddoppi e dimezzamenti

Operando su numeri interi, dalla relazione

si ottiene l’algoritmo:

Z=0;

While (Y³1)

{if (dispari(Y))Z=Z+X

Y=[Y/2]; X=2*X

}

Si ha ad esempio: X Y Z

12 11 12

24 5 12+24=36

48 2 24resta 36

96 1 36+96=1320

Si noti che ilIl raddoppio e il dimezzamento si ottengono facilmente con algoritmi appositi.

Divisore meccanico

metodo decimale del restoring

Classica è la macchina calcolatrice in uso fino agli anni ’50, prima manuale e poi elettrica. Di essa si

riferisce l’essenziale.

Due banchi di rotelline coassiali ponevano in evidenza in un apposito “registro”(si pensi agli attuali

contatori del gas) le cifre decimali costituenti un numero ed erano i registri di ingresso, A e B, di un

addizionatore/sottrattore; le rotelline di A erano collegate ad una manovella ed un apposito sistema di

ingranaggi faceva sì che con un giro di questa in una direzione si effettuava l’operazione A=A+B, con

un giro in senso opposto A=A-B. Gli algoritmi di moltiplicazione e divisione avvenivano manualmente

(in seguito elettricamente), effettuando la sequenza necessaria di addizioni, sottrazioni e scorrimento

(mediante appositi tasti il sistema di rotelline si spostava assialmente di una posizione a destra o a

sinistra). Per la divisione, si effettuavano manualmente le sottrazioni fino a che in A non appariva un

numero negativo (l’attenzione dell’operatore era anche richiamata dallo squillo di un campanello); si

effettuava allora il restoring con un giro di addizione, mentre un apposito contatore del numero di giri

della manovella determinava la cifra del quoziente.

Metodo del non-restoring binario

Estensione ai numeri relativi

Si ripropone qui la (13.6):.

if (segno(P)=1) R=P-Y else R=P+Y;

P=R; [1]

=1

if (R³0)D 0

e si ricorda che esso pone q Î{0, 1}e che, al termine, è necessaria una correzione se è R<0.

L’algoritmo può essere esteso al caso dei numeri relativi, ma allora la casistica delle correzioni

aumenta ed il tutto diventa più complesso (vedi in seguito). Nel caso dei numeri relativi conviene porre

q Î{-1, 1} invece di q Î{0, 1}, così come accade in generale per il metodo degli eccessi. Avendosi allora

per definizione:

P=qY+R con |R|<|Y| (la questione del segno di R è trattata dopo)

si ha anche:

®

· q=1 D=Y+R; R=D-Y

®

· q=-1 D=-Y+R; R=D+Y [2] e quindi:

All'inizio dell'algoritmo è |P|£2|Y|

®

· segno(P)=segno(Y) |P-Y|£|Y| (mentre in genere |P+Y|>|Y|): deve dunque essere q=1 e R=P-Y;

®

segno(P)¹segno(Y) |P+Y|£|Y| (mentre in genere |P-Y|>|Y|): deve dunque essere q=-1 e R=P+Y.

· Si ha dunque in ogni caso |R|£|Y|. Il nuovo dividendo parziale |P|£2|R|+1 rispecchia ancora la

condizione |P|£2|Y| e si può dunque procedere iterativamente.

Sul piano operativo, in Q si possono lasciare a 0 i bit per i quali la cifra dovrebbe essere –1 e si ha

l’algoritmo:

if(segno(P)=segno(Y)){R=P-Y; D =1} else R=P+Y;

0

P=R;

che calcola una sequenza di bit dipendente ciascuno non più dal segno del resto ma dal confronto dei

segni di P ed Y. Al termine dell'algoritmo sono richieste alcune correzioni :

· se il resto assume i valori R=±Y, il resto va azzerato (R=R±Y) e il quoziente corretto di una unità

(Q=Q±1);

· se il resto è non nullo e discorde dal dividendo, va reso concorde, aggiungendovi (o sottraendovi)

Y e variando Q di una unità.

Il quadro completo delle correzioni diventa allora il seguente:

correzioni

D Y R DQ DR

+ + + no no

+ + - no +Y

+ - + +1 no

+ - - +1 -Y

R qualsiasi +1 no

- + - R=-Y no +Y

R qualsiasi +1 -Y

- + + R=0 no no

R qualsiasi no no

- - - R=Y no no

R qualsiasi no +Y

- - + R=0 +1 no

Infine, il quoziente va ricostruito secondo la (13.5), come in generale per il metodo degli eccessi.

Quest'ultima correzione è semplificata per b=2. Infatti si ha in tal caso Q'=Q (sono rimaste a 0 le cifre

n -Q-1, Si ha allora;

negative) e Q” è il complemento bit a bit di Q, cioè il complemento diminuito, Q”=2

n

Q = 2Q+1-2 n la quantità che trabocca a sinistra di Q, Si può

che si ottiene con l’operazione shl (Q,1) essendo 2

quindi semplicemente effettuare un ulteriore scorrimento a sinistra di Q ed aggiungervi 1 a destra.

[1] Si ricorda che dopo lo shift è D =0.

0

[2] Poiché all'inizio P è formato dalla sola prima cifra "abbassata" è addirittura |P|£1 per divisione fra interi. Per i frazionari è

per evitare overflow 2|D|<|Y| ed il primo dividendo P, che si ottiene abbassando un bit è |P|£2|D|+1; si ha dunque |P|<|Y|+1,

donde |P|£2|Y.|

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Capitolo decimo

Il processore: una vista più matura

Premessa

1 Osservazioni sulla architettura del processore

2 Il trasferimento fra registri

3 Trasferimenti che coinvolgono ALU e banco di registri

4 Preparazione dell'operando e modi di indirizzamento

5 I segnali di controllo

6 Controllo cablato

7 Controllo microprogrammato

8 Modello a bus multipli

Premessa

Gli argomenti sviluppati nel cap. 4, introduttivi all'architettura della CPU, hanno come obiettivo la

comprensione di massima dei meccanismi interni del processore e sono didatticamente semplificati

evitando ogni riferimento a concetti che si ritengono non noti all'atto del loro studio da parte dello

studente (come ad esempio quelli delle reti logiche) o a problemi di ottimizzazione dei tempi di

funzionamento delle apparecchiature. Gli stessi concetti ora vengono ripresi e sviluppati in una ottica

più matura.

1 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

1 Osservazioni sulla architettura del processore

Riprendendo ed approfondendo la figura IV-11.1 (bus interno della CPU), si anticipano in primo

[1] :

luogo le seguenti osservazioni

Per accelerare la velocità del processore si tende a minimizzare il numero di registri: il loro caricamento, infatti,

· richiede un tempo ad hoc e si evita tale operazione quando essa non serva per memorizzare un dato che

altrimenti andrebbe perduto. In tale spirito si rileva che possono essere eliminati:

o il registro RA, in quanto il decodificatore di fig.11.2 può far capo direttamente alla parte del

registro D che contiene l'indirizzo del registro-operando.

o il secondo registro di ingresso all'ALU (O2), in quanto, differentemente da quanto accade per il

primo operando (in O1), quando l'ALU deve operare, il secondo è sul bus.

· I registri MB, MA sono quelli per il collegamento alla memoria; da essi quindi partono i bus "dati" e

"indirizzi" di cui al § IV.11.

· Ai registri RI, RU sono collegati i bus di I/O; essi sono quelli di un particolare modello di CPU, con I/O isolato

(altrimenti i bus di I/O coincidono con quelli di memoria).

· L'ALU deve essere vista completata dai segnali che selezionano l'operazione da compiere

· Lo studio delle reti logiche insegna che per caricare un registro esistono due tecniche diverse, a seconda che

il registro sia di tipo latch o edge-triggered e che nel secondo caso, se il caricamento avviene attraverso un

bus, si richiede prima il posizionamento del bus (segnale into bus) e poi il caricamento del registro (from

bus). La notazione usata negli esempi del cap.4 pone in evidenza i due tempi (p.es. BUS=PC e poi

MA=BUS per effettuare il trasferimento MA=PC) e quindi fa riferimento ad una soluzione edge triggered.

La soluzione latch (flip-flop RS in arrivo, segnale di selezione a livelli) opera invece in un sol tempo,

avendo selezionato i registri di partenza e di arrivo. Negli esempi del cap. 4 le due microperazioni associate

sono poste sul medesimo rigo proprio per indicare che esse possono essere realizzate anche con un'unica

microoperazione, qualora si adotti la tecnologia latch.

· Nel caso di adozione del modello asincrono di tempificazione del colloquio CPU-memoria (invio da parte

[2]

della memoria di un ack - detto anche FM - in risposta ad una sollecitazione della CPU) , la CPU deve

attendere il segnale FM (Fine Memoria) per proseguire le operazioni. Nelle microoperazioni che

coinvolgono la memoria (p.es. all'inizio della fase fetch) occorrerebbe aggiungere che il processore attende

il segnale FM.

2 Il trasferimento fra registri

Operazione fondamentale per la realizzazione della unità di controllo è il trasferimento fra registri.

Ne approfondiamo ora alcuni aspetti ed in particolare quello della tempificazione.

Tutti i trasferimenti dello schema di fig.IV-11.1 partono da dati memorizzati in uno o più registri,

attraversano il bus ed eventualmente alcune reti combinatorie (p.es. l'ALU oppure il decodificatore del

banco di registri) e memorizzano il risultato in un altro registro. I registri sono realizzati con flip-flop

ed occorre dunque esaminare come questi sono collegati al bus.

Fig. 2.1 Collegamento a un bus di un flip-flop

Si ricorda che il collegamento di un flip-flop su un bus avviene secondo lo schema di fig.2.1: il

2 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

flip-flop F (di tipo D) è scritto (a seconda dei casi in modo latch o edge triggered) se F è attivo mentre

in .

si pone sul bus – e quindi viene letto – attraverso una porta tristate abilitata da un segnale F out

Analogamente accade per il registro di n bit, realizzato attraverso n flip-flop in parallelo. Diremo

, R i segnali che rispettivamente scrivono o leggono il registro R.

dunque nel seguito R in out

In fig. 2.2a è quindi esemplificato il collegamento su un bus di un registro, S, che funge da sorgente

per un trasferimento verso D (ovviamente, in un'altra microoperazione S potrebbe essere destinazione e

D sorgente); in fig 2.2b è invece mostrato lo schema che in genere si usa a livello architettura, laddove

non si vuole entrare nei dettagli del livello porta.

A livello di architettura, vanno comunque tenuti in conto i tempi necessari per il trasferimento da S a

D. Nel caso di un trasferimento senza interposizione di reti combinatorie i tempi sono:

Fig. 2.2 Collegamento di registri a bus (a) e simbologia (b)

a) tempo di ritardo nella and-three-state verso il bus;

b) tempo di trasmissione sul bus

tempo di caricamento del registro-destinazione D

c) Solo al termine del tempo b) il dato è disponibile all'ingresso di D ed inizia la memorizzazione. Se

pertanto la tempificazione è di tipo edge triggered, solo allora può venire il fronte attivo di D che

in

può rendersi attivo

effettua la memorizzazione in D; se viceversa il trasferimento è di tipo latch, D in

.

insieme a S out

3 Trasferimenti che coinvolgono ALU e banco di registri

Oltre ai trasferimenti semplici attraverso un bus (come ad esempio MA:=PC), il processore deve

gestire trasferimenti che implicano anche una elaborazione o per selezionare un registro oppure per

l'effettuazione di una semplice operazione logico-aritmetica.

L'architettura per la selezione dei registri richiede un decoder per la selezione mentre i registri (in

numero limitato) possono accedere direttamente al bus. In fig. 3.1 ne è mostrato un modello basato

sull'ipotesi che nel registro D, ove è contenuta l'istruzione, esistono due campi, D.d e D.s, che

indirizzano rispettivamente un registro destinazione ed uno sorgente.

Due segnali di controllo, d ed s, selezionano il campo destinazione o sorgente, il decoder seleziona il

registro ed i segnali REG , e REG abilitano il registro selezionato al caricamento dal bus o a porre il

in out

proprio contenuto sul bus. Se ad esempio l'operazione richiede di porre in output sul bus il contenuto di

un registro-sorgente, sarà attivo il segnale s che attraverso il multiplexer seleziona l'indirizzo D.s;

seleziona il registro generale che così pone

l'uscita del decoder, quindi, in concomitanza con REG out

sul bus; da qui poi questo sarà trasferito altrove oppure sarà operato con altro dato e quindi trasferito.

Se viceversa il dato sul bus deve essere trasferito in un registro-destinazione, d, il multiplexer e il

ne abilita il caricamento dal bus.

decoder lo selezionano, REG in

3 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Fig. 3.1 Collegamento al bus del banco di registri

Il modello presentato prevede un unico decoder e quindi una operazione che richiedesse il

trasferimento da un registro-sorgente ad un registro-destinazione dovrebbe avvenire in due tempi.

Ovviamente. è anche possibile duplicare lo schema, un decoder per la sorgente ed uno per la

destinazione.

Per l'effettuazione di operazioni aritmetiche o logiche elementari (addizioni, sottrazioni, incremento

di una unità, and, or, etc.) nelle diverse fasi del suo algoritmo, il processore usa direttamente l'ALU,

che è collegato al bus ed ai suoi registri come mostrato in fig, 3.2. Gli operandi di ingresso sono

contenuti l'uno nel registro apposito O1 e l'altro sul bus, sostenuto da uno dei registri che vi sono

collegati in input (nella figura sono posti in evidenza il PC per l'operazione PC+1 ed MB per un

operando proveniente dalla memoria); l'uscita dell'ALU va in U (U ), che può poi essere immesso sul

out

).

bus (U in Fig.3.2 Collegamento al bus dell'ALU

Se un trasferimento attraverso un bus include operazioni di elaborazione come quelle di fig. 3.1 e

3.2, il tempo del trasferimento ovviamente si allunga, allungandosi il tempo necessario per porre il dato

sul bus (voce a del § 2) oppure per caricare il registro-destinazione (voce c). Si vedano i due esempi:

Una operazione di selezione di un registro generale BUS:=R(D.s): elaborazione del dato da porre

· sul bus, si allunga il tempo a):

· Una operazione di addizione U:= O1+MB: elaborazione del dato da porre in registro D, si allunga

il tempo c);

La scelta realizzativa che ottimizza i tempi di funzionamento del processore è che ogni trasferimento

avvenga in un solo ciclo di clock e quindi il periodo di clock deve essere dimensionato al tempo di cui

sopra. A seconda poi della tecnica di trasferimento, latch o edge-triggered, i segnali di abilitazione al

trasferimento sono attivi durante tutto il ciclo oppure quello "from bus" segue l'altro dopo il ritardo

necessario.

4 Preparazione dell'operando e modi di indirizzamento

La fase di preparazione degli operandi comporta da un lato la necessità di individuare il modo di

4 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

indirizzamento e dall'altro quella di effettuare eventuali accessi in memoria ed eventuali addizioni fra

indirizzi, offset o contenuti di registri-.indice. è in

L'individuazione del modo di indirizzamento (cfr. in cap. V esempi di modi di indirizzamento)

qualche caso affidata al codice operativo (p.e. ADDI -Add con immediato- è spesso un codice diverso

da ADD), in qualche altro è individuata in un campo apposito della istruzione (p.e.,ciò accade per

l'8086) in qualche altro ancora ogni operando dell'istruzione possiede un campo "modo" associato (p.e.

è quanto accade per il 68000).

In ogni caso, appositi segnali provenienti dalla decodifica dell'istruzione identificano il modo di

indirizzamento che sarà poi usato dal processore per effettuare la preparazione degli operandi. Ad

esempio, per un processore tipo 68000 uno schema analogo a quello di fig.3.1 può generare i segnali

M0, M1,… utili a tale scopo (cfr. fig. 4.1).

Fig. 4.1 Decodifica del modo di indirizzamento.

Una volta che il modo di indirizzamento sia stato individuato, gli accessi in memoria e le addizioni

richieste sono effettuati usando i medesimi circuiti ed apparati che si usano nelle fasi fetch ed execute

(MA, BUS, ALU, etc.).

5 I segnali di controllo

Facendo seguito a quanto esposto ai paragrafi precedenti, la rete di controllo della CPU deve

generare i segnali di controllo che abilitano le microoperazioni necessarie ed in particolare:

segnali di abilitazione di reti combinatorie (es. ADD, d, s);

a) segnali che abilitano l'uscita – in genere sul bus – di un registro (p.es. MB );

b) out

segnali di caricamento di registri (come ad esempio U ).

c) in

I segnali della classe c devono essere generati in ritardo se di tipo edge-triggered, simultaneamente

agli altri se di tipo latch. Se l'istruzione richiede più operazioni di trasferimento da eseguire in

sequenza, l'esecuzione può essere organizzata in una sequenza di passi, in ciascuno dei quali vengono

eseguite operazioni fra loro indipendenti, che possono essere eseguite in parallelo. Nell'allegato sono

esemplificate alcune sequenze di segnali di controllo.

Attività dell'unità di controllo del processore è quella di generare tali sequenze di segnali

relativamente all'algoritmo del processore e all'esecuzione di tutti i codici operativi.

Controllo cablato

6 Per realizzare un sistema che generi la sequenza di segnali di controllo, si può usare la tecnica di

unità di controllo cablata: apposite reti combinatorie e sequenziali generano tali sequenze. Un modello

di tale unità di controllo è schematizzato in fig. 6.1:

Fig. 6.1 Schema di unità di controllo cablata

5 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

· supposto che il codice operativo dell'istruzione sia contenuto in D.op, questa parte del registro D è

, I , …I ,è quello in

attestata ad un decodificatore del codice, che individua quale dei codici I 0 1 k-1

esame;

un "contatore di passi" individua il passo P , P , …P della sequenza di passi;

· 0 1 n-1

supposto che le indicazioni del modo di indirizzamento siano contenute in un campo D.modo,

· questa parte del registro D è attestata ad una rete combinatoria (eventualmente un altro decoder)

che individua appositi segnali (ad esempio, M , M , …) che caratterizzano il modo di

0 1

indirizzamento.

una apposita rete combinatoria genera i segnali di controllo, funzioni booleane della istruzione,

dei passi e dei segnali che condizionano l'evoluzione della istruzione, quali i segnali di modo di

cui sopra e quelli provenienti dallo stato del processore, quali i bit-flag ma non soltanto questi.:

un segnale di stop, generato dalla stessa rete combinatoria, resetta il contatore e fa iniziare un

· nuovo ciclo di macchina.

Ciascuno dei segnali di controllo è dato da una sommatoria booleana di

· alcuni dei segnali P (per quei segnali che devono essere prodotti in un determinato passo,

indipendentemente dal codice operativo, come quelli necessari alla realizzazione della fase

fetch;

· alcuni dei segnali I (per i segnali necessari alla esecuzione di un determinato codice operativo), in

and con una funzione dei passi nei quali il segnale deve essere generato e delle condizioni che lo

determinano.

Per fissare le idee, si veda l'esempio di controllo cablato.

Lo schema proposto è in realtà un modello di principio; si noti che:

· la rete combinatoria può essere utilmente sostituita da un apparato PLA.

· la fase fetch è indipendente dal codice operativo e pertanto nelle (6.1) appaiono passi non

=1);

condizionati dal codice (I j

i codici operativi potrebbero essere suddivisi in classi ed alcuni bit potrebbero individuare la

· classe; in tal caso questi ultimi farebbero capo ad un "decoder di classe" che genererebbe segnali

comuni alla classe, mentre altri bit, attraverso un altro decoder, determinerebbero i segnali

specifici del singolo codice.

7 Controllo microprogrammato

Il controllo cablato può essere sostituito da un apparato costituito da una ROM nella quale sono

preregistrati (si dice microprogrammati) i segnali da generare.

Come struttura di base, la microistruzione (detta anche parola di controllo, control word, CW) del

microprogramma è costituta da tanti bit quanti sono i possibili segnali di controllo da generare, come

schematizzato in fig.7.1 e da un apposito campo per il controllo di sequenza, che determina eventuali

"salti" vall'interno del delle istruzioni del microprogramma (vedi in seguito per qualche dettaglio).

contr. seq.

segnali®

0/1 0/1 0/1

i 0/1 0/1 0/1

6 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

n 0/1 0/1 0/1

d

i

r.

Fig. 7.1 Schema di microprogramma

In maniera non dissimile da quanto accade in una RAM, ogni istruzione è ad un determinato

indirizzo della ROM. Dopo la fase fetch comune a tutte le istruzioni (o almeno una prima fase di

questa, negli esempi dell'inserto i passi 0.1.2), l'istruzione è nel registro D e da qui un apposito

trascodificatore trasforma il codice operativo nell'indirizzo della ROM ove è memorizzato il primo

passo per l'esecuzione dell'istruzione (il passo 3 negli esempi); da qui in poi, una microistruzione dopo

l'altra del microprogramma, si generano i segnali dei passi microprogrammati. Per fissare le idee, si

veda esempi di microprogramma.

Fig. 7.2 Schema di apparato per microprogrammazione

Il tutto è controllato da un apparato il cui schema di principio è illustrato in fig.7.2: un "contatore di

passi" invia alla ROM, a ritmo di clock, l'indirizzo della microistruzione da cui la memoria trae i

segnali di controllo, mentre un apposito blocco "generatore di indirizzi" inizializza o reinizializza il

contatore; l'inizializzazione avviene da parte del codice operativo D.op, sulla base della istruzione

identificata, la reinizializzazione a causa dei salti, che sono funzione, oltre che dei flag e degli stati,

della stessa uscita della ROM attraverso il campo "controllo di sequenza". Si usano in merito tecniche

diverse , come quella che la microistruzione definisce il nuovo indirizzo di ROM o quella i cui la

microistruzione definisce solo alcuni bit dell'indirizzo.

Alcuni varianti possono essere realizzati sulla struttura di base descritta ed in particolare sulla

struttura delle microistruzioni. Se ne accennano alcune:

Organizzazione verticale. Lo schema completamente decodificato dei segnali di controllo (un bit

· per segnale) è detto organizzazione orizzontale e richiede molti bit nella microistruzione, a

fronte di una buona velocità. Esso può essere sostituito da una "organizzazione verticale" nella

quale i segnali sono in parte codificati. In particolare, in un modello "codificato a campi",

gruppi di segnali mutuamente esclusivi fra loro sono codificati su alcuni campi della

microistruzione, che sono poi decodificati in uscita.

Salti con ORing. La gestione dei salti condizionati all'interno di un microprogramma avviene in un

· modo che sia efficace piuttosto che in un modo sistematico. Ad esempio, una istruzione può

specificare il salto ad un indirizzo ed i bit di flag possono alterare l'indirizzo effettuando una

OR bit a bit fra detto indirizzo ed un flag (l'indirizzo 110, posto in OR con un flag in ultima

posizione diventa ad esempio 111 se il flag è alto, resta 110 altrimenti).

Uso di PLA. In alcune fasi del microprogramma possono essere usate apposite PLA che

· definiscono l'indirizzo della prossima microistruzione. Ciò tipicamente accade nei punti ove

esiste un'ampia diramazione del microprogramma, come ad esempio dopo la fase fetch, quando

ciascuna istruzione (o classe di istruzioni) deve saltare ad un diverso indirizzo (vedi ad esempio

dopo il passo 2 di esempi di microprogrammi).

8 Modello a bus multipli

7 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Come è noto, in generale l'uso di più bus, consentendo trasferimento di dati in parallelo, è uno

strumento per aumentare la velocità di un apparato. Il modello a singolo bus trattato nel cap. 4 può ad

esempio utilmente evolvere nel modello a 3 bus di fig. 8.1.

Fig. 8.1 Modello a 3 bus

Il modello è tipico di una architettura RISC, ove le istruzioni di calcolo sono tipicamente a 3

operandi di tipo registro, ma si adatta anche ad architetture CISC tipo 68000. Faremo nel seguito

riferimento al primo caso e poniamo in evidenza le seguenti particolarità:

Una istruzione di calcolo a 3 operandi, come ad esempio ADD Rd, Rs1, Rs2, avviene in un unico

· ciclo di clock in quanto:

gli indirizzi-registro dei 3 operandi sono contenuti in 3 campi del registro D, D.d, D.s1, D.s2.

o il banco di registri possiede 3 circuiti di selezione che operano in parallelo, 2 per i

o registri-sorgente (letti dal banco e portati rispettivamente sul bus 1 e sul bus 2), 1 per il

registro-destinazione (bus 3);

i bus 1 e 2 sono di input all'ALU, la cui uscita è sul bus 3; sono eliminati i registri dell'ALU sia in

o input che in output;

· da un'analisi di dettaglio del set di istruzioni e delle microoperazioni necessarie, si deriva che

qualche registro è opportuno che sia collegato a più bus (come in figura PC) ed altri ad uno solo

(come MA).

· così come sono stati eliminati i registri temporanei dell'ALU O1 e U, un registro temporaneo

generale TEMP è talora inserito per operazioni speciali.

· Purché si adotti una tecnica edge triggered, la struttura si presta anche a realizzare un trasferimento

nel quale il registro origine e quello destinazione coincidano; la catena di trasferimento, infatti,

parte ed arriva sul medesimo registro, attraversando circuiti combinatori in modo non dissimile da

quanto avviene in una rete sequenziale sincrona a sincronizzazione esterna (nelle architetture RISC,

però, in genere origine e destinazione sono registri diversi).

[1] Si mette in evidenza che in altri testi si adoperano simboli e denominazioni diverse per i registri. In particolare su

segnala che:

· MA è detto MAR (Memory Address Register);

MD è detto MDR (Memory Data Register);

·

8 of 9 25/01/2007 21.32

Cap. 10 - Il processore: una vista più matura file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

· D è detto IR (Instruction Register);

· O1, O2 sono detti X, Y;

U è detto Z.

·

[2] Si ricorda che un collegamento sincrono sarebbe limitativo della possibilità di fare evolvere in modo indipendente le

tecnologie della CPU e delle memorie. Viceversa, un colloquio sincrono (vedi SDRAM, § VII-10.2) ottimizza i tempi

di funzionamento della memoria.

9 of 9 25/01/2007 21.32

Tempificazione trasferimenti con elaborazione: esempi file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Tempificazione trasferimenti con elaborazione

Esempi

Trasferimento di un registro generale in MA

1

2 Operazione di addizione U:= O1+MB

1 Trasferimento di un registro generale in MA

In una istruzione un operando-sorgente in memoria è indirizzato da un registro generale

(indirizzamento indiretto attraverso un registro, per fissare le idee il registro R3); il suo indirizzo,

contenuto nel registro, deve allora essere trasferito in MA:

MA:=R(D.s) ed MA (cfr. fig. 3.1).

e ciò si ottiene attivando i segnali di controllo s, REG out in

La catena del trasferimento coinvolge dunque in testa la selezione del registro: parte dal registro D

ove è contenuta l'istruzione; attraversa il decodificatore che seleziona il registro, il cui contenuto,

conseguentemente all’abilitazione fornita da REG , va sul bus, da dove si trasferisce in MA (grazie

out

).

ad MA in

I tempi della rete combinatoria (il multiplexer, il decoder e la porta AND che segue) allungano il

tempo di messa sul bus del dato (voce a); ad essi vanno poi aggiunti i tempi di trasmissione sul bus

(voce b) e di caricamento del registro-destinazione (voce c).

2 Operazione di addizione U:= O1+MB

La fig.3.2 mostra la catena di trasferimenti per un'operazione di addizione con gli operandi l'uno

precaricato in O1 nel ciclo precedente e l'altro proveniente direttamente da MB (vedi § 1, O2 è stato

eliminato). Ai tempi di messa sul bus (voce a) e di trasmissione (voce b) va allora aggiunto, oltre al

tempo di caricamento in U (voce c), anche il tempo di ritardo dell'addizionatore.

Si noti che in questo caso occorre anche rendere attivo il segnale ADD dell'ALU, che può essere

comunque anticipato: l'uscita dell'adder sarà infatti significativa solo a tempo debito, alla fine del

tempo di ritardo dell'ALU.

1 of 1 25/01/2007 21.31

Sequenze di segnali di controllo: esempi file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Sequenze di segnali di controllo

Esempi

ADD R2, R1

1

2 ADD (R3), R1

3 BRANCH offset

4 Bcc offset

Nel seguito si riportano alcuni esempi.

1 ADD R2, R1

Il primo esempio (tabella 1) attiene alla esecuzione di una istruzione in una architettura tipo 68000,

per l'esecuzione della istruzione

ADD R2, R1

ove l'istruzione ha due operandi, destinazione e sorgente, che costituiscono due campi del registro D,

D.d (nel caso specifico R1) e D.s (nel caso specifico R2).

n segnali abilitazione microoperazioni note

MA:=PC; leggi in memoria; O1:= 0;

PC MA RE Clear O1 Cin

out in

0 Cin:=1; U:=O1+BUS+Cin {cioè

ADD U in U:=PC+1}

PC Aack PC:=U; attende fine memoria

1 U out in

2 MB D D:=MB {Istruzione in D}

out in O1:=R2 (s seleziona R2); {1°

O1

s REG

3 out in addendo};

U:=R2+R1; {R1 è 2° operando su

d REG ADD U

4 out in BUS} {U:= R1+R2}

5 d U REG Stop R1:=U (d seleziona R1);

out in

Tabella 1 Microoperazioni per istruzione "tipo 68000" ADD R2. R1

2 ADD (R3), R1

Una piccola ma sostanziale modifica si ha, rispetto all'esempio precedente, se il modo di

indirizzamento dell'operando-sorgente è indiretto (cfr. tabella 2):

ADD (R3), R1

Al passo 3, infatti, il contenuto del registro indirizzato (R3 questa volta, prima R2) viene

interpretato come indirizzo di memoria dell'operando e quindi inviato in MA.al passo 4. Poi, mentre la

memoria legge (R3), il controllo pone R1 in O1 e, quando la memoria ha completato la lettura, viene

eseguita la somma fra O1 ed MB.

Si noti che viene così introdotto un passo in più.

n segnali abilitazione microoperazioni note

MA:=PC; leggi in memoria; O1:= 0;

PC MA RE Clear O1 Cin ADD

out in

0 Cin:=1; U:=O1+BUS+Cin {cioè

U in U:=PC+1}

1 U PC Aack PC:=U; attende fine memoria

out in

2 MB D D:=MB {Istruzione in D}

out in MA:=R3 (s seleziona R3); leggi in

mem.;

s REG MA RE

3 out in {assume R3 come indirizzo di

sorgente}

O1:=R1 (d seleziona R1); {1°

d REG O1 Aack

4 addendo};

out in attende fine memoria

U:=O1+MB; {MB è 2° operando su

MB ADD U

5 out in BUS} {U:= R1+(R3)}

1 of 2 25/01/2007 21.31

Sequenze di segnali di controllo: esempi file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

6 d U REG Stop R1:=U (d seleziona R1);

out in

Tabella 2 Microoperazioni per istruzione ADD (R3). R1

L'esempio mostra come alcuni passi dell'esecuzione possono essere condizionati dal modo di

indirizzamento.

3 BRANCH offset

In tabella 3 sono mostrate le microoperazioni per una istruzione di salto relativo con offset:

BRANCH offset

ove offset è un operando immediato dell'istruzione, posto nel campo D.im di D, direttamente collegato

al bus.

n segnali abilitazione microoperazioni note

PC MA RE Clear O1 Cin ADD

out in

0 U in come in tab.1: fetch e PC+1

PC Aack

1 U out in

2 MB D

out in

3 PC O1 PC è il 1° addendo (va in O1)

out in D.im (offset) è il 2° addendo– somma

U

ADD D.im

4 out in in U

5 U PC Stop PC:=U (cioè PC:=PC+offset

out in

Tabella 3 Microoperazioni per istruzione "tipo 68000" BRANCH offset

4 Bcc offset

In tabella 4 è illustrata una istruzione "Bcc" (Branch on condition) la cui esecuzione è del tutto

simile a quella di un salto incondizionato: al passo 4 se la condizione cc non è verificata, l'esecuzione

termina, altrimenti prosegue come per il salto incondizionato. Il tutto prosegue poi come per il salto

incondizionato, avendo comunque aggiunto un passo.

L'esempio mostra come alcuni passi dell'esecuzione possono essere condizionati dal valore dei flag

del sistema. Se, ad esempio, la condizione fosse "se è zero", il passo 3 sarebbe condizionato dal valore

del flag Z.

n segnali abilitazione microoperazioni note

PC MA RE Clear O1 Cin ADD

out in

0 U in come in tab.1: fetch e PC+1

PC Aack

1 U out in

2 MB D

out in le microoperazioni seguenti sono quelle

3 se condizione prosegui, altrimenti Stop di BRANCH

4 PC O1 PC è il 1° addendo (va in O1)

out in D.im (offset) è il 2° addendo– somma

ADD D.im U

5 out in in U

6 U PC Stop PC:=U (cioè PC:=PC+offset

out in

Tabella 4 Microoperazioni per istruzione "tipo 68000" Bcc offset

2 of 2 25/01/2007 21.31

Controllo cablato: esempi file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Controllo cablato

Esempi

Con riferimento, ad esempio, alle tabelle dell'esempio di sequenze di segnali di controllo, diremo

· A il segnale uscente dal decodificatore che individuano il codice ADD;

· B il segnale uscente dal decodificatore che individuano il codice BRANCH;

C il segnale uscente dal decodificatore che individuano il codice Bcc

· nel modello generale);

(qesti segnali sono detti I j

M0 il segnale che identifica un indirizzamento diretto a registro nel campo D.s dei codici della

· classe ADD

· M1 il segnale che identifica un indirizzamento indiretto attraverso registro nel medesimo campo.

I segnali di controllo sono allora dati dalle seguenti espressioni booleane, limitatamente a quanto

espresso nelle tabelle 1-4 dell'esempio di sequenze di segnali di controllo.

PC = P1 + B×P5 +C×P6 + …

in = P0 + B×P3 +C×P4 + …

PC out = P0 + A×M1 P3 + …

MA in

RE = P0 + A×M1 P3 + …

ClearO1= P0 + …

= A×(M0×P3 +M1×P4) +B×P3 +C×P4 + …

O1 in

Cin=P0 +…

ADD = P0 + A×(M0×P4 +M1×P5) +B×P4 + C×P5 +……

U = P0 + A×(M0×P4 +M1×P5) +B×P4 + C×P5 +……

in = P1 + A×(M0×P5 +M1×P6) + B×P5 +C×P6 +…

U out = P2 + A×M1 P5 +…

MB out

= P2 + …

D in

s = A× P3 + …

d = A× (P4 + M0×P5 + M1×P6) +…

REG = A×(M0×P5 + M1×P6) +…

in = A× (P3 + P4) +…

REG out = B×P4 + C×P5 +…

D,im out

Aack = A×(M0×P3 +M1×P4) +…

stop = A×(M0×P5 +M1×P6) + B×P5 +C×(P3×notZ + P6×Z) +…

1 of 1 25/01/2007 21.31

Controllo microprogrammato: esempio file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Controllo microprogrammato

Esempio

Con riferimento ancora all'esempio di sequenze di segnali di controllo, in tabella 1 si presenta un

esempio di microprogramma, limitatamente all'esecuzione dei codici operativi ADD, BRANCH, Bcc, ai

relativi segnali di controllo ed ai due modi di indirizzamento identificati dai segnali M0 ed M1 (cfr.

esempio di controllo cablato).

Tab.1 Bozza di microprogramma per le istruzioni ADD, BRANCH, Bcc

C R

l

I M D.

E

R

e

P

n controllo di

B im A

G

E

a O U

C M

d P sequenza

o o a

o

G

r 1 C A U o D

o A

i C u u c

u

i

O i i D i u i

u i R

r i t k

t

n

1 n n D n t n s d

t n

. n t

E avanti

0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 avanti

1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ln funzione

di

codop

vai

a

· 3 se

=ADD and

M0

2 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 · 6 se

=ADD and

M1

· 9 se

=Bcc

· 10 se

=BRANCH

……

·

continua

3 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0

4 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 continua

5 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 vai a 0

6 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 continua

7 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 continua

8 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 vai a 5

·

continua se

9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Z

· avanti

se not Z

avanti

10 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 avanti

11 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 vai a 0

12 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

Nel campo "controllo di sequenza" è indicata l'azione che deve essere compiuta, in termini di salti

incondizionati o condizionati, per i quali non è stato fissato un preciso linguaggio di programmazione

anche perché il microprogramma resta pur sempre uno schema di principio: nella realtà operativa,

l'adozione di una delle tecniche accennate (organizzazione verticale. salti con ORing, suddivisione in

classi di istruzion) o di altre ancora determinano il vero e proprio linguaggio di

(micro)programmazione.

1 of 1 25/01/2007 21.31

Capitolo undicesimo

memoria principale

cache superblocco 0

ag = cache

superblocco

superblocco 1

cache ···

superblocco 31

Memoria Cache e Pipeline

0

31

+ collocazione

Premessa

1 Memorie cache: concetti di base memoria

2 Corrispondenza diretta principale

3 Indirizzamento associativo

3.1 Cache totalmente associativa

3.2 Cache parzialmente associativa

o 4 Scrittura nella cache

5 Strategie di gestione della cache

6 Algoritmi di sostituzione

6.1 Algoritmo random

6.2 Algoritmo LRU

6.2.1 Algoritmo LRU a stack LRU

6.2.2 Algoritmo LRU a contatori di linea

6.3 Algoritmo FIFO

6.4 Confronto fra gli algoritmi

7 Il pipelining: concetti di base

8 Stallo e bolle

9 Le criticità del pipeline

10 Superamento della criticità sul controllo

10.1 Coda delle istruzioni e branch folding

10.2 Salto ritardato

10.3 Previsioni di salto

11 Superamento della criticità sui dati

12 Pipeline multipli

13 Interruzioni e pipeline

Premessa

1 Memorie cache: concetti di base

2 Corrispondenza diretta

3 Indirizzamento associativo

4 Il pipelining: concetti di base

5 Stallo e bolle

6 Le criticità del pipeline

7 Superamento della criticità sul controllo

8 Superamento della criticità sui dati

Premessa

1 Memorie cache: concetti di base

La cosiddetta memoria cache è un'applicazione importante del modello di gerarchia di memoria già

trattato in precedenza e che qui si riprende. In particolare, in nella tabella Tempi d’accesso e costi delle

memorie 1.1 sono indicati alcuni dati tipici (aggiornare???) che evidenziano la grossa differenza in 2

due parametri fondamentali della gerarchia: il tempo di accesso e il costo.

Tempo di accesso Costo per Mbyte

Tipo di memoria (ns) (in $)

SDRAM

SRAM 2-25 250

DRAM 60-120 10

6

Dischi 0,1

10-20 *10

Tabella 1.1 Alcuni dati sulle memorie ispirato P. pag.473, aspetto ritoccato

Si usa indicare la gerarchia classificando di "livello inferiore" la memoria più veloce (e meno

capace), più vicina alla CPU, secondo lo schema di fig. 1.1.

0000 Fig,. 1.1 Gerarchia di memorie: i livelli

Ai primi livelli di questa gerarchia si pongono le memorie cache (immediatamente sopra i registri di

macchina): si tratta di memorie statiche molto veloci , spesso a loro volta suddivise in due distinti

livelli gerarchici (fig.1.2): una cache di primo livello, realizzata all'intero dello stesso chip ove è

allocata la CPU ed una di secondo livello, immediatamente fuori che funge da memoria intermedia tra

quella di primo livello e la memoria principale:

Fig. 1.2 Gerarchia di memorie con cache primaria e secondaria

Talora (cfr. pipelining) in un sistema di calcolo esistono due distinte cache (eventualmente a due

livelli ciascuna): una per le istruzioni ed una per i dati.

Le cache, ed in generale la gerarchia di memorie, rispondono al principio che è bene avere a

disposizione gli oggetti che servono di frequente (si pensi alla consultazione di un libro che dalla

biblioteca passa allo scaffale dello studio e poi alla scrivania). Questa strategia è sostenuta da due

criteri di località ai quali in genere rispondono i programmi:

località temporale: i programmi tendono a riusare i dati che hanno già usato di recente;

· località spaziale: i programmi tendono ad usare dati che sono memorizzati in locazioni vicine a

· quelle dei dati usati di recente

L'accesso ad una cache avviene fornendole l'indirizzo del dato (o dell'istruzione) come se fosse in

memoria principale; un apposito apparato applica poi a questo indirizzo una legge di corrispondenza

(mapping) che lo trasforma nell'indirizzo di cache ove il dato dovrebbe essere allocato, nel prossimo

paragrafo saranno illustrate le tecniche fondamentali per il mapping.

In lettura, se il dato è presente nella cache, viene trasferito alla CPU e viene inviato a questa un

segnale di consenso detto hit; se invece è assente, si dice che la lettura è fallita (read miss): il dato

viene ricopiato dalla memoria principale e solo al termine di tale operazione la CPU può riceverlo.

In scrittura il dato viene registrato nella cache e da qui nella memoria principale. Esistono invero

(come anche per la lettura) diverse tecniche per ottimizzare i tempi, soprattutto se si considera, come si

vedrà in seguito, che i dati sono trasferiti dalla memoria alla cache in blocchi e che in ogni caso la

memoria principale deve essere aggiornata così come quella cache, ma che finché il dato permane nella

cache potrebbe restare anche con il valore obsoleto nella memoria principale (cfr. § 5).

2 Corrispondenza diretta

Si premette che Istruzioni e dati sono memorizzate nella cache a blocchi e la stessa memoria

si può immaginare in generale che sia suddivisa in blocchi ed il suo indirizzo localizzare da

principale

un lato il blocco e dall’altro la parola nel blocco;; ad esempio, un indirizzo di memoria a 16 bit si può

12 4

immaginare che suddivida la memoria suddiviso in 2 blocchi da 2 =16 parole, come in figura 2.1a.

indirizzo

indirizzo del blocco nel blocco

1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1

Blocco 3096 Parola 3

a)

indirizzo indirizzo indirizzo

superblocco del blocco nel blocco

1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1

supbl 24 Blocco 64 Parola 3

b)

Fig. 2.1 Suddivisione di un indirizzo di memoria

L'indirizzo si compone allora di un indirizzo nel blocco di 4 bit e di uno indirizzo del blocco di 12 bit

11 10 6

(nell'esempio parola 3 del blocco 3.096=2 +2 +2 ). Si possono anche immaginare catene di

indirizzamento più complesse, come ad esempio in fig. 2.1b), in cui l'indirizzo è suddiviso in blocchi e

[1] 4 3

(l'indirizzo sarebbe allora la parola 3 del blocco 64 del superblocco 24=2 +2 ).

superblocchi

Poiché la capacita della cache è minore di quella della memoria principale, occorre definire un

sistema per allocare nella cache i blocchi della memoria principale. Per fissare le idee, detta C la

m

quella della cache, si supponga che sia:

capacità della memoria principale e C c

(le capacità sono sempre potenze di 2)

La tecnica più semplice è quella detta della corrispondenza diretta (direct mapping):

· gli indirizzi della memoria principale si immaginano suddivisi in indirizzo nel blocco, del blocco e

del superblocco (fig. 2.1b);

· blocchi omologhi (di differenti superblocchi) sono destinati ad essere allocati nelle medesimestesse

posizioni della cache: ovviamente, tali blocchi non possono coesistere nella cache;

il campo superblocco è di k bit e nella cache viene memorizzato, in associazione al blocco

· registrato, come etichetta (in inglese tag).

In altri termini, detto n il numero dei bit dell'indirizzo di memoria (n=20 nell'esempio), gli indirizzi

n-k

I della memoria principale sono suddivisi in classi dei resti modulo-C (C =2 , capacità della cache)

m c c

con

e ciascuno di essi è destinato ad occupare nella cache l'indirizzo I c

di I )

(resto modulo-C c m =128 blocchi

Nella fig. 2.2 è mostrato uno schema di memorizzazione a corrispondenza diretta con C c

di 16 parole (2048 word), C =4096 blocchi (64 kword), K=32; in esso i blocchi di memoria 0, 128,

m

256,… sono destinati al blocco 0 della cache, i blocchi 1, 129, 257,… al blocco 1 e così via; il blocco

memoria principale 3096 (superblocco 24, blocco 64) è memorizzato nel blocco 64 della cache,

<della

con tag=24. 0

···

···

127

128

tag 0 ···

··· ··· ···

···

··· 255

tag 127 38993968 ··· ···

tag = indirizzo ···

del superblocco ···

4095

etichetta blocco (indice) parola

1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1

(24) (64) (3)

Fig. 2.2 Cache a corrispondenza diretta

La selezione di una parola avviene con una tecnica composita:

il campo "indirizzo del blocco", blocco detto anche indice (7 bit in fig. 2.2), individua, mediante

· apposito decodificatore, il blocco della cache ove il dato indirizzato dovrebbe risiedere,

il campo "indirizzo del superblocco" spb (5 bit in fig. 2.2) viene confrontato, attraverso un

· comparatore con l'etichetta (tag) memorizzata e, se coincidente, genera il segnale di successo hit

[2]

miss) ;

(altrimenti si ha un

il campo "indirizzo di parola" parola seleziona la parola attraverso un circuito più semplice (ad

· esempio un multiplexer); poiché in genere è di pochi bit (4 in fig. 2.2. ma esistono anche

realizzazioni con 2 bit o addirittura il blocco si può ridurre ad una sola parola).

Lo schema va completato con la registrazione nella cache, a fianco all'etichetta ed al dato, di un bit v

che indichi se il blocco corrispondente contiene in effetti dati validi o non. Infatti, non appena il

calcolatore sia stato "acceso", non esistono dati nella cache e soltanto via via che il funzionamento

avanza la cache si riempie: all'inizio ci potrebbero anche essere "vecchie" etichette che non

v deve essere inoltre invalidato ogni volta che il blocco della memoria

corrispondono a dati validi.Il bit

principale viene riscritta per trasferirvi dati da dischi o da altre memorie secondarie..

Il segnale di hit, pertanto, va condizionato dal bit di dato valido:

× (spbºtag)

hit=v [3]

Ne segue il modello generale di fig. 2.3 . Se risulta hit=1, allora l'accesso alla cache ha avuto successo e la

parola del blocco da questa prelevata viene fornita al processore che la richiede. In caso contrario, il blocco

viene prelevato dalla memoria principale e replicato nella cache all'indirizzo indice unitamente con l'etichetta

spb: l'uno e l'altra rimpiazzano il vecchio contenuto della cache, che sarà così pronta per ulteriori accessi al

blocco. Fig. 2.3 Selezione in una cache a corrispondenza diretta

Per fissare le idee, si vedano gli esempi in cache ad indirizzamento diretto.

3 Indirizzamento associativo

3.1 Cache totalmente associativa

Con l'indirizzamento associativo: i blocchi non hanno una posizione preassegnata, ma possono essere

allocati in un posto qualsiasi. In particolare, con la tecnica totalmente associativa si ha (vedi fig. 3.1

come esempio): 0

···

···

127

128

tag 0 ···

···

···

··· ···

··· ···

tag 127 ···

···

···

4095

etichetta parola

1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1

(3096) (3)

Fig. 3.1 Cache totalmente associativa

· gli indirizzi della memoria principale sono suddivisi soltanto in indirizzo nel blocco e del blocco

(fig. 2.1a);

· i blocchi di memoria possono essere allocati in un qualsiasi blocco di cache;

il campo “indirizzo del blocco” viene memorizzato in associazione al blocco registrato nella cache,

· come etichetta del blocco.

I blocchi provenienti dalla memoria riempiono la cache, allocandosi nei posti liberi; con riferimento

all'esempio di fig. 3.1, il blocco della memoria principale 3096 (lo stesso esemplificato per la fig.2.2) è

memorizzato in uno qualsiasi dei blocchi liberi della cache, ma con tag=3096. Quando non esistessero

posti liberi (la cache è piena), occorre ricorrere ad appositi algoritmi per definire la strategia di

allocazione e sostituzione dei blocchi (cfr. § 5),.

L’indirizzamento della cache è puramente associativo, in quanto il dato viene identificato da un

indirizzo del blocco blocco ed uno nel blocco parola ed il campo assegnato spv blocco viene

confrontato con tutte le etichette tag memorizzate, fino a trovare (se c'è) l'eguaglianza. Ovviamente, per

sia effettuata in parallelo, con altrettanti

rendere competitivi i tempi, è necessario che la ricerca vada

comparatori quanti sono i blocchi delle cache. La parola, poi, viene selezionata come nel caso

dell'indirizzamento diretto.

Fig. 3.2 Selezione in una cache totalmente associativa

3.2 Cache parzialmente associativa

Sono diffuse soluzioni intermedie fra quella a corrispondenza diretta (poco efficiente) e quella

totalmente associativa (troppo costosa). Le soluzioni intermedie sono dette set-associative..

La cache è suddivisa in M set (insiemi) di N blocchi (la cache si dice allora ad a N vie oppure ad N

linee) ed il blocco B della memoria principale è allocato nel set , in uno qualsiasi dei suoi N

m

blocchi, affiancato da un’etichetta (tag) che lo identifica. L’indirizzamento della cache è diretto per il

per set, associativo fra gli N blocchi del set.

Nell'esempio di fig. 3.3, i 128 blocchi di fig. 2.2 della cache diventano M=64 insiemi di N=2 blocchi

(cache a 2 vie) e per la lettura occorre selezionare il set, ½ (in generale 1/N) degli oggetti (i blocchi)

che si dovevano selezionare in fig. 2.2; il campo indice è dunque ora di d=1 bit in meno che in fig. 2.2

(in generale d=log N). Per contro, i blocchi dunque sono N=2 volte i superblocchi di fig.2.2 e

2

l’etichetta richiede 6 bit, d bit in più di fig. 2.2.

Sono anche possibili soluzioni intermedie fra quella a corrispondenza diretta (poco efficiente) e

quella totalmente associativa (costosa). In fig. 3.2 è mostrata una soluzione cosiddetta set-associativa: i

blocchi della cache sono suddivisi in "insiemi (set)" di N blocchi (nell'esempio 64 set di 2 blocchi: la

soluzione è allora detta a 2 vie) ed il corrispondente blocco della memoria principale può essere

allocato in uno qualsiasi degli N blocchi, conservando la sua identificazione attraverso l'etichetta,

Nell'esempio, da confrontare con l'esempio di fig. 2.2, i 128 blocchi della cache diventano 64 set e 9l

set cui è destinato il blocco di memoria M è , in uno qualsiasi degli N blocchi disponibili: i bit che

prima identificavano il blocco ora identificano il set e sono log N in meno (nell'esempio, N=2, 6 invece

2

di 7) mentre l'etichetta aumenta di pari entità (6 invece di 5); il blocco della memoria principale 3096

(superblocco 24, blocco 64) è memorizzato nel set 0, nella prima posizione con etichetta=48

(superblocco 24, collocazione 0) oppure nella seconda con etichetta=49 (superblocco 24, collocazione

1). memoria principale 0

1

···

126

127

tag 0 tag 1

··· ···

···

···

··· ··· ··· ···

tag 127

tag 126 3899

3890

···

4094

4095

etichetta

superblocco coll. set parola

1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1

Fig. 3.2 3 Cache set-associativa

In fig. 3.4 è illustrata la selezione per la cache di fig. 3.3, che avviene localizzando il set attraverso

l'indice (come nella corrispondenza diretta) e con una tecnica associativa all'interno del set (come nella

[4]

selezione totalmente associativa) , ma stavolta la ricerca associativa è limitata ad un numero ridotto

di voci (nell'esempio soltanto 2).

Fig. 3.4 Selezione in una cache parzialmente associativa a 2 vie

Un esempio di cache set-associativa a 4 vie è mostrato in Cache Set-Associativa.

4 Scrittura nella cache

Per le operazioni di scrittura in memoria, si distinguono due casi: si chiede la scrittura di un dato non in

cache (miss di scrittura) oppure l’aggiornamento di un dato già in cache (hit di scrittura).

In caso di miss, due sono le strategie possibili: quella del write-allocate, che trasferisce nella cache il

blocco interessato e poi vi scrive il dato e quella del wite-non-allocate, che scrive il dato soltanto nella

memoria principale.

La seconda strategia è in genere preferita in quanto, per la scrittura in memoria, i principi di località

sono meno validi di quanto non sia per la lettura: la probabilità di trovare nell'immediato futuro un

nuovo accesso alla locazione o a quelle adiacenti è bassa.

Fig. 2.3 Selezione in una cache a corrispondenza diretta

In caso di hit, si possono ancora seguire due strategie diverse:

· Scrittura immediata (write through): cache e memoria principale sono aggiornate insieme.

· Scrittura differita (write o copy back): il dato è riscritto solo nella cache ed un apposito bit in essa (di

modifica o dirty) indica che il contenuto del blocco cui appartiene è stato modificato durante la sua

permanenza nella cache, in modo che lo stesso potrà essere aggiornato nella memoria principale allorché

sarà sostituito nella cache oppure l'elaborazione sarà terminata.

Ovviamente, la seconda soluzione è più efficiente, ma richiede un maggior costo realizzativo.

5 Strategie di gestione della cache

Nelle cache associative e set-associative, allorché la memoria tutta oppure l'insieme siano "pieni", cioè

occupati da blocchi tutti validi, si pone il problema di quale blocco debba lasciare il posto a quello

sopravvenente. Ne nascono apposite strategie di gestione della cache, finalizzate ad ottimizzarne

l'impiego.

Sono possibili diversi algoritmi di sostituzione e diverse varianti, faremo riferimento ai tre

fondamentali:

· RANDOM: il blocco da sostituire viene scelto a caso. È l'algoritmo di più semplice realizzazione e

quello che fornisce dati sperimentali di efficienza abbastanza soddisfacenti, nonostante i riscontri

teorici favorevoli agli altri due.

· FIFO: classica strategia a coda, sostituisce il blocco che è nella cache da più tempo, Occorre

soltanto memorizzare la registrazione di un blocco nella cache ed è dunque un algoritmo di media

complessità.

· LRU (Least Recently Used,): si parte dall'ipotesi che i blocchi recentemente più usati hanno la

massima probabilità di essere ancora usati nel futuro e quindi si sostituisce il blocco usato meno di

recente. Ovviamente, occorre memorizzare l'uso dei blocchi e l'algoritmo è più costoso degli altri,

ma anche molto usato con buone prestazioni.

6 Algoritmi di sostituzione

Faremo in genere riferimento ad una cache set-associativa ad N vie ed M set ed illustreremo con

qualche dettaglio gli algoritmi di sostituzione fondamentali sopra introdotti.

In primo luogo, si consideri che, ovviamente, le linee da sostituire prioritariamente sono quelle “non

valide” e quindi, per tutti gli algoritmi, ove vi fosse un v =0, la linea da sostituire deve essere la i-esima

i

(nel caso ve ne sia più di una è indifferente quale scegliere).

6.1 Algoritmo random

Obiettivo dell’algoritmo è di generare, per ogni miss, un numero casuale x, con 0£x<N, che identifichi

la linea da sostituire. Sarebbe d’altronde inutilmente costoso un algoritmo ad hoc di generazione di un

numero casuale; è invece più conveniente usare un contatore modulo-N che si incrementi allorché capiti

un evento casuale e si può assumere come casuale proprio l’evento “miss di cache”.

La realizzazione concreta è allora affidata ad un unico contatore per tutta la cache che si incrementa ad

ogni miss e che viene usato, per il set che ha provocato il miss, come numero x, Si ha quindi

banalmente:

· per ogni miss:

linea da sostituire: linea C (se non vi sono linee non-valide)

o C=(C+1

o )mod-N

6.2 Algoritmo LRU

Obiettivo dell’algoritmo è di identificare, per ciascun set, la linea usata meno di recente e a tale scopo

si dovrebbe implementare una graduatoria ad N posti ove in ciascun posto è sistemata una linea ed un

algoritmo che la aggiorni ad ogni evento significativo.Poiché occorre tener presente l’uso di una linea,

la graduatoria si deve aggiornare per ciascun hit del set, L’algoritmo dell’aggiornamento è banale; se

l'hit avviene sulla linea q, questa diventa 1° in classifica e tutte le linee che la precedevano perdono una

posizione. In caso di miss si sostituisce l’ultima linea in classifica:

· Per ogni set

· Per ogni hit su linea q

q al 1 posto i classifica

o tutte le linee che precedevano q perdono 1 posto in classifica

o

· per ogni miss:

linea da sostituire: linea ultima in classifica)

o

Questa linea concettuale trova due diverse realizzazioni, a seconda di come si implementa la

graduatoria:

· algoritmo a Stack

· algoritmo a contatori di linea

6.2.1 Algoritmo LRU a stack LRU

Nell’algoritmo detto (impropriamente) Stack LRU esistono N registri, ciascuno con log N bit, ordinati,

2

nel senso che individuano la classifica: il 1° (p.e. il primo a sinistra), il 2°, l’N-esimo (ultimo a

destra); di conseguenza, quando c’è l’hit sulla linea q, q va nel 1° registro (a sinistra) e tutti quelli che

occupavano posizioni prioritarie rispetto q (quelle alla sua sinistra) slittano di una posizione verso la

coda (a destra)

· Per ogni hit su linea q

i=0; while (C ¹q) íi=i+1; C = C ý

o i i i-1

C =q

o 0

· Per ogni miss

Sostituire C

o N-1

6.2.2 Algoritmo LRU a contatori di linea

L’algoritmo dei contatori di linea rappresenta la classifica usando, per ciascuna linea, un contatore

mod-N che ne indica la posizione in classifica; ne segue che, all’avvento di un hit sulla linea q, occorre

incrementare di una unità tutti i contatori di contenuto minore di C ed azzerare quest’ultimo (che va

q

primo in classifica):

· Per ogni miss

Se k è il primo invalido, sostituire k

o se tutti validi, sostituire k con C =N-1

o k

prosegui come per hit su linea k

o

· Per ogni hit su linea q

Per ogni i: if (C <C ) C =C +1

o i q i i

C =0

o q

In fig. 6.1 è mostrato un esempio per una cache a 4 linee

Evento sost C C C C validità

0 1 2 3

0 Condizione iniziale - 1 0 3 2 1111

1 Hit su linea 0 - 0 1 3 2 1111

2 Miss 3 1 2 0 3 1111

3 Invalidazione sulla linea 1 - 1 2 0 3 1011

4 Hit su linea 0 - 0 2 1 3 1011

5 Invalidazione sulla linea 3 - 0 2 1 3 1010

6 Miss 2 1 0 2 3 1110

7 Hit su linea 2 - 2 1 0 3 1110

8 Miss 3 3 2 1 0 1111

9 Miss 0 0 3 2 1 1111

10 Miss 1 1 0 3 2 1111

Figura 6.1 Esempio di algoritmo LRU a contatori

6.3 Algoritmo FIFO

Obiettivo dell’algoritmo è tenere memoria della linea che per prima è stata caricata in cache.

A tale scopo è sufficiente un unico contatore modulo-N per set che ad ogni miss punta alla linea da

sostituire e si incrementa di una unità::

· Per ogni set

· per ogni miss:

sostituire C

o C=C+1

o

Si supponga infatti che anche il caricamento iniziale per non validità avvenga ordinatamente e

ciclicamente secondo le indicazioni del contatore, che si parta da una cache totalmente scarica (tutte le

linee non valide), che non si generino invalidità di linee dipendenti da prelievo di dati da memorie

secondarie e che il contatore sia stato inizialmente posto a 0. Nel set si caricano ordinatamente le linee

0, 1, …N-1 ed il set si satura; a questo punto il contatore è a 0, che è appunto la più vecchia linea

caricata; questa viene sostituita e il contatore va ad 1 e così via:

Solo la comparsa di invalidità per una linea (e non per le altre) porterebbe ad una anomalia nella

sequenza regolare dell’invecchiamento: ora la linea più giovane è quella caricata, che non è ordinata

rispetto alle altre; a rigore, dunque, si dovrebbe aggiustare, complicandolo, l’algoritmo. Peraltro, questo

evento è poco probabile in quanto un’eventuale invalidità per lettura nella memoria primaria da una

memoria secondaria facilmente rende invalide più linee consecutive ed inoltre alcuni sistemi rendono

non cacheable questi blocchi.

Si preferisce allora applicare sempre il medesimo algoritmo, spostando in caso di invalidità, il valore

del contatore alla linea appena caricata prima di incrementarla.

6.4 Confronto fra gli algoritmi

Le approssimazioni che gli algoritmi reali effettuano rispetto alle strategie teoriche non rendono

significativi confronti astratti fra i diversi algoritmi. Questi sono stati comunque confrontati

sperimentalmente facendo correre alcuni programmi di prova (benchmark) e misurando il numero di

miss che si verificano, ad esempio per ogni1000 istruzioni, al variare degli algoritmi e delle dimensioni

cash.

In Benchmark per cache sono riportati alcuni risultati delle prove.

Cache Set-Associativa.

Un esempio di cache set-associativa è mostrato in

47 Il pipelining: concetti di base

Per migliorare le prestazioni di una macchina, oltre alle ovvie soluzioni dell'aumento della velocità e

della miniaturizzazione dei componenti (ma ci sono limiti fisici invalicabili!), la tecnica più diffusa è

quella di parallelizzare le operazioni. Si sono già visti gli effetti positivi, ad esempio, dell'aumentare il

numero di bus del processore oppure quello di realizzare più ALU e così via. Ma un apparato

formidabile per un processo di parallelizzazione è una organizzazione del processore in pipeline o la

tecnica del pipelining.

L'organizzazione in pipeline di un processore è come l'organizzazione del lavoro in catena di

montaggio: laddove il lavoro è divisibile in operazioni da effettuare in cascata, si organizzano diverse

cellule di lavorazione, ciascuna dedicata ad una fase del lavoro ed il prodotto da realizzare attraversa le

diverse cellule, che operano in parallelo fra di loro (ad esempio. mentre una cellula monta la carrozzeria

sul motore di una automobile, un'altra cellula mette assieme i vari pezzi del motore di un'altra auto).

Il lavoro che deve compiere la CPU è quello di prelevare ed eseguire le istruzioni: per semplicità di

sia suddiviso in due soli passi:

impostazione, supponiamo che il lavoro per l'istruzione I k

: fetch dell' istruzione

F k

E : esecuzione della stessa (comprensiva di preparazione dell'operando)

k

e facciamo ancora alcune ipotesi semplificative:

· il processore deve eseguire una sequenza di istruzioni I tutte "simili", che richiedono cioè il medesimo

i

tempo di prelievo ed esecuzione;

non esistono nella sequenza istruzioni di salto;

· tutte le fasi F ed E avvengono in un singolo ciclo di clock.

· i i una cella che realizzi la fase fetch e che lasci in un buffer B1

Organizziamo quindi la CPU come in fig. 4.6.1:

(uno o più registri) l'istruzione prelevata ed una distinta cella che realizzi la fase execute.

Organizzazione dell'hardware con pipeline

Fig. 4.6.1

Un processore tradizionale (alla Von Newmann) realizzerebbe il prelievo e l'esecuzione di una

sequenza di n istruzioni in modo rigidamente sequenziale, come schematizzato in fig. 4.6.2a. Usando

invece la struttura di cui alla fig. 4.1, mentre viene eseguita l'istruzione I , la I viene prelevata ed in

1 2

generale ogni istruzione viene prelevata mentre la precedente viene eseguita: il tempo necessario per

l'esecuzione di un programma si dimezza. Ovviamente, nei limiti in cui valgano le ipotesi, peraltro

ideali. ciclo di clock

1 2 3 4 5 6

Istruzione

a) I1 F1 E1

I2 F2 E2

I3 F3 E3

b) I1 F1 E1

I2 F2 E2

I3 F3 E3

Fig. 4.6.2 Esecuzione sequenziale (a) ed in pipeline (b) di un programma

6.1, mentre viene eseguita l'istruzione I , la I viene

Usando invece la struttura di cui alla fig. 1 2

prelevata ed in generale ogni istruzione viene prelevata mentre la precedente viene eseguita: il tempo

necessario per l'esecuzione di un programma si dimezza. Ovviamente, nei limiti in cui valgano le

ipotesi, peraltro ideali.

Più in generale, l'esecuzione di una istruzione può essere suddivisa in N invece che in 2 fasi e

l'architettura di fig. 4.6.1 ampliata con altrettante celle e buffer ove è memorizzato il risultato

[5]

intermedio dell'elaborazione e da dove parte l'elaborazione della fase successiva . Nella pipeline ad N

si sviluppa dunque con istruzioni suddivise in N fasi e un parallelismo di N

stadi lo schema di fig.4.6.2

(dopo N istruzioni di iniziale riempimento della pipeline) e, sempre negli stessi limiti di validità delle

ipotesi, il tempo di esecuzione sarebbe ridotto ad 1/N del tempo della macchina strettamente

sequenziale.

Il miglioramento delle prestazioni avviene non perché sia diminuito il tempo di esecuzione della

singola istruzione, ma perché aumenta il numero di istruzioni elaborate nell'unità di tempo o, come s

dice, il troughput delle istruzioni nel sistema. Il fattore 1/N è peraltro un limite cui si può tendere, ma

che non è raggiungibile in concreto a causa delle ipotesi semplificative poste a monte. In particolare si

ha: È possibile individuare più fasi distinte nel processo fetch-execute (ad esempio, dopo il prelievo,

· lettura di un registro, operazione nell'ALU, etc.), ma è difficile che i loro tempi di esecuzione siano

eguali.

· I tempi propri di ciascuna fase sono diversi (p.e. una fase di spostamento fra registri è più rapida di

una di elaborazione in ALU) mentre il modello di pipelining assegna a tutte le fasi il medesimo

tempo; ne segue che il periodo di clock deve essere dimensionato al tempo della fase più lenta.

· Una fase (o più) può essere assente in alcune istruzioni, ma il modello prevede che tutte le

fasi, eventualmente vuote, e durino dunque il medesimo

istruzioni abbiano le medesimestesse

tempo.

Il fattore teorico di miglioramento di pipelining passa da 1/N a k/N se mediamente le istruzioni

peggiorano di un fattore k il loro tempo di esecuzione a causa delle caratteristiche di cui sopra; si tratta

in ogni caso di un limite teorico non raggiungibile anche a causa dei fenomeni che saranno presentati in

seguito.

L'esempio di un'architettura RISC con pipelining servirà a chiarire le idee.

Una ipotesi fondamentale deve comunque porsi alla base della fattibilità di una architettura a

pipeline: l'uso di memorie cache. Soltanto, infatti, con essa è concepibile l'ipotesi che l'accesso in

memoria richieda tempi confrontabili con quelli delle altre fasi.

Per fissare le idee, supponiamo che l'architettura sia composta delle seguenti fasi :

§ F (fetch): prelievo dell'istruzione,

D (decode): decodifica dell'istruzione e prelievo degli operandi (o fase di preparazione degli

§ operandi),

§ O (operation): esecuzione dell'operazione,

W (write): scrittura dei risultati.

§

e che ciascuna fase sia realizzata in un diverso stadio del pipeline (cfr. fig..4.6.3).

Pipeline a 4 stadi

Fig.4.6.3

Lo schema ripropone quello noto, fatta salva la suddivisione della fase di esecuzione in due (O, W).

Si tratta comunque di uno schema, così come ne possono esistere altri (si veda ad esempio quello

esemplificato al paragrafo precedente), anche in dipendenza della struttura del set di istruzioni, che

viene progettato tenendo conto della realizzazione con pipeline.

58 Stallo e bolle

La regolare sovrapposizione delle fasi del pipeline può venir meno per il verificarsi di alcuni eventi

nella sequenza di istruzioni a causa dei quali uno stadio non può concludere l'operazione in un solo

ciclo di clock: si dice allora che il pipeline va in stallo.

Nella fig. 5.7.1a) è rappresentato uno stallo della pipeline sulla fase O2 che, dovendo effettuare una

operazione complessa (ad esempio una divisione) si sblocca solo al tempo 7: la fase dura gli intervalli

di tempo 4, 5, 6 invece del solo 4 e tutto il pipelining segna il passo finché il regolare succedersi degli

stadi non possa essere ripreso: in particolare si bloccano ("vanno in stallo") lo stadio che segue O, W,

che deve attenderne la fine per proseguire l'esecuzione dell'istruzione, ma anche quelli che lo

precedono, D e F, perché nelle istruzioni che seguono devono attendere la disponibilità di O per

lasciargli il controllo. In fig. 5.7.1b) è mostrato un analogo fenomeno di prolungamento del tempo di

uno stadio : nel caso specifico si tratta dnella fase di fetch che è ritardata per un missing di cache.

1 2 3 4 5 6 7 8 9 10

Istruzione

a) I1 F1 D1 O1 W1

I2 F2 D2 O2 W2

I3 F3 D3 O3 W3

I4 F4 D4 O4 W4

I5 F5 D5 O5 W5

b) I1 F1 D1 O1 W1

I2 F2 D2 O2 W2

I3 F3 D3 O3 W3

Fig 5.7.1 Esempi di stallo in un pipeline a 4 stadi:

a) a causa di O2; b) a causa di F2

A causa dello stallo, si creano quindi nella pipeline intervalli di tempo nei quali gli stadi, pur non

essendo direttamente interessati ad un fenomeno di rallentamento, restano inattivi. Il fenomeno viene

detto delle bolle (bubble) di inattività.

è mostrata una vista diversa dell'attività del pipelening (sulle righe gli stadi, nella

Nella fig. 5.7.2

tabella le istruzioni elaborate), ponendo in evidenza le attività degli stadi nei successivi intervalli di

clock: : si notano in essa le bolle di cui sopra (evidenziate in giallo – grigio in bianco e nero - nella

figura) sia per gli stadi che prolungano la loro attività sia per quelli che ritardano il loro inizio.

clock 1 2 3 4 5 6 7 8 9 10

a) F 1 2 3 4. in. in 5

D 1 2 3 in. in. 4 5

O 1 2 2 2 3 4 5

W 1 in. in. 2 3 4 5

b) F 1 2 2 2 3

D 1 in in 2 3

O 1 in in 2 3

W 1 in in 2 3

Fig 5.7.2 Esempi di "bolle" nel pipeline per i due casi di fig. 5.7.1:

69 Le criticità del pipeline

Gli eventi che provocano stallo oppure che comunque disturbano il regolare svolgersi del pipelining

vengono detti hazard (rischio. alea, situazione critica): le diremo appunto criticità del pipelining e così

le classificheremo:

Criticità per missing di cache: si è detto che un'architettura a pipeline richiede necessariamente

· una cache in modo da rendere il tempo di accesso in memoria confrontabile con i tempi delle altre

microoperazioni; tuttavia, un missing di cache provoca uno stallo nel sistema.

· Criticità strutturale: se due stadi diversi del pipeline dovessero accedere alla medesima risorsa

hardware, essi non potrebbero operare in parallelo. Questa situazione tipicamente si verifica fra la

fase F che accede alla cache per i dati e la fase D che potrebbe dovervi accedere per i dati: la

criticità si può superare disponendo di due distinte cache, l'una per le istruzioni e l'altra per i dati.

Criticità sul controllo (detta anche per salti): nel caso di istruzione di salto condizionato, non si

· conosce quale sia l'istruzione seguente finché l'istruzione stessa non sia stata eseguita. Questa

situazione comporta uno stallo a meno che non si usino soluzioni alternative particolari

Criticità sui dati (detta anche per vincoli sui dati): se gli operandi di una istruzione sono calcolati

· da una istruzione precedente, è necessario che quest'ultima sia completata per dare esecuzione alla

prima. Anche per queste criticità sono possibili tecniche che ne limitino i danni.

710 Superamento della criticità sul controllo

alcune criticità, soprattutto quelle dovute ai salti, il modello di fig. 4.3 può evolvere

Per risolvere

come segue:

10.1 Coda delle istruzioni e branch folding

·Per risolvere le criticità dovute ai salti, il modello di fig. 4.3 può evolvere come segue.

L'unità F (fetch) preleva di continuo istruzioni dalla cache (spesso in blocchi, (ad esempio di 4

istruzioni), anche se non richieste, e le memorizza in una coda delle istruzioni che mantiene sempre

piena finché possibile (cfr. fig. 7.9.1). F, inoltre, non si limita ad un prelievo "alla cieca", ma effettua

anche una decodifica preliminare e, riconoscendo le istruzioni di salto, segue la sequenza delle

istruzioni nei limiti del possibile: in caso di salti incondizionati, preleva le istruzioni a partire

dall'indirizzo di destinazione del salto.

L’unità D, che segue la F nel pipeline, invece, acquisisce l’istruzione dalla coda soltanto quando essa

deve effettivamente essere eseguitaEssa , così come in caso di salti condizionati, purché la condizione

sia stata calcolata in congruo anticipo

Fig. 7.9.1 Coda delle istruzioni

·L'unità D (decode) effettua anche una attività di smistamento (dispach): preleva l'istruzione dalla coda

quando essa deve effettivamente essere eseguita. In tal modo è anche possibile realizzare pipeline

con unità di calcolo multiple, come ad esempio mostrato nella fig. 7.1, ove coesistono due linee di

esecuzione, una per dati interi e l'altra per dati in virgola mobile.

Branch folding, torna utile in diverse circostanze: con essao si

La tecnica illustrata, detta anche del

riducono gli effetti negativi dello stesso stallo per missing di cache sull'istruzione. Il missing, infatti,

viene riconosciuto dall'unità F in anticipo, quando probabilmente vi sono ancora istruzioni nella coda, e

, finché la coda non si svuoti

l'unità D continua allora ad inviare istruzioni in esecuzione

completamente, mentre F accede alla memoria principale e sposta nella cache l'istruzione. Solo se nel

frattempo la coda si svuotasse completamente il missing produrrebbe i sui effetti negativi.

Tutta la criticità dei salti permane in caso di salti condizionati, per i quali la condizione è spesso

determinata dalla o dalle istruzioni immediatamente precedenti.: è stato calcolato che il 20% delle

istruzioni di un programma sono di salto e quindi il superamento almeno parziale di tali criticità è

essenziale.

Si ricorda che un salto condizionato effettua la scelta su quale delle due sequenze di istruzioni debba

essere eseguita, quella immediatamente dopo il salto (S) oppure quella di destinazione del salto (D) e

che, senza provvidenze particolari, il pipelining inizierebbe comunque ad operare sulla sequenza S,

salvo ad accorgersi, ad esecuzione del salto completata, di aver effettuato lavoro inutile, interrompere

penalità di salto.

l'elaborazione in atto e ricominciare su D. Si dice in tal caso che la pipeline paga ima

Diverse sono le tecniche in uso per limitare l'impatto negativo di tale fenomeno, ma per motivi di

brevità non le trattiamo sistematicamente, limitandoci ad accennare solo a qualche soluzione.

10.2 Salto ritardato

Dal momento in cui l’istruzione di salto entra nella fase fetch a quello in cui l’indirizzo dell’eventuale

salto viene calcolato, altre k istruzioni entrano nella pipeline ed il processore ne inizia l’elaborazione

(k=1 se l’istruzione richiede 2 cicli). Le k istruzioni che seguono una di salto si dice intervallo di

ritardo del salto (branch delay slot)

Se il salto non deve avvenire, la pipeline ha utilmente anticipato il suo lavoro sull’intervallo di ritardo,

ma se il salto deve avvenire il lavoro anticipato andrebbe perso.

Si cerca allora di alterare l’ordine iniziale delle istruzioni e spostare dopo il salto k istruzioni la cui

esecuzione deve essere effettuata indipendentemente dall'esito del salto e ritardare il salto dopo il

completamento delle istruzioni dell’intervallo di ritardo del salto.

Il riordinamento è tipicamente affidata al compilatore o all’assemblatore; talora. in assenza di

istruzioni da inserire nell’intervallo (ad esempio, in una catena di salti) vengono generate istruzioni “no

operating” dopo quella di salto.

Salto ritardato. In salto ritardato è presentato un esempio

10.3 Previsioni di salto

Previsione di saltoCon la tecnica della previsione di salto, :la pipeline prosegue il prelievo delle

istruzioni secondo la strada più probabile, minimizzando dunque il rischio di penalità, La previsione

può essere statica o dinamica.

Con la previsione statica, in sede di compilazione viene stimata la eventualità più probabile. Ad

esempio se il salto è quello di un repeat-until (do-while), la probabilità più elevata è che il salto

avvenga, in quanto esso tipicamente avviene N>1 volte e non avviene solo alla fine del ciclo; viceversa,

per un ciclo while-do, Stimata l’evenienza più probabile, il compilatore genera un codice operativo che

indica alla pipeline di continuare a prelevare in sequenza oppure dall’indirizzo di salto (con questa

tecnica è necessario che il processore possegga distinti codici operativi per le due soluzioni, ad esempio

il processore Intel 80960 possiede un “bit di previsione” che le distingue),

È da sottolineare come in questi ed in altri casi sia essenziale la collaborazione di un buon

programmatore macchina (o, concretamente, di un compilatore "intelligente") che collabori alla

ottimizzazione del codice in linguaggio macchina.

La previsione dinamica usa un hardware aggiuntivo per stimare quale sia l’eventualità più probabile al

tempo di esecuzione ed in base alle volte che in precedenza quella stessa istruzione di salto è stata

eseguita. Gli algoritmi si basano sulla costruzione di una apposita tabella di previsione dei salti o

Branch Prediction Buffer. BPR.

811 Superamento della criticità sui dati

Nel caso di vincoli fra i dati, esistono tecniche per superare lo stallo relativo; si accenna alla

principale.

Se di due istruzioni la prima calcola un risultato che è un operando della seconda, si ottengono bolle

nella pipeline come mostrato nell’esempio di vincoli fra dati..

La tecnica detta del forwarding o bypassing,. illustrata dalla fig. 10.1, invece di attendere il

completamento della prima, se ne può mantienere quando richiesto il risultato nell'ALU perperché possa

essere usato dalla istruzione successiva: rlo nella seconda. Questa tecnica viene detta del forwarding o

bypassing. ed è illustrata dalla fig. 8.1: l'ALU (che è il componente principale dello stadio O) ha in

[6] ; ma U può fungere anche da input dell'ALU (in

input i due registri O1, O2 ed in output il registro U

sostituzione, ad esempio, di O2); una apposita logica di controllo nello stadio O realizza l'alternativa,

consentendo così ad una istruzione di usare come operando il risultato di quella precedente.

Fig.8.10.1 Anticipo di un operando

ancora in esempio di vincoli fra dati. i vantaggi che così si ottengono.

Si vedano

12 Pipeline multipli

Finora si sono considerati pipeline lineari, cioè costituiti da un’unica cascata di celle più o meno lunga

(abbiamo considerato modelli a 2 o a 4 stadi, ma ne esistono anche a 31 stadi!). Una soluzione più

evoluta è quella di mettere in parallelo più pipeline, realizzando così pipeline multipli.

Uno schema introduttivo di pipeline multiplo è in fig. 11.1: l'unità D (decode) preleva l'istruzione dalla

coda ed effettua una attività di smistamento (dispach), attivando due distinti pipeline, l’uno per il

processamento delle istruzioni su dati interi e l'altra per dati in virgola mobile.

Fig. 11.1 Coda delle istruzioni

13 Interruzioni e pipeline

[1]

Il "superblocco" è in effetti un insieme di blocchi: non abbiamo adoperato tale dizione per non confonderla con un diverso

concetto di "insieme di blocchi" usato in questo contesto.

[2] Qui e nel seguito il segnale hit va inteso in effetti come

[3]

In pratica, spesso esso è realizzato attraverso due distinti banchi di memoria, l'uno contenente il "catalogo" della memoria

(la coppia v-tag) e la logica per la costruzione del segnale hit; l'altro contenente i dati veri e propri (parola…parola) e il

multiplexer per la loro selezione.

[4] Per motivi grafici la figura non riporta la selezione della parola, che si effettua come nelle figure precedenti.

[5]

Si noti che in tal modo, se si considera 'elaborazione nell'ALU come una fase del processo, allora si ritorna ad uno schema

nel quale l'ALU possiede 2 registri di input e uno di dì output.

[6]

Il modello a pipeline, con la interposizione di registri fra i diversi stadi, rilancia il modello di ALU che era stato superato

nel cap. X, quello con due registri in input ed uno in output.

Cache ad indirizzamento diretto

Esempio

In figura 1 è mostrato un esempio di architettura per la lettura da cache. L'esempio fa riferimento

alla architettura del processore MIPS ed alle seguenti caratteristiche P. pag. 481

Fig.1 Lettura in una cache a corrispondenza diretta

· indirizzo di memoria a 32 bit: è indirizzato il byte

4 byte per blocco (il blocco è dunque di una parola di 32 bit) e quindi 2 bit per identificare

· il byte nel blocco (detti byte offset)

· etichetta (tag) a 20 bit

indice (=indirizzo del blocco) a 10 bit

·

I 10 bit di indirizzamento nella cache individuano (mediante apposito decodificatore) la posizione

ove il dato indirizzato dovrebbe risiedere, se l'etichetta memorizzata coincide con quella cercata

(circuito di comparazione) ed il dato è valido (bit valido) viene generato il segnale di successo (hit) e la

CPU recepisce il dato.

In questo esempio si utilizza solo la località temporale per trarre vantaggio dalla cache: si presume

che un dato che sia nella cache verrà acceduto di frequente nel tempo, ma le dimensioni ridotte del

blocco non danno la possibilità di utilizzare la località spaziale (la probabilità di accedere a dati

contigui in memoria).

In figura 2 è invece mostrato un esempio in cui il blocco è costituito da 4 parole e che quindi sfrutta

la località spaziale. La selezione nella cache avviene sulle 4 parole in parallelo, che sono selezionate

attraverso un multiplexer dai bit di indirizzo della parola.

P. pag.487

Fig.2 Cache a corrispondenza diretta e blocchi di 4 parole

Cache set-associativa

Esempio

In figura è mostrato lo schema dell'architettura di una cache set-associativa a 4 vie, 8 bit di indirizzo

del set e 22 bit di etichetta; i 4 blocchi del set sono selezionati in parallelo dall'indirizzo di set e quindi

attraverso il multiplexer dall'uscita del comparatore che (se c'è) riconosce l'etichetta da selezionare.

P.pag.505

Figura Architettura set-associativa a 4 vie.

(tratto da Patterson, pag. 505)

Architettura RISC a pipeline

Esempio

L'architettura MIPS, con pipelining, con riferimento alle istruzioni di cui alla tabella che segue,

presenta le seguenti caratteristiche:

Si supponga ad esempio di trattare una machina tipo RISC con le istruzioni di riferimento: da esso si

può dedurre: tempi (nsec)

Istruzione prelievo leggi Opera Accesso scrivi tempo

registro ALU memoria registro totale

Load 2 1 2 2 1 8

Store 2 1 2 2 7

add. sub,etc- 2 1 2 1 6

branch cc 2 1 2 5

sono individuate 5 fasi distinte:prelievo, leggi registro, etc.;

·

· non tutte le fasi richiedono il medesimo tempo: ci sono fasi da 1 e fasi da 2 nanosecondi; il

periodo di clock è di 2 nanosecondi;

mancano la fase "scrivi" in store e branch, "accesso in memoria" in add e branch: con il pipelining

· tutte le istruzioni durano 8 nsec;

· il fattore di peggioramento k risulta in questo caso 10/8

Benchmark per cache

I valori della tabella rappresentano i miss verificatisi durante l’esecuzione di mille istruzioni. I

risultati ottenuti sono stati rilevati sperimentalmente con una architettura ALPHA avente linee di cache

pari a 64 bytes ciascuna ed il benchmark SPEC2000.

. Dalla tabella si evince la sostanziale equivalenza dei 3 algoritmi. La differenza tra LRU e RAND

per cache di grandi dimensioni è addirittura identica mentre per dimensioni minori si ottengono molto

lievi benefici utilizzando l’algoritmo LRU. L’algoritmo FIFO ha prestazioni medie rispetto LRU e

RAND risultando migliore di quest’ultimo per cache di piccole dimensioni.

Salto ritardato

Esempio

PROGR. ORIGINALE PROGR. RIORDINATO

Move N,R2 Move N,R2

D Shift Left R1 D Decrement R2

Decrement R2 Branch_if=0 D

Branch_if=0 D Shift Left R1

S Add R1,R3 S Add R1,R3

Il programma “originale” di tabella somma al registro R3 il registro R1 shiftato di N posizioni; a tale

scopo è stato programmato un ciclo inizializzato con R2=n e nel quale R2 viene decrementato ogni

volta terminando quando diventa R2=0. Il pipeline avvierebbe in ogni ciclo l’istruzione con etichetta S.

Nell’ipotesi che l’intervallo di ritardo del salto sia di 1 istruzione, si può riorganizzare il programma

come nella colonna “programma riordinato”, ritardando l'’eventuale salto (in tutti gli N cicli) al

completamento dell’istruzione evidenziata in tabella.

Vincoli sui dati e forwarding

Un esempio

Nella sequenza di istruzioni

ADD R3,R1,R2 (R3=R1+R2)

1)

2) SLWI R3,R3, 1 (shift left R3 di 1 bit)

Altra istruzione

3)

l’istuzione 2 usa come operando il risultato dell’istruzione 1.

Nel diagramma temporale della figura che segue è evidenziata la bolla che ne segue.

1 2 3 4 5 6 7 8

Istruzione F1 D1 O1 W1

Add O1=R1;

vincolo add U=O1+R2 R3=U

O2=R2

F2 D2 O2 W2

Shift shift O1=R3 U=sh(O1) R3=U

F3 D3 O3 W3

altra altra opera

Con la soluzione del forward si può agevolmente guadagnate i1 unità di tempo come illustrato nella

figura che segue,

Guadagna 1 tempo

1 2 3 4 5 6 7 8

Istruzione F1 D1 O1 W1

Add O1=R1;

Add U=O1+R2 R3=U

O2=R2

F2 Fwd D2 Fwd O2 W2 R3=U

Shift shift O1=U U=sh(O1) R3=U

Trattando con attenzione la tempificazione è anche possibile eliminare del tutto la bolla, come

mostrato nella figura che segue.

Guadagna 2 tempi

1 2 3 4 5 6 7 8

Istruzione F1 D1 O1 W1

Add O1=R1;

Add U=O1+R2 R3=U

O2=R2

F2 Fw D2 Fwd O2 W2

Shift shift U=sh(O1) R3=u

O1=U

I2 F2 D2 O2 W2

I3 F3 D3 W3

O3

I4 F4 O4 W4

D4

I5 D5 O5 W5

F5

Tempi d’accesso e costi della gerarchia di memoria

Nel seguito sono riportati alcuni dati, aggiornati al 2004, relativi alla gerarchia di memorie, tratti da

Patterson: et alii – Progetto e struttura dei calcolatori – II edizione- Zanichelli.

Tempo di accesso Costo per Gbyte

Tipo di memoria (ns) (in $)

SRAM 0,5-5 4000-10000

DRAM 50-70 100-200

6

Dischi 0,5-2

5-20 *10

Tabella 1.1 Alcuni dati sulle memorie ispirato P. pag.473, aspetto ritoccato

Generalità sui linguaggi assemblativi e relativi assemblatori file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Generalità sui linguaggi assemblativi

e relativi assemblatori

I linguaggi assemblativi

1.

2. Il programma assemblatore

3. Operazioni base svolte dall’assemblatore

4. Assemlatori ad uno o a due passi

1. I linguaggi assemblativi

Queste sono le caratteristiche principali dei linguaggi assemblativi:

- a ciascun linguaggio macchina è associato un linguaggio elementare, detto linguaggio assemblativo

oppure assembler, che costituisce il più elementare fra i linguaggi simbolici;

- in un linguaggio assemblativo le istruzioni del linguaggio macchina non perdono la loro

individualità, ma ai codici operativi numerici sono sostituiti codici simbolici letterali (p.e., ADD per

addizione), con caratteristiche mnemoniche e gli operandi sono indicati con nomi simbolici (p.e. A,B,

ciclo, somma);

- alle istruzioni corrispondenti al linguaggio macchina, l’assembler aggiunge apposite dichiarazioni

(dette anche direttive di assemblaggio), espresse attraverso appositi pseudocodici (p.e. A RLS 2 per

indicare che A è il nome di una variabile che occupa in memoria 2 byte);

- le direttive di assemblaggio consentono di introdurre nomi simbolici i quali vengono associati dal

programma assemblatore ad indirizzi di macchina.

Concettualmente, dunque, il linguaggio assemblativo mantiene la struttura e le caratteristiche

operative del linguaggio macchina, ma è di più agevole comprensione.

Esempio 1: linguaggio assemblativo

Per fornire una idea introduttiva, si presenta un segmento di programma in un ipotetico linguaggio assemblativo:

A WORD 1 { A è una word }

B WORD 1 { B è una word }

C WORD 1 { C è una word }

.......

LOAD A, R { sposta A nel registro R }

ADD B, R { aggiungi B ad R }

STO R, C { memorizza R in C }

Le prime tre righe (pseudocodice WORD) sono direttive di assemblaggio e dichiarano che A, B, C sono altrettante

variabili del programma, ciascuna delle quali occupa in memoria una parola-macchina (ad esempio, 16 bit); le altre sono

altrettante istruzioni che eseguono l’operazione C=A+B.

2. Il programma assemblatore

Il traduttore di un linguaggio assemblativo è detto assemblatore (assembler). Esso traduce ciascuna

istruzione del testo origine nella corrispondente istruzione del linguaggio macchina, sulla base delle

citate direttive. Suoi compiti fondamentali sono pertanto la trascodifica dei codici operativi e

l’assegnazione di indirizzi di memoria ai nomi simbolici (identificatori o etichette).

Per l’espletamento dei compiti di cui sopra gli assemblatori adoperano tipicamente un insieme di

tabelle delle quali alcune “statiche”, cioè costanti ed altre “dinamiche”, cioè aggiornate durante

l’assemblaggio. Le principali tabelle sono:

a. Tabella dei codici operativi. Fa corrispondere a ciascun codice simbolico mnemonico il

corrispondente codice numerico di macchina. È una tabella statica. Viene analizzata per individuare se

un codice simbolico è un codice lecito e per trascodificarlo nel codice di macchina.

b. Tabella degli pseudocodici. Fa corrispondere a ciascuno pseudocodice del linguaggio assemblativo

l’indirizzo del segmento di programma (o del sottoprogramma) del programma assemblatore che

1 of 3 25/01/2007 21.38

Generalità sui linguaggi assemblativi e relativi assemblatori file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

effettua le operazioni richieste dallo pseudocodice stesso (informazioni di tipo “puntatore”). E’ una

tabella statica. Viene analizzata per selezionare le azioni corrispondenti a ciascuno pseudocodice.

c. Tabella dei simboli. Fa corrispondere a ciascuno dei nomi simbolici del programma origine

(identificatori di variabili, etichette, nomi di sottoprogrammi, etc.) un’informazione strutturata detta

descrittore con la quale si definiscono tutte le proprietà associate al nome ed in particolare:

- l’indirizzo di memoria assegnatogli

- il tipo della variabile

- informazioni ausiliarie.

La tabella dei simboli, presente in tutti i traduttori e non soltanto negli assemblatori, è tipicamente

dinamica, in quanto va aggiornata via via che il programma introduce (ad esempio con una

dichiarazione) un nuovo nome; essa è inoltre consultata sia per verificare la correttezza sintattica del

linguaggio origine sia per trascodificare il nome nell’indirizzo corrispondente.

3. Operazioni base svolte dall’assemblatore

Per fissare le idee, si illustra lo schema generale di un assemblatore, nella parte di gestione dei

simboli e della relativa tabella; si ipotizza che:

- ciascuna istruzione-origine è caratterizzata da una coppia (OP, A) di codice ed operando;

- ciascun codice è riconosciuto, sulla base di apposite tabelle, come di uno dei tipi (codice operativo,

dichiarazione, fine, altro);

- se di tipo “codice operativo”, l’istruzione deve essere tradotta;

- se di tipo “dichiarazione”, l’istruzione definisce il tipo di un nome simbolico (tutte le variabili

debbono essere dichiarate prima di essere usate);

- se di tipo “fine”, l’istruzione indica la fine del testo-origine.

Le linee essenziali dell’algoritmo sono riportate in tab. 1. Si noti che:

- la tabella dei simboli viene aggiornata per effetto delle dichiarazioni e consultata per la traduzione

delle istruzioni;

- gli indirizzi vengono assegnati alle variabili e alle istruzioni secondo una strategia che dipende dal

tipo di variabile, dallo schema di allocazione e dall’impiego di indirizzamento assoluto o relativo;

- in particolare, si è supposto che la sequenza delle istruzioni generate venga memorizzata in indirizzi

consecutivi di memoria, distanti di un’unità l’uno dall’altro (INDISTR=INDISTR+1);

nel semplice schema mostrato, non è trattato il problema delle “etichette future”: se nel testo

- origine compare prima il riferimento ad una etichetta poi questa viene apposta ad una istruzione

(ad esempio, con un’istruzione di “salto in avanti”), l’indirizzo dell’etichetta risulta non ancora

definito quando essa viene usata.

Tabella 1 Algoritmo dell’assemblatore

repeat

leggi istruzione-origine (OP,A)

if OP = codice operativo then

begin

- trascodifica OP nel codice-macchina OPM

- attraverso tabella-simboli trasforma nome di operando A

in indirizzo IND

- genera istruzione (OPM, IND) all’indirizzo INDISTR

if istruzione ha un’etichetta ET then

-inserisci la coppia (ET, INDISTR) in tabella-simboli

INDISTR = INDISTR+1

end

else if OP=dichiarazione then

begin

- assegna indirizzo a variabile

- aggiorna tabella-simboli con nome di variabile,

indirizzo assegnato e tipo

else if ........

until OP = fine

2 of 3 25/01/2007 21.38

Generalità sui linguaggi assemblativi e relativi assemblatori file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

4. Assemlatori ad uno o a due passi

Un traduttore viene detto ad un sol passo se l’operazione di traduzione si completa analizzando una

sola volta il testo origine, a più passi se il testo viene analizzato più volte. Tipicamente, un traduttore a

più passi effettua dapprima la traduzione in un codice intermedio che non è ancora il testo oggetto in

quanto o incompleto o scritto in linguaggio diverso da quello definitivo; il codice intermedio viene

successivamente rianalizzato e da questo viene generato il testo oggetto, oppure un nuovo codice

intermedio. Il numero di passi di un traduttore dipende soprattutto dalla complessità del linguaggio

è il programma

origine. In fig. 1 è schematizzato il caso di un assemblatore operante in due passi: P A

il programma in linguaggio intermedio, P il programma

origine scritto in linguaggio assemblativo, P r O

oggetto. Figura 1 Assemblatore operante in due passi

L'algoritmo effettivamente implementato dall'assemblatore è strettamente dipendente dalle

caratteristiche del linguaggio assemblativo e dal numero di passi in cui si completa la traduzione; esso

comunque travalica gli obiettivi di questo testo.

Solo un cenno viene qui sviluppato per il problema delle etichette future, che può essere risolto con

l'ausilio di una apposita “tabella delle etichette future", dinamica, in cui l'assemblatore pone le etichette

non ancora presenti in tabella simboli, unitamente all'indirizzo dell'istruzione in cui tale etichetta è

riferita; l'istruzione viene provvisoriamente tradotta lasciando non definito il campo operando.

Successivamente, in un secondo passo o comunque quando l'etichetta viene definita, la traduzione viene

completata con l'indirizzo effettivo delle etichette.

In particolare, l'assemblatore, allorché incontra una istruzione della forma (OP.ALFA) con ALFA

etichetta futura, genera:

-

nel programma oggetto, all'indirizzo I, un’istruzione provvisoria nella forma (OPM, -), ove OPM è il

codice macchina equivalente a OP e "-" sta per "indirizzo non definito";

- nella tabella delle etichette future, viene posta la coppia {ALFA,i}.

In seguito, quando nel programma origine è presente l’istruzione con etichetta ALFA, da allocare

all'indirizzo j, l’assemblatore:

- accede alla tabella dei simboli, ricerca l’etichetta ALFA e non la trova perché ALFA non ha ancora un

indirizzo;

- accede alla tabella delle etichette future e ritrova una o più coppie (ALFA,i) e per ciascuna di esse

completa l'istruzione con l’indirizzo i trasformando la coppia (OPM. -) in (OPM. j)

Un esempio didattico di assemblatore è illustrato in Esempio di assemblatore.

3 of 3 25/01/2007 21.38

Esempio di assemblatore file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Esempio di assemblatore

Nell'esempio che segue faremo riferimento ad un linguaggio assemblativo didattico ove l'istruzione è

costituita da:

- un'etichetta (ET);

- un codice operativo mnemonico (OP)

- un indicatore di modo (MODO)

- un operando costituito da:

- operando base (BASE)

- registro indice (INDICE)

Il calcolatore ideale di riferimento possiede un numero discreto di registri-indice (64), tale che anche

gli indici si indicano con nomi mnemonici; la parola-macchina è di 32 bit e i campi dell’istruzione

assemblativa coincidono con quelli in bit dell’istruzione in linguaggio macchina; tutte le istruzioni

hanno la medesima struttura.

Ogni istruzione dell'assembler occupa un rigo, l'eventuale etichetta precede l'istruzione ed è separata

da questa dal carattere ":" ; al codice operativo (o allo pseudocodice) segue un blank, quindi un "modo"

espresso con una cifra e poi. dopo altro blank, l'operando; se quest'ultimo è affetto da indice, l'indice è

separato da virgola. Ad esempio, una istruzione è

ALFA nel registro indice K)

IST: LOAD 2 ALFA. K (carica

e viene tradotta in linguaggio macchina nella forma:

12000 : 04 05 01 10000

in cui:

- 12000: indirizzo dell'istruzione associato all'etichetta IST

- 04: indicatore di modo 2 (diretto)

- 05: codice operativo LOAD

- 01: registro indice K

- 10000: indirizzo base ALFA

In tabella 1 sono sintetizzate le strutture delle istruzioni assembler e del corrispondente linguaggio

macchina.

Tabella 1 Struttura dell’istruzione in linguaggi assemblativo e macchina

LINGUAGGIO ASSEMBLATIVO LINGUAGGIO MACCHINA

Campo separat. significato Campo significato

ET : etichetta ETM indirizzo istruzione

OP blank codice mnemonico OPM codice numerico

MODO blank modo indirizzamento M modo in bit

BASE , nome operando-base B indirizzo base

INDICE fine rigo nome dell'indice I indirizzo indice

I principali codici mnemonici e la loro traduzione in linguaggio macchina sono illustrati nella tabella

2. Tabella 2 Tabella dei codici operativi e degli pseudocodici

Codici operativi Pseudocodici dichiarativi

Assemb. Macch. Significato

LOAD 005 M:=a RLS riserva locazioni dato

LXP 012 X:=M RLX riserva indice

GOTO 017 PC:=M RES riserva in zona istruzioni

ADD 045 a:=a+M .....

STS 013 M:=a .....

FGO 061 a>M? .....

ADX X:=X+M .....

1 of 4 25/01/2007 22.09

Esempio di assemblatore file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

SXT 026 X:=X-M ≠ 0 END fine programma

Il linguaggio prevede che tutti i nomi simbolici siano preventivamente dichiarati con uno degli

[1]

pseudocodici di cui alla tab.2, seconda colonna; a titolo di esempio, la dichiarazione:

A: RLS 100

significa che A è il nome di un dato, per il quale sono riservate 100 locazioni di memoria (ad esempio,

perché è un array).

L'assemblatore ha le seguenti caratteristiche:

È del tipo load and go ad un passo; per semplicità si considera il programma costituito dal solo

a) programma principale.

b) Lo schema di allocazione adottato è quello di tab. 3; a tale scopo, l'assemblatore utilizza due

variabili di tipo puntatore, CIS, CD, i cui valori forniscono, in ogni istante dell'assemblaggio, la

situazione di occupazione rispettivamente delle zone istruzioni e dati.

Tabella 3 Schema di allocazione

c) CIS parte dal valore “maxass”+1, essendo “maxass” l'indirizzo dell'ultima locazione occupata

dall'assemblatore, e viene quindi incrementato di una unità dopo ogni allocazione di un'istruzione.

d) CD viene posizionata inizialmente a “maxmem”, massimo indirizzo di memoria disponibile, e

quindi decrementata, per ogni nuovo identificatore dichiarato, della quantità specificata nel

campo-base della dichiarazione.

e) Analogamente, un puntatore CIN conta gli indici usati dal programma e viene posizionato ad 1

all'inizio e quindi incrementato per ogni dichiarazione RLX.

f) Ogni qualvolta CIS e CD vengono aggiornati, si effettua un controllo di capienza in memoria,

assicurandosi che le zone istruzioni e dati non si siano sovrapposte (se CIS≥CD vi è sovrapposizione).

Anche per CIN viene verificato che non si ecceda il numero di indici disponibili.

g) Per ciascuna frase del testo origine, l'assemblatore confronta il campo OP del testo origine con i

codici mnemonici registrati nella tabella dei codici operativi. Se OP è in tabella, la frase è del tipo

istruzione ed è corrispondentemente disponibile il codice numerico da trasferire nel campo OPM

dell’istruzione-macchina. In caso contrario viene analizzata la tabella degli pseudocodici.

h) Nella tabella dei simboli, questi sono classificati in base ai seguenti tipi:

se compare in una dichiarazione RLS; gli è assegnato l'indirizzo CD;

· dato: se compare nel campo ET di una istruzione; gli è assegnato l'indirizzo CIS;

· etichetta:

se compare in una dichiarazione RLX; gli è assegnato l'indirizzo CIN.

· indice:

m) Lo pseudocodice END prevede nel campo BASE il nome simbolico della prima istruzione della

sequenza dinamica del programma. In assenza di errori, l'assemblatore esegue una istruzione di salto

all'indirizzo corrispondente, allo scopo di produrre l'esecuzione del programma (si tratta infatti di una

realizzazion load & go, come preannunciato).

Tabella 4 Programma di esempio

Testo origine Linguaggio macchina

ET OP BASE SIGNIFICATO ETM M OPM

I RLX 1

T RLS 100

M RLS 1

N RLS 1

START LXP 0 1,I I:=1 5000 0 012 01 00001

5001 2 005 01 10000

LOAD T,I a:=T i

2

2 of 4 25/01/2007 22.09

Esempio di assemblatore file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

STS 0 M M:=Acc 5002 0 113 00 10100

LXP 0 2,I I:=2 5003 0 012 01 00002

CICLO LOAD M a:=M 5004 2 005 00 10100

2

FGO 2 T,I if Acc>T 5005 2 061 01 10000

i

GOTO A then goto A 5006 0 017 00 05008

0

GOTO B else goto B 5007 0 017 00 05010

0 5008 2 005 01 10000

A LOAD T,I a:=T i

2

STS 0 M M:=a 5009 0 113 00 10100

B ADX 0 1,I I:=I+1 5010 0 002 01 00001

LOAD I a:=I 5011 2 005 00 00001

2

FGO 2 N if a>N 5012 2 061 00 10101

GOTO CONT then go CONT 5013 0 017 00 05015

0

GOTO CICLO else go CICLO 5014 0 017 00 05004

0

CONT ..... 5015 … … … …..

In tabella 4 è mostrato un programma di esempio e in tabella 5 la relativa tabella dei simboli: si è

supposto che all'inizio della fase di assemblaggio sia CIS=5000, CD=10000 e CIN=1.

)

Tabella 5 (

Tabella dei simboli con riferimento al programma di tab. 4

NOME TIPO INDIRIZZO

I indice 1

T dato 10000

M dato 10100

N dato 10101

START etichetta 5000

CICLO etichetta 5004

A etichetta 5008

B etichetta 5010

CONT etichetta 5015

Per l'impiego della tabella dei simboli si adoperano due sottoprogrammi dell'assemblatore, l'uno per

il suo aggiornamento e l'altro per la ricerca.

1) ricerca NOME in tabella; se non

aggiornamento(in NOME, TIPO, INDIRIZZO; out ERRORE):

è già presente, viene inserito in tabella unitamente con l'indicazione di tipo (TIPO) e l'indirizzo

(INDIRIZZO); se NOME è già presente, l'evento viene segnalato attraverso la variabile logica

ERRORE (si tratterebbe di una duplice dichiarazione per lo stesso nome).

2) ha come parametro d'ingresso NOME e

ricerca(in NOME; out TIPO, INDIRIZZO, ERRORE):

fornisce in uscita TIPO e INDIRIZZO corrispondenti; esso segnala inoltre, con la variabile logica

ERRORE, l'eventuale assenza del NOME ricercato in tabella.

Lo schema di programma dell'assemblatore è riportato in tab. 6.

3 of 4 25/01/2007 22.09

Esempio di assemblatore file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Tabella 6 Programma assemblatore

CIS:= maxass+1;

CD := maxmem;

CIN:= 1;

repeat

leggi istruzione-origine(ET,OP,MODO,BASE,INDICE);

stampa istruzione-origine;

cerca OP in tabella-codici operativi;

OP è in tabella

if then

begin

trascodifica OP in codice-numerico OPM

ricerca (BASE, TIPO, B, ERRORE)

ERRORE and TIPO¹etichetta errore 1

if then

ERRORE and TIPO=etichetta etichetta futura

if then

ricerca (INDICE, TIPO, I, ERRORE)

ERRORE or TIPO≠indice errore 2

if then

trascodifica MODO in M

MEMORIA(CIS):= (M,OPM,I,B)

analisi dell’etichetta della istruzione

CIS:= CIS+1

controllo occupazione di memoria

end

else

begin

cerca OP in tabella-pseudocodici

OP è in tabella

if then

begin

CD:= CD-BASE

of OP

case RLS: TIPO:=dato

RLX: TIPO:=indice

RES: TIPO:=etichetta

aggiorna (ET, TIPO, CD, ERRORE)

ERRORE then errore 3

if

end

else if ........

OP=END

until

nessuno errore

if then

begin

ricerca (BASE, TIPO, P, ERRORE)

not ERRORE and TIPO=etichetta goto P

if then

end

L'analisi dell' etichetta può avvenire con il seguente schema di programma:

ET è presente

if then

begin

poni in tabella-simboli (ET, ETICHETTA, CIS)

ET è in tabella-futuri

if then

completa istruzioni incomplete

end

Nello schema di programma riportato sono anche state poste in evidenza alcune attività diagnostiche:

- errore 1: uso di un nome non precedentemente dichiarato;

- errore 2: in campo-indice c'è un nome non dichiarato come indice;

- errore 3: è dichiarato un nome già dichiarato.

[1] Gli pseudocodici hanno formato pù semplice delle istruzioni

4 of 4 25/01/2007 22.09

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Appendice A

Architettura, linguaggio macchina e assembler 68000

Premessa

1 Architettura della sezione registri

2 Rappresentazione dei dati

3 Struttura delle istruzioni

4 Modi di indirizzamento

5 Linguaggio assemblativo

6 Istruzioni di trasferimento dati

6.1 Move in generale

6.2 Clear e Set

6.3 Move e load verso registri di indirizzamento

6.4 Move per registri speciali

6.5 Operazioni su stack

6.6 Operazioni di scambio

6.7 Istruzioni di move assenti nel 68000

7 Istruzioni aritmetiche e logiche

7.1 Aritmetica binaria

7.1.1 Operazioni unarie

7.1.2 Addizione e sottrazione

7.1.3 Estensione del segno

7.1.4 Moltiplicazione e divisione

7.2 Aritmetica decimale

7.3 Istruzioni d’indirizzamento e controllo

7.4 Istruzioni logiche

7.5 Istruzioni di Shift

8 Posizionamento dei flag - Istruzioni di comparazione e test

8.1 Comparazione aritmetica

8.2 Test

8.2.1 Test su un bit

8.2.2 Test su byte, word o longword

9 Istruzioni di salto

9.1 Salti incondizionati

9.2 Salti condizionati

9.3 Salti a sottoprogrammi

9.4 Ritorno da sottoprogrammi

10 Altre istruzioni

10.1 Istruzione DBcc

10.2 Trasferimenti a blocchi

10.3 Stop e Nop

10.4 Istruzioni LINK e UNLK

10.4.1 Esempio d’uso di LINK, UNLK: chiamata di sottoprogrammi

10.5 Istruzioni di interruzione software (trap)

10.6 Istruzioni di input/output

1 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Prerequisiti

Argomenti che si suppone siano noti al lettore (oltre quelli di questo testo):

Generalità su linguaggi assemblativi e assemblatoti

·

Premessa

Il processore MC68000 della Motorola è stato introdotto nel 1979. Si tratta di un’architettura a

registri generali, molto interessante per la sua regolarità, pur non essendo completamente ortogonale.

Molte soluzioni architetturali adottate da questo processore (riguardo ai modi d’indirizzamento, il tipo

d’istruzioni, l'I/O) sono derivate dal PDP-11, architettura innovativa e di riferimento degli anni '70. Il

processore 68000 è il capostipite di una famiglia di microprocessori prodotti dalla Motorola negli anni

’80 e ‘90. Questi processori, inizialmente utilizzati in sistemi di calcolo di tipo workstation, come i

"personal computer" della serie Apple Macintosh, trovano tuttora impiego in sistemi di controllo

numerico programmabili.

1 Architettura della sezione registri

Il 68000 costituisce una architettura di transizione fra quelle ad 8 bit dei primi microprocessori e

quelle a 32 bit dei successori: la memoria è indirizzata a byte, si intende per “word” una parola di 16

bit, pur essendo, in effetti, i registri a 32 bit (doppia word o longword).

La tabella 1.1 elenca i registri disponibili nella omonima sezione della architettura 68000. La figura

1.2 fornisce una immagine di tutti i registri del modello di programmazione.

Tabella 1.1 Registri di macchina del processore MC68000

Classi di registri Denominazione Parallelismo

PC 32 bit

Program Counter: D0-D7 32 bit

Accumulatori: A0-A7 32 bit

Indirizzamento: SP=A7 32 bit

Stack pointer: SR 16 bit

Stato: CCR 8 bit

Indicatori (Flag):

Il 68000 è dunque una macchina con 16 registri generali di 32 bit suddivisi in due banchi:

8 accumulatori detti "Data Register", D0-D7, che operano su dati di tipo byte (bit 0-7 del

- registro), word (bit 0-15), longword (0-31);

- 8 registri d’indirizzamento, detti "Address Register", A0-A7 (A7 svolge anche la funzione di

Stack Pointer, vedi in seguito).

Si noti che sia i registri D sia quelli A possono avere funzioni di registri-indice.

32 =4 Giga locazioni di

La macchina dispone di un Program Counter di 32 bit, atto ad indirizzare 2

memoria. In effetti, nelle prime versioni del processore si usavano solo 24 dei 32 bit.

2 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Figura 1.2 Modello di programmazione del processore MC68000

Il registro di stato della macchina è costituito da due byte (16 bit); quello di minor peso è anche detto

CCR (Condition Code Register) e contiene gli indicatori o flag (cfr. § F2-III-I.12.6):

C= Carry: segnala un riporto/prestito uscente dal bit di maggior peso in operazioni aritmetiche;

· V= oVerlow: overflow in rappresentazione in complementi;

· Z= Zero: dato nullo;

· N= Negative: dato negativo;

· X= eXtend: copia C in alcune istruzioni aritmetiche ed è usato per l’estensione ad aritmetica in

· precisione multipla.

Si noti che i significati attribuiti ai flag nella tabella di cui sopra sono quelli prevalenti, ma ogni

istruzione che agisca su di essi ne attribuisce di propri. In particolare, il flag C rappresenta il riporto

per le istruzioni aritmetiche e può rappresentare altri eventi per le altre; il flag X copia C per le

istruzioni aritmetiche, mentre resta inalterato per le altre: conserva dunque memoria del riporto

scaturito dall’ultima istruzione aritmetica eseguita. X rappresenta dunque la copia di C che il

processore usa in alcune istruzioni aritmetiche, mentre C, così come V, Z, N sono bit da interrogare

nelle istruzioni di salto condizionato.

Il byte alto di SR contiene bit che afferiscono alla gestione della macchina e precisamente:

· S= Stato: distingue lo stato utente da quello supervisore (cfr. § F2-III-I.12.6)

T= Trace: individua uno speciale stato di “trace”, nel quale la macchina sviluppa un

· programma evidenziandone l’avanzamento passo per passo;

I I I = maschera delle interruzioni: il sistema delle interruzioni è molto elementare e viene

· 2 1 0

ampliato attraverso apposite interfacce.

Si noti infine che esistono due distinti registri A7 che hanno funzioni di stack pointer (e si chiamano

dunque anche SP), uno per ciascuno stato della macchina. Nello stato utente la macchina fa

automaticamente riferimento allo stack-utente USP, in quello supervisore allo stack-supervisore SSP.

I registri speciali del 68000 sono dunque CCR, SR ed SP, tutti singolarmente indirizzabili da alcune

istruzioni. Nel seguito vengono usati i simboli di cui alla tabella 1.3 per indicare gli operandi delle

istruzioni Tabella 1.3 – Simboli adoperati per la semantica delle istruzioni

Simbolo significato

D D0-D7: un qualsiasi registro-dati

A A0-A7: un qualsiasi registro di indirizzamento

R un qualsiasi registro A oppure D

im Operando immediato

M Operando memoria

G Operando “generale”: a seconda dei modi, è un registro,

un operando-memoria o un operando-immediato

CCR registro dei flag

3 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

SR registro di stato

SP stack pointer

Si useranno notazioni analoghe a quelle di cui al § F2-III-III.5, con i simboli allineati a quelli tipici

dei manuali del 68000 (si usa solo R in luogo di X per motivi di chiarezza rispetto al testo).

2 Rappresentazione dei dati

I dati numerici sono rappresentati in aritmetica binaria e tipo intero, nelle due forme di numeri

naturali ("unsigned", senza segno) e di numeri relativi ("signed"): in questo secondo caso si adopera la

rappresentazione in complementi alla base (complementi a due). In particolare, si hanno i seguenti tipi

di dato, tutti nelle due forme di signed oppure unsigned:

intero binario a 8 bit (byte),

- intero binario a 16 bit (word)

-

- intero binario a 32 bit (long)

In alcune istruzioni sono previsti valori immediati allocati in un campo dell’istruzione (ad esempio,

negli ultimi 8 bit); anche in tali casi i numeri in gioco sono talora rappresentati in complementi a 2.

Oltre alla aritmetica binaria, esiste un'aritmetica decimale packed (su un singolo byte).

I caratteri sono rappresentati in ASCII su un byte.

3 Struttura delle istruzioni

Il 68000 possiede istruzioni di lunghezza variabile da uno a cinque parole: di queste, la prima

fornisce codice operativo, modo d’indirizzamento ed implicitamente la lunghezza della stessa

istruzione. Le parole successive contengono eventualmente, in base al modo di indirizzamento,

l'operando immediato e/o gli indirizzi degli operandi. Esistono molti formati distinti, che si possono

riassumere nello schema di fig. 3.1.

15 12 11 6 5 0 a)

op EA2 EA1

15 12 11 9 8 7 6 5 0 b)

op R r tipo EA

15 12 11 8 7 0 c)

op cc displacement

15 8 7 6 5 0 d)

op tipo EA

15 3 2 0 e)

op R

15 0 f)

op

op= codice operativo EA = Effective Address (cfr. § 4)

R =indirizzo di registro D oppure A r =il registro è origine o destinazione

tipo= tipo di operando (B,W,L) cc= codice di condizione

displacement =indirizzo di salto relativo

Figura 3.1 Formato delle istruzioni del 68000:

a) Istruzioni a 2 operandi G; b) 2 operandi, uno G e l’altro R;

c) salto condizionato;

d) istruzioni ad 1 operando-G; e) ad 1 operando-R; f) a 0 operandi,

Le istruzioni operano sul tipo byte (8 bit), word (16) o long (32 bit), così come specificato dal campo

tipo oppure implicitamente dal codice operativo.

È da notare che lo sforzo del progettista del 68000 è stato quello di compattare in un’unica word (16

4 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

bit), detta opcode word, il codice operativo e tutti gli indicatori essenziali: sono esclusi solo gli

operandi immediati ed assoluti, che seguono nelle word successive. Ciò ha richiesto un intenso

sfruttamento dei 16 bit disponibili, a scapito talora della linearità e regolarità dei campi.

Si ha dunque che per codici diversi, i medesimi campi hanno diverso significato ed inoltre molte

varianti esistono rispetto ai formati fondamentali della fig. 3.1. In particolare, oltre quanto espresso in

figura, spesso i bit del codice operativo spesso invadono campi diversi da quello specificamente ad esso

dedicato. Un approfondimento si trova in Formato delle istruzioni del 68000.

4 Modi di indirizzamento

I modi di indirizzamento del 68000 sono illustrati nella tabella 4.1, ove per ciascun modo sono

riportati la tecnica usata a livello macchina per individuare il modo, la notazione assembler e il

riferimento al capitolo del testo di Fondamenti II nel quale il modo stesso è illustrato in teoria.

Tabella 4.1: Modi di indirizzamento del 68000 Rif §

EA Assembler cap V

Notazione

m reg Esempio 3.3.1

Dn D3

Diretto di registro dati 0 num

Diretto di registro indirizzi 1 num An A4 3.4.1

Indiretto via reg. indirizzi 2 num (An) (A5)

Indiretto con 3 num (An)+ (A1)+

postincremento 4.3

Indiretto con predecremento 4 num -(An) -(A3)

Indiretto con displacement 4.1.2

5 num offset16(An) $54(A2)

(detto anche based) offset8(An, Rn) $30(A3,A6)

Indiretto con displacement e 4.2.1

6 num offset8(An, $50(A3,A6.L)

indice Rn.L)

7 0 addr16 $7124

Diretto di memoria 3.3.2

(assoluto) 7 1 addr32 $247124

Relativo a PC 7 2 offset16(PC) $8(PC) 4.1.3

Relativo a PC con displ. e 7 3 offset8(PC, Rn) $4E(PC,A3)

indice 3.2

Immediato 7 4 im $107E

In particolare, le prime due colonne indicano la tecnica usata a livello macchina: il modo di

indirizzamento è indicato esplicitamente in quelle istruzioni che prevedono il campo EA (classe a, b, d

di fig.3.1) ed è esplicitato attraverso due sottocampi di 3 bit l'uno:

§ m (codificato in ottale in figura) esprime un codice di modo:

§ reg che individua il registro indirizzato per m<7 (nei tre bit se ne indica allora l'indirizzo), specifica

ulteriormente il modo per m=7.

Si noti l'uso del displacement che qui viene anche detto offset. Esso può essere espresso attraverso

un numero relativo ad 8 bit (offset8) oppure a 16 (offset16), quantità che in ogni caso è immessa nella

parola che segue l'istruzione (si tratta infatti di un immediato). In particolare, nel modo “indiretto con

displacement” l'offset è di 16 bit ed occupa per intero la parola seguente; nel caso che vi sia anche

l'indice, l'offset è limitato ad 8 bit, ma nella parola che segue è anche immesso l'indice R e l'indicatore r

che lo riguarda.

La tecnica dell'indirizzamento relativo ad un indirizzo contenuto in un registro An è estesa nel

68000, per i modi "relativo a PC", sostituendo PC ad An; questa sostituzione è implicita in linguaggio

macchina, esplicita in assembler.

L'indirizzamento diretto a memoria avviene usando un indirizzo assoluto su 16 bit (address16)

oppure su 32: i due casi sono distinti in linguaggio macchina da un bit (num =0/1) in quanto nei due

casi l'indirizzo richiederà l'accesso a 1 oppure 2 parole successive. In assembler, non è necessaria la

distinzione: l'assemblatore traduce l'istruzione nella prima o nella seconda forma a seconda della

5 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

lunghezza effettiva dell'indirizzo espresso.

5 Linguaggio assemblativo

La programmazione di un processore non è mai effettuata direttamente nel linguaggio macchina. Si

ricorda che a ciascun linguaggio macchina è associato un linguaggio simbolico elementare, detto

linguaggio assemblativo oppure assembly, che costituisce il più elementare fra i linguaggi simbolici

(cfr. § F2-IV-VII.1).

In questo paragrafo si illustrano le caratteristiche essenziali del linguaggio assemblativo (per brevità,

indicato come ASM68K), definito dalla Motorola per l’intera famiglia di processori MC680x0, di cui il

68000 è il capostipite. Questo linguaggio è adottato dai sistemi di sviluppo prodotti sia dalla Motorola

che da terze parti.

Pur nella sua specificità, il linguaggio segue le linee generali di tutti i lin-guaggi assemblativi e

pertanto esso va studiato a valle della acquisizione di con-cetti e terminologie di carattere generale. Per

questi si rinvia ai libri di testo.

Solo a scopo riepilogativo, si ricorda in questa sede che:

· la traduzione da linguaggio assemblativo a linguaggio macchina è effettuata da un apposito

programma traduttore, detto assemblatore (si rimanda a Generalità su linguaggi assemblativi e

assemblatori per un opportuno approfondimento sulle tecniche adoperate dagli assemblatori);

in un linguaggio assemblativo le istruzioni del linguaggio macchina non perdono la loro

· individualità, ma ai codici operativi numerici sono sostituiti codici simbolici letterali, con

caratteristiche mnemoniche e gli operandi sono indicati con nomi simbolici;

alle istruzioni corrispondenti al linguaggio macchina, l’assembler aggiunge apposite dichiarazioni

· (dette anche direttive di assemblaggio), espresse attraverso appositi pseudocodici in luogo dei codici

operativi;

le direttive di assemblaggio consentono, tra le altre cose, di introdurre nomi simbolici, i quali

· vengono associati dal programma assemblatore ad indirizzi di macchina.

Il testo origine è strutturato come un file di testo, in cui ciascuna linea è una istruzione oppure una

· direttiva di assemblaggio (pseudo-istruzione). Questa soluzione è preferita in genere a soluzioni

tipiche di linguaggi ad alto livello ove il testo è una stringa di caratteri ed una istruzione si distingue

da un’altra mediante appositi separatori (ad esempio”;”).

Così come nei linguaggi ad alto livello, è importante potere inserire commenti in un programma;

· questi in generale possono essere aggiunti in coda ad una istruzione, sulla medesima linea, oppure in

apposite linee di commento.

Un assemblatore (come del resto un qualsiasi programma applicativo) è ”case-insensitive” se non

· distingue un carattere maiuscolo dal corrispondente minuscolo, case-sensitive altrimenti.

Nel linguaggio ASM68K istruzioni e direttive di assemblaggio sono strutturate in campi secondo il

[1] :

seguente formato

[Etichetta] CodiceOperativo [Operando1 [[,Operando2]…[,OperandoN]]] [Commento]

I campi sono separati da caratteri separatori (spazi bianchi o caratteri di tabulazione).

· L’etichetta è una sequenza di caratteri (priva di separatori, e di solito limitata in lunghezza ad 8

caratteri) che costituisce il nome dell’istruzione o della variabile introdotta mediante la

pseudo-istruzione. Essa è ovviamente opzionale e, laddove manchi, è necessario iniziare il rigo con

almeno un carattere separatore prima del codice operativo, affinché ASM68K possa distinguere il

codice operativo come tale e non confonderlo con una etichetta.

· Il codice operativo può essere o uno dei codici mnemonici associati alle istruzioni in linguaggio

macchina del processore, o uno pseudo-codice di una direttiva di assemblaggio (gli uni e gli altri

sono elencati in Codici e Pseudocodici).

· Al codice operativo può essere giustapposto uno dei suffissi .B (che indica byte, 8 bit), .W (word,

16 bit) o .L (longword, 32 bit). Questi sono infatti i tre tipi di dato che tratta il processore ed il

suffisso ne specifica, per i codici che lo richiedono, quello su cui il codice operativo deve operare.

Il tipo di dato fondamentale è word e quindi la mancanza di suffisso indica il tipo Word: p.e. il

codice ADD.B indica un'addizione fra byte, ADD oppure ADD.W una fra word.

· Il campo operandi contiene gli operandi dell’istruzione, che possono essere zero, uno, due o

6 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

[2]

più . Ciascun operando è un simbolo (p.e. 2, ALFA, pigreco, $27) o una espressione, (A+2,

è illustrata la sintassi e la semantica dei simboli

2*pigreco*r). In Simboli ed espressioni

dell'assemblatore.

· Il campo commenti è rappresentato dalla parte dell’istruzione che segue il campo operandi. Non è

necessario l’uso di un carattere speciale per delimitare l’inizio del campo commenti, in quanto

ASM68K controlla la sintassi della istruzione e “comprende” che qualsiasi carattere che la segua

nel rigo appartiene ad un commento. Il linguaggio consente anche di inserire nel testo intere linee

di commento: si usa allora il carattere iniziale ‘*’.

Nei paragrafi che seguono si descriveranno le istruzioni del repertorio di codici operativi del

processore Motorola 68000; nonché gli pseudocodici dichiarativi. In Codici e Pseudocodici sono invece

mostrate due tabelle che listano codici e pseudocodici e il riferimento ai paragrafi che li illustrano.

Prima ancora di addentrarci nello studio di dettaglio dei codici, si suggerisce di dare uno sguardo a

Programma introduttivo, che presenta un programma ASM68k.

7 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

6 Istruzioni di trasferimento dati

Le istruzioni di trasferimento dati si rifanno concettualmente alla (V.8.1: a:= b) e sono

genericamente dette di move (come in altri processori) e solo qualcuna di load. In tabella 6.1 sono

esemplificate le istruzioni in esame, suddivise nelle classi che seguono.

6.1 Move in generale

L'istruzione MOVE nella sua forma fondamentale si presenta come:

MOVE G1,G2

nel significato G2:= G1, coerentemente con il fatto che in ASM68K il secondo operando è sempre quello

destinazione (contrariamente ad altri assembler).

L'istruzione è praticamente ortogonale: G1 e G2 corrispondono a livello di linguaggio macchina,

rispettivamente a EA1, EA2 con il modo di EA1 praticamente qualsiasi (qui e nel seguito non si

pongono in evidenza alcuni limiti di dettaglio, per i quali si rinvia ai manuali) e quello di EA2 che

esclude soltanto quello immediato (non potrebbe essere altrimenti!), quello relativo a PC ed il diretto a

registro A (esiste in proposito altra istruzione, MOVEA).

A questa classe appartiene anche un'altra istruzione, detta Move Quickly in quanto più veloce:

MOVEQ im, D

per la quale l'immediato è posto negli ultimi 8 bit dell'istruzione e la destinazione è un registro D: essa sostit

utilmente una MOVE con operando-origine immediato esprimibile su 8 bit.

6.2 Clear e Set

L’istruzione di Clear (codice operativo CLR) è un’istruzione di azzeramento di un operando

generale:

CLR G

nel significato G:= 0.

Una istruzione particolare di set condizionato

Scc G

pone G=0 oppure G=<tutti 1> a seconda del valore dei flag: essa sarà più chiara in seguito, quando sarà sp

l'istruzione di salto condizionato Bcc (cfr. § 9.2).

Non esistono codici semplici per set/clear di bit singoli. ma solo istruzioni che azzerano (BCLR),

pongono ad 1 (BSET) o complementano (BCHG) un bit opportunamente specificato, dopo che su tale

bit sia stato fatto un test: tali istruzioni saranno illustrate in seguito (cfr. § 8.1.2).

6.3 Move e load verso registri di indirizzamento

Una particolare classe di istruzioni è dedicata agli operandi di tipo "indirizzo", tipicamente trattati

nei registri A. In particolare la move è:

MOVEA G,A

che differisce da MOVE solo per il registri-destinazione (nel move non poteva essere di tipo A, qui lo

[3]

necessariamente) ed inoltre perché non altera i flag.

Una logica diversa sottende l'istruzione

LEA M,A

che sposta in A l'indirizzo (e non il contenuto) di M, costruito nella fase di preparazione dell'operando. M è

espresso come un generico operando di tipo G, ma ha il vincolo che deve essere di tipo memoria (sono esclusi i

modi diretto a registri, immediato e relativo al PC).

6.4 Move per registri speciali

Per quanto attiene al caricamento di registri speciali, esistono appositi codici di macchina che

gestiscono il transito verso/da CCR, SR, SP. A livello assembler si usa sempre il codice MOVE,

specificando il nome del registro speciale che ne è un operando:

MOVE G,SR

-

8 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

- MOVE G,CCR

- MOVE A, SP

MOVE SR,G

-

- MOVE SP,A

9 of 32 25/01/2007 22.10

Architettura, linguaggio macchina e assembler 68000 file:///C:/Documents%20and%20Settings/BaRoN%20SaMeDi/Docum...

Tabella 6.1 Istruzioni di trasferimento dati flag

OP Formato Struttura Semantica Note

XNZVC

Move in generale MOVE a MOVE Ga,Gb Gb:=Ga -xx00

MOVEQ c3 MOVEQ im,D D:=im -xx00

Clear CLR d CLR G G:=0 -100

Scc b6 Scc G if (cc) G:="tutti 1" else G:00 G è byte - cfr. tabella

-----

Set/clear condizionato

Move verso registri A MOVEA a MOVE G,A A:=G e non modifica i flag -----

LEA b3 LEA M,A A:=indirizzo di M -----

Da/verso registri speciali MOVE G,SR SR:=G xxxxx

MOVE SR,G G:=SR

d1 -----

MOVE

operando= MOVE G,CCR CCR:=G xxxxx

reg. spec. MOVE SP,A A:=SP -----

e MOVE A,SP SP:=A -----

Operazioni su stack PEA d1 PEA M pushm(SP,ind. di M) -----

Scambi EXG c2 EXG Ra,Rb Rb :=: Ra -----

SWAP e SWAP D scambia word in D -xx00

10 of 32 25/01/2007 22.10


ACQUISTATO

2 volte

PAGINE

469

PESO

2.62 MB

AUTORE

Sara F

PUBBLICATO

+1 anno fa


DETTAGLI
Corso di laurea: Corso di laurea in ingegneria informatica
SSD:
A.A.: 2013-2014

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Sara F di informazioni apprese con la frequenza delle lezioni di Architetture Sistemi Elaborazione e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Napoli Federico II - Unina o del prof Fadini Bruno.

Acquista con carta o conto PayPal

Scarica il file tutte le volte che vuoi

Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato

Recensioni
Ti è piaciuto questo appunto? Valutalo!

Altri appunti di Architetture sistemi elaborazione

Architetture Sistemi Elaborazione – Interruzioni
Dispensa
Architetture Sistemi Elaborazione   - Sommatori ASE
Dispensa
Architetture Sistemi Elaborazione -  Moltiplicatori sequenziali unsigned
Dispensa
Architetture Sistemi Elaborazione – Intel
Dispensa