Ressourcenschoner Mikroprogrammierte Steuerwerke in FPGAs

Programmierbare FPGA-Bausteine sind heute mit zahlreichen RAM-Blöcken als primitive Komponenten ausgestattet. Sehr häufig werden diese Blöcke als interne Pufferbereiche zur Datenspeicherung eingesetzt. Aber nicht in jeder Applikation können alle RAM-Blöcke ganz ausgelastet werden, oft bleiben sogar viele von ihnen ungenutzt. Dieser Artikel befasst sich mit dem Einsatz solcher RAM-Blöcke als Mikroprogrammspeicher in mikroprogrammierten Steuerwerken in FPGA-Bausteinen und zeigt an zwei Anwendungsbeispielen, wie der Einsatz mikroprogrammierter Steuerwerke auf der Basis von RAM-Blöcken zu einer erheblichen Einsparung von Ressourcen führt.

Die meisten modernen, hochkomplexen, programmierbaren Logikbausteine vom Typ FPGA sind heute mit zahlreichen RAM-Blöcken in Form von sog. primitiven Komponenten ausgestattet. Tabelle 1 gibt einen Überblick über die Anzahl der RAM-Blöcke und deren Kapazität in den aktuellen fünf FPGA-Familien von Xilinx [7].

FPGA-Familie
Anzahl RAM-BlöckeGröße pro RAM-Block
Virtex-6156 - 106436 Kbit
Virtex-526 - 51636 Kbit
Virtex-436 - 55218 Kbit
Spartan-612 - 26818 Kbit
Spartan-34 - 12618 Kbit
Tabelle 1. Anzahl von RAM-Blöcken und deren Kapazität in den einzelnen FPGA-Familien von Xilinx

Innerhalb einer FPGA-Familie hängt die Anzahl der verfügbaren RAM-Blöcke mit der Größe eines FPGA-Bausteins zusammen. So enthält bspw. der kleinste Spartan-3 vom Typ XC3S50 nur vier RAM-Blöcke, wogegen im größten Spartan-3 vom Typ XC3S5000 insgesamt 126 RAM-Blöcke vorhanden sind [8, 9]. Häufig werden solche RAM-Blöcke als interne Pufferbereiche (FIFOs) zur Datenspeicherung oder als Daten-/Programmspeicher für Soft-Core-Prozessoren eingesetzt. Weitere Anwendungen sind Code-Konverter, schnelle Funktionsgeneratoren, BCD-Zähler und mikroprogrammierte Zustandsmaschinen[1].

Der folgende Beitrag befasst sich mit dem Einsatz der RAM-Blöcke als mikroprogrammierte Steuerwerke in FPGA-Bausteinen und zeigt deren Anwendungsmöglichkeiten anhand eines mikroprogrammierten UART-Moduls sowie eines mikroprogrammierten Soft-Core-Prozessors M68HC05.

RAM-Blöcke in den Spartan/Virtex-Familien von Xilinx basieren auf einer universell konfigurierbaren, synchronen Speicherarchitektur. Sie verfügt über zwei symmetrische, physikalisch voneinander getrennte Ports mit separaten Adress-, Daten- und Steuersignalen. Diese Merkmale ermöglichen es, RAM-Blöcke als Single- oder als Dual-Port-Speicher flexibel zu konfigurieren.

In der Spartan-Serie sind die RAM-Blöcke spaltenweise organisiert und haben eine typische Blockgröße von 18 Kbit. Für einen RAM-Block kann der Anwender zehn verschiedene Speicherorganisationen von 16 K × 1 bit, über 1024 × 16 bit bis 256 × 72 bit, wahlweise - mit Paritätsbits, auswählen [10]. Die FPGA-internen RAM-Blöcke sind sehr schnelle synchrone Komponenten und weisen in der Spartan-Serie eine Verzögerung (Clock-to-Output-Time) von 2,4 ns [9] auf. Die Initialisierung von RAM-Blöcken kann entweder über INIT-Attribute bei der Instanziierung einer primitiven RAM-Block-Komponente oder über eine COE-Datei bei der Konfiguration einer RAM-Block-Komponente mit dem Core-Generator von Xilinx erfolgen [8].

