Wie verbinden sich Register mit CPU-Bussen?

Ich frage mich, welche Art von Puffern / Techniken normalerweise zum Anschließen eines CPU-Registers (Flip-Flops?) An einen CPU-Bus (Daten / Adresse / Steuerung) verwendet werden. Da es viele Register auf einem einzelnen Bus gibt, weiß ich, dass es eine Art Tristate-Mechanismus geben muss, aber wie geben Sie an, welche Puffer schweben sollen?

Logischerweise sollte es eine Art Registerauswahlbit zusammen mit einem Lese-/Schreibbit geben, das umschaltet, welches Register verwendet wird und was es mit dem Wert macht. Obwohl dies für mich sinnvoll ist, halte ich es nicht für praktikabel, jeden Registereingang mit einem Registerauswahl- oder R / W-Bit zu UNDEN.

Ich habe im Internet nach Schaltplänen oder Dokumentationen gesucht und kann keine soliden Informationen finden. Die meisten CPU-Schaltpläne sind so kompliziert, dass ich Schwierigkeiten habe, sie zu verstehen. Jede Hilfe wird sehr geschätzt.

Antworten (2)

Bei einigen Gerätetechnologien sind Register unter Verwendung von Ausgängen mit drei Zuständen mit einem Bus verbunden. Ein solcher Ansatz hat einige Vorteile, erfordert jedoch im Allgemeinen entweder, dass zwischen dem Moment, in dem ein Register den Bus freigibt, und dem Moment, in dem ein anderes Register beginnt, ihn zu steuern, eine „Totzeit“ besteht, oder es besteht die Gefahr, dass ein Gerät mit dem Fahren beginnt den Bus, bevor das vorherige Gerät ihn vollständig freigegeben hat.

Bei anderen Technologien wird dieser Ansatz zugunsten der Verwendung verschachtelter Multiplexer vermieden. Wenn es 64 Register gibt, die an ein Busbit ausgeben können, könnte das Gerät acht 8-Wege-Multiplexer haben, von denen jeder Eingaben von einem Register akzeptiert, und einen weiteren 8-Wege-Multiplexer, der Eingaben von einem der ersten acht akzeptiert. Während dies etwas mehr Schaltungsaufwand erfordert als der busbasierte Ansatz, hat es den Vorteil, dass jedes Signal im gesamten System zu jeder Zeit von genau einem Gerät angesteuert wird.

Gute Antwort; Ich suche jedoch mehr nach Einzelheiten darüber, wie ein "Drei-Zustands-Ausgang" funktionieren würde. Takten sie nur die Register, die den Wert auf dem Datenbus verwenden müssen (damit sich die anderen nicht ändern)? Welche Art von Chips zwischen dem Bus/Register werden verwendet? Ihr zweiter Absatz enthält einige großartige Informationen, danke!
@DaveC - Versuchen Sie, sich die Schaltpläne / Designs der benutzerdefinierten / selbstgebauten TTL-Computer anzusehen, dort gibt es viele nette Informationen.
@DaveC: Das erwartete Design wäre, dass jedes Register den Bus ignoriert, außer wenn es entweder seinen Inhalt dort ablegen oder seinen Inhalt von dort laden muss. Abhängig von der Designtopologie kann der Bus schwebend, schwach hoch oder niedrig gezogen, schwach in seinem aktuellen Zustand gehalten werden (was auch immer das sein mag) oder aktiv hoch oder niedrig gezogen werden, wenn nichts anderes ihn antreibt. Im Allgemeinen ziehen CMOS-Gatter zusätzlichen Strom, wenn sich ihre Eingänge in der Nähe der Mittelschiene befinden (und ein Bus, der überhaupt nicht angesteuert wird, könnte auf eine Spannung nahe der Mittelschiene schweben), aber ...
... es ist nicht schwierig, ein CMOS-NAND-Gatter so zu entwerfen, dass es egal ist, ob der andere Eingang in der Mitte liegt, wenn ein Eingang niedrig ist. Ebenso kann man ein NOR-Gatter so entwerfen, dass, wenn ein Eingang hoch ist, der andere keine Rolle spielt.

Haben Sie vielleicht darüber nachgedacht, sich das Datenblatt eines Teils anzusehen, das früher zur Implementierung von Registern in einer CPU verwendet wurde, wie z. B. das 74HC574-Datenblatt ?

Es funktioniert genau so, wie Sie es vermutet haben:

