So vermeiden Sie Input/Output-Konflikte mit einem Bus

Wie funktioniert ein Systembus?

Ich verstehe nicht, wie eine Schaltung Eingangs- / Ausgangsprobleme mit einem Bus vermeiden kann. Ich habe ein Bild eingefügt, um meine Gedanken besser zu erklären.

Geben Sie hier die Bildbeschreibung ein

Die Schaltung hat 2 Mehrzweckregister, die mit einem Systembus verbunden sind. Die linken Drähte jedes GP-Registers werden eingegeben und die rechten Drähte ausgegeben. Derzeit geht der Eingang in den Ausgang, was dazu führt, dass Logisim den Draht rot markiert (Fehler). Welche Lösungen gibt es, um dies zu vermeiden?

Hier ist die Blackbox für die Register.

Geben Sie hier die Bildbeschreibung ein

Antworten (2)

Anstelle von UND-Gattern müssen Sie Tristate-Treiber verwenden. Diese Treiber gehen in einen hochohmigen Zustand, wenn sie nicht aktiviert sind, was es einem anderen Gerät auf dem Bus ermöglicht, die Bussignalspannungen zu steuern. Vermutlich lässt die Steuerlogik zu, dass nur ein Registerausgang zu einem gegebenen Zeitpunkt freigegeben wird.

Logisim bezeichnet diese Treiber übrigens als "kontrollierten Puffer".

Interessant! Ich habe noch nie damit gespielt ... Tatsächlich weiß ich nicht einmal, was ein Tristate ist! Ich werde das überprüfen.
Ich habe diese als Tri-State-Puffer gelernt. Ihnen ist auch eine Wahrheitstabelle zugeordnet: Für einen Eingang A und B, wobei A das Signal ist und B den Pufferteil steuert. Wenn B niedrig ist (für Aktiv-High-Puffer), "gibt" der Puffer High-Z aus, sodass kein Signal in ihn eingespeist werden kann. Wenn B hoch ist, ist der Ausgang A. (Nur ein Beispiel)
Sie werden "Tristate" genannt, weil sie drei unterschiedliche Zustände auf dem Draht ansteuern, und nicht "binär", was sich auf zwei unterschiedliche Zustände bezieht. Die Zustände sind logisch 1, 0 und HiZ. Logisch 1 und 0 sind die üblichen Signale. HiZ ist ein offener Stromkreis, der Pin ist elektrisch isoliert (mit hoher Impedanz, auch bekannt als Z) von beiden Stromschienen oder effektiv vom Draht getrennt.

Joe Hass deckt den traditionellen Weg ab und ersetzt die UND-Gatter durch Tristate-Logik. So wurde es in den 1970er Jahren mit TTL-Chips gemacht und es ist auf PCB-Ebene immer noch üblich.

Innerhalb eines FPGAs werden Tri-State-Puffer jedoch seit etwa Anfang dieses Jahrhunderts nicht mehr unterstützt (außer an den externen Pins). (ASICs unterscheiden sich in dieser Hinsicht; danke an Joe Hass für die Korrektur) Das Synthesetool akzeptiert möglicherweise eine Schaltungsbeschreibung basierend auf Tristates, implementiert sie jedoch, indem es die Schaltung in etwas völlig anderes umwandelt ... normalerweise ist die erste Stufe eine Reihe von UND-Gattern, die wie in Ihrem Beispiel mit dem Enable verbunden sind.

Wenn Ihr Register wirklich UND-Gatter auf der Freigabeleitung hat, handelt es sich um ein neueres Design, und Sie benötigen eine zusätzliche Logikstufe, um den Bus zu erstellen.

Diese Stufe ist einfach ein ODER-Gatter auf jedem Busbit mit N Eingängen, ein Eingang für jede Quelle (GP-Register usw.), die den Bus ansteuert. Die Ausgänge jeder Quelle werden einfach ODER-verknüpft, und der Ausgang des ODER-Gatters treibt den Bus. Das N-Eingangs-ODER-Gatter kann auf verschiedene Arten implementiert werden - zB als Baum von 2-Eingangs-ODER-Gattern, wenn Ihr Logiksystem dies bietet.

Dies funktioniert, weil wenn ein Enable hoch ist, alle anderen Quellen 0 auf dem Bus treiben.

Es ist zuverlässiger als der Tri-State-Ansatz, denn wenn mehrere Enables hoch sind, ist das Ergebnis bedeutungsloser Unsinn (mehrere Ausgänge mit ODER verknüpft) anstelle eines Kurzschlusses über der Stromversorgung (wobei eine Quelle "0" und die andere " 1'), was möglicherweise ein kleines Feuer verursacht...

Beide Ansätze funktionieren: Wenn Sie jedoch Logik in einem FPGA oder ASIC entwerfen, wird dieser stark bevorzugt.

(Eine alternative Möglichkeit, Tristates zu eliminieren, basiert auf einem N:1-Multiplexer. Wenn Sie die übliche Implementierung eines 2:1-Multiplexers herausziehen, werden Sie feststellen, dass die beiden Ansätze im Wesentlichen gleich sind).

Brian, bei allem Respekt, Multiplexing mit Tristate-Treibern wird immer noch in ASICs durchgeführt, obwohl Sie mit den Leckströmen im tiefen Submikrometerbereich sehr vorsichtig sein müssen. Die Verwendung von Multiplexern ist in FPGAs üblicher, da die Struktur Boolesche Logikimplementierungen bevorzugt. Der Vorschlag, dass ein Busstreit ein Feuer verursachen könnte, ist einfach albern ... Ich hoffe, Sie haben Witze gemacht. Und ich kann Ihnen versichern, dass meine praktische Erfahrung kundenspezifische CMOS-ICs in diesem Jahrhundert umfasst.
Danke für die Korrektur bezüglich: moderne ASIC-Flows. Zur Behebung bearbeitet. Und ich habe hauptsächlich über das "kleine Feuer" gescherzt, obwohl ich vermute, dass Sie zugeben werden, dass mit 74S oder vielleicht einem ausreichend großen Ausfall bei etwas Neuerem verbrannte Finger oder Geräteausfälle möglich sind.
@JoeHass: Eine Sache, über die ich mich bei der Entwicklung von Low-Power-Designs mit CMOS auf Transistorebene gefragt habe, ist, ob es hilfreich wäre, intern zwei Takte zu verwenden, die zu leicht unterschiedlichen Zeiten schalten und jeweils einen Bus sehr kurz "schweben" lassen Taktflanke, um sicherzustellen, dass alles, was eine Leitung hoch treiben möchte, vollständig ausgeschaltet wird, bevor alles, was sie niedrig treiben möchte, mit dem Einschalten beginnt. Ich verstehe, dass dynamische Logik heutzutage nicht sehr beliebt ist, aber ein solcher Ansatz würde sich kaum von der meisten dynamischen Logik unterscheiden, insofern ...
... die meisten dynamischen Logiken erwarten, dass die Kapazität eines Knotens einen Zustand zwischen Systemtaktflanken hält, während das Ziel hier darin besteht, den kapazitiven Schwimmer zu verwenden, um einen Zustand für eine intern generierte Zeit zu halten, die wahrscheinlich näher an einer Nanosekunde liegen würde .