Che materia stai cercando?

Anteprima

ESTRATTO DOCUMENTO

Quelli appartenenti alla seconda vengono usati per campionare i segnali in ingresso durante il fronte

di salita del clock, ovvero quando passa da 0 a1.

In fine esistono i Flip-Flop di Tipo D che tramite l’utilizzo di due linee in ingresso (segnale in

ingresso e clock) e due in uscita (valore in uscita e il suo complemento) memorizzano in memoria il

dato presente in ingresso quando il valore di clock è affermato (Flip-Flop aperto). Per la durata di

tempo uno dei valori in uscita sarà identico al valore in ingresso, salvo poi stabilizzarsi sull’ultimo

dato entrato prima della non affermazione del clock (Flip-Flop chiuso), mentre il secondo valore in

uscita è complementare al primo. Flip flop di tipo d

Sui primi 3 tipi di Flip-Flop, quindi, il valore può cambiare solo in corrispondenza di un fronte di

clock in base alla costruzione del Flip-Flop stesso. Nel caso del Tipo D invece, poiché l'ingresso D è

campionato ad ogni fronte del clock, deve rimanere valido in un opportuno intervallo di tempo

immediatamente prima ed immediatamente dopo il fronte del clock. Il tempo minimo per cui

l'ingresso deve rimanere valido prima del fronte del clock è detto tempo di set-up (tempo di

preparazione), mentre il tempo minimo per cui deve rimanere valido dopo il fronte del clock è detto

tempo di hold (tempo di mantenimento). Registri

Un registro è unapiccola parte di memoria utilizzata per velocizzare l’esecuzione dei programmi

fornendo un accesso rapido ai valori usati più frequentemente. 1

9

La struttura intorno alla quale è costruita l'unità di elaborazione è il register file. È formato da un

insieme di registri che possono essere letti o scritti fornendo il numero del registro a cui fare

accesso. Un register file può essere realizzato mediante un decodificatore per ciascuna porta di

lettura o scrittura ed una matrice di registri costruiti a partire da flip-flop di tipo D. La lettura di un

registro non ne modifica lo stato, quindi occorre solo fornire in ingresso il numero del registro ed in

uscita si otterrà il dato contenuto nel registro. Per una scrittura in un registro sono invece richiesti

tre ingressi: il numero di registro, il dato da scrivere ed un segnale di clock che controlli

l'operazione di scrittura.

Le porte in lettura si possono implementare con due multiplexer di ampiezza pari al numero di bit

nel register file. La porta in scrittura può invece venire implementata usando un decodificatore per

generare un segnale in grado di determinare in quale registro scrivere, in quanto è concesso

modificare solo il contenuto del registro designato.

Un registro con caricamento parallelo e shift si può realizzare a partire da Flip Flop di tipo D e

collegamenti di multiplazione le cui linee dati sono controllate da segnali LOAD e SHIFT. Quando

le

linee LOAD e SHIFT sono entrambe a 0 o il clock è 0, i Flip Flop conservano i valori in memoria.

Quando LOAD e Clock sono a 1 e SHIFT è a 0 il valore in ingresso viene memorizzato nei Flip

Flop. Quando invece LOAD è 0 e SHIFT e CLOCK hanno valore 1 i bit in uscita vengono shiftati

(Y1= yin) e conservati resettando lo switch

RAM (random access memory)

La RAM (Random Access Memory – Memoria ad Accesso Casuale) è la memoria principale lavoro

del computer dove vengono mandati in esecuzione i programmi e vengono elaborati i dati. È molto

più veloce da leggere e scrivere rispetto ad altri dispositivi di archiviazione e una sua parte può

essere inclusa direttamente nella scheda madre, anche se più spesso è presente sotto forma di

moduli intercambiabili che ne permettono l'ampliamento. È una memoria volatile, ovvero i dati

2

0

vengono mantenuti solo fin tanto ché rimane applicata una tensione al modulo; le informazioni,

sotto forma di 0 o 1 logici, possono essere scritte e lette. Consiste di 212 registri a 21 bit, divisi in

MBR (Memory Buffer Register) e MAR (Memory Address Register). La prima è data da registri a

21 bit dei dati di memoria e contiene i dati da leggere/scrivere. La seconda è data da registri a 12 bit

che contengono gli indirizzi delle celle di memoria da cui bisogna leggere/scrivere

Dettagli di Lettura/Scrittura RAM

La RAM viene utilizzata principalmente per poter leggere e scrivere il contenuto di una locazione

specifica dell’indirizzo MAR dal/nel MBR ed è formata da un registro MAR collegato a un

decodificatore le cui linee di uscita attivano sequenze di Flip-Flop. Quando il CLOCK e la READ

sono uno, l’OR delle uscite dei Flip Flop i-esimi dei registri RAM, prese in AND con le

corrispondenti linee di uscita dal decodificatore viene calcolato in ingresso al Flip-Flop i-esimo del

MBR. Poiché solo una

coppia di linee (di uscita) dal decodificatore è ad uno, il bit i-esimo della parola di memoria

selezionata dall’indirizzo in MAR viene scritto nella cella i-esima del MBR (per ogni i). Quando il

CLOCK e la WRITE sono uno, il bit i-esimo del MBR viene passato in ingresso al Flip-Flop set-

