2. Der PCI-Bus

2.1. Einführung

Der Peripheral Component Interconnect Bus ist ein weitgehend CPU-unabhängiges hochperformanentes Bussystem für PCs und wurde von INTEL im Jahre 1991
ursprünglich unter zwei Hauptgesichtspunkten konzipiert: Zudem sollte er einfach zu handhaben und zukunftssicher, das heißt auch für zukünftige Prozessorgenerationen geeignet, sein.
 

2.2. Aufbau

Der Chipsatz besteht aus drei Hauptbestandteilen:

Host-Bridge Expansion Bus Interface Data Path Unit Der PCI-Bus kann als CPU-unabhängiges Bussystem zur Verbindung des DRAM-Subsystems mit High-Speed-I/O und einer Brücke zu anderen Bussystemen
verstanden werden. PCI-Erweiterungskarten können so in allen PCI-Computern unabhängig von der Host-CPU eingesetzt werden; lediglich das karteneigene BIOS
muß die Konfigurationssoftware für die verschiedenen Prozessoren unterstützen. Bei Verwendung einer anderen Host-CPU bzw. eines anderen CPU-Subsystems
muß lediglich die Host-Bridge verändert werden. Durch dieses stark von der CPU entkoppelte Konzept ist der Aufbau von symmetrischen und asymmetrischen
Multiprozessorsystemen möglich, da hier ebenfalls das Interprozessorbussystem unabhängig von der Implementation des PCI-Busses ist und nur eine neue
Host-Bridge erforderlich macht. Dies ist ein echter Vorteil gegenüber allen anderen Bussystemen, was ihn auch für zukünftige Prozessor-Generationen geeignet
macht, da man auch dort nur einen der Plattform entsprechenden Treiber, die Host-Bridge benötigt.

Ein weiterer Vorteil der Trennung ist der, daß bei PCI-Rechnern nicht die CPU, sondern die Host-Bridge für den Burst verantwortlich ist. Deshalb arbeitet auch bei
486ern, die Write-Burst nicht unterstützen, ein PCI-Device mit Write-Burst, was besonders Grafikanwendungen beschleunigt. Zudem ermöglicht die Trennung von
CPU und PCI-Bus, daß die CPU weiterarbeiten kann, während der PCI-Bus in den Hauptspeicher schreibt oder aus ihm ließt (Concurrency). Dies gilt auch wenn
Daten zwischen zwei PCI-Devices ausgetauscht werden. So kann der Prozessor zum Beispiel Berechnungen ausführen, während zur gleichen Zeit Daten von der
Festplatte zur Grafikkarte übertragen werden.
 

2.1.1.1. PCI-Spezifikation

Die PCI-Definition erlaubt insgesamt 10 Devices (Loads) an einem PCI-Bus, wobei immer ein Device für die Host-Bridge verwendet werden muß. Die anderen
können z.B. für On-Board-Komponenten, wie SCSI-, EIDE-, LAN-, oder Grafikadapter, verwendet werden. Über Slots, die als 2 Devices gezählt werden, können
auch externe Geräte (PCI-Karten) an den Bus angekoppelt werden. Durch die Doppelzählung sind maximal 4 PCI-Slots verwendbar, da Host-Bridge und jene 4
Slots 9 der 10 vorhandenen Geräte besetzen.

Um auch andere Karten (z.B. ISA-Karten) nutzen zu können, kann über eine entsprechende Bridge der nötige Bus an den PCI-Bus angekoppelt werden, wodurch
auch ältere Karten weiterverwendet werden können.

Die PCI-Spezifikation sieht Bus-Bridges zu eigentlich allen anderen Bussystemen vor, d.h. Bridges für die ISA, die EISA, die MCA sowie die PCMCIA. Damit will
man die Probleme der MCA umgehen, die keinerlei Migrationspfad zwischen den alten ISA- und den neuen MCA-Karten vorsah. Am sinnvollsten ist dabei eine
Brücke zwischen PCI und EISA, damit sind PCI-Karten, 8-Bit-ISA-Karten, 16-Bit-ISA-Karten und EISA-Karten einsetzbar. Auch technisch ist sie am
interessantesten, weil sie die meisten Features bietet, dazu gehören die Möglichkeit doppelter Posted Writes; sowohl vom PCI-Bus zum Host als auch vom
EISA-Bus zur PCI-Bridge. Zudem stellt die EISA-Bridge alle Funktionen einschließlich der vollständigen EISA-Arbitration zur Verfügung.

