Logische Elemente
Guten Tag, ich beginne eine Reihe von Artikeln über das Schreiben einer virtuellen Maschine in der Golang-Sprache. Ich habe diese Sprache gewählt, weil sie einfach zu lesen ist und die erforderlichen Funktionen in der Standardbibliothek enthält, die in Zukunft nützlich sein werden.
Dieser Artikel enthält absolut keine neuen Informationen für diejenigen, die Wahrheitstabellen für einfache Logikgatter kompilieren können. Wenn Sie wissen, wie es geht, verschwenden Sie keine Zeit und fahren Sie mit dem zweiten Teil fort.
Ein Logikgatter ist ein Gerät mit einem oder mehreren Eingängen und einem oder mehreren Ausgängen. In diesem Teil werden wir nur die einfachsten betrachten. Für die Modellierung von Gattern werden nur die Signale 0 und 1 verwendet, ohne die Eingangs- und Ausgangseigenschaften von realen Gattern zu verwenden.
Da wir mit Golang arbeiten werden, kann jedes Element als Funktion dargestellt werden.
In Go sieht die Funktion folgendermaßen aus:
func ( ) {
Puffer
Dies ist das einfachste Element mit einem Eingang und einem Ausgang. In der Praxis wird es verwendet, um ein Signal zu verstärken oder eine Verzögerung zu erzeugen, manchmal kann es durch einen Leiter ersetzt werden.
Im Falle des Puffers sieht unsere Funktion folgendermaßen aus:
func Buf(v bool) bool { return v }
Wechselrichter
Derselbe Puffer, nur der Ausgang invertiert das Signal.
Im Falle eines Wechselrichters sieht die Funktion folgendermaßen aus:
func Inv(v bool) bool { return !v }
ODER
Dieses Element benötigt mindestens ein Signal gleich 1, um 1 am Ausgang zu erhalten.
func Or(v, s bool) bool { return v || s }
Und
Es gibt immer 1 zurück, wenn 1 an allen seinen Eingängen anliegt, in allen anderen Fällen wird 0 zurückgegeben.
func And(v, s bool) bool { return v && s }
Exklusives ODER
Um 1 am Ausgang zu erhalten, müssen unterschiedliche Signale (0 und 1) oder (1 und 0) am Eingang anliegen. Diese Operation ist nützlich, da Sie zwei Variablen austauschen können, ohne zusätzlichen Speicher zu benötigen.
func Xor(v, s bool) bool {
Oder auch nicht
Es arbeitet als ODER-Glied, nur ein Inverter ist an seinem Ausgang angeschlossen, von dem wir ein Signal erhalten.
func Nor(v, s bool) bool { return !(v || s) }
UND NICHT
Das Element funktioniert genauso wie das Element And, nur das Signal wird am Ausgang invertiert.
func Nand(v, s bool) bool { return !(v && s) }
Exklusives ODER mit Umkehrung
Das Element arbeitet wie das ODER-Element, nur das Signal wird am Ausgang invertiert.
func Xnor(v, s bool) bool {
Nachdem die Funktionen geschrieben wurden, können Sie sie zu einem Gate-Paket zusammenfassen, auf dessen Grundlage wir komplexere Dinge implementieren. Unsere Pakethierarchie ähnelt einer realen Computerabstraktionshierarchie. Den Quellcode finden Sie
hier .