VHDL-Kurs, Klassen und Datentypen
VHDL ist eine typenorientierte Programmiersprache. Man unterscheidet grundsätzlich 3 Klassen verschiedener Informationsträger:
constant
|
Die Definition einer Konstante erfolgt im Deklarationsteil durch: constant constant_name : type := value; Wie der Name schon
sagt, ist der Wert der Konstante im restlichen VHDL-Code unveränderlich.
|
variable
|
Variablen sind nur innerhalb eines process, einer procedure oder einer function lokal gültig. Die Definition der Variable erfolgt im Deklarationsteil durch:
variable variable_name : type [:= value]; Die Initialisierung bei der Deklaration ist optional. Die Zuweisung eines Wertes im
Code erfolgt durch variable_name := value; Im Gegensatz zu einem signal steht der neue Wert schon in der nächsten VHDL-Zeile zur Verfügung.
|
signal
|
Die in der Portdeklaration einer Entity (s.u.) aufgeführten Signale, stehen automatisch dem Umfeld einer Architecture zur Verfügung. Eine Definition eines Signals erfolgt im Deklarationsteil durch:
signal signal_name : type [:= value] ; Die Initialisierung des Signals bei der Deklaration ist optional. Mehrere Signale des
selben Typs können in der Deklaration durch Komma getrennt werden. Ein Signal hat ein grundsätzlich anderes Verhalten als eine Variable. Zum einen wird im Gegensatz zu einer lokalen Variable ein
Signal zur Kommunikation zwischen Prozessen und Entities benutzt (s.u.). Zum anderen gibt es zwischen Variablen und Signalen einen erheblichen Unterschied bei der Zuweisung eines neuen Wertes. Bei
einem Signal erfolgt dieses durch "<=", z.B. signal_A <= signal_B AND signal_C; Da Prozesse in VHDL parallel
(unabhängig ihrer Position im VHDL-Code) ablaufen, müssen die Wertzuweisungen von Signalen innerhalb der Simulation 'synchroniert' werden. Dieses erfolgt mit dem folgenden Ablauf:
- Neue Signalwerte aller Prozesse berechnen, aber noch nicht zuweisen! Erst wenn bei keinem Prozeß mehr ein neuer Signalwert berechnet werden muß (alle Signale befinden sich in Ruhe), kann mit
Punkt 2 fortgefahren werden
- Neue Signalwerte aus 1. den Signalen zuordnen, und zwar bei allen Prozessen gleichzeitig!
- Gehe zu Punkt 1 (neuer Simulationszyklus)
Daher ist der neue Wert eines Signals nach seiner Zuweisung noch nicht unmittelbar, z.B in den folgenden Zeilen eines Prozesses, bekannt! Es wird weiter der alte Signalwert benutzt! Dieser in 1. neu
berechnete Wert wird - wie bei allen anderen Signalen auch - erst in Schritt 2. an das Signal übertragen.
|
|
Vordefinierte Typen In VHDL gibt es eine Sammlung von vordefinierten Datentypen, die benutzt werden können.
integer
|
Ganzzahlig von -231-1 (-2.147.483.647) bis 231 (2.147.483.647)
|
bit
|
Wert `0´ oder `1´
|
bit_vector(range)
|
Wert `0´ oder `1´ für jedes bit des Vektors, z.B. byte <= “00110110”. range wird durch einen ganzzahligen Indexbereich definiert, z.B. 7 downto 0 (Byte) oder 3 to 6 . Der Zugriff auf ein einzelnes Bit innerhalb eines Vektors erfolgt durch Indizierung entsprechend bit_signal <= vector_signal(index).
|
boolean
|
Wert kann true (wahr) oder false (falsch) annehmen. Dieser kann auch durch logische Ausdrücke berechnet werden, z.B. (sig1 = 12)
|
|
Selbst definierte oder hinzugefügte Typen Neben den vordefinierten Typen können aufbauend auf den vorhandenen selbst definierte Typen erzeugt
werden, oder aus vorhandenen Packages (s.u.) mit hinzugefügt werden. Beispiele für selbst erzeugte Typen sind:
type AMPEL is (ROT, GELB, GRUEN);
|
Aufzählungstypen. Intern werden die definierten Werte mit normalen Bits gehandhabt. Im Beispiel ist ROT=”00”, GELB=”01 und GRUEN=”10”
|
subtype DIGIT is integer range 0 to 9;
|
Subtypes; es ist nur ein eingeschränkter Bereich aus dem Basistyp zulässig. Eine Zuweisung außerhalb dieses Bereiches führt in der Simulation zu einem Fehler.
|
type type_name is record part_1 : part_1_type; ... part_n : part_n_type; end record;
|
Komplexe Arrays bilden einen Zusammenschluß mehrerer Typen. Ein Zugriff erfolgt über zwei Ebenen - getrennt durch einen Punkt - durch: sig <= type_name.part_x; (Wert auslesen)
type_name.part_x <= value; (neuen Wert setzen)
|
use IEEE.std_logic_1164.std_logic;
|
Aus der Bibliothek IEEE wird aus dem Package std_logic_1164 der Typ std_logic zur weiteren Verwendung hinzugefügt (s. libraries).
|
|
|
|