Es ist ebenfalls möglich, Bus-Bridges zu benutzen, die für den IBM-PC nicht üblich sind.

Ein entscheidender Vorteil, den es nur beim PCI-Bus gibt, ist die Existenz einer PCI-to-PCI-Bridge, wodurch zum Beispiel die Anzahl der Slots oder der
On-Board-Komponenten erhöht werden kann. Diese Möglichkeit mehrere PCI-Busse parallel oder seriell in einem Rechner zu betreiben, wird durch die
Skalierbarkeit des PCI-Bus ermöglicht. Hiermit ist es möglich, ein großes System oder eines mit hohen Leistungsanforderungen in mehrere Teilsysteme aufzuspalten,
die unabhängig voneinander arbeiten können, ohne sich zu stören.

Insgesamt ist es möglich 256 Busse einzusetzen, wobei die ersten 255 Busse PCI-Busse sind und der letzte entweder ein weiterer PCI-Bus oder ein Expansion Bus
(d.h. ein EISA-, ISA-, MCA-, oder VL-Bus) sein kann.

Zudem ist durch die Migration von 5V-Systemen hin zu den 3.3V-Systemen und den daraus resultierenden verschiedenen Slots bei PCI ein Weg gefunden worden,
der sowohl die alte Technik als auch die neue und bei Kombi-Boards sogar beide Arten der Spannungsversorgung zuläßt; durch den eingesetzten Stecker und den
mechanischen Aufbau des Systems ist es den Endkunden unmöglich, eine Karte verkehrt herum oder mit der falschen Spannungsversorgung einzustecken.

Der elektrische PCI-Bus arbeitete bis zur Version 2.0 mit einem maximalen Takt von 33 MHz synchron zum Prozessortakt. War die CPU höher getaktet, so lief der
Bus mit heruntergeteiltem Takt. Bei einem 60 MHz Pentium betrug der PCI-Takt deshalb nur 30 MHz. In der Spezifikation 2.1 liegt der maximale Takt inzwischen
schon bei 66 MHz (siehe auch unter 2.2.3.).
 

2.2.1.2. PCI-Bridges

2.2.2. Arbeitsweise

Der PCI-Bus kennt zwei Arten von Bus Devices, Initiator und Target. Der Initiator initiiert einen Zugriff, indem er die Kontrolle über die Steuersignale übernimmt und
die Adressen generiert, sowie Beginn und Länge einer Bus Transaktion bestimmt. Das Target aktiviert beim Erkennen seiner Adresse auf dem Bus ein
Rückmeldesignal für den Initiator des Zugriffs. Das Target kann die Verfügbarkeit von Daten oder Lesebereitschaft, aber auch die Bitte um Erzeugung von
Wait-States signalisieren. Mit diesen beiden Einheiten können alle Transfers und Zugriffe abgewickelt werden, was weitere Devices überflüssig macht.

Die PCI-Bus Targets sind die Slaves des PCI-Bus. Sie selbst sind nicht in der Lage Zugriffe oder Transfers zu initiieren und sind deshalb darauf angewiesen, daß die
Zugriffe durch einen Bus-Master oder die Host-CPU durchgeführt werden. Das PCI-Bus-Interface des Targets ist wie bei jedem anderen PCI-Device ein ASIC,
das die PCI-Bus-Zyklen beherrscht und sinnvollerweise Burst-Modi unterstützen sollte. Optional kann auch ein Transfer Buffer implementiert werden, der einen
Transfer von Daten von und zum Bus und I/O-Device mit geringer Latenz und ohne die Notwendigkeit zur Erzeugung von Wait-States ermöglicht. Die Daten sollten
ohne eingreifen der CPU geschrieben und gelesen werden können, deswegen kann ein Slave mit einer eigenen CPU ausgerüstet sein. Hat ein Slave von der
peripheren Einheit Daten empfangen, so kann er diesen Umstand der CPU oder einem Bus Master per Interrupt melden, die die Daten dann abholen können.