reset i del registro RAM selezionato (in forma s=1, r=0 se Yi ed s=0, r=1 altrimenti) attraverso

collegamenti AND attivati dall’unica linea superiore ad uno dal decodificatore.

ALU (arithmetical logic unit)

L'Arithmetical-Logic Unit è un processore digitale preposto all'esecuzione di operazioni aritmetiche

o logiche su numeri interi. Per le operazioni in virgola mobile, essendo più complesse, esiste

un'unità dedicata chiamata Floating Point Unit (FPU). Infatti la rappresentazione in virgola mobile è

molto più complessa della rappresentazione a complemento a due utilizzata tipicamente dalle ALU,

proprio per questo le FPU tendono ad essere molto più articolati delle ALU includendo circuiti

molto più complessi. Aritmetica Binaria

L'aritmetica binaria utilizza le stesse regole dell'aritmetica decimale, con l'unica accortezza di

ricordare che la base di numerazione è 2. 2

1

 Somma

Consideriamo il numero 1310 = (1101)2 e il numero 710 = (0111)2; sommandoli otteniamo:

1101+ 0111 = 10100

in quanto 1+1 = 102, ovvero 0 con riporto di 1, 1+1+1 = 112, ovvero 1 con riporto di 1, e così via.

 Sottrazione

1101- 0111 = 0110 13- 7 = 6

Vale lo stesso principio della somma, con l'ovvia differenza che stavolta si tratta di sottrarre i valori.

Quindi otteniamo, ad esempio, che 102 -1 = 1, ovvero che come nell'aritmetica a base 10 si possa

dover ricorrere alla cifra immediatamente più a sinistra per completare l'operazione. C’è un caso

particolare al quale bisogna fare attenzione, ovvero quando il numero delle cifre non permette di

rappresentare il risultato: in questo caso si verifica il fenomeno dell’overflow nella propagazione

del riporto. Infatti se si considerano due numeri interi senza segno rappresentati su n bit, si verifica

n

la condizione di overflow ogni volta che il risultato supera 2 -1. Il Calcolatore non è in grado di

prevenire un errore di Overflow, in quanto può venire individuato solo dopo aver effettuato

l’operazione.

Supponiamo di voler effettuare la somma 71+60=131 in complemento a 2 su 8bit (=[-128,+127]). Il

risultato della somma non è contenuto nel range di valori ottenibili, quindi verrà generato un errore

di Overflow. La condizione di overflow si ha quando il risultato di un calcolo intero è un numero

che in binario occupa più bit di quelli a disposizione, di conseguenza ne viene troncata la parte più

significativa generando un risultato errato.

 Moltiplicazione

La moltiplicazione avviene come quella in decimale, ma sommando i risultati in forma binaria.

1101 * 0111= 1101 + 11010 + 110100 + 0000000= 1011011

 Divisione

Ancora una volta, la tecnica è identica alla divisione in base 10 e può essere eseguita contando

quante volte un numero può essere sottratto da un altro. Il risultato è detto quoziente. In realtà

2

2

questa operazione viene eseguita nei calcolatori elettronici per sottrazioni ripetute utilizzando il

metodo del complemento a 2. Celle Addizionatrici

Una cella addizionatrice è un modulo combinatorio con tre ingressi e due uscite che opera sui bit

omologhi di due parole binarie di n bit e su un bit di riporto, producendo in uscita un bit di somma e

uno di riporto. Quindi ogni coppia di parole viene analizzata bit per bit sommando di volta in volta i

bit in posizione i-esima e tenendo conto del riporto dell'operazione precedente.

Le celle addizionatrici sono componenti base per costruire un circuito che realizzi la somma di due

parole binarie che codifichino interi in complemento a 2.

Semplificazione di forme SOP per una cella addizionatrice 2

3

Espressioni semplificate della cella addizionatrice:

• Seriali: si possono ottenere moduli addizionatori sulle parole con propagazione seriale

dei riporti;

• Parallele: ove vi è un modulo che calcola direttamente i riporti ci, dati il riporto iniziale

c0 ed i bit ai e bi delle parole a e b da somma. Una cella addizionatrice è alla base della

progettazione ALU, facilmente interagibile con altre operazioni, controllabili attraverso

collegamenti di multiplazione.

Operazioni effettuate dai circuiti ALU

Moltiplicazione: Il circuito moltiplicatore consiste di un registro prodotto inizializzato nei suoi LSB

(Least Significant Bit, bit con peso minore) con il moltiplicatore, un registro complicando ed un

sommatore, comandati dall'unità di controllo.

Divisione: viene eseguita testando se il divisore è contenuto 0/1 volte nei resti parziali via via che si

2

4

procede nell'operazione. Il test di contenimento può essere effettuato sottraendo dal resto parziale il

divisore: se il risultato è uno allora il bit di quoziente è uno, altrimenti zero. Il circuito divisore

consiste di un registro resto/quoziente inizializzato con il dividendo, un registro divisore ed un

sommatore comandati dall'unità di controllo.

INTRODUZIONE ARCHITETTURA DI VON NEUMANN

L'architettura di Von Neumann è formata da 4 elementi base: CPU, Memoria, Bus di sistema e

periferiche di I/O. In questa architettura i bus di sistema hanno il compito di fornire la capacità di

comunicare a tutti gli altri elementi, le periferiche, come abbiamo già visto, permettono l'interazione

