Caricare half word e carico byte in una singola unità di elaborazione ciclo
-
24-09-2019 - |
Domanda
C'è stato questo problema che è stato chiesto circa l'attuazione di un byte di carico in un unico ciclo di datapath senza dover cambiare la memoria dei dati, e la soluzione era qualcosa sotto.
alt text http://img214.imageshack.us/img214/7107/99897101. jpg
Questo è in realtà un abbastanza realistico domanda; maggior parte dei sistemi di memoria sono interamente basato sulla parola, e individuale byte vengono tipicamente trattate solo all'interno del processore. Quando si vede un “Errore di bus” su molti computer, questa spesso significa che il processore provato per accedere a un indirizzo di memoria che era non adeguatamente word-allineati, e la sistema di memoria generato un'eccezione. In ogni caso, a causa indirizzi di byte forza non essere un multiplo di 4, non possiamo passare loro di memoria direttamente. Tuttavia, abbiamo può ancora ottenere in qualsiasi byte, perché ogni byte può essere trovato all'interno di alcuni di parola, e tutti di parola indirizzi sono multipli di 4. Quindi la prima cosa che abbiamo do è per essere sicuri di ottenere la giusta parola. Se prendiamo alto 30 bit di l'indirizzo (cioè, ALUresult [31-2]) e combinarle con due bit a 0 la fascia bassa (questo è ciò che la “sinistra SHIFT 2” unità è davvero facendo), si avere l'indirizzo di byte della parola che contiene il byte desiderato. Questo è solo indirizzo del byte, arrotondato fino a un multiplo di 4. Questo cambiamento mezzi che lw sarà ora anche rotondo indirizzi scorrimento a multipli di 4, ma Questo va bene in quanto gli indirizzi non allineati Non avrebbe funzionato per lw in ogni caso con questo unità di memoria. OK, ora abbiamo i dati parola torna dalla memoria. Come si arriva il byte che vogliamo fuori di esso? Bene, notare che il byte di byte-Offset all'interno della parola è solo proposta dal basso ordine 2 bit del byte di indirizzo. Quindi, usiamo semplicemente quei 2 bit per selezionare il byte appropriato dalla parola utilizzando un MUX. Notare la l'uso dei numeri di byte big-endian, come è appropriato per MIPS. Successivamente, abbiamo dovuto zero estendere il byte da 32 bit (cioè, appena combinarlo con 24 zeri alla sua estremità elevata), perché la problema specifica per farlo. In realtà, questo è stato un piccolo errore nel domanda: in realtà, il LBU istruzioni zero estende il byte, ma lb-sign estende. Oh bene. Infine, dobbiamo estendere il MemtoReg controllato mux ad accettare una nuovo input: il byte zero per esteso il caso lb. Il controllo MemtoReg segnale deve essere ampliato a 2 bit. Il 0 e 1 casi originali modifica 00 e 01, rispettivamente, e aggiungiamo una nuova cassa 10 che viene utilizzato solo nel caso di lb.
non ho ben capito in realtà su come questo funziona anche dopo aver letto la spiegazione, soprattutto di spostamento a sinistra il risultato ALU da 2 darebbe l'indirizzo di byte ... come è possibile ?? quindi se vorrei caricare una mezza parola poi vorrei fare uno spostamento a sinistra e vorrei ottenere l'indirizzo della mezza parola ?? ciò sarebbe un modo migliore per fare byte carico, per metà parola modificando la memoria dati? (La domanda di cui sopra puts vincoli che non siamo in grado di modificare la memoria dei dati)
Soluzione
L'autore originale sembra semplicemente essere l'aggiunta di un multiplexer di byte ai dati a 32 bit viene letto dalla memoria. Questa memoria consente un pieno 32 bit carico naturalmente allineata (istruzione lw) e il multiplexer ulteriore byte ed estensione a zero consente istruzioni carico byte così (istruzione lbu).
Lo spostamento a sinistra del risultato ALU produce un indirizzo di parola, non un indirizzo di byte, e rappresenta l'implicito spostamento a destra da due nel segnale di routing. Il risultato finale è semplicemente inferiori due bit del risultato ALU mascherato (azzerato) prima di essere inviato alla memoria. I due LSB del valore ALU vengono alimentati a valle della memoria al multiplexer byte, consentendo la parola memoria per leggere byte arbitrari.
Non v'è alcun supporto diretto nella logica mostrata per il carico mezze parole (16 bit), solo byte completi e parole di 32 bit. Si potrebbe, tuttavia, facilmente modificare il byte di indirizzamento logica di parole supporto invece di byte (o entrambi) utilizzando un approccio simile.