3. Bausteine der Sprache VHDL
3.1 Zeichensatz
Der in VHDL (Version 87) verwendete Zeichensatz besteht aus 128 Zeichen (ISO 83) einschließlich einiger Sonderzeichen (gezeigt an der Typdeklaration character ):
TYPE character IS (
NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL,
BS, HT, LF, VT, FF, CR, SO, SI,
DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB,
CAN, EM, SUB, ESC, FSP, GSP, RSP, USP,
' ', '!', '"', '#', '$', '%', '&', ''',
'(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?',
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '[', '\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', '{', '|', '}', '~', DEL
);
3.2 Lexikalische Elemente
Lexikalische Elemente sind Kombinationen von Einzelzeichen (character) aus dem Zeichensatzvorrat.
Folgende lexikalische Elemente sind zu unterscheiden (Beispiele in Bild 7):
- Kommentare stehen nach dem Kommentarzeichen "-- " und werden vom Simulator ignoriert.
- Bezeichner (Identifier) sind Zeichenketten, bestehend aus Buchstaben, Sonderzeichen und Ziffern, beginnend mit einem Buchstaben.
- Schlüsselwörter sind reservierte Wörter der VHDL-Syntax. Sie dürfen nicht als Identifier verwendet werden!
ABS ACCESS AFTER ALIAS ALL
AND ARCHITECTURE ARRAY ASERT ATTRIBUTE
BEGIN BLOCK BODY BUFFER BUS
CASE COMPONENT CONFIGURATION CONSTANT DISCONNECT
DOWNTO ELSE ELSIF END ENTITY
EXIT FILE FOR FUNCTION GENERATE
GENERIC GUARDED IF IN INOUT
IS LABEL LIBRARY LINKAGE LOOP
MAP MOD NAND NEW NEXT
NOR NOT NULL OF ON
OPEN OR OTHERS OUT PACKAGE
PORT PROCEDURE PROCESS RANGE RECORD
REGISTER REM REPORT RETURN SELECT
SEVERITY SIGNAL SUBTYPE THEN TO
TRANSPORT TYPE UNITS UNTIL USE
VARIABLE WAIT WHEN WHILE WITH
XOR - Begrenzungszeichen sind neben dem Leerzeichen sämtliche mathematische und logische Operatoren, Klammern und das Kommentarzeichen.
- Einzelzeichen (Character) sind Elemente des Zeichensatzes und stehen in einfachen Hochkommata.
- Zeichenketten (String) sind Kombinationen aus beliebigen Einzelzeichen, in Anführungszeichen stehend.
- Integerzahlen sind ganze Zahlen in Exponentialschreibweise. Zur Übersicht können Unterstriche ("_ ") eingefügt werden.
- Reelle Zahlen sind Fließkommazahlen in Exponentialschreibweise. Auch hier sind Unterstriche möglich.
- Zahlenwerte zu von 10 verschiedener Basis stehen innerhalb von "# "-Zeichen. Die Basis ( 2, 8, 16) wird vorangestellt.
- Bit-Strings stehen in Anführungsstrichen. Die Basis (B = bit, O = oktal, X = hexadezimal) wird vorangestellt (Defaultwert ist B ).
- Physikalische Größen bestehen aus Zahlenwert und Einheit. Die Einheit ist nicht auf Basiseinheiten beschränkt, sondern kann auch davon abgeleitet sein.
3.3 Sprachkonstrukte
Kombinationen von lexikalischen Elementen der Sprache VHDL, die eine bestimmte syntaktische Bedeutung besitzen, nennt man Sprachkonstrukte. Man unterscheidet hierbei zwischen folgenden Gruppen:
3.3.1 Primitive
Primitive stellen einen Wert dar. Dies kann durch Angabe von einzelnen Operanden oder durch Ausdrücke, bestehend aus Operanden und Operatoren geschehen.
Operanden
Operanden können von folgender Art sein:
- Explizite Größenangaben: numerische Größen, Zeichen und Zeichenketten sowie Bit-Strings; sie können direkt als Operanden eingesetzt werden.
- Bezeichner: Referenzname eines Objektes ("identifier").
- Attribute: sie dienen zur Abfrage bestimmter Eigenschaften von Objekten.
- Aggregate: im Englischen "aggregates"; sie kombinieren einen oder mehrere Werte in einem Feldtyp ("array") oder zusammengesetzten Typ ("record").
- Qualifizierte Ausdrücke ("qualified expressions"): sie dienen zur expliziten Festlegung des Datentyps bei Operanden, die mehreren Typen entsprechen können. Die Syntax hierfür lautet:
type_name'(ambiguous_operand_expression )
- Funktionsaufrufe
- Typumwandlungen
Operatoren
Ohne zusätzliche Definitionen kennt man in VHDL folgende Operatoren, die in Gruppen mit gleicher Priorität eingeteilt sind. Die Priorität der Gruppen (entsprechend der nachfolgenden Aufzählung) regelt die Abarbeitung mehrerer Operatoren.
- Diverse Operatoren ( ** ABS NOT )
- Multiplizierende Operatoren ( * / MOD REM )
- Signum-Operatoren ( + - )
- Addierende Operatoren ( + - & )
- Vergleichsoperatoren ( = /= < <= > >= )
- Logische Operatoren (AND NAND OR NOR XOR )
3.3.2 Kommentare
Kommentare in der Sprache VHDL stehen nach dem Kommentarzeichen (doppelter Bindestrich, "-- "). Kommentare können bereits am Anfang einer Zeile beginnen oder nach VHDL-Anweisungen stehen. Der Kommentar reicht immer bis zum Ende der aktuellen Zeile.
3.3.3 Anweisungen
Deklarationsanweisungen
Diese Gruppe dient zur Deklaration von Datentypen, Objekten, Unterprogrammen und Attributen. Dazu gehören die folgenden Anweisungen:
ALIAS ATTRIBUTE COMPONENT CONSTANT
FILE FUNCTION PROCEDURE SIGNAL
SUBTYPE TYPE USE VARIABLE
Sequentielle Anweisungen
Sequentielle Anweisungen dienen zur Beschreibung prozeduraler Vorgänge und sind den Konstrukten von höheren Programmiersprachen ähnlich:
Signalzuweisungen Variablenzuweisungen
ASSERT CASE EXIT IF
LOOP NEXT NULL RETURN
WAIT Prozeduraufruf
Nebenläufige Anweisungen
Nebenläufige (oder parallele) Anweisungen sollen das spezielle Verhalten von Hardware (parallel arbeitende Funktionseinheiten) nachbilden. Zu den nebenläufigen Anweisungen zählen:
Signalzuweisungen ASSERT BLOCK
GENERATE PROCESS Prozeduraufruf
Komponenteninstantiierung
Konfigurationsanweisungen
Bei strukturalen (aus Untermodellen aufgebauten) Modellen muß festgelegt werden, welche Modelle aus den Bibliotheken für die einzelnen Instanzen verwendet werden, wie sie zu verdrahten sind und welche Parameter an sie übergeben werden. Dies geschieht durch sog. Konfigurationsanweisungen. Bei Verhaltensmodellen ist lediglich die gewünschte Architektur auszuwählen.
3.3.4 Syntaktische Rahmen
Einzelne Design-Einheiten benötigen eine gewissen Rahmenstruktur. Diese wird durch sog. syntaktische Rahmen gegeben für die folgenden Design-Einheiten:
ENTITY ARCHITECTURE CONFIGURATION
PACKAGE PACKAGE BODY
3.3.5 Kontextbefehle
Kontextbefehle stehen vor den Design-Einheiten und legen fest, welche Bibliotheken verwendet werden und welche Bibliothekselemente direkt sichtbar sind. Es handelt sich hierbei um die LIBRARY - und die USE -Anweisung.