# AMD Am29000

Der AMD 29000, oft einfach auch 29k, war eine populäre Familie von 32-bit-RISC-Mikroprozessoren, entwickelt von AMD. Die AMD 29000 waren zeitweise die populärsten RISC-Chips auf dem Markt, vielgenutzt in Laserdruckern von vielen Herstellern. Ende 1995 stellte AMD die Entwicklung des 29k ein, weil die Entwicklungsmannschaft zur Unterstützung der PC-Sparte versetzt wurde. Der Rest von AMDs Embedded-Geschäft wurde für die Embedded-186-Familie der 80186-Abkömmlinge neu ausgerichtet. Der Großteil von AMDs Ressourcen wurde auf das Hochleistungs-, x86-Klon-Geschäft konzentriert, das viele Ideen und Teile des letzten 29k nutzte, um den AMD K5 zu produzieren.

## Geschichte und Architektur

Der 29k entwickelte sich aus dem Berkeley-RISC-Design, das auch Sun SPARC und Intel i960 beeinflusste. Ein Trick in allen von der Berkeley abgeleiteten Chip-Designs ist das Konzept des Registerfensters, einer Technik, die benutzt wird, um Prozeduraufrufe signifikant zu beschleunigen. Die Grundidee ist das Benutzen einer großen Anzahl von Prozessorregistern als Stack, die während eines Aufrufs lokale Daten in einen Registersatz lädt und diese als „dead“ markiert, wenn die Prozedur beendet ist. Werte, die von den Routinen zurückgegeben werden, werden in der „global page“ platziert, den oberen acht Registern in SPARC. Es ist interessant anzumerken, dass das konkurrierende frühe RISC-Design der Stanford University, Stanford MIPS, auch dieses Konzept beachtete, jedoch wurde schließlich entschieden, dass fortgeschrittenere Compiler ein effizienteres Nutzen von Allzweckregistern ermöglichen als festverdrahtete Registerfenster, was sich über die Jahre als richtig erwies.
Im ursprünglichen Design von SPARC und i960 gab es eine feste Fenstergröße. Eine Routine mit nur einer lokalen Variablen nutzte gleich acht Register des Prozessors und verschwendete damit diese kostbare Ressource. Der 29k hat dagegen eine variable Fenstergröße. In diesem Beispiel würden nur zwei Register genutzt, einer für die Variable, der andere für die Rückgabeadresse. Auch hatte der 29k mehr Register, einschließlich der 128-Bit-Register für den Prozedur-Stack, als auch 64 mehr für globalen Zugang. Zum Vergleich: Der SPARC hatte insgesamt 128 Register. Diese Änderungen, kombiniert mit einem guten Compiler, führten zum Besten aus beiden Welten an Leistung für Prozeduraufrufe, während man immer noch genug Register für andere Arbeiten zur Verfügung hatte.
Ein weiterer, nicht so außergewöhnlicher Unterschied zu SPARC besteht darin, dass der 29k keine Zustandscode-Register enthielt. Jedes Register konnte für Zustandscodes genutzt werden, was die Zustandssicherung vereinfacht, jedoch zum Preis von eventuell komplizierterem Code. Ein Befehlspuffer für bis zu 16 Instruktionen wurde genutzt, um die Leistung bei Sprüngen zu erhöhen. Der 29k enthielt keine Sprungvorhersage, sodass eine Verzögerung entstand, sobald ein Sprung ausgeführt wurde (auch war der 29k ursprünglich nicht superskalar, sodass er nicht, wie in anderen Designs üblich, „beide Seiten“ ausführen konnte). Der Puffer verminderte dies, indem er vier Instruktionen der „anderen Seite“ des Abzweigs speichern konnte, der sofort laufen konnte, während der Puffer mit Instruktionen aus dem Speicher wiederaufgefüllt wird.

## Modelle und Varianten

Der erste 29k erschien 1988, mit eingebauter MMU, wobei eine Gleitkommaeinheit erst mit dem 29027 kam. Der 29005 war eine abgespeckte Version. Die Serie wurde aufgewertet mit dem 29030 und dem 29035, die einen 8 kB bzw. 4 kB großen Befehls-Cache enthielten. Ein anderes Update integrierte einen Teil der FPU direkt auf dem Die und fügte 4 kB Datencache hinzu, woraus der 29040 entstand.
Die letzte Allzweck-Version war der 29050, der eine vollständige FPU integrierte und dadurch viel bessere Gleitkommaleistung als ältere Versionen hatte.
Die Typen 29000, 29005 und 29050 hatten drei Bussysteme je für Adressen, Daten und Instruktionen, die Typen 29030, 29035 und 29040 hatten zwei Bussysteme je für Adressen und für Daten und Instruktionen.
Einige Teile des 29050-Designs wurden als Basis für den AMD K5, einen x86-kompatiblen Prozessor, genutzt. Die FPU des 29k wurde hierfür unverändert genutzt, während der Rest des Kerndesigns zusammen mit komplexem Microcode genutzt wurde, um Maschinenbefehle der x86-Architektur zur Laufzeit in 29k-Befehle zu konvertieren.

## Modelldaten
### Am29000/Am29005

Technische Daten
* L1-Cache: nicht vorhanden
* Bauform: 168-Pin PQFP oder 169-Pin PGA
* Betriebsspannung (VCore): 5V
* Erscheinungsdatum: ?
* Fertigungstechnik: CMOS
* Taktraten:
** 16 MHz (Am29000 und Am29005)
** 20, 25, 30 und 33 MHz (nur Am29000)

### Am29030/Am29035

Technische Daten
* 16 - oder 32 bittiger Datenbus (programmierbar)
* L1-Cache: 8 KiB Instruktionen (Am29030) oder 4 KiB Instruktionen (Am29035)
* Bauform: 144-Pin CQFP (Keramikgehäuse) oder 145-Pin PGA
* Betriebsspannung (VCore): 5V
* Erscheinungsdatum: ?
* Fertigungstechnik: CMOS
* Taktraten:
** 16 MHz (nur Am29035)
** 25 und 33 MHz (nur Am29030)

### Am29040

Technische Daten
* Pin- und buskompatibel zum Am29030 und Am29035
* Multiprozessor-fähig
* L1-Cache: 8 KiB Instruktionen, 4 KiB Daten
* Bauform: 144-Pin PQFP (Plastikgehäuse) oder 145-Pin PGA
* Betriebsspannung (VCore): 3,3 V
* Erscheinungsdatum: ?
* Fertigungstechnik: CMOS
* Taktraten:
** 33, 40 und 50 MHz

### Am29050

Technische Daten
* Pin- und buskompatibel zum Am29000 und Am29005
* Integrierte Gleitkommaeinheit
* Multiprozessor-fähig
* L1-Cache: 8 KiB Instruktionen, 4 KiB Daten
* Bauform: 169-Pin PGA
* Betriebsspannung (VCore): 5V
* Erscheinungsdatum: ?
* Fertigungstechnik: CMOS
* Taktraten:
** 20, 25, 33 und 40 MHz