Architektur von Computersystemen 1 Teil. Logikgatter

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 (   )    {     //     return    } 

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.

aBUF a
00
11

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.

aNICHT a
01
10

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.

aba ODER b
000
011
101
111

 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.

aba UND b
000
010
100
111

 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.

aba xor b
000
011
101
110

 func Xor(v, s bool) bool { //  (v ^ s)    ,   bool     ,       return (v || s) && !(v && s) } 

Oder auch nicht


Es arbeitet als ODER-Glied, nur ein Inverter ist an seinem Ausgang angeschlossen, von dem wir ein Signal erhalten.

aba noch b
001
010
100
110

 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.

aba und b
001
011
101
110

 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.

aba XNOR b
001
010
100
111

 func Xnor(v, s bool) bool { //       return !((v || s) && !(v && s)) } 

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 .

Source: https://habr.com/ru/post/de476100/


All Articles