2010-03-03 5 views
5

Es gab dieses Problem, das zum Implementieren eines Ladebytes in einen Einzelzyklus-Datenpfad gestellt wurde, ohne den Datenspeicher ändern zu müssen, und die Lösung war etwas darunter.Laden Sie ein halbes Wort und laden Sie das Byte in einem einzelnen Datenpfad

alt text http://img214.imageshack.us/img214/7107/99897101.jpg

Dies ist eigentlich ein ziemlich realistisch Frage; die meisten Speichersysteme sind vollständig wortbasiert, und einzelne Bytes werden typischerweise nur innerhalb des Prozessors mit behandelt. Wenn Sie auf vielen Computern einen "Busfehler" sehen, bedeutet dies bedeutet oft, dass der Prozessor versucht, auf eine Speicheradresse zuzugreifen, die nicht richtig Wort ausgerichtet war, und das Speichersystem eine Ausnahme ausgelöst. Wie auch immer, weil Byte-Adressen möglicherweise nicht ein Vielfaches von 4 sein, können wir sie nicht direkt in den Speicher übergeben. Aber wir kann immer noch an jedem Byte bekommen, weil jedes Byte innerhalb einiger Wort, und alle Wortadressen sind Vielfachen von 4. Das erste, was finden wir tun wird sicherstellen, dass wir das Recht Wort erhalten . Wenn wir die hohen 30 Bits von die Adresse nehmen (dh ALUresult [31-2]) und kombinieren sie mit zwei 0 Bits bei das niedrige Ende (das ist, was die "linke shift 2" Einheit wirklich macht) , we haben die Byte-Adresse des Wortes, enthält das gewünschte Byte. Dies ist nur die eigene Adresse des Byte, gerundet bis zu einem Vielfachen von 4. Diese Änderung bedeutet, dass lw wird nun rund um auch Adressen bis auf ein Vielfaches von 4, aber , die seit blockfrei Adressen in Ordnung ist, würde nicht funktionieren für lw sowieso mit dieser Speichereinheit. OK, jetzt bekommen wir die Daten aus dem Speicher zurück. Wie erhalten wir das Byte, das wir daraus wollen? Nun, beachten Sie, dass der Byte-Offset des Bytes innerhalb des Wortes ist nur durch die niederwertigen 2 Bits der Adresse des Bytes gegeben. Also verwenden wir einfach diese 2 Bits, um das entsprechende Byte aus dem Wort mit einem Mux auszuwählen. Beachten Sie die Verwendung der Big-Endian-Byte-Nummerierung, da für MIPS geeignet ist. Als nächstes müssen wir das Byte auf 32 Bits zero-erweitern (d. H. Es einfach mit 24 Nullen an seinem oberen Ende kombinieren), weil das Problem dies angibt. Eigentlich Dies war ein kleiner Fehler in der Frage: in Wirklichkeit, die 0build Anweisung Null-erweitert das Byte, aber lb-Zeichen-erweitert es. Naja. Schließlich müssen wir den MemtoReg-gesteuerten Mux erweitern, um einen neuen Eingang zu akzeptieren: das Null-erweiterte Byte für der Fall lb. Das MemtoReg-Steuerelement Signal muss auf 2 Bits erweitert werden. Die Original 0 und 1 Fälle ändern auf 00 und 01 ist, und wir fügen Sie einen neuen Fall 10, die nur im Fall von lb.

mir recht eigentlich gar nicht verwendet wird verstehen, wie das funktioniert auch nach dem Lesen der Erklärung, besonders bei Linksverschiebung würde das ALU-Ergebnis um 2 die Byte-Adresse ergeben ... wie ist das möglich ??Also wenn ich ein halbes Wort laden möchte, dann würde ich eine Linksverschiebung machen und ich würde die Adresse des halben Wortes bekommen ?? Was wäre ein besserer Weg, um das Lade-Byte zu laden, laden Sie das halbe Wort, indem Sie den Datenspeicher modifizieren? (Die obige Frage stellt Einschränkungen, dass wir den Datenspeicher nicht ändern können)

Antwort

3

Der ursprüngliche Autor scheint einfach einen Byte-Multiplexer zu den 32-Bit-Daten hinzuzufügen, die aus dem Speicher gelesen werden. Dieser Speicher ermöglicht eine vollständig natürlich ausgerichtete 32-Bit-Last (lw-Befehl), und der zusätzliche Byte-Multiplexer und die Nullerweiterung ermöglichen auch Lade-Byte-Anweisungen (lbu-Befehl).

Die linke Verschiebung des ALU-Ergebnisses ergibt eine Wortadresse, NICHT eine Byte-Adresse, und berücksichtigt die implizite Rechtsverschiebung um zwei im Signal-Routing. Das Endergebnis sind einfach die unteren zwei Bits des ALU-Ergebnisses, die maskiert (genullt) werden, bevor sie an den Speicher gesendet werden. Die zwei LSBs des ALU-Wertes werden stromabwärts des Speichers dem Byte-Multiplexer zugeführt, wodurch der Wortspeicher beliebige Bytes lesen kann.

Es gibt keine direkte Unterstützung in der Logik zum Laden von Halbwörtern (16-Bit), nur Bytes und volle 32-Bit-Wörter. Sie könnten jedoch die Byte-Adressierungslogik einfach modifizieren, um Wörter anstelle von Bytes (oder sogar beide) zu verwenden, wobei ein ähnlicher Ansatz verwendet wird.

+0

so ist der Punkt, dass. 1. geht das, ohne um 2 nach links zu schalten? 2. wenn ich ein halbes Wort machen möchte, dann brauche ich einen 2x1 Mux und benutze das niedrigstwertige Bit als Steuersignal? – aherlambang

+0

1) Es gibt wirklich keine Linksverschiebung um zwei. Es gibt eine Rechtsverschiebung um zwei (verursacht durch das Fallenlassen der beiden LSBs: ALUResult [31-2]) und die Linksverschiebung um zwei setzt die Bits einfach an die gleiche Stelle zurück (mit Null in den zwei LSBs). Es wäre viel offensichtlicher, einfach die unteren zwei Bits zu maskieren. 2) Um einen ausgerichteten Halbwort-Lesevorgang auszuführen, würden Sie ALUresult [1] verwenden, um einen 16-Bit-2-zu-1-Multiplexer zu steuern. Sie können mit diesem Speicher keine wahlfreien Halbzyklus-Lesevorgänge unterstützen, da einer der nicht ausgerichteten Fälle (Adresse LSB = 11) Bytes aus zwei verschiedenen 32-Bit-Wörtern (dh zwei Speicherzugriffe) benötigt. –