con l'utente, la memoria RAM (Random Access Memory) ospita i dati che devono, stanno venendo

e saranno elaborati e la CPU si occupa dell'elaborazione.

La CPU (Central Processing Unit) si compone di 5 elementi fondamentali:

1. C.U. (Unità diControllo)

2. A.L.U. (UnitàAritmetico-Logica)

3. Registri diMemoria

4. F.P.U. (Floating PointUnit)

5. P.C. (ProgramCounter)

L'Unità di Controllo legge le istruzioni del programma in esecuzione dai registri di memoria,

2

5

determinandone quale sarà la prossima azione da eseguire e inviando di conseguenza segnali

all'A.L.U. o ai BUS affinché vengano eseguite le operazioni richieste. Terminate queste operazioni,

i dati elaborati vengono scritti nuovamente nei registri. Gli unici dati su cui la CPU può lavorare

sono quelli contenuti nei registri, che sono proprio per questo la tipologia di memoria più veloce nel

calcolatore, per quanto di dimensioni ridotte, se paragonata alla memoria RAM o a un dispositivo di

archiviazione. La F.P.U. è l'unità dicalcolo per i valori in virgola mobile e il P.C. contiene l'indirizzo

di

memoria della prossima istruzione da eseguire. Il clock di sistema è un orologio che è in grado di

inviare segnali elettrici scandendo la frequenza di lavoro del sistema. È necessario anche per la

corretta sincronizzazione di tutti gli elementi del sistema stesso.

La memoria si differenzia in due categorie fondamentali: la Memoria ad Accesso Casuale e la

Memoria ad Accesso Sequenziale. La prima categoria include HardDisk, RAM, CD, DVD, Pen-

drivee così via, e si basa sul principio della disposizione dei dati in maniera casuale nello spazio

fisico, di modo da poter accedere ai dati alla stessa velocità indipendentemente dalla loro

collocazione. Ovviamente il dispositivo tiene traccia in un'apposita struttura dati degli indirizzi

dimemoria dei dati su cui lavora; in questo modo, nota la posizione dei dati, diventa facile

accedervi. La memoria ad accesso sequenziale comprende nastri magnetici e bobine e dè tanto più

veloce tanto più i dati sono scritti vicino al punto di lettura, ma diventa lenta manmano che ci si

allontana da esso.

Una seconda divisione che si può fare per lememorie è in base all'utilizzo che se ne fa o in base alle

caratteristiche fisiche: abbiamo infatti la Memoria Centrale (RAM e ROM) e la Memoria di Massa

