Die ALU, das Schweizer Taschenmesser jeder CPU
Heute möchte der Autor einen wichtigen Teil jeder CPU vorstellen: Die Arithmetisch-Logische-Einheit (ALU), von der wir bereits einige Funktionen kennen, die in den vorherigen Blog-Beiträgen vorgestellt wurden. In diesem Beitrag wollen wir die Lücken systematisch schließen. Zeit für eine kurze Zusammenfassung: Die Logikfunktionen 'und', 'oder', 'nicht' und 'xor' wurden vorgestellt, ebenso wie die arithmetischen Funktionen „add“ und „sub“ für ganze Zahlen. Nun wollen wir die meisten dieser Funktionen in einer Einheit zusammenfassen, der 1-Bit-ALU-Zelle.
Bild:../images/how_does_cpu/alu_symbol.svg[width=500]
Funktion | Beschreibung | Ainvert | Binvert | Operation |
und | a & b | 0 | 0 | 00 |
oder | a | b | 0 | 0 | 01 |
add | a + b | 0 | 0 | 10 |
sub | a - b | 0 | 1 | 10 |
slt | a < b | 0 | 1 | 11 |
nor | a nor b | 1 | 1 | 00 |
nand | a nand b | 1 | 1 | 01 |
Eine 1-Bit-ALU-Zelle
Um die Dinge einfach zu halten, implementieren wir eine ALU für 1 Bit, die dann einfach durch Wiederholung an jede Bitbreite angepasst werden kann. Wir führen eine Implementierung ein, die von Hennessey und Peterson entworfen wurde und aus dem beliebten Buch „Computer Organization and Design (RISC-V) Edition“ von Hennessey und Patterson stammt.
Die Implementierung unterstützt die grundlegenden Operationen „und“, „oder“, „addieren“ und „subtrahieren“. Wie wir bereits gelernt haben, kann die Subtraktion als Zweierkomplement realisiert werden: Invertieren des Eingangs B und Setzen des Übertragseingangs auf Eins.
Aufbau einer n-Bit-ALU
Die 1-Bit-ALU-Zelle, die wir im ersten Abschnitt erstellt haben, kann mit einer n-Bit-ALU verkettet werden. Die letzte ALU-Zelle in der Kette unterscheidet sich ein wenig von der regulären Zelle, da sie auch einen Überlauferkennungsschaltkreis enthält. Wir werden später in diesem Artikel darauf zurückkommen.
Set-less-than
Wir wollen, dass die komplette ALU einen weiteren grundlegenden Befehl unterstützt: set-less-than (slt), der notwendig ist, um später Verzweigungsoperationen zu ermöglichen. Für diese Operation ist der zusätzliche Eingang „less“ vorgesehen. Die ALU unterstützt also eine Anweisung, die in C wie folgt aussieht:
(a < b)? 1 : 0
Dies kann einfach durch Subtrahieren von b von a und Testen, ob der Wert kleiner als Null ist, implementiert werden. Bei der Implementierung erhält jede ALU-Zelle in der Kette mit Ausnahme des niedrigstwertigen Bits eine Null am Eingang „less“. Die erste ALU-Zelle erhält das Ergebnis der letzten Zelle, die das höchstwertige Bit darstellt. Da das höchstwertige Bit auch das Vorzeichenbit darstellt, können wir einfach eine Eingabe an das niedrigstwertige Bit weiterleiten und sind fertig. Dies ist jedoch nicht der Fall, falls die Subtraktion zu einem Überlauf führen könnte.
Außerdem fügen wir ein NOR-Gatter mit Eingaben von allen Ergebnisbits hinzu, um eine Null zu erkennen.
Überlauferkennung
Die letzte 1-Bit-ALU-Zelle in der Kette hat einen weiteren Ausgang „Überlauf“, um einen Überlauf bei der Addition von zwei Ganzzahlwerten anzuzeigen. Dies ermutigt den geneigten Leser, die Wahrheitstabelle und die Schaltung als Übung abzuleiten.
Bei einer Zweierkomplement-Interpretation tritt ein Überlauf in zwei Fällen auf:
Zwei positive Zahlen werden addiert, das Ergebnis wird negativ
Zwei negative Zahlen werden addiert, das Ergebnis wird positiv
Die Wahrheitstabelle für den Überlauf sieht wie folgt aus (die Originalquelle finden Sie unter hier)
Binv | a(n-1) | b(n-1) | c(n-1) | OF |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 0 |
Der von Logisim erzeugte Schaltkreis sieht dementsprechend aus wie folgt:
Multiplexer und Demultiplexer
Um eine Leitung aus mehreren Quellen auszuwählen, benötigen wir eine weitere Schlüsselkomponente, den Multiplexer. Multiplexer kommen an mehreren Stellen vor, in einer ALU werden sie jedoch zur Auswahl einer der logischen oder arithmetischen Operationen verwendet, wie wir später sehen werden.
Der Demultiplexer – wie der Name schon sagt – hat die genau entgegengesetzte Aufgabe und verteilt das Signal auf einer Leitung (Eingang) auf einen von mehreren Ausgängen, je nach Auswahlbit(s).
Multiplexer in komplementärer Pass-Transistor-Logik
Wir zeigen und implementieren den Multiplexer in Pass-Transistor-Logik, da dies das ressourceneffizienteste Design ist…