So, eine weitere Universitätswoche ist vorbei und der liebe Lord integriert jetzt nicht nur fröhlich in drei komplexen Dimensionen vor sich hin, sondern hat auch (endlich) konkretes zum PCIe-Takt-Problem herausgefunden (für alle nochmal: Es ging um die Frage, in welcher Relation die 100 MHz, die man zB bei Mainboards als PCIe-Freq. einstellen kann, zu den 1,25 bzw. 2,5GHz aus der Spezifikation stehen). Für alles, was jetzt kommt, übernehme ich keinerlei Haftung, aber der Mensch, mit dem ich mich darüber ausgetauscht habe, hat eigentlich ziemlich viel Ahnung.
Das ganze funktioniert also folgendermaßen: Bei PCIe handelt es sich um eine seriell übertragende Punkt-zu-Punkt-Verbindung. Jeder Busteilnehmer hängt also an einem PCIe-Backend (man könnte es auch Frontend nennen, denn eigentlich ist es beides gleichzeitig), auf das er seine Daten - welche auch immer das sind - mit den 100 MHz schreiben darf. Theoretisch 100 MHz, praktisch werden die zuerst (noch AUSSERHALB des Backends!) mit einem handelsüblichen PLL so abgegriffen, dass es 125 MHz werden. Mit diesen 125 MHz schreibt, wer auch immer da gerade schreiben will (fürs Lesen gilt das natürlich ebenso), sein 8 Bit breites Datenwort in das Backend. Allerdings wird das Datenwort VORHER bereits "verdoppelt", d.h. es wird ein 16-Bit-Wort erzeugt, in dem die 8 höchstwertigsten Bits denselben Inhalt haben wie Bit 7 bis LSB. Das hat den Sinn einer Datensicherung (logisch: tritt in den unteren oder oberen 8 Bit ein Fehler auf, merkt man das, indem man mit dem jeweils anderen Byte vergleicht). Diese 16 Bit werden jetzt also ins Backend geschrieben (wir erinnern uns: 125MHz) und dort in einem Initialregister gespeichert. Mit ebenfalls 125 MHz wird jetzt die als "Overhead" verschriene Parität gebildet, das sind bei 8 Bit Wortbreite 2 Bit Parität, und da unser Wort doppelt so breit ist, stehen in einem zweiten Register jetzt 20 Bit Daten. Dieses Register ist ein MS-Schieberegister. Das bedeutet, dass im Folgenden eine bitweise Übertragung des Registerinhalts stattfindet (indem jeweils das aktuelle zu bearbeitende Bit über einen Shift in die Ausgangsposition geschoben wird), und zwar 2 Bit pro Taktimpuls. Warum muss das so sein? Damit das gesamte Register übertragen worden ist, sobald von außen (vom Gerät, was gerade auf den Bus schreibt) das nächste 16-Bit-Wort kommt. Um 20 Bit seriell in derselben Zeit zu übertragen, wie 16(20) Bit mit 125 MHz auf den Bus geschrieben werden, braucht man bei 2 Bit pro Takt - tada - 1,25 GHz. Oder, wenn man es wirklich pro Bit betrachtet, 2,5 GHz, denn es wird bei jeder Flanke des Signals ein Bit übertragen. Fürs Lesen vom Bus passiert das alles ähnlich, nur der Leitungsname ist anders (RX beim Lesen, TX beim schreiben) und die Reihenfolge natürlich.
Merke also:
- die 16 Bit Wortbreite dienen entweder zur Übertragung breiterer Worte oder doppelter Sicherheit bei Standardwortbreite
- die 2 bzw 4 Bit "Overhead" sind Paritätsbits (generiert man leicht durch entsprechende dedizierte Logik, geht aber auch langsamer mit einem PLA/ROM)
- aus den 100 MHz werden, wenn der Chipsatz das nicht schon selbst macht (da bin ich mir nicht ganz sicher) per PLL 125 MHz und später (ebenso per PLL) 1,25 GHz
- dieses Jonglieren mit unterschiedlichen Taktraten innerhalb und außerhalb des Bussystems bzw. zwischen den Back-/Frontends und außerhalb dieser Back-/Frontends dient der Tatsache, dass ein elektrisch sehr sauberes Signal für hochfrequente Übertragungen benötigt wird und ein solches Signal liefern nur die wenigsten Busteilnehmer von sich selbst aus, außerdem ist nur so eine synchrone serielle Übertragung möglich (und die bringt aus dem einfachen Grund, dass man nicht fette Leitungen legen muss, eine ganze Menge)
Da sind noch einige Fragen (allen voran: Warum der Zwischenschritt über 125 MHz?), aber nach allem, was wir wissen, funktioniert es genau so.