Prinzip der Mikroprogrammierung

Der klassische Entwurf eines Steuerwerks als Zustandsmaschine auf Basis festverdrahteter Logik kann bei komplexen digitalen Systemen mit zahlreichen Zuständen und Zustandsübergängen sowie mit vielen Statussignalen recht aufwendig werden. Mit der steigenden Komplexität erhöht sich auch die Fehleranfälligkeit und sinkt die Flexibilität sowie die Erweiterbarkeit. Anstelle eines festverdrahteten Steuerwerks kann deshalb ein Steuerwerk auf der Grundlage eines (Mikroprogramm-) Speichers verwendet werden. Dabei wird ein Steuerungsalgorithmus als Programm im Mikroprogrammspeicher des Steuerwerks abgelegt und als Folge von Mikrobefehlen abgearbeitet.

In diesem Beitrag wird vor allem auf diejenigen Architekturen mikroprogrammierter Steuerwerke eingegangen, die sich besonders gut zur Realisierung mit synchronen Speichern eignen. Eine umfassende und praxisorientierte Beschreibung spezieller mikroprogrammierter Steuerwerke im Prozessorentwurf und für Steuerungsanwendungen findet man in [4]. Einen sehr guten Überblick über die Synthese mikroprogrammierter Steuerwerke für Rechenwerke in universellen und speziellen Prozessoren bieten auch [5, 6].

Es gibt drei einfache Grundstrukturen mikroprogrammierter Steuerwerke, die für den Einsatz in FPGA-Bausteinen mit synchronen RAM-Blöcken besonders geeignet sind (Bild 1).

Als erstes gibt es Steuerwerke mit paralleler Abfrage von Eingangsbedingungen. Im einfachsten Fall besteht ein mikroprogrammiertes Steuerwerk nur aus einem einzelnen RAM-Block als Mikroprogrammspeicher und kommt ohne zusätzliche Logik aus. Die effektive Adresse, also diejenige Adresse, mit der der Mikroprogrammspeicher adressiert wird, wird durch die Konkatenation der Zustandsadresse mit den Eingangsbedingungen gebildet. Das Format eines Mikrobefehls besteht aus einem Feld für Folgeadressen und einem Bitvektor für Ausgangssteuersignale. Dieser Typ des Steuerwerks fand Verwendung bei der Implementierung des mikroprogrammierten UART-Moduls.

Des Weiteren gibt es Steuerwerke mit sequenzieller Abfrage von Eingangsbedingungen. Ein Steuerwerk dieses Typs kann dann zum Einsatz kommen, wenn die Eingangsbedingungen zeitlich disjunkt ausgewertet werden können. Das Steuerwerk wird eingangsseitig um einen 1-aus-N-Multiplexer derart erweitert, dass die Auswahl einer aus mehreren Eingangsbedingungen erfolgen kann. Die effektive Adresse wird durch die Konkatenation der Zustandsadresse mit der selektierten Eingangsbedingung gebildet. Das Format des Mikrobefehls beinhaltet drei Felder, und zwar mit Folgeadressen, mit Ausgangssteuersignalen und mit Auswahlsignalen für den Multiplexer.

Schließlich gibt es noch Steuerwerke mit bedingten Startadressen. Dieser Typ des Steuerwerks ist für die Implementierung eines mikroprogrammierten Steuerwerks in einem Soft-Core-Prozessor besonders gut geeignet. Eingangsseitig befinden sich dort zwei Multiplexer. Mit einem Multiplexer werden Eingangsbedingungen selektiert, die dann im zweiten Multiplexer zur Auswahl von Startadressen dienen.

Mit Hilfe der Startadressen lassen sich verschiedene Abschnitte im Mikroprogramm erreichen. Diese Abschnitte beinhalten Folgen von Mikrobefehlen zur Ausführung  von Maschinenbefehlen des Soft-Core-Prozessors. Das Format des Mikrobefehls besteht hier aus einem Feld für Folgeadressen, einem Bitvektor für Ausgangssteuersignale und einem Feld mit Auswahlsignalen für die Multiplexer.