Ein Registerauswahlbit (ein Pin namens CLK) für WRITE, das bei seiner ansteigenden Flanke dem Chip mitteilt, die Daten an seinen Eingangspins zu übernehmen und intern zu speichern. Eine CPU, die viele dieser Chips enthält, würde nur die Register takten, die den aktuellen Wert auf dem Datenbus speichern müssen, und nicht die anderen Register takten, die ihre internen Werte halten müssen.

Ein weiteres Registerauswahlbit (ein Pin, der manchmal "nOE" genannt wird) für READ, das, solange es niedrig ist, den Chip anweist, seine internen Daten auf den Datenbus zu treiben.

Registerdateien innerhalb eines FPGA sind konzeptionell gleich.

Wie geben Sie an, welche Puffer schweben sollen?

Typischerweise befindet sich an einer anderen Stelle in der CPU das Befehlsregister (IR). Typischerweise decodiert ein Decoder wie der 74HC138 das "Quellfeld" aus dem Befehlsregister in eine Reihe von nOE-Zeilen, eine für jedes Register. Der 74HC138 stellt sicher, dass höchstens ein Register gleichzeitig den Datenbus ansteuert, sodass es keinen Konflikt gibt. Der 74HC138 hält das nOE aller anderen Register hoch, sodass ihre Ausgangspins effektiv "getrennt" ("tristated", "disabled" usw.) sind. Ich würde jedoch nicht sagen, dass ihre Ausgangspins "schwebend" sind - jeder Pin, der mit einem bestimmten Bit des Datenbusses verbunden ist, wird von dem einen Chip, der vom 74HC138 ausgewählt wird, hoch oder niedrig getrieben.

Ein ähnlicher Demultiplexer decodiert das "Zielfeld" aus dem Befehlsregister in eine Reihe von CLK-Leitungen, eine für jedes Register, und der CPU-Designer fügt eine kleine zusätzliche Schaltung hinzu, um die Uhr genau im richtigen Moment zu pulsieren, kurz nachdem die Daten vorhanden sind auf dem Bus stabilisiert, und kurz bevor ein anderes Quellregister ausgewählt wurde und die Daten sich wieder zu ändern beginnen.

Jedes Signal im gesamten System wird zu jeder Zeit von genau einem Gerät angesteuert.

Das könnte funktionieren. In der Praxis habe ich jedoch noch nie eine Registerdatei gesehen – auf einem monolithischen IC oder aus TTL-Chips oder aus noch einfacheren Komponenten – die vollständig aus kaskadierenden Muxes aufgebaut ist. Die, die ich gesehen habe, enthalten immer irgendwo mindestens einen bidirektionalen 3-State-Bus.

Viele Arten von programmierbarer Logik haben kein Konzept eines internen Busses mit mehreren 3-State-Treibern. Registerdateien, die aus einer solchen Logik aufgebaut sind (im Gegensatz zu den speziell entwickelten Registerdateischaltungen, die oft in FPGA-Chips enthalten sind), sind daher typischerweise Mux-basiert. Beachten Sie auch, dass die Ausgabe einer synchronen Mux-basierten Registerdatei zwischen dem Zeitpunkt, an dem ein Register die Ausgabe seiner Daten beendet, und dem Zeitpunkt, an dem das nächste beginnt, kein "totes Intervall" aufweisen muss. Die Verwendung von 3-Zustands-Logik erfordert häufig entweder die Bereitschaft, entweder Totzeit oder intermittierende Buskonkurrenz zu akzeptieren.
Wenn eine Registerdatei als reguläre Struktur innerhalb eines monolithischen ICs implementiert ist, kann es (häufig) möglich sein, die Zeitsteuerung der Freigabeleitungen ausreichend gut zu steuern, um das notwendige Totintervall zu minimieren. Ferner kann es in vielen Situationen kein Problem darstellen, dass der Bus zwischen Lesevorgängen unterschiedlicher Daten im Leerlauf sein muss. Nichtsdestotrotz erfordert der 3-Zustands-Ansatz die Aufmerksamkeit auf bestimmte Aspekte des Timings, was bei einem Mux-basierten Ansatz kein Problem wäre.
@supercat: Ich möchte solche Mux-basierten Registerdateien in einem Buch erwähnen, an dessen Schreiben ich mitarbeite. Hast du Links zu guten Beispielen? (Sollte ich dies als unabhängige Frage stellen?)