4. Objekte

4.1 Objektklassen

Sämtliche Daten in VHDL werden über Objekte verwaltet. Es gibt vier Objektklassen.

4.2 Typdeklarationen

VHDL ist eine typenstrenge Sprache. Alle Objekte müssen von einen bestimmten Typ sein. Handelt es sich dabei nicht um einen bereits vordefinierten Typ, so muß vor der eigentlichen Objektdeklaration der Typ des Objektes deklariert werden. Man unterscheidet hierbei skalare Typen, zusammengesetzte Typen und sonstige Typen.

4.2.1 Skalare Datentypen

Skalare Datentypen sind in VHDL entweder Aufzähltypen, ganzzahlige Typen, Fließkomma-typen oder physikalische Typen. Die Syntax von Typdeklarationen ist wie folgt:

Aufzähltypen

 TYPE enum_type_name IS (case1, case2, case3, ...);

Die möglichen Signalwerte (case ) müssen Bezeichner (ohne Hochkomma) oder Einzelzeichen (Character, in einfachen Hochkomma stehend) sein.

Ganzzahlige Typen

  TYPE int_type_name IS RANGE range_lo TO range_hi;
TYPE int_type_name IS RANGE range_hi DOWNTO range_lo;
TYPE int_type_name IS RANGE other_int_type_name'RANGE;

Fließkommatypen

  TYPE float_type_name IS RANGE range_lo TO range_hi;
TYPE float_type_name IS RANGE range_hi DOWNTO range_lo;
TYPE float_type_name IS RANGE other_float_type_name'RANGE;

Physikalische Typen

Physikalische Typen bestehen aus einem Zahlenwert und einer Einheit:

   TYPE phys_type_name IS RANGE range_lo TO range_hi
UNITS base_unit;
derived_unit = multiplicator unit, ...
END UNITS;

Untertypen von skalaren Typen

Soll der Wertebereich eines existierenden Datentyps eingeschränkt werden, können Untertypen, ("Subtypes"), verwendet werden. Die Syntax einer skalaren Untertyp-Deklaration ist wie folgt:

   SUBTYPE subtype_name IS type_name RANGE range_lo TO     range_hi;
SUBTYPE subtype_name IS type_name RANGE range_hi DOWNTO range_lo;

Folgende Basistypen und Untertypen sind im Package standard festgelegt und somit implizit bekannt:

TYPE    boolean   IS (FALSE, TRUE);
TYPE bit IS ('0', '1');
TYPE character IS ( ... ); -- 128 ASCII-Zeichen
TYPE severity_level IS (NOTE, WARNING, ERROR, FAILURE);

TYPE integer IS RANGE {systemabhängiger Bereich};
TYPE real IS RANGE {systemabhängiger Bereich};
TYPE time IS RANGE {systemabhängiger Bereich}
UNITS
fs;
ps = 1000 fs;
ns = 1000 ps;
....
END UNITS;

SUBTYPE natural IS integer RANGE 0 TO integer'HIGH;
SUBTYPE positive IS integer RANGE 1 TO integer'HIGH;

4.2.2 Zusammengesetzte Datentypen

Zusammengesetzte Datentypen basieren auf skalaren Datentypen. Man unterscheidet unbeschränkte Felder, eingeschränkte Felder und sog. Records. Die Syntax der Deklaration von Feldtypen ist wie folgt:

Uneingeschränkte Felder (eindimensional)

TYPE array_type_name IS ARRAY   (index_type RANGE <>) 
OF base_type_name;

Eingeschränkte Felder (eindimensional)

  TYPE array_type_name IS ARRAY   ({index_type RANGE} range_lo TO range_hi)
OF base_type_name;

Mehrdimensionale Felder

TYPE array_type_name IS ARRAY   ({idx1_type RANGE} dim1_range_lo TO dim1_range_hi,
({idx2_type RANGE} dim2_range_lo TO dim2_range_hi,
... )
OF base_type_name;

Neben der Indizierung range_lo TO range_hi ist bei mehrdimensionalen Feldern auch eine absteigende Indizierung range_hi DOWNTO range_lo oder eine uneingeschränkte Indizierung (<> ) möglich. Eine weitere Alternative ist die Indizierung mit einem skalaren enumeration -Datentyp:

 TYPE array_type_name IS ARRAY   (enum_type1_name, enum_type2_name,...)
OF base_type_name;

Die Indizierung kann für jede Dimension des Feldes anders gewählt werden.

Untertypen von Feldtypen

Untertypen von Feldern sind ebenfalls möglich; hierbei wird jedoch nicht, wie bei skalaren Typen der Bereich, sondern die Indizierung eingeschränkt. Am Beispiel eines eindimensionalen Feldes mit aufsteigender Indizierung sei die Syntax dargestellt:

 SUBTYPE array_subtype_name IS array_type_name (range_lo TO range_hi);

Records

Records sind zusammengesetzte Datentypen, die im Gegensatz zu Feldern aus unterschiedlichen Einzelelementen bestehen können:

   TYPE record_type_name IS RECORD 
element1_name : element1_type;
element2_name : element2_type;
...
END RECORD;

Record-Elemente werden folgendermaßen angesprochen: record_name.element_name

Als Beispiele sind wieder die vordefinierten Typen aus dem standard -Package und eine Möglichkeit zur Deklaration des komplexen Zahlentyps complex aufgezeigt:

 TYPE string     IS ARRAY    (positive RANGE <>) OF character;
TYPE bit_vector IS ARRAY (natural RANGE <>) OF bit;

TYPE complex IS RECORD
R: real;
I: real;
END RECORD;

4.2.3 Sonstige Typen

Access Typen

Access Typen können mit Zeigern in anderen Programmiersprachen verglichen werden:

   TYPE access_type_name IS ACCESS accessed_type_name;

Files

Files dienen zum Zugriff auf Dateien:

 TYPE file_type_name IS FILE OF base_type_name;

4.3 Datendeklarationen

Die eigentliche Deklaration von Daten geschieht in Anweisungen, die den zu deklarierenden Daten eine Objektklasse, einen Referenznamen und einen Datentyp zuordnen. Mehrere Daten eines Typs können gemeinsam in einer Anweisung deklariert werden. Mögliche Defaultwerte können ebenfalls angegeben werden. Bei Konstanten ist die Defaultwertvergabe bei der Deklaration obligatorisch. Ohne eine explizite Defaultwertvorgabe wird das Objekt mit dem am weitesten links in der Typdeklaration stehenden Wert vorbelegt. Dies ist entweder die erste Alternative eines Aufzählungstyps oder der niedrigst mögliche Wert einer Integer- bzw. Fließkomma-Zahl.

Die prinzipielle Struktur einer Deklarationsanweisung ist:

 object_class    data_name1, data_name2, ...
: data_type_name {:= default_value};

Im Falle von Files lautet sie:

 FILE        data_name1, data_name2, ...
: data_type_name IS IN | OUT file_name;

Einige Beispiele:

  CONSTANT    a, b, c     : integer := 5E2;
CONSTANT v_dd : integer := 5;
CONSTANT address : bit_vector := "00101011";
CONSTANT cycle_length : time := 20 ns;

VARIABLE status : severity_level;
VARIABLE data_bus : bit_vector (7 DOWNTO 0);
SIGNAL s1, s2, sa5 : bit := '1';
SIGNAL bit_tab : bit_vector (1 TO 16) := (1 TO 4 | 9 => '1'|OTHERS => '0');

FILE input : string IS IN "/usr/textin";
FILE output : string IS OUT "lib/result";