VHDL-Kurs

[ASICs]  [Chip Typen]  [Chip Aufbau]  [Entwicklung ]  [Schnittstellen]  [Glossar]
 
     [Modellierung]  [Strategie]  [Synthese]  [ASIC Test]  [VHDL-Kurs] [Beispiel]
 
        
[VHDL-Typen]  [VHDL-Libraries]  [VHDL-Hierarchie]  [VHDL-Struktur]

VHDL-Kurs, eine Übersicht

VHDL ist eine Hardwarebeschreibungssprache, wobei der Name für VHSIC Hardware Description Language und VHSIC wiederum für Very High Speed Integrated Circuit steht. VHDL wurde 1983 vom amerikanischen Department of Defense initiiert und seit Ende 1987 als IEEE 1076 Standard aufgenommen. Seit dem hat sich VHDL quasi als Standard-Hardwarebeschreibungssprache etabliert, zumindest im europäischem Raum, während in den USA und Japan eher Verilog bevorzugt wird.

Im folgenden ist ein kleiner VHDL-Kurs zu finden. Dieser soll nur einen gewissen Eindruck von VHDL an nicht `Eingeweihte´ geben, und keinesfalls als vollständiges Nachschlagewerk dienen. Dennoch versuche ich mit dieser Seite die wichtigsten Prinzipien und Konzepte aufzuführen, so daß es versierten Programmierern am Ende möglich ist, dem VHDL-Beispiel zu folgen und danach selber kleinere Schaltungen designen zu können. Auch möchte ich von der grauen beschreibende Theorie, die in vielen anderen Dokumenten benutzt wird, ein wenig Abstand nehmen und zum Einstieg mehr auf konkrete Beispiele Bezug nehmen.
VHDL Struktur

Grundkonzepte
VHDL dient der Beschreibung und Simulation digitaler Systeme bzw. Schaltungen (z.B. ASIC's) und deren Umgebung (übergeordnetes System oder spezielle Testbench). Alle während der Entwicklung des Designs anfallenden Beschreibungen werden vom Sprachumfang nahezu komplett abgedeckt und können durch Simulation mit einem VHDL-Simulator verifiziert werden. Folgende Grundkonzepte sind in VHDL verwirklicht:

  • Hierarchie
    Hierarchie bedeutet die Unterteilung der Gesamtschaltung in einfachere und kleinere (Teil-)Komponenten. Diese sind entsprechend der Struktur der Schaltung ineinander verschachtelt. Die Komplexität dieser Komponenten kann von einem einzelnen einfachen Gatter (z.B. ein NAND) bis hin zu komplexen Funktionseinheiten (z.B. Prozessorkern, Filter) reichen. Eine Hierarchie stellt selber keine eigene Funktion innerhalb der Schaltung dar, sondern kann als eine Hülle angesehen werden, in der sich ein Schaltungsteil befindet. Die Hülle hat einen Namen und verschiedene Anschlüsse zu der innen liegenden Schaltung, deren Komplexität außerhalb verborgen bleibt und so quasi eine vereinfachte Betrachtung erst ermöglicht. Eine hierarchische Struktur einer Schaltung kann man sich sehr leicht mit Koffern vorstellen, die ineinander gelegt sind und in denen sich jeweils ein Teil des Gesamt-Designs befindet. Die Gesamtschaltung kann man dann mit dem obersten Koffer anfassen, da alle anderen sich in diesem befinden.
  • Abstraktion
    Jede Designeinheit in VHDL (genannt Entity) kann auf unterschiedlichen Abstraktionsgraden beschrieben werden. Dabei ist grundsätzlich zwischen folgenden Möglichkeiten zu unterscheiden (Mischformen sind natürlich möglich):
    • Verhalten
      Algorithmische Beschreibung mit den Mitteln einer höheren Programmiersprache, in der kein/kaum Bezug zur späteren Schaltungsstruktur genommen wird (s.u.).
    • Struktur
      Darstellung der strukturellen Verbindung von Elementen im Sinne einer Hierarchie. Ein Strukturmodell spiegelt viele Details der späteren Schaltung wieder.
    • Datenfluß
      Mischform zwischen Struktur- und Verhaltensbeschreibung. Beschreibt die Struktur von Datenpfaden, während die Operationen auf den Daten als elementare Funktionen vorhanden sind.
  • Bibliotheken
    Die entworfenen Modelle werden in Bibliotheken organisiert, in denen die kompilierten VHDL-Codes enthalten sind und die durch den VHDL-Simulator simuliert werden können. Das in VHDL benutzte Bibliothekskonzept erlaubt weiterhin:
    • Zugriff auf gemeinsame Datenbestände (z.B. Standard Packages, Schaltungsspezifische Datentypen, Teilschaltungen)
    • Wiederverwendung bestehender Schaltungen in unterschiedlichen Designs
    • Einbindung herstellerspezifischer Bibliotheken (z.B. für Standardzellen) für die Entwicklung von ASICs.

Modellierung und Designstrategie
Bei Verwendung von VHDL können zur Entwicklung eines Systems oder einer Schaltung verschiedene Strategien angewendet werden. Bei sehr komplexen Systemen werden auch mehrere Strategien angewendet, da sich die Anforderungen an die zu entwickelnden Modelle in einzelnen Projektphasen unterscheiden können:

  • Verhaltensbeschreibung (Behaviour)
    Ausgangspunkt ist eine 'grobe' Verhaltensbeschreibung der Schaltung, deren Funktionalität durch Simulation überprüft wird. Der Detailierungsgrad ist nicht sehr hoch und man ignoriert zunächst bestimmte Anforderungen der späteren Realisierung. Der Vorteil einer Verhaltensbeschreibung ist der geringe zeitliche Aufwand für die Entwicklung des Modells.
  • Register Transfer Level (RTL)
    Auf dieser Modellierungsebene liegt als klares Ziel die Synthese vor. In der Synthese wird aus der VHDL-Beschreibung eine Netzliste (Gattermodell) erzeugt (transfer to gate level), das letztendlich die wirkliche digitale Schaltung darstellt. Da es in VHDL auch viele Konstrukte gibt, die nicht synthetisierbar sind (z.B. Dateizugriffe, wait-Statement, ...) dürfen sich in dem VHDL-Code nur solche Konstrukte befinden, die synthetisiert werden können.
  • Top-Down Strukturierung
    In der Top-Down Vorgehensweise wird die gesamte Designfunktionalität in kleinere Funktionsblöcke unterteilt, bis man bei den einzelnen Blöcken eine in jeder Hinsicht (Spezifikation, Simulation, Test, Synthese, Layout) handhabbare Größe hat.
    Der entgegengesetzte Weg, Bottom-Up, wird in VHDL auf komplexere Designs so gut wie gar nicht angewendet.

Auf folgenden Seiten befinden sich detailliertere Beschreibungen verschiedener Modellierungen und Designstragegien.

VHDL und das Verhalten in der Simulation
Das aktive Grundelement einer Designbeschreibung in VHDL ist der process. Er ist mit einem Programm einer Programmiersprache vergleichbar und wird mit den üblichen Konzepten erstellt:

  • Sequentielle Abarbeitung mehrerer hintereinander gestellter Anweisungen
  • Kontrollanweisungen zur Steuerung des Ablaufs (if ... then, loop)
  • Verwendung globaler als auch lokaler Variablen und Datentypen
  • Unterprogrammtechniken (Prozeduren und Funktionen)

Ein Prozeß ist eine eigene aktive Einheit und agiert selbständig von anderen Prozessen. Es gibt spezielle Konstrukte um festzulegen, wann ein Prozeß genau zu aktivieren ist:

  • sensitivity list im Prozeß-Header
    Sobald ein Signal aus der sensitivity list einen neuen Zustand einnimmt, wird der Prozeß gestartet und läuft bis zu seinem Ende. Danach wird auf einen neuen Signal-Event gewartet.
  • wait-Anweisungen
    Mit einer wait-Anweisung kann an beliebiger Stelle innerhalb des Prozesses angehalten werden. Der Prozeß wird fortgeführt, sobald die Bedingung der wait-Anweisung erfüllt ist,
     z.B. wait until 5 ns;
    wait-Anweisungen und sensitivity list schließen sich gegenseitig aus.

Diese Methoden bewirken, daß der Prozeß auf bestimmte Bedingungen hin aktiviert wird, seine Anweisungen sequentiell abgearbeitet werden um dadurch neue Ausgangssignale zu erzeugen.
Dieser Aufrufmechanismus ist gleichzeitig der größte Unterschied zu den herkömmlichen sequentiellen Programmen (Software) wie Pascal oder C. Während es in Software immer nur einen aktiven Punkt gibt, den die CPU gerade abarbeitet, können die Hardwareelemente von VHDL (durch mehrere Prozesse repräsentiert) gleichzeitig aktiv sein. Dabei sind die Ergebnisse verschiedener Prozesse unabhängig von der Reihenfolge ihres Auftretens im VHDL-Code! Dieser gravierende Unterschied der Parallelität mehrerer Prozesse im Gegensatz zur sequentiellen Software erfordert das größte Umdenken bei der Entwicklung von digitalen Schaltungen.
Die Kommunikation von Prozessen kann nur über Signale nach außen erfolgen. Diese Signale können Ein- und Ausgangssignale der Schaltung oder interne Signale sein.
In Gegensatz zu den Signalen sind Variablen eines Prozesses nur innerhalb des Prozesses bekannt und können außerhalb des Prozesses nicht gesehen werden (lokalen Speicher).

 

VHDL-Sprachelemente

Im Folgenden werden einige wichtige Sprachelemente aufgeführt. Diese Liste von Sprachelementen soll jedoch nur einen gewissen Eindruck von VHDL vermitteln und kann daher keinesfalls als vollständig betrachtet werden. In Zusammenhang mit dem VHDL-Beispiel können jedoch die meisten aufgeführten Elemente identifiziert und leicht in einen gemeinsamen Zusammenhang gebracht werden.

In den folgenden Beschreibungen werden die Bestandteile des VHDL-Codes blau und VHDL-Schlüsselwörter darin blau&kursiv dargestellt. Alle frei wählbaren oder mit Packages eingebundene Namen erhalten die Endung '...name'. Optionen, wie z.B. Deklarationen, die an bestimmten Stellen im VHDL-Code vorliegen können, werden auf dieser Seite in eckigen Klammern kurz textuell beschrieben [Option xy].

Hier zunächst einige grundlegende Informationen zu der Code-Struktur von VHDL:

  • VHDL unterscheidet keine Groß- und Kleinbuchstaben
  • Am Ende eines Befehls muß ein Strichpunkt (;) gesetzt werden
  • Zeilenumbrüche sind nicht unbedingt nach jedem Befehl erforderlich, erhöhen jedoch - wie in anderen Programmiersprachen auch - die Übersichtlichkeit des Codes immens.
  • Einrückungen am Anfang einer Zeile sollten entsprechend der Codestruktur (z.B. bei if-Konstrukten) eingefügt werden, sind aber nicht zwingend notwendig
  • Kommentare im Code werden durch '--' an beliebiger Position einer Zeile eingeleitet und enden am Zeilenende

Weiter geht es im VHDL-Kurs mit folgenden Themen:

Eine ausführlichere Beschreibung von VHDL gibt es unter http://www.doulos.com/knowhow.

top 

[Home] [ASICs] [Selbstmanagement] [Inselmeer] [Spiele]
[Ich über mich] [Links] [SiteMap] [Disclaimer]