PCI-Bus-Initiators, die dem Master entsprechen, können im Unterschied dazu über alle Ressourcen des Systems verfügen, also auch auf alle PCI-Devices zugreifen.
Sie können eigenständig und unabhängig von der Host-CPU Zyklen initiieren und Zugriffe und Transfers durchführen. Solch ein Zugriff wird initiiert, indem der
Initiator die Kontrolle über die Steuersignale übernimmt und die Adressen generiert sowie Beginn und Länge einer Bus Transaktion bestimmt. Weiterhin betreibt er
ein Handshake mit dem Target, wodurch die Anzahl der Wartezustände definiert wird.

Beide Device-Arten sind in der Lage Burst-Transfers zu bedienen, aber nur der Initiator ist in der Lage sie zu initiieren. Burst-Übertragung bedeutet, daß nicht jeder
Datenblock (z.B. 1 DWord, also 32 Bit) mit seiner dazugehörigen Adresse angefordert werden muß, sondern nur die Adresse des ersten Datenblocks und die Daten
danach einfach der Reihe nach übertragen werden. Dies funktioniert natürlich nur, wenn im Speicher aufeinanderfolgende Daten abgerufen werden, was in der Praxis
relativ häufig vorkommt. Folgen die benötigten Daten im Speicher nicht aufeinander, muß allerdings weiterhin jedes DWord mit seiner entsprechenden Adresse
angefordert werden. Der Burst beim PCI-Bus ist praktisch unbegrenzt, was nur hier der Fall ist. Als Vergleich, beim VL-Bus ist er auf 4 DWords begrenzt.

Im Prinzip kann beim PCI-Bus jede Karte ein Master sein. Eine Arbitrierungslogik entscheidet welcher Master als nächstes an der Reihe ist, wenn mehrere Master
Anspruch auf den Bus erheben. Die Arbitration selbst erfolgt im Hintergrund (overlapped Arbitration) mit Hilfe slotspezifischer Steuerleitungen. Ein
Watch-Dog-Timer überwacht, daß ein Master den Bus nicht zu lange belegt. Wird die zugestandene Zeit überschritten und ein anderer Master will Daten übertragen,
entzieht der Watch-Dog dem ersten den Bus. Dadurch wird verhindert, daß abgestürzte Devices den beanspruchten Bus nicht wieder freigeben (Deadlocks).

Neben den Initialisierungs- und Arbitrierungszyklen gibt es nur noch einen weiteren Grundzyklus für Datentransfers. Über Frame- und Stoping-Leitung einigen sich
Initiator und Target darüber, ob ein Burst- (Auto incremental Burst Mode) oder ein Non-Burst-Zyklus gewünscht wird. Im Non-Burst-Transfer benötigt ein Read 3
und ein Write 2 Takte pro DWord, womit sich bei 33 MHz Bustakt eine Transferrate von 44 MByte/s beim Read und 66 MByte/s beim Write ergibt. Im
Burst-Mode werden normalerweise größere Blöcke (ab 4 DWords) übertragen. Beim Read ist dies ein 3-1-1-1-...-Burst (105 MByte/s) und beim Write ein
2-1-1-1-...-Burst (117 MByte/s). Da die Burstlänge nur durch den Adressbereich begrenzt wird, ist ein maximaler Wert von theoretisch 266 MByte/s möglich.