(Hard Disk, Floppy, Pen-Drive, CD, DVD) oppure la divisione in memorie magnetiche (ovvero

dispositivi che polarizzano il materiale ferro-magnetico di cui è composto il supporto, come un hard

disk, per conservare le informazioni) e le memorie ottiche (che vengono lette e scritte tramite

l'utilizzo di un laser).

La Memoria ROM (Read-OnlyMemory) è una memoria in sola lettura contenente il BIOS (Basic

Input Output System) del calcolatore, ovvero il software che cerca il Sistema Operativo nella

memoria di massa del calcolatore e lo carica in RAM, rendendo così possibile l'avvio del sistema

operativo stesso.

La Memoria RAM è una tipologia di memoria volatile ad accesso casuale. I dati quindi vengono

conservati solo fintanto che permane una tensione elettrica attraverso i moduli di memoria.

Le memorie Cache sono dispositivi di memorizzazione ultra-veloci. Hanno capacità limitate di

immagazzinare dati e sono usate nelle fasi relative all'elaborazione-esecuzione di un dato o gruppo

di dati. Sono memorie temporanee che accolgono i dati prima di essere elaborati velocizzando così

il processo.

Il Registro di indirizzo (MAR) a 12 bit contiene l’indirizzo che indica la locazione di memoria da

leggere o scrivere, mentre il registro buffer di memoria (MBR) di 21 bit contiene i dati, le istruzioni

o gli indirizzi da leggere o scrivere in memoria. 2

6

I vari moduli funzionali (CPU, RAM, unità di I/O) sono collegati attraverso speciali linee di

comunicazione, i BUS. Un Bus consiste di diverse linee di ingresso e uscita che possono essere

attivate o disattivate dai segnali di controllo inviati dalla CU, permettendo così la trasmissione dei

dati. I Bus possono essere di 3 tipi: di interruzione i-Bus (trasmette un segnare OR dei flags, se il

valore è 1 esiste un'unità che richiede un trasferimento dati alla CPU), di stat of-Bus (segnala lo

stato di unità alla CPU quando il selettore riconosce che è stata selezionata da una richiesta) e di

comando c-Bus (trasmette al decodificatore di comandi i segnali di CU generati in funzione del

codice operativo diiscrizione).

Le periferiche I/O sono connesse ai bus tramite apposite interfacce e possono essere:

• Periferiche di Input: permettono di inserire dati nel calcolatore (mouse, tastiera).

• Periferiche di Output: permettono di visualizzare i dati in uscita dal calcolatore (monitor,

stampante).

• Periferiche di Input/Output: permettono sia di inserire sia di ricevere dati (monitor touch

screen, stampante multifunzione).

Le componenti di un’unità I/O sono:

• il selettore di unità, che abilita l'esecuzione dell'operazione quando riconosce che

l'istruzione lo richiede; il riconoscimento avviene tramite un indirizzo specificato nei bit

meno significativi dell'istruzione che richiede ilservizio;

• il decodificatore di comandi, che interpreta l'operazione richiesta dalla CPU, ovvero

riceve i segnali di controllo generati dalla CU;

• il Data Buffer, che è un registro utilizzato dal dispositivo I/O per leggere e/o scrivere

dati;

• il flag di unità, che segnala alla CPU quando l'unità I/O è abilitata ad effettuare un

trasferimento dati tra RAM e Data Buffer.

Cenni di Multiprogrammazione

In un sistema di calcolo che supporta la multiprogrammazione l'insieme dei processi muta in

funzione dell'esecuzione del “ciclo di vita” di ogni singolo processo. Ogni “fase” di questo ciclo di

vita è uno stato del processo.

Un processo può vertere in uno di questi stati base:

• NEW – il processo viene creato o inizializzato

• READY - il processo è pronto per essere eseguito

• RUNNING – il processo è in esecuzione

• WAITING – il processo è sospeso in attesa di un altro evento 2

7

• HALTED – il processo termina la sua esecuzione

Alla creazione del processo, questi è nello stato NEW. Quando viene dichiarato pronto per

l'esecuzione, il processo passa da NEW a READY. Attraverso i moduli del sistema operativo, lo

scheduler e il dispatcher, passa così allo stato di RUNNING e se nel tempo che gli viene concesso

riesce ad eseguire tutte le sue istruzioni passa allo stato HALTED, altrimenti se esaurisce il tempo o

necessita, ad esempio, di un input, passa allo stato WAITING. Quando il processo è pronto per

riprendere la sua esecuzione torna nello stato READY, dove può poi ritornare al RUNNING,

riprendendo dal punto di interruzione e continuando così questo ciclo fino al naturale termine

dell'esecuzione (HALTED), dove la memoria occupata dal processo viene liberata.

Il sistema è realizzato col fine di eseguire programmi, ovvero sequenze finite di istruzioni volte alla

risoluzione di un problema

Classificazione delle istruzioni SEC-XR

Nell'architettura SEC-XR le istruzioni hanno un formato standard: i primi bit formano il codice

operativo volto ad identificare l'istruzione, seguiti dal registro dell'indice dei dati e dall'indirizzo in

memoria in cui si andrà a lavorare.

Abbiamo 4 tipi di istruzioni:

• aritmetico-logiche: realizzano operazioni di calcolo sui dati contenuti in RAM e registry

di CPU

• accesso alla memoria: consentono di trasferire dati tra registri di CPU e RAM

• controllo di flusso: permettono di rendere non lineare l'esecuzione delle istruzioni di un

programma

• input/output: consentono di assumere dati in ingresso e produrre dati in uscita

Vediamole ora più dettagliatamente:

Aritmetico/logiche:

• ENT,0,Y - carica il dato all'indirizzo Y nell'accumulatore (A←0Y);

• ADD,0,Y – somma il contenuto dell'indirizzo di memoria Y con l'accumulatore,

salvando il risultato nell'accumulatore (A←A+M(Y));

• SUB,0,Y – come ADD, ma viene fatta un'operazioni di sottrazione sull'accumulatore

(A←A- M(Y));

• MULT,0,Y – moltiplica il contenuto dell'accumulatore con il valore di indirizzo Y (A ←

A*M(Y));

• DIV,0,Y – divide il contenuto dell'accumulatore con il valore di indirizzo Y

(A←A/M(Y)); 2

8

• ALS,0,Y –shift di una posizione a sinistra del valore

contenuto nell'accumulatore (A ← A*2);

• ARS,0,Y - shift di una posizione a destra del valore contenuto nell'accumulatore

(A←[A/2]);

• NEG,-,- - cambia il segno del dato contenuto nell'accumulatore (A ← -A). Accesso alla

Memoria

• LDA,0,Y – carica il contenuto della posizione di indirizzo Y nell'accumulatore

(A←M(Y));

• STA,0,Y – carica il contenuto dell'accumulatore in RAM all'indirizzo Y(M(Y) ←A).

Controllo di Flusso

• JUMP,0,Y – esegue l'istruzione del programma corrente all'indirizzo Y (salto

condizionato: PC

• ← Y);

• JZA,0,Y–comeJUMP,ma solo se l'accumulatore contiene “0” (salto condizionato:

IFA=0PC ← Y);

• JPA,0,Y – come JUMP, ma solo se l'accumulatore contiene un valore maggiore di 0

(salto condizionato: IF A>0 PC ←-1);

• JNA,0,Y – come JUMP, ma solo se l'accumulatore contiene un valore minore di 0 (salto

condizionato: IF A<0 PC ←-1);

• HLT,0,0 – arresto dell'elaborazione (PC ←-1).

• Set di Istruzioni RAM

• LOAD – carica dalla memoria in accumulatore (R0) STORE – salva il contenuto di R0

in memoria

• ADD, SUB, MULT, DIV – operazioni di somma, sottrazione, moltiplicazione e divisione

• READ – legge un dato in input WRITE – scrive un dato in output JUMP –

salto non condizionato

• JGTZ – salto se l'accumulatore contiene un valore maggiore di “0” JZERO – salto

se l'accumulatore contiene il valore“0”

