Nell’articolo di oggi analizzeremo come avviene l’accesso in memoria tramite l’utilizzo dei registri MAR e MDR.
Negli articoli precedenti abbiamo visto:
- Come funziona una CPU: progetto di circuiti logici #0
- Come funziona una CPU: Flip-Flop SR asincrono #0.1
- Come funziona una CPU: Flip-Flop sincrono #0.1.1
- Come funziona una CPU: Flip-Flop D #0.1.2
- Come funziona una CPU: Flip-Flop Master-Slave #0.1.3
- Come funziona una CPU: Modello di Huffman #0.2
- Come funziona una CPU: progetto di circuiti sequenziali sincroni #0.2.1
- Come funziona una CPU: progetto dei circuiti logici #0.3
- Come funziona una CPU: porte logiche operanti su parole #0.3.1
- Come funziona una CPU: multiplexer #0.3.2
- Come funziona una CPU: decodificatore #0.3.3
- Come funziona una CPU: codificatore (encoder) #0.3.4
- Come funziona una CPU: codificatore prioritario (priority encoder) #0.3.4.1
- Come funziona una CPU: sommatore full-adder #0.3.5
- Come funziona una CPU: sommatore Ripple Carry Adder #0.3.5.1
- Come funziona una CPU: sommatore seriale #0.3.5.2
- Come funziona una CPU: Sommatore con carry-lookahead #0.3.5.3
- Come funziona una CPU: ALU spiegata in modo semplice #0.3.5.4
- Come funziona una CPU: comparatore #0.3.5.5
- Come funziona una CPU: registro a m-bit #0.3.6
- Come funziona una CPU: registro a scalamento (Shift Register) #0.3.6.1
- Come funziona una CPU: contatore semplice #0.3.7
- Come funziona una CPU: contatore asincrono (ripple counter) #0.3.7.1
- Come funziona una CPU: contatore sincrono #0.3.7.2
- Come funziona una CPU: bus spiegato in modo semplice #0.3.8
- Come funziona una CPU: introduzione alla cpu #0.4
- Come funziona una CPU: architettura base di una CPU #0.4.1
- Come funziona una CPU: operazioni fondamentali CPU #0.4.2
- Come funziona una CPU: operazioni sulla ALU #0.4.3
Quando l’istruzione da eseguire è una Load o una Store, bisogna effettuare operazioni di lettura/scrittura sulla Memoria. Anche nella fase di Fetch, durante la quale l’UC trasferisce una singola istruzione all’interno dell’Instruction Register, il processore effettua un accesso in Memoria (in lettura, proprio per acquisire l’istruzione da trasferire all’IR).
Il processore utilizza i registri MAR (il quale è connesso al Data Bus interno) e MDR (il quale scrive o legge dal Data Bus esterno) per effettuare tali accessi in lettura/scrittura alla Memoria.
Il registro MAR serve a trasferire dal Bus interno all’Address Bus l’indirizzo con cui si vuole fare accesso alla Memoria (attivando MARin e MARout). Del trasferimento dei dati si occupa invece il registro MDR
Esso è bidirezionale (in lettura il valore proviene dal Bus esterno e deve andare al Bus interno, mentre in scrittura il valore del Bus interno deve andare sul Bus esterno). Si sfrutta quindi un Multiplexer con parallelismo uguale a quello del Bus interno e dei registri. In base al valore del segnale di controllo SEL del Multiplexer viene prediletta una direzione piuttosto che l’altra. Tramite 2 Buffer tri-state muniti di segnali di controllo MDR1 out ed MDR2 out si pilotano i 2 Bus. Si supponga di voler trasferire il valore di un registro in Memoria ad un certo indirizzo MEM[Ri]← Rj.
La sequenza di operazioni necessarie per far ciò, è la seguente:
• Riout (Ri contiene l’indirizzo);
• MARin;
• MARout;
• Rjout (Rj contiene il dato);
• SEL = 1;
• MDR1 out;
A questo punto la Memoria ha tutti i dati ed i segnali di controllo necessari, tuttavia necessita ugualmente di un certo intervallo di tempo per eseguire le operazioni. Si può immaginare che la Memoria richieda un tempo non prevedibile per completare tali operazioni e, pertanto, si supponga che un segnale MFC indichi quando un’operazione è stata terminata. Immaginiamo di voler fare un’operazione di lettura MEM[Ri]→Rj accedendo alla parola il cui indirizzo è contenuto in Ri e scrivere la parola prelevata dalla Memoria in Rj.
Sequenza di operazioni:
• Riout;
• MARin;
• MARout;
• RD (segnale di Read);
• attesa del segnale MFC;
• SEL = 0;
• MDRin;
• MDR2 out;
• Rjin;
Iscriviti ai nostri gruppi Telegram
Link utili