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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top