• HALT – termine del programma

Microsequenze

L’esecuzione di istruzioni di programma comporta una sequenza di trasferimenti di informazioni tra

gli elementi di memoria. Le specifiche delle attività identificabili, a livello hardware, che realizzano

tali trasferimenti/elaborazioni di informazioni sono dette microsequenze.

L'esecuzione si realizza in due fasi: fetch e execute. Nella fase FETCH l'istruzione indicata dal

2

9

Program Counter viene importata dalla ram e in quella EXECUTE viene eseguita. Mentre la prima

è identica per ogni tipo di istruzione, la seconda varia in funzione dell'istruzione stessa.

La fase FETCH si sviluppa a sua volta in due momenti: nel primo l'indirizzo contenuto nel P.C.

viene posto nel bus indirizzi permettendo alla CPU di identificare la cella di memoria

contenente l'istruzione da eseguire; nel secondo i dati vengono inseriti nel bus e trasferiti nel

Registro Istruzioni della CPU (I.R.). Il decodificatore di istruzioni provvede alla decodifica

permettendo alla logica di controllo di generare i segnali necessari per eseguire effettivamente

l'istruzione. Durante questa fase il contenuto del P.C. viene aggiornato per passare all’istruzione

successiva. Questa pratica viene chiamata Address Modification e consente alle istruzioni (con

codice operativo LDA, STA, ADD, SUB, MUL e DIV) di indicizzare gli indirizzi di memoria

attraverso i contenuti dei registri R0-R7 (per default il contenuto di R0 è sempre 0).

Architettura MIPS

Un’architettura di tipo differente, che più si adatta a descrivere i modelli di architetture attuali, è

un’architettura di tipo MIPS. L’architettura MIPS

(Microprocessor without Interlocked Pipeline Stages) viene progettata nei prim ianni ’80 e prodotta

da MIPS Technologies negli anni’90. Mentre l’architettura di Von Neumann era formata da 8

registri di CPU, l’architettura MIPS ha 32 registri di CPU da 32 bit e come per l’architettura vista in

precedenza il registro zero contiene sempre 0. Per denotare i registri si usano nomi simbolici

preceduti da $. Alcuni registri sono riservati: 3

0

I registri della RAM dell’architettura MIPS sono formati da 32 bit per l’indirizzo del registro e 32

bit (4 byte contigui) per i dati. Inoltre supporta la codifica in virgola mobile con singola e doppia

precisione (rispettivamente 32 bit e 64 bit). Ulteriore differenza con l’architettura semplificata è che

supporta molte più istruzioni, divise in tre formati.

Istruzioni in formato R

Formato per le operazioni algebriche R:

• add $1, $2, $3 – somma il contenuto dei registri 2 e 3 e salva il risultato nel registro 1;

• sub $1, $2, $3 – sottrae il contenuto del registro 3 dal contenuto del registro 2 e salva il

risultato nel registro 1;

• slt $1, $2, $3 – predispone un salto condizionato settando il registro 1 se il contenuto del

registro 2 è minore del contenuto del registro 3, altrimenti effettua il reset del registro 1.

Istruzioni in formato I

• Formato per le istruzioni di salto condizionato e di trasferimento dati dalla RAM e dai

registri CPU. I dati a 32 bit sono divisi in 4 campi:

• lw $1, 100($2) – (load word) salva il contenuto della locazione di memoria di indirizzo

100+

• $2 nel registro 1;

• sw $1, 100($2) – (store word) salva il contenuto del registro 1 nella locazione di

memoria di indirizzo 100 +$2;

• beq $1, $2, L – salta all’istruzione con etichetta L se I contenti dei registry 1 e 2 sono

uguali;

• bne $1 , $2, L – salta all’istruzione con etichetta L se I contenuti dei registry 1 e 2 sono

distinti.

Istruzioni in formato J

Formato per le istruzioni di salto non condizionato. I dati a 32 bit sono divisi in 2 soli campi:

-- OP;

-- ADDRESS. Esempi di Istruzioni 3

1

Formato R

add $1,$2,$3

Salva nel registro 1 la somma dei contenuti dei registri 2 e 3.

mul $1,$2,$3

Salva nel registro 1 il prodotto dei contenuti dei registri 2 e 3.

Formato I

beq $1,$2,L1

Va all'istruzione con etichetta L1 se i contenuti dei registri 2 e 3 sono uguali.

bne $1,$2,L1

Va all'istruzione con etichetta L1 se i contenuti dei registri 2 e 3 sono diversi.

Formato J

j L

Salta all'istruzione con etichetta L.

Allocazione di Memoria

La memoria di un programma MIPS viene suddivisa in segmenti, ognuno dei quali viene utilizzato

per un particolare scopo. Quelli principali sono:

I. segmento testa: è collocato nella zona inferiore, contiene I codici dei programmi

II. segmento dati: contiene i dati globali dei programmi ed è suddiviso in dati statici, contenenti

strutture dati e dati dinamici, allocati durante l'esecuzione

III. segmento stack: è collocato nella zona superiore e contiene i dati locali delle funzioni 3

2

Le dimensioni delle aree di memoria riservate ai dati dinamici posso arrivare a occupare tutto lo

spazio libero, motivo per cui è difficile dimensionarle a priori.

Convenzioni di Utilizzo dei Registri