Um die Anwenderfreundlichkeit des Busses zu erhöhen, unterstützt PCI die automatische Konfiguration von Devices (plug and play). Das PCI-BIOS auf dem
Motherboard erkennt beim Booten jede der eingestellten Karten und konfiguriert sie automatisch. Sollten zwischen zwei PCI-Karten unlösbare Konflikte auftreten,
so wird eine der Karten einfach abgeschalten. Dies geschieht aber sehr selten, da das BIOS in der Lage ist, die von den verschiedenen Karten benutzten Ressourcen,
wie Port- und Memoryadressen sowie DMA-Kanäle, selbständig zu ändern. Belegen z.B. zwei Karten den gleichen I/O-Port, so wird die Adresse einer der Karten
vom BIOS gewechselt. Anders verhält es sich bei den Interrupts (IRQ). Freie IRQ's sind im PC eh Mangelware, besonders aber seit immer mehr Netzwerk-,
Sound-, Fax- oder sonstige Erweiterungskarten die Computer bis auf den letzten Steckplatz füllen. Da ist es oft nicht leicht, noch einen freien IRQ für die neue
Erweiterungskarte zu finden. Der PCI-Bus kennt zwei Möglichkeiten dies zu umgehen. Erstens können gemäß Spezifikation alle IRQ's mehrfach benutzt werden
(Interrupt-Sharing). Zweitens lassen sich die Interruptleitungen der PCI-Karten durch Jumper- oder BIOS-Einstellungen auf jeden freien Interrupteingang des
Interruptcontrollers schalten. Die PCI-Spezifikation sieht vor, daß für jeden PCI-Slot vier Interrupts zur Verfügung stehen (A, B, C und D). Davon wird
normalerweise nur der Interrupt A genutzt. Dieser Interrupt wird nun für jeden PCI-Slot einzeln auf einen PC-Interrupt gelegt. Zum Beispiel A von Slot 1 auf IRQ 5,
A von Slot 2 auf IRQ 3 und A von Slot 3 auf IRQ 7. Desweiteren schlägt die PCI-Spezifikation vor, daß die Interrupts B, C und D nur von Karten, die mehr als
einen Interrupt benötigen, benutzt werden. In der Praxis sah es aber am Anfang (erste Hälfte 1994) noch ganz anders aus. Bei damals erhältlichen Boards lag
entweder nur einer der Interrupts am Slot an, oder es standen alle vier Interrupts zur Verfügung, aber sie ließen sich nicht von Slot zu Slot unabhängig belegen. Dies
drohte eine der wichtigsten Stärken von PCI zu zerstören, die exakte Spezifikation. Ein weiteres schwerwiegendes Problem stellten einige BIOS-Versionen dar, die
nur die PCI-Karten erkannten, die zu der Zeit existierten. Glücklicherweise residierte bei allen PCI-Boards das BIOS in einem sogenannten Flash-Memory
(Flash-ROM). Das bedeutet, daß man jederzeit ein neues BIOS von Diskette auf das Board überspielen kann. Hat das BIOS herausgefunden, welche Ressourcen
von der PCI-Karte benötigt werden, steht ein 256 Byte großer Konfigurationsbereich zur Verfügung, um diese Parameter zu speichern.

Da PCI nicht nur auf die Prozessoren der INTEL-Architektur beschränkt ist, können verschiedene Karten-BIOS-Versionen, z.B. für Alpha- oder Power-PC,
gleichzeitig verwaltet werden. Je nach CPU wählt das BIOS einen der drei möglichen Einsprungspunkte des Karten-BIOS aus. Diese Fähigkeit ist besonders
wichtig, da sowohl APPLE (Power-PC) als auch DEC (Alpha) PCI unterstützen. Somit können alle Kartenhersteller ein einheitliches ROM für alle drei Plattformen
anbieten.
 

2.2.3 Neuerungen gegenüber Spezifikation 1.0

Der PCI-Bus ist in der Spezifikation 1.0 ein gebuffertes, entkoppeltes, 32-Bit breites Bussystem mit einer Zyklusdauer von 30 ns bei einer Taktrate von 33 MHz.

In der Version 2.0 der PCI-Spezifikation ist unter anderem die Erweiterung auf 64 Bit enthalten, die abwärtskompatibel zur 32 Bitversion ist. Hierfür ist allerdings ein
längerer bzw. ein zusätzlicher Stecker notwendig. Durch den gemultiplexten Daten- und Adreß-Bus stehen somit 17 x 109 TByte an adressierbarem Speicher zur
Verfügung.

Eine weitere Neuerung dieser Version ist die 3,3 Volt Variante des PCI-Bus, denn neuere CPUs (jüngere 486er und Pentiums) und wahrscheinlich auch die
zukünftigen Rechner werden mit 3,3 Volt betrieben werden.

