Ein NAND-Gatter richtig simulieren? (Ich baue einen Computer in meinem Computer)

Ich bin dabei, ein von Nand2Tetris (http://www.nand2tetris.org/) inspiriertes Projekt zu starten, um einen Computer vollständig zu simulieren und das Ganze aus NAND-Gattern aufzubauen.

Ich möchte alles von Grund auf simulieren, beginnend mit einer primitiven Implementierung eines NAND-Gatters, das simuliert, wie ein NAND-Gatter auf der physischen Ebene funktionieren würde, und sie dann miteinander verbinden, um einen Computer zu bauen.

Die Sache ist, ich verstehe nicht genug darüber, wie ein NAND-Gatter auf der physischen Ebene funktionieren würde, um dies zu schreiben.

Um es klar zu sagen, das ist sicherlich nicht das, wonach ich suche:

def nand(a, b)
  return !(a && b)
end

Ich möchte das NAND-Gatter als Klasse implementieren, damit es eher wie ein tatsächliches Objekt funktioniert. Ich möchte, dass es Stifte hat, und ich möchte in der Lage sein, die Stifte miteinander zu verbinden und Spannung anzulegen usw.

Kann mir jemand zeigen, wie Sie eine ordnungsgemäße Simulation eines physischen NAND-Gatters implementieren könnten, eines, das miteinander verbunden werden könnte, um letztendlich einen Computer zu bauen?

Obwohl ich denke, was Sie tun, ist großartig, aber ich denke, dass diese Frage für Stack Overflow etwas zu weit gefasst ist. Von wie wenig Niveau redest du hier? Auf der Ebene einzelner Transistoren? Einzelne Atome?
Tolle Frage. Ich denke, Transistoren wären ein guter Ausgangspunkt. Atome, lass uns das für ein späteres Projekt aufheben :)
Wenn Ihr Projekt darin besteht, "das Ganze aus NAND-Gattern aufzubauen", wie Sie in Ihrem ersten Absatz sagen, sollten Sie sich keine Gedanken darüber machen, wie NAND-Gatter physisch realisiert werden. Wenn Sie das tun, bauen Sie das Ganze aus Transistoren auf, nicht aus Gates.
Sie sollten einen Blick auf Digital werfen . Sehen Sie sich insbesondere die README-Datei an – sie enthält einige gute Details darüber, wie das Programm implementiert ist, und verschiedene Fallstricke, auf die Sie gestoßen sind.

Antworten (3)

Der beste Weg ist, ein Ereignisrad zu implementieren und eine Laufzeitverzögerung für das Tor zu definieren. Ohne diese Verzögerung ist es unmöglich, irgendeine Art von Speicherelement zu simulieren. Sie können den Begriff "Ereignisrad" in Google nachschlagen, er ist die Grundlage für HDL-Simulatoren. Alternativ kann man das Ganze auch in Verilog schreiben, was den Vorteil hat, dass man die Hardware später mit den richtigen Tools tatsächlich realisieren kann und der Simulator kostenlos sein kann (siehe "Icarus").

Wenn Sie wirklich Spannungen anlegen möchten, müssen Sie ein Transistormodell implementieren oder BSIM3 in einer Art benutzerdefiniertem Simulator verwenden, aber Sie müssen SPICE schließlich neu implementieren, da das von Ihnen vorgeschlagene Objektmodell für Schaltungen mit "Eingängen" nicht gut funktioniert tatsächlich Drähte, die mit Gattern verbunden sind, die die Ausgänge laden und das Verhalten der Schaltung ändern können.

Viel Glück.

Nein, das wird nicht funktionieren. Sie können einem Gate keine beliebige Verzögerung zuweisen, die die Timing-Anforderungen nicht erfüllen würde und die Schaltung nicht funktionieren würde
@ShashankVM, nein, Sie MÜSSEN unbedingt eine Verzögerung im Gate haben, wenn Sie es richtig simulieren möchten. Echte NAND-Gatter haben Verzögerungen – es dauert einige Zeit, bis sich die Signale von den Eingangspins durch die Transistoren innerhalb des Gatters ausbreiten. Die Verzögerung sollte nicht willkürlich sein – aber sie sollte existieren. Oh, und die Timing-Anforderungen basieren auf den tatsächlichen Verzögerungen der Schaltungselemente, nicht umgekehrt.
Ereignisgesteuerte Logiksimulationen verwenden keine Ausbreitungsverzögerungen unter der Haube, sondern verwenden das Konzept von Delta-Zyklen. Ausbreitungsverzögerungen werden, falls explizit geschrieben, unter Verwendung derselben ereignisgesteuerten Techniken modelliert.
@BillNace Mein Punkt ist, dass Sie einem Logikdesign nicht einfach Verzögerungen hinzufügen und erwarten können, dass die Schaltung funktioniert. Außerdem verwenden logische Simulationen Deltazyklen und keine Ausbreitungsverzögerungen. Die RTL-Simulation wird oft als „Zero-Delay“-Simulation bezeichnet

Der Aufbau eines Computers aus NAND-Gattern wäre schmerzhaft. Wenn Sie jedoch auf die Ebene von Spannungen und Strömen heruntergehen möchten, benötigen Sie einen Simulator auf Transistorebene wie Spice . Vielleicht können Sie, sobald der Transistor-Eins funktioniert, davon ausgehen, dass er funktioniert, und zu HDL wechseln, wie Sie es gezeigt und von Apalopoapa vorgeschlagen haben.

Ich bin ziemlich verwirrt über Ihr eigentliches Problem.

Die Sache ist, ich verstehe nicht genug darüber, wie ein NAND-Gatter auf der physischen Ebene funktionieren würde, um dies zu schreiben.

aber dann schreibst du alles Wissenswerte über ein NAND-Gatter:

def nand(a, b) return !(a && b) end

Alles, was Ihnen fehlt, ist, "wie man daraus ein Objekt macht", aber das ist keine Frage des physikalischen NAND-Gatters, sondern Ihres Programmierverständnisses.

Sie haben die Funktion eines NAND-Gatters geschrieben, wobei beide Eingänge flexibel sind und der Ausgang vom Aufrufer bestimmt wird. Alles, was Sie jetzt brauchen, ist, es zu einem Objekt mit festen Ein- und Ausgängen zu machen [Plus, wie die anderen Fragen sagten, eine minimale Zeitverzögerung für die Speicherung]