In IP-Bibliotheken von Xilinx findet man unter dem Namen KCUART einen universellen, asynchron-seriellen Sender und Empfänger. Der Sender und der Empfänger sind mit dem -Datenübertragungsformat der V24-Schnittstelle kompatibel und arbeiten mit festen Übertragungsparametern: einem Startbit, acht Datenbits und einem Stoppbit, ohne Parität [2, 3]. Die Baudrate lässt sich mit einem externen Baudratengenerator auf Basis eines Modulo-Zählers einstellen.
Der KCUART ist auf einen hohen Durchsatz hin entworfen und in seinem Sende- und Empfangspfad mit je einem 16-byte-FIFO ausgestattet. Auf diese Weise kann der KCUART bei einer Taktfrequenz von 50 MHz eine maximale Übertragungsgeschwindigkeit bis zu 1,5625 Mbit/s erreichen. Der KCUART ist zwar modular in -VHDL, dafür aber vollständig mit primitiven FPGA-Komponenten als Netzlisten beschrieben. Nach einer Synthese belegt der KCUART insgesamt 48 Slices in einem Spartan-3.
Für diese Realisierung als micro-coded UART (MCUART), also auf der Basis eines mi-kroprogrammierten Steuerwerks, wurden zuerst in den KCUART-Quelltextdateien alle Instanzen identifiziert und anschließend entfernt, die eindeutig den festverdrahteten Empfänger- bzw. Sender-Steuerwerken zugeordnet waren.
Die Analyse des VHDL-Quelltextes ergab, dass das Steuerwerk im Sender aus einigen Zustands-Flipflops mit der dazugehörigen Übergangslogik, einem 3-bit-Zähler sowie einem Modulo-16-Zähler besteht. Ähnliche Ergebnisse ergab die Analyse des VHDL-Quelltextes im Steuerwerk des Empfängers. Anstelle der beiden fest verdrahteten Steuerwerke ist im MCUART eine primitive RAM-Block-Komponente in einer Konfiguration als Dual-Port-Speicher in der Organisation 1024 × 16 bit eingesetzt.
Mit Hilfe der Steuerflussanalyse konnte der Steuerungsalgorithmus aus den beiden festverdrahteten Steuerwerken rekonstruiert und in Folgen von Mikrobefehlen umgesetzt werden. Dadurch sind zwei separate Mikroprogramme entstanden. Das Mikroprogramm des Senders beinhaltet 322 Mikrobefehle. Es belegt im RAM-Block den Adressbereich von 0x000 bis 0x1FF und wird über dessen Port A ausgeführt. Das Mikroprogramm des Empfängers ist etwas kompakter und umfasst 308 Mikrobefehle. Es belegt im RAM-Block den Adressbereich von 0x200 bis 0x3FF und wird über dessen Port B ausgeführt.
Das Grundformat eines Mikrobefehls ist für beide Mikroprogramme weitgehend identisch und besteht aus einem 8-bit-Datenfeld für Folgeadressen und einem 7-bit-Datenfeld für Steuersignale. Die Blockschaltung des MCUART zeigt Bild 2.
Der als Dual-Port-Speicher konfigurierte RAM-Block ist zentral angeordnet und steuert die Abläufe im Sende- und Empfangspfad unabhängig voneinander. Außerdem sind die beiden Pfade mit je einem 16-byte-FIFO ausgestattet. Die parallel-serielle Umsetzung erfolgt in der TX-Komponente, die seriell-parallele Umsetzung in der RX-Komponente.
Der direkte Vergleich im Ressourcen-Verbrauch zwischen dem KCUART und dem MCUART nach der Synthese unter denselben Syntheseparametern ist in Tabelle 2 aufgelistet:
KCUART | MCUART | FSM | MCU | |
---|---|---|---|---|
Anzahl Slices | 48 | 25 | 23 | 0 |
Anzahl Flip-Flops | 51 | 17 | 34 | 0 |
Anzahl LUT4 | 86 | 23 | 63 | 0 |
Anzahl RAM-Blöcke | 0 | 1 | 0 | 1 |
fmax[MHz] | 146 | 146 | - | - |
Tabelle 2. Detaillierte Gegenüberstellung des Ressourcen-Verbrauchs zwischen dem KCUART mit festverdrahtetem Steuerwerk und dem MCUART mit mikroprogrammiertem Steuerwerk sowie jeweils separat für das festverdrahtete (FSM) und das mikroprogrammierte (MCU) Steuerwerk.
Anhand der Anzahl der belegten Slices sieht man, dass der MCUART um 34 % weniger Ressourcen verbraucht als der KCUART. Die maximale Taktfrequenz ist in beiden Modulen unverändert geblieben und liegt bei 145 MHz. Durch den modularen Aufbau des KCUART und des MCUART war es auch möglich, die Komplexität des festverdrahteten (FSM) und des mikroprogrammierten (MCU) Steuerwerks separat zu ermitteln.
Diese Werte sind in den FSM- und MCU-Spalten zu sehen. Der Unterschied ist hier deutlich zu erkennen: Das Steuerwerk im KCUART verbraucht 23 Slices, wogegen das Steuerwerk im MCUART keine Slices verbraucht, sondern nur einen einzelnen RAM-Block.