Le convenzioni sull'utilizzo dei registri sono seguite (e definite) dai programmatori di comune

accordo, con lo scopo di standardizzare nomi e funzioni attribuiti a determinati registri:

• I registri $at($1), $k0($26) e $k1($27) sono riservati all’ assemblatore ed al sistema

operativo e non andrebbero mai usati dai programmi

• I registri $a0-$a3($4-$7) sono usati per passare fino a quattro argomenti ad un

sottoprogramma

• I registri $v0 e $v1 ($2 e $3) sono usati per restituire argomenti al programma chiamante

• I registri $t0-$t9 ($8-$15 ed $24-$25) sono di salvataggio temporaneo

• I registri$s0-$s7 ($16e$23) sono di salvataggio permanente e servono per memorizzare

dati la cui vita non èlimitata

• Il registro $gp ($28) è un puntatore globale che fa riferimento ad un blocco di memoria

da 64 K

• Il registro $sp ($29) è il puntatore allo stack e fa riferimento alla prima cella libera

• Il registro $fp ($30) è il puntatore all’ area di attivazione di procedura

• Il registro $ra ($31) viene aggiornato in modo da contenere l’indirizzo di rientro

I/O MIPS

Il programma MIPS accede a due unità di ingresso uscita, un’unità di ricezione che legge i caratteri

introdotti da tastiera ed una di trasmissione che scrive caratteri sullo schermo. Le operazioni di

ingresso/uscita sono gestite dal sistema operativo i cui contenuti sono allocati in memoria

principale. Attraverso l’utilizzo di un programma si possono leggere i caratteri inseriti dall’utente e

visualizzare eventuali uscite sulla finestra di console. Si usano chiamate di sistema (syscall) per

scrivere su o leggere da console. Il programma deve caricare il codice della chiamata di sistema nel

registro $v0 e gli argomenti nei registri $a0-$a3. Le chiamate di sistema che forniscono un valore in

uscita mettono il risultato in $v0, e se si usano le chiamate di sistema occorre disabilitare l’opzione

3

3

mapped I/O. Esempio di traduzione Assembler MIPS

Procedura in C:

int power (int base, int

n) { int i, p;

i = 0; p = 1;

while (i < n) {

p = p *

base; i = i

+ 1;

}

}

Procedura in Assembler

Assumiamo: $a0 = base; $a1 = n; $t0 = i;

$t1 = flag; $s0 = p

Salvataggio registri: 3

4

sub $sp, $sp, 12

sw $s0, 0($sp)

sw $t1, 4($sp)

sw $t0, 8($sp)

add $t0, $0, $0

addi $s0, $0, 1

Corpo del programma:

LOOP:

slt $t1, $t0, $a1 # i >= n esco dal ciclo

beq $t1, $0, EXIT

mul $s0, $s0, $a0

# p = p * base;

addi $t0, $t0, 1 # i = i + 1;

j LOOP

EXIT:

add $v0, $s0, $0 # p nel registro di ritorno

lw $s0, 0($sp)

# ripristino dei registri l w $t1, 4($sp) lw

$t0, 8($sp) add

$sp, $sp, 12 jr,

$ra Planimetria MIPS

