Aus diesem generischen Code werden bei den meisten FPGA-Bausteinen FPGAinterne RAM-Blöcke abgeleitet, welche Leistung und Platzbedarf für jede Architektur ohne Neucodierung vergleichbar machen. ROMStrukturen lassen sich sogar einfach über Case-Statements im HDL-Code abbilden.
Die zweite Klasse eingebauter Funktionen, die normalerweise instantiiert werden, sind DSP-Blöcke. Bisher war häufig der einzige dedizierte Arithmetikblock ein Multiplizierer. Die Datenpfade, meist das Ergebnis arithmetischer Funktionen wie Multiplikation, Addition oder Subtraktion, stellen ein großes Problem bei der Implementierung von DSP-Funktionen in FPGAs dar. Eine einfache mathematische Gleichung, die relativ komplexe Logik bedingen kann, ist: Y = (C ± (A * B) + CIN).
Um gegenüber ASICs konkurrenzfähig zu sein, bieten viele FPGA-Anbieter komplexere DSP-Elemente, welche Multiplizierer, Addierer, Subtrahierer, Pipeline-Register oder andere arithmetische Funktionen in einem logischen Block beinhalten, mit einer zu ASIC-DSPs vergleichbaren Leistungsfähigkeit. Damit haben moderne FPGAs nun dedizierte DSP-Blöcke für die effiziente Implementierung von arithmetischen Funktionen wie Addition, Subtraktion, Multiplikation, Multiplikation+Addition oder Multiplikation+Akkumulation. Diese Operationen sind typisch für viele DSP-Designs mit FIR- oder IIR-Filtern, FFT, DCT (Diskrete Cosinus-Transformation), Codierer/Decodierer oder Fehlerkorrekturfunktionen.
Der »XtremeDSP«-Block in der Familie »Virtex-4« von Xilinx besteht beispielsweise aus einem Multiplizierer, Datenpfad- Multiplexern, einem Akkumulator, Pipeline-Registern und Steuerungslogik. Um diese DSP-Funktionen bestmöglich nutzen zu können, müssen alle Pipeline-Register und Akkumulator-Operatoren (Addierer/ Subtrahierer) möglichst in einem XtremeDSP-Block untergebracht werden. Dies minimiert oder eliminiert die externen Verbindungen, sodass sich eine maximale Einsatzbandbreite erreichen lässt.
Bei der RTL-Beschreibung ist daher besonders auf jene Steuerungssignale zu achten, die entscheiden, ob eine Funktion in diese speziellen Blöcke implementiert werden kann. Wenn Resetsignale oder Busbandbreiten nicht zu diesen Funktionsblöcken passen, kann es sein, dass unvorhersehbare Logik implementiert wird. Bild 1 zeigt ein Beispiel für einen Multiplizierer- Addierer, dessen Code im Kasten »Codebeispiel für einen Mutiplizierer/Addierer« aufgelistet ist.
Der Multiplizierer/Addierer lässt sich in einem Xtreme- DSP-Block implementieren. Würde dieser Code in mehreren verschiedenen Architekturen eingesetzt, ergäben sich entsprechend unterschiedliche Varianten, basierend auf den Unterschieden in den Architekturen. Kommt ein generischer Code-Ansatz zur Beschreibung der Multiplizierer/ Addierer-Funktion zum Einsatz, lässt sich relativ einfach evaluieren, wie das entsprechende Design in anderen Systemen ausgeführt wird.
Eine andere Methode, um mehrere Versionen eines Designs in RTL zu implementieren, ist der Einsatz so genannter »Wrapper« (Configuration- Statements in VHDL bzw. Define-Statements in Verilog). Mit Wrappern lassen sich Komponenten wie I/Os und Schaltungen für die Taktsteuerung, die normalerweise technologiespezifisch sind, generisch definieren. Dabei werden die spezifischen Primitives unter einer Sub-Hierarchie »versteckt« (Bild 2).
Angenommen, es werde ein SRAM-basiertes FPGA in einem Prototypen eingesetzt, während ein FPGA mit nicht flüchtigem Speicher für das fertige, fertigungsbereite System verwendet wird. In diesem Fall kann eine Wrapper- Datei dazu dienen, unterschiedliche Komponenten je nach Zielbaustein aufzurufen. Die Beispieldatei im Kasten »Eingewickelter Xilinx-Code« zeigt die Verwendung eines Wrappers. Durch den Einsatz von Wrapper-Files kann der eigentliche HDL-Basiscode während der Entwicklungsphase unverändert bleiben, während eine einfache Portierung auf eine neue Zielhardware möglich bleibt. (mc)
Autor:
Roger Do gehört zum FPGA Solutions Marketing Team in der Design Creation and Synthesis Group von Mentor Graphics
Mentor Graphics
Telefon 089 /57 09 60
www.mentor.com/germany
Verwandter Artikel:
Logik-Entwurf: Adieu Schaltplan