Università degli Studi dell’Insubria
Dipartimento di Scienze Teoriche e Applicate Architettura degli Elaboratori
Cognome e nome Matricola
Esercizio 1 (6 pts)
Qui a fianco è riportata la tabella di verità di una funzione booleana F a quattro variabili. Le X denotano input che non fanno parte del dominio di F.
(a) Scrivere un’espressione booleana, ottimizzata col metodo di Karnaugh, in prima forma canonica.
(b) Ripetere, per la seconda forma canonica.
(c) Se una porta AND (a due ingressi) costa quanto 2 porte NOT, e una porta OR (a due ingressi) costa quanto 3 porte NOT (e non è disponibile nessun altro tipo di porta), quale delle due espressioni risulterà nel circuito meno caro? (giustificare la risposta)
Esercizio 2 (6 pts)
Una architettura con words di 8 bits dispone di un formato in virgola mobile con 4 bit di esponente (memorizzato con spiazzamento 8) seguiti da 3 bit di mantissa. Descrivere il valore memorizzato nei seguenti floats:
(le risposte devono essere fornite in base 10, come numero con virgola oppure come frazione, cioè come rapporto di interi; non è sufficiente fornire le risposte in notazione scientifica).
(a) 00101100 (c) 11101010 (e) 00000000
(b) 10101100 (d) 00001000 (f) 01000010
Esercizio 3 (6 pts)
Si supponga di avere a disposizione il datapath mostrato sotto (è uno di quelli visti a lezione).
L’ALU dispone delle comuni funzioni (ADD, SUB, PASSA, PASSB, eccetera).
Si scriva un microprogramma che realizza la nuova istruzione, avente opcode = 39:
DBLIND regA regB
“Double Indirection”, cioè doppia indirezione(*).
L’effetto di questa istruzione è quello di memorizzare nel registro A il valore in RAM presente alla locazione registrata in RAM all’indirizzo regB. Cioè:
regA = RAM[
RAM [ regB ]]
Non è necessario includere la fase di fetch: il microprogramma parte dal passo 3, dopo tale fase.
(*) si ricorda che “indirezione”, o
“deferenziazione”, è il procedimento di ottenere un valore registrato in memoria a partire dal suo indirizzo.
a b c d F 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 0 X 1 1 0 1 X 1 1 1 0 0 1 1 1 1 X
Esercizio 4 (3 pts)
(a) dire quanti bit di uscita ha un decoder a 4 ingressi, e specificare l’uscita per l’ingresso 0010 (b) disegnare il circuito di un un latch SR usando solo le comuni porte logiche
(c) disegnare il circuito di un Multiplexer a due segnali di ingresso (da un bit ciascuno)
Esercizio 5 (6 pts)
(a) Si ha a disposizione un Clock con frequenza 1MHz, e lo si vuole impegnare per implementare un Clock con frequenza 0.5Hz. Si possono usare tutti i comuni blocchi funzionali, come quelli visti a lezione. Suggerimento: prima di procedere allo svolgimento, ci si accerti di aver capito bene quale comportamento è richiesto dal circuito realizzato; nel proprio elaborato, specificare esplicitamente la durata: del ciclo, dell’intervallo basso, e alto del clock che si vuole ottenere.
(b) Per ciascun blocco funzionale usato, specificare se si tratta di un circuito combinatorio oppure sequenziale.
Esercizio 6 (5+1 pts)
Completare il programma Assembly MIPS qui sotto, fornendo il codice da sostituire alla parte indicata.
La sezione dati contiene una variabile n intera, seguita da un array 1 di n numeri interi, e un array 2 di altri n numeri interi.
Lo scopo del programma è scoprire se almeno uno dei due array contiene uno o più elementi
strettamente negativi ( < 0 ). In questo caso, si deve eseguire il codice contrassegnato dall’ etichetta
“casoA”; altrimenti, se entrambi gli array sono costituiti solo da elementi positivi (o nulli), va eseguito il codice contrassegnato dall’etichetta
“casoB”.
Ci si sforzi di scrivere un programma il più possibile efficiente e coinciso. Bonus di 1 punto al
programma corretto che usi numero minore di istruzioni.
Si forniscono a fianco le sintassi di alcune istruzioni.
.data .word
n: < qui un valore >
array_1: < qui dei valori >
array_2: < qui dei valori >
.text main:
<il tuo codice qui>
casoB:
< qui il trattamento del caso B, e uscita.>
casoA:
< qui il trattamento del caso A, e uscita.>
la reg , etichetta load address li reg , valore load immediate move regA , regB copia il registro B nel
registro A lw reg , offset(reg) load word
(l’offset è opzionale) sw reg , offset(reg) store word
(l’offset è opzionale) add reg , reg , reg add (somma) addi reg , reg , val add immediate sub reg , reg , reg subtract (differenza) sll reg , reg , val Shift left logical srl reg , reg , val Shift right logical
j etichetta jump
bgez reg , etichetta branch on greater than or equal to zero bgtz reg , etichetta branch on greater than
zero
bnez reg , etichetta branch on not equal zero
beqz reg , etichetta branch on equal zero bltz reg , etichetta branch on less than
zero
bltz reg , etichetta branch on less than or equal to zero