La planimetria MIPS consiste di PC, memoria istruzioni, ALU, CU (separata dall'ALU), banco

registri e memoria dati.

L’istruzione [31-26] è l’input della CU e rappresenta il campo a 6 bit che contiene il codice

operativo.

L’istruzione [25-21] rappresenta il registro sorgente RS per le istruzioni in formato R e per le

istruzioni beq (branch on equal) e sw (store word) e rappresenta il registro di base per le istruzioni

lw (load word) e sw.

L’istruzione [20-16] rappresenta il registro sorgente RT per le istruzioni in formato R e per le

3

5

istruzioni beq e sw e, inoltre, rappresenta il registro destinazione dell’istruzione lw.

L’istruzione [15-11] rappresenta il registro destinazione RD per le istruzioni in formato R.

L’istruzione [15-0] rappresenta l’offset per le istruzioni beq, lw e sw. L’offset è detto anche

spaziamento ed è dato dalla costante nell’istruzione di trasferimento moltiplicata per quattro (ciò

perché nell’architettura MIPS vige il vincolo di allineamento: le parole devono iniziare con indirizzi

multipli di quattro). Per ottenere l’indirizzo al byte, l’offset va sommato al registro di base.

Gli output della CU sono divisi in segnali per controllare i multiplexer (RegDst, MemtoReg,

ALUSrc), segnali che controllano la scrittura e la lettura (MemRead, MemWrite, RegWrite), il

segnale di controllo per i salti condizionati (Branch) ed il segnale di controllo per l’ALU (ALUop,

che indica se l’operazione da eseguire è una somma, una sottrazione oppure se deve essere

determinata dal contenuto del campo funzione).

Il segnale di controllo PCSRC è l’input di un multiplexer, che determina da dove prendere il

successivo valore del PC, ed è l’output di una porta AND utilizzata per combinare il segnale di salto

condizionato e l’uscita zero dell’ALU, che dipende dall’esecuzione dell’operazione dell’ALU.

Le fasi di esecuzione di una singola istruzione passano da due (fetch e execute) a cinque:

I. Prelievo dell'istruzione: corrisponde alla fase di fetch. Poiché i dati in RAM sono divisi

in byte, il PC viene incrementato di 4 da un addizionatore;

II. Decodifica dell'istruzione, lettura dei registri sorgente e calcolo dell'indirizzo di salto;

III. Calcolo del risultato;

IV. Scrittura del risultato nel registro destinazione ed accesso alla memoria;

V. Scrittura del risultato in memoria.

Per eseguire un'istruzione bisogna attendere che termini l'esecuzione dell'istruzione precedente,

quindi il tempo di esecuzione sarà dato dalle “n” istruzioni moltiplicate per le “m” fasi necessarie

per ogni istruzione.

Ovviamente questo comporta un’esecuzione potenzialmente molto lenta, motivo per cui è stata

concepita l'architettura MIPS con pipelining. 3

6

Pipelining Mips

L'architettura MIPS con pipelining è strutturata come una catena di montaggio: nel caso in cui le

istruzioni siano indipendenti tra loro, è possibile iniziare l'esecuzione di un'istruzione senza

attendere la terminazione di quella precedente. Nel caso ci fossero istruzioni dipendenti potrebbero

verificarsi situazioni incoerenti con la logica di programmazione, chiamate “alee”. È compito del

programmatore risolvere le alle organizzando le istruzioni in maniera tale da evitare che si generi

conflitto, anche ritardando artificialmente l'esecuzione di alcune istruzioni.

Le principali tecniche di risoluzione delle alee sono lo stallo e il bypassing: il primo prevede di

ritardare il caricamento delle istruzioni tramite istruzioni speciali chiamate NO_OP, che rendono

temporaneamente inattive le unità, mentre il secondo prevede l'utilizzo di apposito hardware per

correggere eventuali situazioni incoerenti.

Il tempo impiegato per eseguire n istruzioni con m fasi nell'architettura con pipelining è di n+m-1

cicli di clock, quindi consente un risparmio notevole di tempo rispetto all'architettura senza

pipelining (che ricordiamo essere n*m).

Prestazioni di un'Architettura 3

7

È possibile valutare le prestazioni di un'architettura da due punti di vista: per un utente

corrispondono a prestazioni maggiori tempi di risposta più bassi, ovvero la richiesta del minor

tempo possibile per l'esecuzione di un compito, mentre per un centro di calcolo le prestazioni

migliori sono rappresentate dal maggior numero di compiti svolti in un'unità di tempo. Ovviamente

questi due aspetti possono influenzarsi vicendevolmente. Possiamo considerare le prestazioni di un

calcolatore x in base al tempo di esecuzione con la formula

prestazioni(x)=1/tempo di esecuzione(x);

quindi, se considerassimo un secondo calcolatore y, potremmo calcolare quale sia migliore con la

relazione

prestazioni(x)/prestazioni(y)=tempo di esecuzione(y)/tempo di esecuzione(x);

nel caso di un tempo di esecuzione (x) minore del tempo di esecuzione (y) avremmo la

dimostrazione che il calcolatore con prestazioni migliori è x, e viceversa.

Il discorso appena fatto vale se il calcolatore NON lavora su più programmi contemporaneamentee

quindi se possiamo intendere il tempo di esecuzione come assoluto. Se il calcolatore invece esegue

più programmi contemporaneamente possiamo sapere quanto tempo impiega per eseguire un

singolo programma tramite il tempo di CPU, che ci è dato dai cicli di clock * il tempo di clock. Il

tempo di clock a sua volta è dato dalla relazione 1/frequenza di clock. Queste informazioni sono

rese note dal produttore della CPU e sono riportate nel manuale dell'architettura. Un metodo diffuso

per aumentare le prestazioni è la pratica dell'overclocking: come il nome stesso suggerisce, consiste

nell'aumentare la frequenza di clock al fine di far diminuire il tempo di clock, aumentando così le

operazioni eseguite; lo svantaggio primario di questa pratica è che induce una maggiore produzione

di calore e un maggior dispendio di energia, rischiando così di danneggiare le componenti stesse.

La precedente definizione non tiene conto del numero di istruzioni eseguite, quindi è possibile

scrivere un'altra relazione che ne tenga conto.

Possiamo calcolare le istruzioni eseguite come

Cicli di clock = numero di istruzioni * Cicli per Istruzione

Il valore dei Cicli per Istruzione (che chiameremo CPI) varia in base all'architettura del calcolatore

e può venire ricavata tramite appositi strumenti sia software che hardware, ottenendo così un valore

medio. Da questo evinciamo quindiche

Tempo di CPU = numero di istruzioni * CPI * Tempo di Clock

Ma questa definizione non è del tutto esatta, in quanto non tiene conto del fatto che classi di

istruzioni diverse possono avere tempi di clock diversi. A questo punto la nostra relazione diventa 3

8

Cicli di Clock = Σin=1(CPIi*num.Ii)

dove CPIi indica i cicli di clock appartenenti alla i-esima classe, e num.Ii indica il numero di

istruzioni della classe i-esima.

Per testare adeguatamente le prestazioni di un'architettura si cerca di riprodurre situazioni di carico

(workload), utilizzare metriche miste in base alla tipologia di istruzione eseguita oppure eseguire

una valutazione su prototipi di confronto, chiamati benchmark.

Un’alternativa per valutare le prestazioni di un’architettura sono gli valuta ed i MIPS.

Gli MFLOPS (milioni di istruzioni per secondo in virgola mobile) si utilizzano per valutare le

prestazioni in base a programmi eseguiti su architetture diverse. I MIPS (milioni di istruzioni per

secondo) dipendono dal numero di istruzioni eseguite, si utilizzano per confrontare due architetture

se si esegue lo stesso gruppo di istruzioni e misurano la frequenza di esecuzione di un certo numero

di istruzioni.

Il MIPS viene calcolato come 6

MIPS = (numero di istruzioni / tempo di esecuzione) * 10

Lo svantaggio di questo metodo è che non è possibile confrontare calcolatori che eseguono

istruzioni diverse, in quanto non tiene in conto le caratteristiche delle operazioni eseguite, inoltre il

MIPS può cambiare in base in base al programma eseguito.

Gerarchie di Memoria

I programmi godono delle proprietà di località Spaziale che Temporale; in virtù di ciò sono venute a

crearsi delle tecniche basate su queste proprietà. Nel caso della località temporale possiamo dire che

è molto probabile che un'istruzione verrà referenziata nuovamente a breve e, nel caso della località

temporale, che è molto probabile che vengano referenziate istruzioni vicine a quella attualmente in

esecuzione. Per sfruttare al meglio questi principi la memoria di un calcolatore viene realizzata

seguendo una gerarchia. Essendo, a parità di dimensioni, più costose le memorie più veloci,

normalmente si opta per avere poca memoria molto veloce e più memoria più lenta per

ammortizzare i costi. Allo stesso tempo è opportuno gestire la memoria in maniera tale da dare

l'impressione all'utente di avere una memoria caratterizzata da grande velocità e grandi dimensioni.

3

9

Il livello inferiore ha una maggiore capacità di memorizzazione ed un minor costo per la

realizzazione (rispetto al livello superiore). L’unico svantaggio è che necessita di maggiore tempo

perl’accesso.

La Dinamic Random Access Memory e le Static Random Access Memory formano la memoria

principale del calcolatore. La SRAM viene utilizzata per i registri della CPU ed è sostanzialmente

più veloce della s, ma anche di molto più costosa in quanto utilizza più transistor per ogni bit di

memoria. Viste queste differenze è opportuno, quindi, utilizzare la SRAM, più piccola ma più

veloce, in maniera più “legata” al processore e la DRAM come memoria più grande per i dati da

elaborare. L'obiettivo è quello di fornire all'utente memoria veloce come quella più costosa e

spaziosa come quella più economica; questo obiettivo può essere raggiunto lavorando

adeguatamente sulle gerarchie di memoria, copiando i dati solo tra elementi di memoria “adiacenti”

tra loro e posizionando le memorie più veloci, piccole e costose più vicine possibile al processore,

lasciando quelle man mano più lente e grandi più in basso nella gerarchia. Un blocco, ossia la

minima quantità di dati trasferibile, diretto alla CPU, deve essere precedentemente trasferito dalla

RAM o dalle memorie di massa in memoria cache. Se dopo aver effettuato la richiesta di trasferire i

dati, si accerta che il dato è presente, viene determinato un successo (hit). Nel caso opposto, viene

determinato un fallimento (miss). A tal proposito, vengono definiti due tempi:

• Hit time, ovvero il tempo necessario per accedere al livello superiore;

• Miss time, ovvero il tempo necessario per trasferire un blocco dal livello inferiore a quello

superiore.

La frequenza di miss può diminuire se il blocco diventa maggiore (si sfrutta il principio di località

spaziale), ma può anche aumentare se la dimensione del blocco diventa troppo grande in confronto

alla dimensione totale della memoria cache. Un incremento dei miss determina quindi una

diminuzione delle prestazioni della memoria cache.

Blocchi, Successi, Fallimenti

La frequenza dei successi (hit rate) corrisponde alla frazione di accessi alla memoria che hanno

trovato il dato richiesto nel livello superiore; spesso questo valore viene utilizzato come indice delle

prestazioni della memoria gerarchica. La frequenza dei fallimenti (missrate) indica invece la

frazione di accessi alla memoria che non hanno trovato il dato richiesto.

Il tempo di successo (hit time) è il tempo di accesso al livello superiore della gerarchia di memoria,

che comprende anche il tempo necessario a stabilire se il tentativo di accesso si risolve in un

successo o in un fallimento.

La penalità di fallimento (misstime) è il tempo necessario a sostituire un blocco nel livello superiore

con un altro blocco preso al livello inferiore e a passare le informazioni contenute in questo nuovo

4

0


ACQUISTATO

2 volte

PAGINE

51

PESO

8.71 MB

PUBBLICATO

7 mesi fa


DETTAGLI
Corso di laurea: Corso di laurea in Scienze e tecnologie informatiche
SSD:
Docente: Carp Marco
A.A.: 2018-2019

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher antonio446 di informazioni apprese con la frequenza delle lezioni di Architettura dei calcolatori elettronici e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Basilicata - Unibas o del prof Carp Marco.

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 Architettura dei calcolatori elettronici

Appunti Architettura dei Calcolatori Elettronici
Appunto
Tesina Architettura dei Calcolatori Elettronici
Appunto
Reti dei calcolatori - Sintesi
Appunto
Tesina Architettura dei Calcolatori Elettronici
Appunto