Die aktuelle Spezifikation 2.1 beseitigt einige Zweideutigkeiten und erweitert den PCI-Konfigurationsbereich um eine Sub-Vendor- und eine Sub-Device-Kennung,
was vor allem von den Grafikkartenherstellern gefordert worden war, um Plug&Play-Betriebssystemen eine Chance zu geben, herstellerspezifsche Treiber auch dann
automatisch zu laden, wenn mehrere Anbieter den selben Grafikchip verwenden.

Eine weitere Klarstellung gab es im Bereich des Interrupt-Routings, wo es jetzt im Gegensatz zu früheren Versionen erstmals einen klar definierten Algorithmus gibt,
nach dem die systemspezifischen Interruptkanäle (IRQs) auf die Interruptleitungen des PCI-Bus verteilt werden. Mit der Version 2.1 verabschiedet sich der PCI-Bus
auch vom Bus-Konzept bei Interrupts, d.h., INT A von Slot 1 ist nicht jetzt nicht mehr zwangsweise mit INT A von Slot 2 usw. verbunden. Jetzt ist es vielmehr so,
daß die systemspezifischen verfügbaren IRQs zuerst auf die einzelnen PCI-Slots verteilt werden und das Interrupt-Sharing erst zum tragen kommt, wenn mehr
Interrupts durch PCI-Devices angefordert werden, als das System zur Verfügung stellen kann.

Die letzte wichtige Neuerung ist die 66-MHz-Option. Damit diese abwärtskompatibel zur alten 33 MHz-Version ist, gibt es allerdings einen Haken. Steckt nämlich in
einem 66-MHz-System auch nur eine 33-MHz-Karte, so arbeiten alle Komponenten mit 33 MHz. Damit ein Board nun nicht versehentlich mit 66 MHz läuft, wenn
eine 33-MHz-Karte eingesteckt ist, wurde der 66-MHz-Enable-Pin (M66EN) auf einen bisher mit Masse belegten Kontakt (Pin B49) gelegt.
 

2.3. Die PCI SIG

Damit PCI immer auf dem neuesten Stand ist und ihm nicht das gleiche Schicksal wie der MCA beschieden ist, hat INTEL die Weiterentwicklung des PCI-Busses
an ein unabhängiges Komitee abgegeben, die PCI SIG.

Im Juni 1992, das heißt zu dem Zeitpunkt als der PCI-Bus das erste mal in der Öffentlichkeit vorgestellt wurde, haben sich namhafte Firmen aus der gesamten
Computerindustrie (einschließlich INTEL) zur PCI Special Interest Group (SIG) zusammengeschlossen, um den PCI-Bus als offenen, nicht proprietären Standard zu
promoten und weiterzuentwickeln. Inzwischen sind mehr als 300 Firmen einschließlich verschiedener Halbleiterhersteller, Computer- und Zusatzkartenhersteller
aktive Mitglieder der PCI SIG, der jeder für 2500 US-$ im Jahr beitreten kann, was auch kleineren Firmen die Möglichkeit gibt aktiv an der Entwicklung des
PCI-Bus teilzunehmen.
 
 
PCI-Bus 32 Bit 1.0
PCI-Bus 64 Bit 2.0 
PCI-Bus 32 Bit 2.1
PCI-Bus 64 Bit 2.1
Busart
Synchronbus
Synchronbus
Synchronbus
Synchronbus
Taktfrequenz in MHz
33
33
66
66
Datenbusbreite in Bit
32
64
32
64
Adreßbusbreite in Bit
32
32
32
32
Anzahl Devices
10
10
10
10
Anzahl Slots
4
4
4
4
max. Burstlänge
unbegrenzt
unbegrenzt
unbegrenzt
unbegrenzt
Datenraten bei 33 MHz, in MByte/s 
Non-Burst-Read
44
88
44
88
Non-Burst-Write
66
132
66
132
Burst-Read
106
211
106
211
Burst-Write
117
234
117
234
Datenraten bei 66 MHz, in MByte/s 
Non-Burst-Read    
88
172
Non-Burst-Write    
132
264
Burst-Read    
211
423
Burst-Write    
234
468