HSG |
|
Tristate-Elemente erlauben es, eine gemeinsame Leitung zu nutzen. Dabei kann es auch zu Konflikten kommen.
Webstart von 1BitBus.hds
Will man mehr als zwei Werte übertragen, so muss der Bus aus mehr Leitungen bestehen. Mit 3 Bits lassen sich bereits 8 Werte darstellen. Das Zu- oder Abschalten zum Bus geschieht hier jeweils durch einen gemeinsamen '/enable'-Eingang.
Webstart von 3BitBus.hds
Die Simulation Hades ermöglicht auf der sogenannten Register-Transfer-Ebene eine abstraktere und übersichtlichere Darstellung. Die beiden Darstellungen können durchaus auch gemischt werden. Man beachte wie die Tristate-Elemente der RT-Ebene auf die Invertierung verzichten und auch mit positiver Logik gesteuert werden.
Mit den Registertransfer-Komponenten (hier: rtlib.io.OpinVector, rtlib.muxes.TriBuf, rtlib.io.IpinVector) von Hades lässt sich das Beispiel auf einen 8-Bit-Bus erweitern.
Webstart von 8BitBus.hds
In Hades lässt sich bei Anzeigen auf der RT-Ebene durch bloßes Anklicken das Format wechseln. Bei Eingaben kann das Format über ein Editieren des Elements eingestellt werden. Auf diese Weise kann man leicht z.B. einen Dezimal-Dual/Hexadezimal-Konverter erstellen. Ausprobieren!
Jetzt sollen statt der Eingaben Register (schnelle Speicher, z.B. rtlib.register.Latch) verwendet werden, die schreiben und lesen können. Ist das verwendete Register flankengesteuert oder taktzustandsgesteuert? Bitte vor den Experimenten die Register auf das Format 0, dezimal (Maus auf Register, dann e) umstellen. Die Eingabe findet man übrigens unter rtlib.io.SmallConstant.
Webstart von 8BitBusR.hds
Mit Hilfe der Steuersignale kann man die Register zum Schreiben auf den Bus und zum Lesen von dem Bus bringen.
a) In welcher Reihenfolge muss man welche 'Steuersignale' anlegen, um das Register A auf 86 zu setzen?
b) In welcher Reihenfolge muss man welche 'Steuersignale' anlegen, um den Inhalt von Register C nach Register B zu transportieren?
Takt | enableC | loadC | enableB | loadB | enableA | loadA | enableE -----+---------+---------+---------+---------+---------+---------+---------- 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 -----+---------+---------+---------+---------+---------+---------+----------- 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 -----+---------+---------+---------+---------+---------+---------+----------- 2 | ? | ? | ? | ? | ? | ? | ? .........
Um die Steuersignale nicht von Hand anlegen zu müssen, bräuchte man ein Schaltwerk, das mit jedem Takt ein vorher bestimmtes 'Steuerwort' ausgibt. Ein solches Schaltwerk lässt sich z.B. aus einem Zähler und einem read-only-memory (ROM) erstellen. Bei dieser Gelegenheit lernt man nicht nur die Bauteile rtlib.register.CounterRE, rtlib.memory.ROM und rtlib.io.Expander kennen, sondern auch auch die Möglichkeit von Hades, Leitungen zu Bussen zusammenzufassen. Im Beispiel ist der 'Adressbus' und der 'Datenbus' je 4 Bit breit. Die Bauteile rtlib.io.Expander und - hier nicht benötigt - rtlib.io.mergeBits dienen dazu, aus einem Bus Einzelleitungen und aus Einzelleitungen einen Bus zu machen. Den Inhalt des ROMs kann man in Hades editieren, in einer Datei abspeichern und dann auch wieder einlesen. In data0.rom befindet sich z.B. der auf dem Bild gezeigte Inhalt. Hades erlaubt auch die Busbreite einstellen. Das funktioniert allerdings nur, wenn das Bauteil noch nicht 'verkabelt' ist.
Benutze die folgende Schaltung, um obige Aufträge automatisch ablaufen zu lassen.