Ich bin derzeit ein Junior in der Highschool und habe mich für Computer- / Elektrotechnik interessiert, insbesondere für das Design von Mikroprozessoren. Ich habe Code von Charles Petzold gelesen und mit dem Lesen des Mikroprozessor-Design-Wikibooks begonnen (das unvollständig zu sein scheint). Durch das Lesen von Code verstehe ich die grundlegende Logik hinter einer CPU und habe begonnen, eine in LogiSim zu erstellen. Kapitel 17 in Code beschreibt die CPU, die ich bauen möchte, aber den Schaltkreisen fehlen Schlüsselkomponenten - Taktsignale und Befehlsdecodierung. Einige der Taktsignale scheinen ziemlich offensichtlich zu sein (der PC scheint ein stetiges Taktsignal zu benötigen), andere (wie das Speichern von RAM-Werten) musste ich mir überlegen und versuchen, mich an die Arbeit zu machen.
Ich kann einen funktionierenden Akkumulator bauen (ich glaube, er kann nicht genau als ALU bezeichnet werden, weil ihm der L-Teil fehlt), der mit einem einzigen Eingang zwischen Addition und Subtraktion umschaltet, und ich verstehe, dass dies alles ist, was ich für den arithmetischen Teil benötige - Sobald ich Sprung-Opcodes zum Laufen gebracht habe, kann ich Multiplikation und Division im Code implementieren. Der Teil, mit dem ich zu kämpfen habe, ist die Befehlsdecodierung. Bei einigen Google-Suchen sehe ich, dass jeder Opcode als mehrere Mikrobefehle interpretiert werden muss, aber ich weiß nicht, wie ich das brauche, um zu funktionieren. Derzeit ist mein Befehlsdecoder nur eine kombinatorische Analyseschaltung mit einem einzigen Binärausgang für jeden Opcode - insgesamt 13.
Der Code funktioniert so, dass er einen 8-Bit-Codewert hat (ich verwende nur das Low-End-Byte) und dann zwei separate 8-Bit-Adresswerte, die ich dann als 16-Bit-Adresseingabe in den RAM kombiniere. Um die Werte zu speichern, habe ich einen separaten Zähler, der bis zu 10b zählt und dann auf 00b zurückgesetzt wird. Es ist der Takteingang für jeden Latch nacheinander (für die drei Latches gibt es a, b und c. Die zweiten Takte haben a 1, während b & c 0 sind, dann ist b 1 und 1 & c sind 0, dann c ist eins und 1 & b sind 0, dann wird es zurückgesetzt). Bei Anweisungen wie ADD 000Ah springt der PC jedoch zu 000AH ..., das in den Akkumulator eingefügt werden soll, aber tatsächlich in den Code-Latch zwischengespeichert wird und dann als nächster Opcode interpretiert wird, der das Ganze zum Laufen bringt verrückt.
Ich habe das Gefühl, dass mir einige wichtige Informationen zur Befehlsdecodierung und zur Ausführung von Taktsignalen fehlen ...
Hier sind die LogiSim .circ-Dateien: https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.c https dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/u/61676438/ ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ
PetzoldMk5 ist die Haupt-CPU und basiert auf den anderen Dateien, die als Bibliotheken importiert werden sollen.
Hier ist eine Liste von Opcodes (alle binär):
Load 0001
Add 0010
Add w/ Carry 0011
Sub 0100
Sub w/ Borrow 0101
Jump 0110
Jump w/ Carry 0111
Jump W/ 0 1000
Jump w/o C 1001
Jump W/o 0 1010
Store 1011
Halt 1100
Reset 1101