|
PCI-RecorderAudio-Schnittstellenkarte für den PCI-Bus, Teil 1Martin Kirst, Uwe Kirst |
D ie Vorstellung dieses neuen Projekts ist aber nicht nur aufgrund der besonderen Features interessant (Aufnahme und Wiedergabe gleichzeitig, Mehrspur-Option, 24 Bit breite Auflösung), sondern soll auch einen Weg auf zeigen, wie ein PCI-Bus-Adapter konstruiert werden kann. Das hier eingesetzte Know-how und die während der Entwicklung gesammelten Erfahrungen können Entwicklern anderer PCI-Lokal-Bus-Bridges (PLBB) eine Hilfe sein.![]()
Auswahl der Bausteine
Software
Das Schaltungskonzept
Die Details der PCI-Bus-Bridge
Übertragung von Nutzdaten
Die Schaltungsbeschreibung
Daten- und Adreßpfade
Der PCI-Bus wird im allgemeinen als besonders kostengünstige Lösung angepriesen. Für den Entwickler selbst sieht die Situation erst einmal etwas anders aus. Es müssen nicht unerhebliche Startschwierigkeiten überwunden werden.
Die strengen Timing-Spezifikationen erfordern besondere Sorgfalt beim
Schaltungsdesign. SMD-Gehäuse, typischerweise PQFP, sind vorgeschrieben,
da PGA-Gehäuse zu hohe Leitungskapazitäten besitzen. Vorgaben,
die der Entwickler unbedingt einhalten muß, sind beispielsweise,
daß die minimale 'Input Setup Time' relativ zum Takt nur 7 ns betragen
darf und daß alle von einem PCI-Agenten getriebenen Signale spätestens
11 ns nach der steigenden Taktflanke (CLK to Signal Valid Delay) auf dem
Bus stabil anstehen. Die maximale Taktverzerrung zwischen zwei beliebigen
Buskomponenten darf 2 ns nicht überschreiten.
![]() |
Bild 1. Das Handmuster der Schnittstellenkarte. Im Gegensatz zur alten "Take Five" eine geradezu "flockige" Bestückung. |
Eine Aufteilung in verschiedene ICs verschlingt außerdem viele
I/O-Pins und schafft ein großes Verbindungsnetzwerk, das der Entwickler
auf der Platine unterbringen muß. Außerdem verliert man an
Flexibilität, da davon ausgegangen werden kann, daß nachträgliche
Schaltungsänderungen neue Chip-zu-Chip-Verbindungen erfordern.
![]() |
Bild 2. Die drei Funktionsblöcke der Karte PLBB, SRAMs und Audiologik sind über einen internen lokalen 32-Bit-Bus verbunden. |
CPLDs besitzen den Vorteil niedriger Laufzeiten, die zudem noch genau vorhergesagt werden können. Außerdem fallen auch keine Plazierungs- und Routingprobleme an. Die meisten CPLDs sind aber allein wegen ihrer beschränkten Größe nicht für unser Projekt verwendbar. Der größte verfügbare Xilinx-Baustein, das XC73144 CPLD mit 144 Makrozellen, reicht nicht aus, um die ganze Schaltung aufzunehmen.
Die Berücksichtigung der bisher diskutierten Gesichtspunkte legt nahe, die PLBB unter Verwendung von FPGAs zu realisieren.
Wir haben PCI-kompatible FPGAs von Cypress (Quick Logic), Altera, Actel und Xilinx auf Eignung für das Projekt untersucht.
Alle Hersteller haben Produkte in ihrem Programm, die die Spezifikationen in bezug auf die Treiberleistung und die Timing-Vorgaben erfüllen. Da die nicht-terminierte Übertragungsleitung das Grundprinzip des Busses darstellt, müssen die Bausteine zudem besonders strengen Anforderungen beim Überspannungsschutz genügen. Die meisten Antifuse-basierten Bauteile sind zwar den SRAM-FPGAs in der Performance überlegen, lassen sich jedoch nur einmal programmieren.
Die FPGAs von Altera und Xilinx basieren auf SRAM-Zellen und sind daher in-circuit-rekonfigurierbar (ICR). Besonders in der Entwicklungsphase ist diese Eigenschaft sehr nützlich, da Fehler im Design schnell behoben werden können. Aber auch später kann es wichtig sein, den Baustein neu zu konfigurieren. Inkompatibilitäten mit bestimmten PC-Boards lassen sich so schnell beheben, und es können kleine Erweiterungen nachträglich hinzugefügt werden.
Bei FPGAs muß berücksichtigt werden, daß das Timing von der Plazierung der Logikblöcke und deren Verdrahtung innerhalb des Bausteins abhängt und meist nicht vorhergesagt werden kann. Die Xilinx-FPGAs der XC3000er und XC4000er Serie besitzen den Vorteil, daß ihre konfigurierbaren Logikblöcke (CLBs), die durch verschiedene Arten von Routingressourcen verbunden werden können, von programmierbaren Ein-/Ausgabeblöcken mit intergrierten Registern umgeben sind. Bei Verwendung der Flip-Flops in den I/O-Blöcken (IOBs) lassen sich die Forderung der 'Input Setup Time' und der 'Clock to Output'-Verzögerung unabhängig vom Routing einhalten.
Die Altera Flex 8000 Familie besitzt zwar ebenfalls I/O-Blöcke, diese beinhalten jedoch nur ein einziges Flip-Flop, so daß keine I/O-Flip-Flops für beide Datenrichtungen zur Verfügung stehen. Nachdem ein erster Prototyp, der mit einem FPGA 4008E des Marktführers Xilinx bestückt worden war, einwandfrei funktionierte, gab es kurzzeitig Überlegungen, auf Actel mit Antifuse-basierter Technologie umzusteigen. Actel-Bauteile besitzen ebenfalls zwei I/O-Flip-Flops pro PAD. Wir haben die Idee jedoch schnell wieder fallengelassen, da die PCI-kompatible Actel-Logik zwar angekündigt, aber noch nicht lieferbar war. Ein Preisvergleich ergab zudem, daß Actel keinen nennenswerten Kostenvorteil bietet. Daher sehen wir auch keinen Anlaß, die große Flexibilität der Xilinx-FPGAs aufzugeben. Die hohe Geschwindigkeit der XC4000E-Produkte machen es zudem möglich, eine voll PCI-kompatible Lösung in einem Chip unterzubringen. Die strengen Timing-Vorgaben erfordern in einigen Fällen eine manuelle Plazierung, die ohne das Wissen über die interne Struktur des FPGA nicht möglich ist.
Die modular aufgebauten Logikblöcke der XC4000E-Familie bestehen aus zwei unabhängigen programmierbaren Funktionsgeneratoren F und G mit je vier Eingängen und einem H-Funktionsgenerator mit drei Eingängen, der auch die Ausgänge von F und G verschalten darf. Die Funktionsgeneratoren bestehen aus Lookup Tables. Die vier beziehungsweise drei kombinatorischen Eingänge adressieren die Tables, die jeder ein 1-Bit-Ergebnis zurückliefern. Die kombinatorischen Ausgänge der CLBs können mit dem Verbindungsnetzwerk verknüpft oder in zwei Flip-Flops der CLB eingespeist werden.
Die XC4000E LCAs (Logic Cell Arrays) besitzen noch weitere Goodies:
Eine CLB kann in einem speziellen Modus als 16¥2-Bit-RAM oder als 16¥1-Bit-Dual-Port-RAM konfiguriert werden. Die RAM-Option wird in unserem Design nicht verwendet, ist aber bei Busmaster-Anwendungen für die Implementierung von Burst-FIFOs interessant (Xilinxs Application Note).
Für die Synthese der Schaltung stand uns die auf PCs unter Windows 95/ NT 4.0 lauffähige Software FPGA-Express von Synopsys - Marktführer auf dem Gebiet der Logiksynthese - zur Verfügung. Die Firma Synopsys, die für ihre Chip-Entwurfstools auf Workstation-Basis bekannt ist, engagiert sich neuerdings auch im PC-Bereich. Der FPGA-Express benutzt die gleiche Compiler-Technologie wie die Synopsys Workstation-Programme 'Design Compiler' und 'FPGA Compiler', ist aber von Grund auf neu entwickelt worden. Der FPGA Express glänzt durch die optimale Nutzung aller Features der Xilinx-Bausteine. Besonders hilfreich für unser Design erwies sich, daß die Takt-Freigabeleitung der I/O-Flip-Flops unterstützt wird.
Zum Routen und zum Überprüfen des Timings kam die Entwicklungsumgebung Xilinx Foundation Series in der Ausführung Standard VHDL zum Einsatz.
Der PCI-Bus ist eine 32 Bit (zukünftig auch 64 Bit) breite Schnittstelle mit gemultiplexten Adreß- und Datenleitungen, der mit 33 MHz getaktet ist. Ein besonderer Vorteil des PCI-Bus ist die hohe Bandbreite, theoretisch können 132 MBytes/s übertragen werden. Jedes Gerät, das mit dem Bus verbunden ist, agiert entweder als 'Target' oder besitzt die Funktionalität von 'Initiator' und 'Target'. Der 'Initiator' kann die Kontrolle über den Bus übernehmen und Adreß-, Daten- und Steuerleitungen betätigen (Busmaster). Das Gerät mit 'Target'-Funktion kann nur auf Datenanforderungen des 'Initiators' reagieren.
Die hier vorgestellte Audiokarte arbeitet nur in der 'Target'-Betriebsart, obwohl auf der Platine auch die für den 'Initiator' benötigten Steuerleitungen zum FPGA geführt werden, um sich für zukünftige Weiterentwicklungen die Busmaster- Option offen zu halten. Für eine PCI-Audiokarte kommen verschiedene Konzepte der Realisierung in Frage; eine Möglichkeit ist der Busmaster-Betrieb. Bei diesem Ansatz sollte besonderes Augenmerk auf die Buslatenz gelegt werden. Als 'Initiator' müßte die PLBB sicherstellen, daß Audiodaten für 30 µs ('access latency') zwischengespeichert werden können. Im worst case kann der Bus für diese Zeit von anderen Geräten blockiert werden. Die typische Latenzzeit beträgt meist nur 2 µs, kann aber in einigen Fällen nur schwer vorhergesehen werden. Insbesondere bei einer PCI-zu-ISA-Bridge wird die Latenzzeit nicht durch diese, sondern durch den nachfolgenden ISA-Adapter bestimmt.
Da innerhalb von 30 µs mehrere Abtastwerte liegen, muß ein FIFO zur Zwischenspeicherung vorgesehen werden. Dieser Speicher ließe sich zwar noch im FPGA unterbringen, erhöht aber den Entwicklungsaufwand der Schaltung beträchtlich. Eine Variante dieses Konzepts ist der Busmaster-Betrieb mit blockweiser Datenübertragung. Um das Problem mit der Buslatenz zu umgehen, könnte man einen größeren Speicher, beispielsweise mit Hilfe von externen SRAMs, vorsehen.
Unsere Schaltung ist jedoch nur als PCI-Target konzipiert. Der Verzicht auf Busmaster-Betrieb vereinfacht die Schaltung wesentlich und sollte auch zu keinen nennenswerten Geschwindigkeitseinbußen führen, da der Datentransfer im Burst-Modus vergleichsweise schnell abgewickelt wird. Auf spezielle FIFO-Bausteine als Zwischenspeicher wollten wir aus Kostengründen verzichten. Auf der Karte setzen wir statt dessen billige SRAMs ein. Der Speicher, der sich auf der Karte befindet, wird in den Adreßbereich des Rechners eingeblendet.
Ein PCI-Target zeigt durch Erzeugen des DEVSEL-Signals an, daß es einen Zugriff auf eine Adresse registriert hat, die sich in dem ihm durch das Basisadreßregister zugewiesenen Adreßbereich befindet. Das DEVSEL-Signal kann nach einem (fast), zwei (medium) oder drei (slow) Taktzyklen nach der Adreßphase von High auf Low wechseln. Unsere Karte arbeitet in der Slow- Betriebsart, weil die Timing-Vorgaben des verwendeten FPGAs keine schnellere Dekodierung erlauben.
Um die PCI-Ablaufsteuerung zu vereinfachen, wird auf die Erzeugung von Wartezyklen während eines Burst durch die Audiokarte verzichtet. Initiator-Wartezyklen können selbstverständlich abgearbeitet werden.
Die maximale Transferrate von 132 MBytes/s ergibt sich aus der Überlegung, daß maximal während eines Burst-Zugriffes alle 30 ns ein 32-Bit-Wort übertragen wird. Die geplante Erweiterung auf 64 Bit und 66 MHz PCI-Takt, die in der Version 2.1 der PCI-Spezifikation bereits beschrieben sind, erhöht die Transferrate noch einmal.
Die maximal mögliche Spitzenbandbreite wird von vielen Anbietern werbewirksam angepriesen, ist aber mit Vorsicht zu genießen. Die effektive Bandbreite beispielsweise bei Festplattenkontrollern oder Netzwerkkarten liegt meist deutlich unter diesen Werten. Bei Performance-Überlegungen spielen auch andere Einflüsse wie die Güte der PCI-Host-Bridge oder das Host-Memory-Subsystem eine Rolle. Unsere Karte erreicht eine durchschnittliche REP-STOSD-Transferrate von 87 MByte/s (Intel HX Board mit Pentium-100-MHz-Prozessor) und ist damit in dieser Disziplin schneller als jede bisher in ELRADs Schwesterzeitschrift c't getestete PCI-Karte. Die guten Werte führen wir auf den unbeschränkten linearen Burst zurück. Daß der erste Zugriff nur verhältnismäßig langsam ausdekodiert wird, spielt in diesem Fall keine Rolle. Der STOSD-Befehl wird nur zum Löschen des Speichers auf der Karte verwendet. Beim Kopieren (Speicher zu PCI, REP MOVSD) ergaben erste Messungen eine immer noch gute Datenrate von 52 MByte/s.
![]() |
Bild 2. Die drei Funktionsblöcke der Karte PLBB, SRAMs und Audiologik sind über einen internen lokalen 32-Bit-Bus verbunden. |
![]() |
Bild 3. Im FPGA wurde die PLBB und der Audiosender untergebracht. Extern verblieben SRAMs und Audioempfänger. |
Das Design ist nicht streng hierachisch aufgebaut, das heißt,
auch die oberste Komponente der Strukturbeschreibung enthält teilweise
Fragmente, die in Verhaltensbeschreibung formuliert sind. Für komplexe
Schaltungsdesigns sind effiziente Testmethoden erforderlich. Daher existiert
zum Simulieren der Schaltung eine ganz einfache Testbench (test_pci_top
in Bild 4). Die Testbench ermöglicht das Erzeugen von simulierten
Schreib- und Lesezugriffen auf dem PCI-Bus und erzeugt zu Simulationszwecken
einen seriellen Datenstrom, wie ihn der Crystal-Empfänger bereitstellen
würde.
![]() |
Bild 4. Die Testbench 'test_pci_top' verdrahtet 'pci_top'- und SRAM-Komponente. |
Die Testbench simuliert einen PCI-Master, indem sie die Leitungen des PCI-Bus ansteuert und die Reaktion des Target analysiert. Die einzelnen Phasen der Datenübertragung, die der Master einleiten soll, werden in einer Textdatei vorgegeben. Die Software FPGA-Express von Synopsys ist ein reines Syntheseprogramm und beinhaltet keinen VHDL-Simulator. Aus diesem Grund muß zum Ausführen der Testbench auf andere Produkte zurückgegriffen werden (z. B. Synopsys VHDL System Simulator). Die Xilinx-Foundation-Standard-Systemsoftware beinhaltet keinen vollwertigen VHDL-Simulator, erlaubt es jedoch, mit wenigen Mausklicken Testsignale zu erzeugen und diese auf die Schaltung loszulassen. Die Ergebnisse werden in grafischer Form aufbereitet und angezeigt. Erste Tests sind daher einfach und komfortabel möglich; ein automatisches Reagieren auf Signale des zu testenden Designs kann jedoch nicht erfolgen.
![]() |
Bild 5. Der synthetisierbare Quellcode: die Komponente 'pci_top' und deren Unterkomponenten. |
![]() |
Bild 6. Die Daten- und Adreßpfade. |
Zwei Quellen können das SRAM mit Daten beliefern: der PCI-Bus und das Audio-Schieberegister; ein Multiplexer nimmt die Umschaltung vor. Bei PCI-Lesezugriffen steuert ein zweiter Multiplexer, ob zwischengespeicherte Audiodaten vom SRAM oder Konfigurationsdaten zurückgegeben werden. Das intern erzeugte Request-Signal PCI_REQ in der 'pci_top'-Komponente zeigt einen PCI-Zugriff auf den Speicher beziehungsweise den Konfigurationsbereich an. In der Adreßphase müssen folgende Bedingungen zur Erzeugung des Signals erfüllt sein:
Der gleiche Inkrementierer wird auch zur Erhöhung der Audioadresse herangezogen. Da die Audioadresse nur alle 1/44100 s erhöht werden muß, ist das Timing wesentlich entspannter. Es ist eine zusätzliche äußere Schleife mit Register und Multiplexer vorgesehen. Dieser Multiplexer wurde mit Absicht noch vor den Burst-Multiplexer in den Adreßpfad eingefügt, um die Schleifenverzögerung des Burst-Zählers nicht weiter zu vergrößern.
Zur Erhöhung der Audioadresse sind zwei Taktzyklen notwendig, da zwei Register durchlaufen werden. Das Register hinter dem Inkrementierer dient als Zwischenspeicher der Audioadresse, falls gerade ein PCI-Transfer stattfindet und der Zähler als Burst-Zähler verwendet wird. (roe)