2 Min

Der Programmzähler

wie im vorherigen Artikel Das Adressregister beschrieben, nutzen wir ein 16 Bit Register um auf die Informationen im RAM oder ROM zuzugreifen.

So ein ähnliches Register benötigen wir noch einmal damit die CPU ihre nächsten Befehle aus dem Speicher holen kann. Das Register zeigt immer auf die als nächstes auszuführende Anweisung im Speicher.

Daher der Name Programmzähler oder Program Counter.

Es gibt allerdings einen großen Unterschied zum bisherigen Adressregister, es gibt einen weiteren Eingang, wenn dieser 1 ist, soll das Register von sich aus mit jedem Takt eins weiter zählen und damit auf die nächste Anweisung springen.

Das hat einige Konsequenzen und benötigt ein wenig Erklärung.

Binärzähler

Unser Programmzähler ist vom Aufbau her weniger ein Register, mehr ein Zähler (jeweils + 1).

Die einfachste Art besteht aus der Aneinanderreihung von J-K-Flip Flops:

 

Hauptproblem:
Der Zähler arbeitet asynchron, d.h. die Ergebnisse nächsten Elements "warten" auf das Ergebnis des Vorgängers. Jeder Schritt sorgt für eine kleine Zeitverzögerung. Je mehr Elemente vorhanden sind, desto größer der Zeitunterschied von der ersten Stelle bis zu letzten Stelle des Zähler.

Um das zu verhindern benötigen wir einen synchronen Zähler:

 

Die zusätzlichen UND sorgen dafür, dass die J und K Eingänge des nächsten Elemnte nur dann 1 sind, wenn auch wirklich umgeschaltet werden soll. Das umschalten selbst erfolgt dann über den gemeinsamen Clock Eingang.
Hierdurch gibt es nun keine Verzögerung mehr und alle Ausgänge schalten gleichzeitig.

Wenn wir nun noch das Clock-Signal mit einen Enable-Signal verunden, können wir steuern, ob der Zähler hochzählt oder nicht.

Soweit ganz nett, aber wir brauchen ja noch die Möglichkeit einen Wert zu setzen.

Allerdings wird dies von der Logik richtig kompliziert. Aber jemand hat sich das schon ausgedacht, so haben wir z.B. den 74xx161 Chip. Ein 4-Bit Zähler mit Reset, Enable und der Möglichkeit den Wert zu setzen. Also 4 Stück davon nehmen, ein Tri-State-Buffer dahinter und unser Programmzähler (für die ersten 8 Bit der Übersichtlichkeit) ist fertig:

Solange das CNT Signal 0 ist, zählt der 74x161 nicht hoch, dazu muss es 1 sein. Dann wird bei jedem 0->1 Übergang von CLK eins hoch gezählt. Der TC Ausgang ist zum verschalten von mehreren Zählern.

Ist das R Signal 0, wird beim nächsten Takt der Inhalt der Eingangssignal in den internen Zustand des Zählers übernommen. Bei W=0 wird über die Tri-State-Buffer das Signal auf den Adressbus gegeben.

Für den kompletten Programmzähler, wird die Schaltung einfach erweitert auf 4 Zähler und Buffer.