VHDL-Syntax F. Schubert 05/01
05/2001 Pnr, Rch, Sbr, Swr
Prof. Dr. F. SchubertFachhochschule Hamburg
Fachbereich Elektrotechnik und Informatik
Informationstechnik
VHDL-SYNTAX
VHDL-Syntax F. Schubert 05/01
Erläuterungen:
Groß geschrieben: Selbsdefinierte Namen
z.B. VADD, CARRY_IN, TD
Klein geschrieben und fett gedruckt:
VHDL-Schlüsselwort oder -Zeichen
z.B. entity, all, nand, is, std_ulogic, :=, <=
In eckigen Klammern [ ]: optional
z.B. [use <Libraryname>],[<Komponentenkonfiguration>]
In spitzen Klammern < >: Bezeichnungen
z.B. <Libraryname>, <Komponentenkonfiguration>
In geschweiften Klammern { }: beliebig oft wiederholbar
Alternativen werden durch einen Vertikalstrich | getrennt
Hochgestellte „93“ bedeutet, daß das VHDL-Schlüsselwort nichtin VHDL-87 sondern nur in VHDL-93 definiert ist:
z.B. group 93
VHDL-Syntax F. Schubert 05/01
Struktur von VHDL-Modellen
1.) Empfohlene Grundstruktur ohne Komponenten
-- use- und library-Deklarationen
{[use . . . ;]}
{[library . . . ;]}
{[use . . . ; }
-- entity
entity . . . is
[generic(. . .);]
port(. . .);
end . . . ;
-- architecture
architecture . . . of . . . is
{[type . . . ;]} -- Typ- und Signal-Deklarationen
{[subtype . . . ;]} -- innerhalb der Architektur
{[attribute . . . ;]}
{[constant . . . ;]}
{[signal . . . ;]}
{[function . . . ;]} -- Funktions- und Prozedur-{[procedure . . . ;]} -- Deklarationen
VHDL-Syntax F. Schubert 05/01
begin
{[<nebenläufige Anweisung>]}
{[<Prozess-Name>]: [process(. . .)
{[type . . . ;]} -- Typ- und Variablen-
{[subtype . . . ;]} -- Deklarationen innerhalb des
{[variable . . . ;]} -- Prozesses
{[constant . . . ;]}
{[function . . . ;]} -- Funktions- und Prozedur-{[procedure . . . ;]} -- Deklarationen
begin
{[<sequentielle Anweisung>]}
end process [<Prozess-Name>];]}
end . . .;
VHDL-Syntax F. Schubert 05/01
2.) Empfohlene Struktur mit Komponenten
-- use- und library-Deklarationen
-- entity
entity . . . is
[generic(. . .);]
port(. . .);
end . . . ;
-- architecure
architecture . . . of . . . is
-- Architektur -Deklarationen
-- Komponentendeklarationen
{[component <Name der Entity>
[generic(. . .);]
port(. . .);
end component;]}
[-- Komponentenkonfigurationen
{[for all: . . . use entity . . . ;]}
begin]
-- Komponenteninstanziierung
{ . . . : . . . [generic map(. . . )] port map(. . . );}
{[<nebenläufige Anweisung>]}
{[<Prozess>]}
end . . .;
VHDL-Syntax F. Schubert 05/01
-
-
Operator für Werte vom Typ integer, real (für real nicht synthese-fähig).
Funktion: Subtraktion.
Beispiele:
Y := A – B;
Y <= A – B;
VHDL-Syntax F. Schubert 05/01
--
--
Kommentare in VHDL beginnen mit -- und enden am Zeilenende.
Beispiel:
-- Dies ist ein Kommentar
VHDL-Syntax F. Schubert 05/01
&
&
Operator für Signale vom Typ boolean, bit, bit_vector.
Funktion: Verkettung (Concatenation).
Beispiel:
entity VOLLADD1 is
port( AI, BI, CIN: in bit;
SI, COUT: out bit);
end VOLLADD1;
architecture VERHALTEN of VOLLADD1 is
signal TEMP_IN: bit_vector(2 downto 0);
begin
..........
TEMP_IN <= CIN & BI & AI; -- TEMP_IN = “000“ für
-- CIN = BI = AI = ‘0‘
..........
end VERHALTEN;
VHDL-Syntax F. Schubert 05/01
*
*
Operator für Werte vom Typ integer, real oder physical types. Wirdbei integer von den meisten Synthesewerkzeugen unterstützt.
Funktion: Multiplikation.
Beispiele:
Y := A * B;
Y <= A * B;
VHDL-Syntax F. Schubert 05/01
**
**
Operator für Werte vom Typ integer oder real. Der linke Operand darfvom Typ integer oder real sein, der rechte nur vom Typ integer.Synthesefähigkeit nur bei Potenzen von 2!
Funktion: Potenzierung.
Beispiele:
Y := 2 ** B;
Y <= 2 ** B;
VHDL-Syntax F. Schubert 05/01
/
/
Operator für Werte vom Typ integer, real oder physical types. Istmeistens nicht synthesefähig!
Funktion: Division.
Beispiele:
Y := A / B;
Y <= A / B;
VHDL-Syntax F. Schubert 05/01
:=
:=
Sequentielle Anweisung.
Zuweisungsoperator für Variablen.
Beispiele:
Y := A;
Y := ‘0‘; -- Datentyp bit
Y := 3; -- Datentyp integer
VHDL-Syntax F. Schubert 05/01
|
|
Operator für Signale vom Typ boolean, bit, bit_vector.
Funktion: Auswahl mit ODER („Alternativauswahl“).
Beispiele:
with I select
Y <= ‘0‘ when “0000“ | “0101“ | “1010“ | “0111“,
‘1‘ when others;
VHDL-Syntax F. Schubert 05/01
‘event
‘event
Signalattribut.
Funktion: Beschreibung einer Signaländerung.
Syntax:
<Bezeichner>‘event
Beispiele:
wait until CLK’event;
wait until (CLK=‘1‘ and CLK’event);
VHDL-Syntax F. Schubert 05/01
+
+
Operator für Werte vom Typ integer, real (für real nichtsynthesefähig).
Funktion: Addition.
Beispiele:
Y := A + B;
Y <= A + B;
VHDL-Syntax F. Schubert 05/01
<=
<=
Nebenläufige Anweisung. Auch innerhalb von Prozessen erlaubt.
Zuweisungsoperator für Signale.
Beispiele:
Y <= A;
E(3) <= ‘1‘;
E <= “1101“;
E <= (‘1‘,‘1‘,‘0‘,‘1‘);
siehe after, when, with
VHDL-Syntax F. Schubert 05/01
= /= < > <= >=
= /= < > <= >=
Vergleichsoperatoren:
= gleich
/= ungleich
< kleiner
> größer
<= kleiner gleich
>= größer gleich
Funktion: Vergleich.
Beispiele:
when A=B ...;
when A>=B ...;
VHDL-Syntax F. Schubert 05/01
=>
=>siehe case
VHDL-Syntax F. Schubert 05/01
abs
abs
Operator für Zahlenwerte.
Funktion: Liefert den Absolutwert des Arguments.
Beispiele:
Y := abs(A);
Y <= abs(A);
VHDL-Syntax F. Schubert 05/01
after
after
Definition der Verzögerungszeit.
Funktion: Bei der Zuweisung eines Wertes an ein Signal kann eineVerzögerungszeit definiert werden. Der Default-Wert ist 0 fs, wennkeine Verzögerungszeit definiert wird. Dieses Konstrukt ist nichtsynthesefähig! Einige Synthesewerkzeuge ignorieren dies, bei anderen istafter ungültig.
Bei der Modellierung der Verzögerungszeit werden zwei Artenunterschieden:
- inertial-Modellierung: es werden nur Impulse mit einer minimalenDauer weitergegeben
- transport-Modellierung: es werden auch kurze Impulseweitergegeben
Kurze Impulse sind Impulse, deren Dauer kleiner als dieVerzögerungszeit ist. Da reale Gatter kurze Impulse unterdrücken, ist inVHDL das inertial-Modell Standard und braucht nicht angegeben zuwerden. Sollen beim inertial-Modell Impulse weitergegeben werden,deren Dauer kleiner als die Verzögerungszeit ist, so kann die minimaleImpulsdauer mit dem Schlüsselwort reject angegeben werden.
Syntax:
<Signalname> <= [reject <Zeit>] [transport] <logischer
Ausdruck> after <Zeit>;
VHDL-Syntax F. Schubert 05/01
after
Beispiele:
Y <= ´1´ after 12 ns; -- inertial-Modell
Y <= inertial ´1´ after 12 ns; -- inertial-Modell
Y <= transport ´1´ after 12 ns; -- transport-Modell
Y <= reject 4 ns inertial ´1´ after 12 ns; -- inertial-Modell
Y <= ´1´ after 12 ns; ´0´ after 20 ns;
siehe <=
VHDL-Syntax F. Schubert 05/01
alias
alias
Bei der Deklaration von Signalen oder Variablen kann mit der alias-Deklaration ein zweiter Name zugewiesen werden. Damit kann dieLesbarkeit des Quellcodes erhöht werden.
Syntax:
alias <Name_1> : <Datentyp> is <Name_2>;
Beispiel:
signal CTRL_BUS : bit_vector(7 downto 0);
alias STROBE: bit is CTRL_BUS(0);
alias RNW: bit is CTRL_BUS(1);
alias DATA_VALID: bit is CTRL_BUS(2);
VHDL-Syntax F. Schubert 05/01
all
allsiehe configuration, library, use
VHDL-Syntax F. Schubert 05/01
and
and
Operator für Werte vom Typ bit oder boolean und eindimensionaleArrays dieser Typen.
Funktion: AND-Verknüpfung der Werte. Bei Arrays werden diekorrespondierenden Komponenten verknüpft.
Beispiele:
Y := A and B;
Y <= A and B;
VHDL-Syntax F. Schubert 05/01
architecture
architecture
Grundlegendes Strukturelement einer VHDL-Beschreibung. In der mitarchitecture bezeichneten Entwurfseinheit wird die Funktionalität einesVHDL-Funktionsblocks beschrieben. Im Vergleich zu einem Board-Design beschreibt die architecture die Funktion, bzw. welcher Chip sichin einem Gehäuse befindet.
Syntax:
architecture <Architekturname> of <Entityname> is
[{<Architekturdeklaration>}]
begin
{<Nebenläufige Anweisung>}
end <Architekturname>;
Beispiel:
architecture VERHALTEN of MUX is
begin
with S select
Y <= E(0) when “00“;
E(1) when “01“;
E(2) when “10“;
E(3) when “11“;
end VERHALTEN;
VHDL-Syntax F. Schubert 05/01
array
array
Zusammengesetzter Datentyp. Ein array enthält Komponenten gleichenTyps, auf die über einen Index zugegriffen werden kann.
Syntax:
type <Arrayname> is array <Indexbeschränkung> of
<Subtypname>;
Beispiele:
type BYTE is array (7 downto 0) of bit;
type VEKTOR is array (1 to 5) of integer;
type MATRIX is array (1 to 5, 1 to 10) of integer;
signal TEST: array(7 downto 0) of integer;
signal S_BYTE: BYTE;
signal RAM: MATRIX;
if S_BYTE(5) = ‘0‘ then .....
S_BYTE(0) <= ‘4‘;
RAM(2, 7) <= ‘12‘;
siehe type
VHDL-Syntax F. Schubert 05/01
assert
assert
Die assert–Anweisung dient zur Erleichterung der Fehlersuche in einemVHDL-Code. Mit ihrer Hilfe können während eines SimulationslaufsFehlermeldungen erzeugt werden. Bei Verletzung der Bedingung wirdein String ausgegeben. Die assert–Anweisung kann durch die Angabeder Bedeutungsklasse (severity) des Fehlers abgeschlossen. Es gibt vierBedeutungsklassen: note, warning, error, failure. Die assert–Anweisung ist nicht synthesefähig!
Syntax:
assert <Bedingung> [report <String>]
[severity <Bedeutungsklasse>];
VHDL’93 erlaubt eine verkürzte Syntax, bei der bei erfüllter Bedingungein String ausgegeben wird:
when <Bedingung> => report <String>;
Beispiele:
assert not (BIT0 = ‘1‘) report “Fehler: Bit0 = 1!“ severity error;
when (BIT0 = ‘1‘) report “Fehler: Bit0 = 1!“;
VHDL-Syntax F. Schubert 05/01
attribute
attribute
Ein Attribut ist ein Charakteristikum, das mit bestimmten Elementen(z.B. array, architecture, entity usw.) verbunden werden kann. DieVerbindung erfolgt durch eine Attributdeklaration. In VHDL gibt esvordefinierte Attribute und benutzerdefinierte Attribute.
Attributdeklaration:
Dient zur Definition eines benutzerdefinierten Attributs.
Syntax:
attribute <Attributname> : <Typ-/Subtypname>;
Attributzuordnung:
Dient zur Einsetzung des Werts eines Attributs.
Syntax:
<Präfix> ‘ <Attributname>
Präfix: <Name> oder Funktionsaufruf
VHDL-Syntax F. Schubert 05/01
attribute
Beispiele:
attribute BOOLE_IN : boolean;
-- Deklariert ein Attribut mit dem Namen BOOLE_IN,
-- das einen boolean-Wert speichern kann
attribute TPLH : real;
attribute TAKT_PERIODE : ZEIT;
CLOCK’TP(15 ns) -- CLOCK ist ein Signalname. ‘TP ist
-- ein benutzerdefiniertes Attribut.
-- Dieser Attributname steht für ein
-- neues Signal, das die gleiche
-- Signalform wie CLOCK aufweist,-- jedoch um 15 ns verzögert ist.
CLOCK’event
VHDL-Syntax F. Schubert 05/01
attribute
Attributfestlegung:
Dient zur Verknüpfung eines benutzerdefinierten Attributs mit einemElement. Das Attribut muß vorher mit einer Attributdeklarationdeklariert worden sein. Auf den Wert des Attributs wird durch denAttributnamen zugegriffen.
Syntax:
attribute <Attributname> of <Einheit>: <Einheitenklasse> is
<Ausdruck>;
Einheit:
- Einheitenname
- all
- others
Einheitenklasse:
- architecture
- component
- constant
- entity
- function
- label
- package
- procedure
- signal
- subtype
- type
- variable
VHDL-Syntax F. Schubert 05/01
attribute
Beispiele:
attribute RES of CLEAR: procedure is WAHR;
-- RES wird mit der Prozedur CLEAR verbunden. Der
-- Wert des Attributs ist WAHR. Zugriff durch z.B.
-- CLEAR’RES.
attribute TPLH of SIG1, SIG2: signal is 5 ns;
-- TPLH wird mit den Signalen SIG1 und SIG2
-- verbunden.
attribute TPLH of all: variable is 5 ns;
-- TPLH wird mit allen Variablen desselben
-- Deklarationsbereichs verbunden.
Vordefinierte Attribute:
- ‘left
- ‘right
- ‘low
- ‘high
- ‘pos(X)
- ‘val(N)
- ‘leftof(X)
- ‘rightof(X)
- ‘pred(X)
- ‘succ(X)
- ‘range(N)
- ‘reverse_range(N)
- ‘length(N)
siehe ‘event
VHDL-Syntax F. Schubert 05/01
b, B
B, b
Kennbuchstabe zur Kennzeichnung der Zahlenbasis.
Basis: Dual.
Beispiele:
b“1010 1010“
B“1010_1010“
VHDL-Syntax F. Schubert 05/01
begin
beginsiehe architecture, process
VHDL-Syntax F. Schubert 05/01
bit
bit
Datentyp.
Wertevorrat: ‘0‘ oder ‘1‘.
Beispiel:
port( S: in bit);
VHDL-Syntax F. Schubert 05/01
bit_vector
bit_vector
Datentyp. Bus aus mehreren bit-Signalen.
Wertevorrat: ‘0‘ oder ‘1‘.
Beispiel:
port( S: in bit_vector(3 downto 0));
VHDL-Syntax F. Schubert 05/01
block
block
Mit der block-Anweisung können Komponentenarchitekturenpartitioniert werden. Sie dient der Kennzeichnung und erhöht dieLesbarkeit des Codes. In einem Block werden die in ihm deklariertenSignale, Typen und Konstanten nur lokal verfügbar gehalten. In derSimulation werden Blöcke als eigene hierarchische Ebene angezeigt.
Syntax:
<Block-Name>: block
[{<Deklarationsteil>}]
begin
{<Nebenläufige Anweisung>}
end block [<Block-Name >];
VHDL-Syntax F. Schubert 05/01
block
Beispiel:
architecture VERHALTEN of BLK is
signal INT_SIG: bit;
begin
AUSWAHL: block
begin
process(ADR)
begin
. . . . . .
end process;
end block AUSWAHL;
MOORE: block
type ZUSTAENDE is (START, STOP);
signal ZUSTAND, FOLGE_ZUSTAND: ZUSTAENDE;
begin
process(CLK, RESET)
begin
. . . . . .
end process;
end block MOORE;
end VERHALTEN;
VHDL-Syntax F. Schubert 05/01
body
bodysiehe package
VHDL-Syntax F. Schubert 05/01
boolean
boolean
Datentyp.
Wertevorrat: true oder false.
Beispiel:
architecture VERHALTEN of TEST is
signal ERROR_FLAG: boolean;
begin
.......
ERROR_FLAG <= false;
.......
ERROR_FLAG <= (A = B);
.......
end VERHALTEN;
VHDL-Syntax F. Schubert 05/01
buffer
buffer
Signalattribut in einer port-Anweisung. Ein buffer-Signal wird nachaußen geleitet, aber auch innerhalb einer Architektur verwendet. Es darfauf der rechten oder linken Seite einer Signalzuweisung oder in einerSignalabfrage stehen.
Beispiel:
port(
B: buffer bit;
E: buffer bit_vector(3 downto 1));
VHDL-Syntax F. Schubert 05/01
case
case
Sequentielle Anweisung.
Die case-Anweisung ist eine Anweisung, die in einem Prozess, einerFunktion oder einer Prozedur verwendet werden kann.
Funktion: Beschreibung von Alternativen zur Programmverzweigung.
Syntax:
case <Kontrollausdruck> is
when <Testausdruck_1> => {<Sequentielle Anweisung>}
when <Testausdruck_2> => {<Sequentielle Anweisung>}
.....
when others => {<Sequentielle Anweisung>}
end case;
Alle Wahlmöglichkeiten müssen angegeben werden. Es gibt keineProbleme, wenn others als letzte Möglichkeit verwendet wird.
Beispiel:
case A is
when 5 => Y <= 3;
when 6 to 10 => Y <= 4;
when 1|2 => Y <= 2;
when others => Y <= 0;
end case;
VHDL-Syntax F. Schubert 05/01
component
component
Ein Quellcode-Modul kann als component (Komponente) innerhalbeiner architecture eingebunden werden.
Komponentendeklaration:
Dient zur Deklaration der Komponente und ihrer Schnittstellen.
Syntax:
component <Komponentenname>
[generic(<Deklaration der Konstanten>);]
port(<Deklaration der Ein- und Ausgänge>);
end component;
Komponenteninstanziierung:
Dient zur Instanziierung einer Komponente.
Syntax:
[<Marke>] : <Komponentenname>
[generic map(<Verknüpfungsliste>)]
port map(<Verknüpfungsliste >);
VHDL-Syntax F. Schubert 05/01
component
Beispiel:
library ieee;
use ieee.std_logic_1164.all;
entity SNETZ is
port( E: in std_logic_vector(3 downto 0);
M: out std_logic);
end SNETZ;
architecture VERHALTEN of SNETZ is
begin
..........
end VERHALTEN;
library ieee;
use work.SNETZ; -- Zugriff auf Objektcode der
-- Komponente in der Library „work“
entity TBENCH is
end TBENCH;
VHDL-Syntax F. Schubert 05/01
component
architecture SIGNALE of TBENCH is
component SNETZ -- Komponentendeklaration
generic(TP: TIME);
port( E: in std_logic_vector(3 downto 0);
M: out std_logic);
end component;
signal TE: std_logic_vector(3 downto 0);
signal TM: std_logic;
begin
DUT: SNETZ -- Komponenteninstanziierung
generic map (TP => 25 ns)
port map (TE, TM);
..........
end SIGNALE;
siehe configuration
VHDL-Syntax F. Schubert 05/01
configuration
configuration
Ein zusätzliches Quellcode-Modul kann als configuration innerhalbeiner eigenen Entwurfseinheit eingebunden werden. Die configurationist die Verbindung zwischen einer Komponenteninstanziierung und derrealen Komponente in einer Bibliothek.
Konfigurationsdeklaration:
Dient zur Deklaration der Komponente und ihrer Schnittstellen.
Syntax:
configuration <Konfigurationsname> of <Entityname> is
[use Libraryname]
for <Architekturname>
[use <Libraryname>]
[<Komponentenkonfiguration>]
[<Blockfestlegung>]
end for;
end [configuration][<Konfigurationsname>];
Komponentenkonfiguration:
for <Komponentenfestlegung>
[<Verbindungsanzeiger>;]
[<Blockkonfiguration>]
end for;
VHDL-Syntax F. Schubert 05/01
configuration
Komponentenfestlegung:
<Instanziierungsmarkenname> : <Komponentenname>
-- alternativ
others : <Komponentenname> -- alternativ
all : <Komponentenname> -- alternativ
Blockfestlegung:
<generate-Anweisung> -- alternativ
<Architekturname> -- alternativ
<Blockmarkenname> -- alternativ
generate-Anweisung:
<Generatemarkenname> :
for <Name> in <Bereich>
generate
[<Deklarationen>]
[begin]
[{<Nebenläufige Anweisung>}]
end generate [<Generatemarkenname>];
Bereich:
<Ausdruck>
to | downto
<Ausdruck>
VHDL-Syntax F. Schubert 05/01
configuration
Verbindungsanzeiger:
[use]
[entity <Entityname>[(<Architekturname>)]]
[configuration <Konfigurationsname>]
[open]
[generic map(<Verknüpfungsliste>)]
[port map(<Verknüpfungsliste>)]
Blockkonfiguration:
for <Blockkonfiguration>
[use <Libraryname>]
[<Komponentenkonfiguration>]
[<Blockfestlegung>]
end for;
Konfigurationsfestlegung:
Dient zur Anbindung der Komponente an eine Design-Einheit.
Syntax:
for <Komponentenfestlegung>
<Verbindungsanzeiger>;
VHDL-Syntax F. Schubert 05/01
configuration
Beispiel: -- 4-BIT-Addierer mit externer Konfiguration
library ieee;
use ieee.std_logic_1164.all;
entity ADD4_B is
generic(WB: positive := 4);
port(A, E: in std_ulogic_vector(WB-1 downto 0);
SUM: out std_ulogic_vector(WB-1 downto 0));
end ADD4_B;
architecture STRUK_HL of ADD4_B is
signal CARRY_RIPPLE: std_ulogic_vector(WB-2 downto 0);
signal ZERO: std_ulogic := ‘0‘;
component VADD
port(CARRY_IN, IN1, IN2: in std_ulogic;
S, CARRY_OUT: out std_ulogic);
end component;
begin
VA_LSB: V_ADD -- Komponenteninstanziierung
port map (CARRY_IN => ZERO, IN1 => A(0) , IN2 => B(0),
S => SUM(0), CARRY_OUT => CARRY_RIPPLE(0));
VA_KETTE:
for N in WB-2 downto 1 generate
VA_INNEN: VADD
port map (CARRY_RIPPLE(N-1), A(N), B(N),
SUM(N), CARRY_RIPPLE (N));
end generate;
VHDL-Syntax F. Schubert 05/01
configuration
VA_MSB: V_ADD
port map (CARRY_RIPPLE(WB-2), A(WB-1), B(WB-1),
SUM(WB-1), SUM(WB));
end STRUK_HL;
-- Strukturmodell des Volladdierers auf der Basis von Halbaddierern
library ieee;
use ieee.std_logic_1164.all;
entity V_ADD is
port(CARRY_IN, IN1, IN2: in std_ulogic;
S, CARRY_OUT: out std_ulogic);
end V_ADD;
architecture STRUK_LL of V_ADD is
signal PROP, GEN: std_ulogic;
signal ZERO: std_ulogic := ‘0‘;
component H_ADD
port(X1, X2, X3: in std_ulogic;
Q1, Q2: out std_ulogic);
end component;
begin
C1: H_ADD
port map (X1 => IN1, X2 => IN2 , X3 => ZERO,
Q1 => PROP, Q2 => GEN);
C2: H_ADD
port map (X1 => PROP, X2 => CARRY_IN , X3 => GEN,
Q1 => S, Q2 => CARRY_OUT);
end STRUK_LL;
VHDL-Syntax F. Schubert 05/01
configuration
-- Verhaltensmodell des Halbaddierers
library ieee;
use ieee.std_logic_1164.all;
entity H_ADD is
generic(TD: TIME := 20 ns);
port(X1, X2, X3: in std_ulogic;
Q1, Q2: out std_ulogic);
end H_ADD;
architecture VERHALTEN of H_ADD is
begin
Q1 <= X1 or X2;
Q2 <= (X1 and X2) or X3 after TD;
end VERHALTEN;
-- Externe Konfiguration
library ieee;
use ieee.std_logic_1164.all;
configuration CONFIG1_ADD of ADD4_B is
for STRUK_HL
for all: V_ADD
use entity WORK.V_ADD(STRUK_LL);
for STRUK_LL
for all: H_ADD
use entity WORK.H_ADD(VERHALTEN);
end for;
end for;
end for;
end for;
end CONFIG1_ADD;
VHDL-Syntax F. Schubert 05/01
constant
constant
Mit dem Schlüsselwort constant können Konstanten innerhalb einerarchitecture, eines process oder eines package deklariert werden. DieDeklaration muß innerhalb einer architecture oder eines process vordem begin erfolgen.
Beispiele:
constant PI : real := 3.1415;
constant LARGE_INT : integer := 99999;
constant VEKTOR : bit_vector (7 downto 0) := (others => ‘1‘);
-- Die Konstante VEKTOR hat 8 Elemente, die alle-- auf ‘1‘ gesetzt werden
VHDL-Syntax F. Schubert 05/01
downto
downto
Absteigende Indizierung eines Busses vom Typ bit_vector oderstd_logic_vector.
Beispiele:
S : in bit_vector(1 downto 0);
E : in std_logic_vector(3 downto 0);
siehe subtype, to, type
VHDL-Syntax F. Schubert 05/01
else
elsesiehe if, when
VHDL-Syntax F. Schubert 05/01
elsif
elsifsiehe if
VHDL-Syntax F. Schubert 05/01
end
endsiehe architecture, block, component, configuration, entity,function, generate, loop, package, procedure, process, while
VHDL-Syntax F. Schubert 05/01
entity
entity
Grundlegendes Strukturelement einer VHDL-Beschreibung. In der mitentity bezeichneten Entwurfseinheit werden die Schnittstellen einesVHDL-Funktionsblocks nach außen beschrieben. Im Vergleich zu einemBoard-Design stellt die entity den IC-Gehäusetyp dar, der durch Anzahlund Bezeichnung der Anschlüsse definiert ist. Die Deklaration derAnschlüsse innerhalb der entity erfolgt mit Hilfe der port-Anweisung.
Syntax:
entity <Entityname> is
port(
<Deklaration der Ein- und Ausgänge>
);
end <Entityname>;
Beispiel:
entity MUX is
port( S: in bit_vector(1 downto 0);
E: in bit_vector(3 downto 0);
Y: out bit
);
end MUX;
siehe port, generic
VHDL-Syntax F. Schubert 05/01
exit
exit
Sequentielle Anweisung.
Die exit-Anweisung verursacht einen Abbruch der Schleife, in der sieenthalten ist. Die Ausführung wird bei der unmittelbar nachSchleifenende folgenden Anweisung fortgesetzt.
Syntax:
exit;
exit <Marke>;
exit when <Bedingung>;
exit <Marke> when <Bedingung>;
Beispiele:
for I in BITS-1 downto 0 loop
.......
exit;
.......
end loop;
for I in BITS-1 downto 0 loop
.......
exit when I = 4;
.......
end loop;
siehe for, while, loop, next when
VHDL-Syntax F. Schubert 05/01
falling_edge
falling_edge
Mit der Funktion falling_edge kann die abfallende Taktflanke einesSignals vom Typ std_ulogic bzw. std_logic abgefragt werden (Giltnicht für Signale vom Typ bit).
Beispiel:
process(CLK)
begin
.......
if falling_edge(CLK) then
.......
end process;
siehe rising_edge
VHDL-Syntax F. Schubert 05/01
false
falsesiehe boolean
VHDL-Syntax F. Schubert 05/01
file
file
Mit der file-Deklaration wird ein Datenfile mit Namen, DatentypFileattribut und externem Namen festgelegt.
Syntax:
file <File-Name>: <File-Typ> is [ in | out ] string;
Beispiel:
use std.textio.all; -- File-I/O-Package
. . . . .
file SRCFILE: text is in "CODE.TXT";
variable SRC_LINE: line;
variable F_CHAR: character;
variable VALID: boolean;
. . . . .
readline (SRCFILE, SRC_LINE);
read (SRC_LINE, F_CHAR, VALID);
'SRCFILE' ist der Quellcode-Name, der Datentyp ist 'text' und es kannaus der Datei "CODE.TXT" gelesen werden.
VHDL-Syntax F. Schubert 05/01
for
for
Sequentielle Anweisung.
In der for-Schleife ist die Anzahl der Schleifendurchläufe durch einenLaufindex vorgegeben. Der Laufindex wird automatisch deklariert undist nur in der for-Schleife gültig.
Funktion: Terminierte Programmschleife.
Syntax:
for <Schleifenspezifikation> loop
{<Sequentielle Anweisung>}
end loop;
Für <Schleifenspezifikation> sind zwei Varianten erlaubt:
<Schleifenindex> in <Untere_Grenze> to <Obere_Grenze>
<Schleifenindex> in <Obere_Grenze> downto <Untere _Grenze>
Beispiel:
for I in BITS-1 downto 0 loop
.......
end loop;
siehe configuration, exit, loop, next when, while
VHDL-Syntax F. Schubert 05/01
function
function
Eine Funktion ist ein Unterprogramm, das aus vorgegebenen Parameternimmer genau einen Rückgabewert erzeugt. Ein Funktionsaufruf wird inVHDL wie ein Ausdruck behandelt.
Syntax:
function <Funktionsname>
[<Liste der Parameter und ihrer Typen>]
return <Rückgabetyp> is
[<Deklarationen>]
begin
{<Sequentielle Anweisung>}
-- mindestens: return <Ausdruck>;
end [function] [<Funktionsname>];
VHDL-Syntax F. Schubert 05/01
function
Beispiel:
function ADDIERER (SUMMAND1, SUMMAND2 : integer)
return integer is
variable SUM: integer;
begin
SUM := SUMMAND1 + SUMMAND2;
return SUM;
end ADDIERER;
.......
Y <= ADDIERER(3, 7); -- Y = 10
.......
siehe procedure
VHDL-Syntax F. Schubert 05/01
generate
generatesiehe configuration
VHDL-Syntax F. Schubert 05/01
generic
generic
Innerhalb der entity können mit generic vor der port-AnweisungGrößen definiert werden, mit denen der Quellcode parametrisiert wird.
Syntax:
entity <Entityname> is
generic(
<Deklaration der generic-Größen>
);
port(
<Deklaration der Ein- und Ausgänge>
);
end <Entityname>;
Beispiel:
entity VAR_ZAEHL is
generic( BITS: natural := 3);
port( CLK: in bit;
Q: out unsigned (BITS-1 downto 0));
end VAR_ZAEHL;
Durch Austausch des Zahlenwertes 3 in der Deklaration der GrößeBITS gegen eine andere Zahl kann ein Zähler beliebiger Bitbreiteerzeugt werden.
siehe component, configuration, entity, port
VHDL-Syntax F. Schubert 05/01
generic map
generic mapsiehe configuration
VHDL-Syntax F. Schubert 05/01
if
if
Sequentielle Anweisung.
Die if-Anweisung ist eine Anweisung, die in einem Prozess, einerFunktion oder einer Prozedur verwendet werden kann.
Funktion: Programmverzweigung.
Syntax:
if <Bedingung_1>
then {<Sequentielle Anweisung>}
elsif <Bedingung_2>
then {<Sequentielle Anweisung>}
elsif .......
.......
else {<Sequentielle Anweisung>}
end if;
elsif und else sind optional. Die Bedingungen dürfen überlappen. DieAnweisungen nach der ersten wahren werden dann ausgeführt.
Beispiel:
if (A = 6)
then Y <= 3;
elsif (A > 5)
then Y <= 4;
else Y <= 0;
end if;
VHDL-Syntax F. Schubert 05/01
in
in
Signalattribut in einer port-Anweisung. Ein in-Signal ist einEingangssignal. Es darf nicht auf der linken Seite einer Signalzuweisungstehen.
Beispiel:
port(
B: in bit;
E: in bit_vector(3 downto 1));
VHDL-Syntax F. Schubert 05/01
inertial
inertial 93
siehe after
VHDL-Syntax F. Schubert 05/01
inout
inout
Signalattribut in einer port-Anweisung. Ein inout-Signal ist ein Signalfür bidirektionalen Datentransfer. In der Regel ist dafür ein speziellerDatentyp erforderlich.
Beispiel:
port(
B: inout std_logic;
E: inout std_logic_vector(3 downto 1));
VHDL-Syntax F. Schubert 05/01
integer
integer
Datentyp.
Wertevorrat: In den meisten Fällen (bei 32 Bit) von
–2147483648 bis +2147483647.
Beispiel:
port( S: in integer range 0 to 7);
siehe natural, positive, range
VHDL-Syntax F. Schubert 05/01
is
issiehe architecture, attribute, entity, file, subtype, type
VHDL-Syntax F. Schubert 05/01
library
library
Mit der library-Anweisung wird angegeben, welche Bibliothekverwendet werden soll.
Beispiel:
library ieee;
use ieee.std_logic_1164.all;
entity EINS is
.......
end EINS;
architecture VERHALTEN of EINS is
port( S: out std_ulogic);
.......
end VERHALTEN;
siehe package, use
VHDL-Syntax F. Schubert 05/01
loop
loop
Sequentielle Anweisung.
In der loop-Schleife wird die Schleifenausführung durch das Eintreteneiner Abbruchbedingung beendet. Deshalb ist sie nur bedingtsynthesefähig!
Funktion: Nicht terminierte Programmschleife.
Syntax:
loop
{<Sequentielle Anweisung>}
end loop;
Beispiel:
loop
Y <= 3 * A;
exit when A = 3;
A := A + 1;
end loop;
siehe exit, for, next when, while
VHDL-Syntax F. Schubert 05/01
map
mapsiehe generic map, port map
VHDL-Syntax F. Schubert 05/01
mod
mod
Operator für Werte vom Typ integer.
Funktion: Modulo-Operator
(A = B*N + (A mod B) -- N = ganze Zahl).
Beispiele:
Y := A mod B;
Y <= A mod B;
VHDL-Syntax F. Schubert 05/01
nand
nand
Operator für Werte vom Typ bit oder boolean und eindimensionaleArrays dieser Typen.
Funktion: NAND-Verknüpfung der Werte. Bei Arrays werden diekorrespondierenden Komponenten verknüpft.
Beispiele:
Y := A nand B;
Y <= A nand B;
VHDL-Syntax F. Schubert 05/01
natural
natural
Datentyp.
Wertevorrat: In den meisten Fällen (bei 32 Bit) von 0 bis+2147483647.
Beispiel:
port( S: in natural range 0 to 7);
siehe integer, positive, range
VHDL-Syntax F. Schubert 05/01
new
newsiehe access
VHDL-Syntax F. Schubert 05/01
next when
next when
Sequentielle Anweisung.
Das Konstrukt next when dient zur vorzeitigen Beendigung einerSchleifeniteration.
Syntax:
next when <Bedingung>;
Beispiel:
loop
Y <= 3 * A;
next when A = 3;
A := A + 1;
end loop;
siehe exit, for, loop, while
VHDL-Syntax F. Schubert 05/01
nor
nor
Operator für Werte vom Typ bit oder boolean und eindimensionaleArrays dieser Typen.
Funktion: NOR-Verknüpfung der Werte. Bei Arrays werden diekorrespondierenden Komponenten verknüpft.
Beispiele:
Y := A nor B;
Y <= A nor B;
VHDL-Syntax F. Schubert 05/01
not
not
Operator für Werte vom Typ bit oder boolean und eindimensionaleArrays dieser Typen.
Funktion: Negations-Operator.
Beispiel:
Y := not A;
Y <= not A;
VHDL-Syntax F. Schubert 05/01
null
null
Sequentielle Anweisung.
Die null-Anweisung ist eine Anweisung, die zu keiner Aktion führt. Siedient z.B. in if- und case-Anweisungen zur expliziten Markierung vonVerzweigungen, die keinerlei Aktion bewirken sollen.
Beispiel:
null;
siehe access
VHDL-Syntax F. Schubert 05/01
O, o
O, o
Kennbuchstabe zur Kennzeichnung der Zahlenbasis.
Basis: Oktal.
Beispiele:
o“13107“
O“1_3_ 46“
VHDL-Syntax F. Schubert 05/01
of
ofsiehe architecture, attribute
VHDL-Syntax F. Schubert 05/01
or
or
Operator für Werte vom Typ bit oder boolean und eindimensionaleArrays dieser Typen.
Funktion: Oder-Verknüpfung der Werte. Bei Arrays werden diekorrespondierenden Komponenten verknüpft.
Beispiele:
Y := A or B;
Y <= A or B;
VHDL-Syntax F. Schubert 05/01
open
open
Nicht benutzte Komponentenausgänge können offen gelassen werden,indem der Klemme das Schlüsselwort open zugeordnet wird. Eingängesind immer zu beschalten, damit keine undefinierten Pegel entstehen!
Beispiel:
entity VOLL_ADD_SUB is
port ( A_I , B_I : in bit_vector (4 downto 0);
OP, C_I : in bit;
SU : out bit_vector (4 downto 0);
OV, C_B : out bit);
end VOLL_ADD_SUB;
. . . . . .
I_O: VOLL_ADD_SUB
port map (A_I => A_0, B_I => B_0, OP => OP,
C_I => C_IN, SU => SUM_I(4 downto 0),
OV => open, C_B => C_Q(0));
siehe port map
VHDL-Syntax F. Schubert 05/01
others
otherssiehe attribute, constant, case, variable, when, with
VHDL-Syntax F. Schubert 05/01
out
out
Signalattribut in einer port-Anweisung. Ein out-Signal ist einAusgangssignal. Dieses Signal darf nicht auf der rechten Seite einerSignalzuweisung oder in einer Signalabfrage stehen.
Beispiel:
port(
B: out bit;
E: out bit_vector(3 downto 1));
VHDL-Syntax F. Schubert 05/01
package
package
Eine package dient zur Speicherung häufig verwendeter Deklarationenund Unterprogramme. Sie wird durch eine Package-Deklarationdeklariert und ihr Inhalt in einem Package-Block (package body)beschrieben. Unter Verwendung von library und use kann der Inhalt despackage in beliebigen Designs verwendet werden. Eine Package-Deklaration ist die Voraussetzung für einen Package-Block. Enthält einePackage-Deklaration eine zurückgestellte Konstanten- oderUnterprogramm-Deklaration, so muß der zugehörige Package-Blockvor-handen sein und die vollständigen Deklarationen enthalten.Zusätzliche Deklarationen im Package-Block sind nur in diesem gültig.
Funktion: Bibliothek mit Deklarationen und Unterprogrammen.
Package-Deklaration:
Syntax:
[<library- und use-Ausdrücke>]
package <Package-Name> is
[<Deklarationen>]
end [package] [<Package-Name>];
Package-Block:
Syntax:
[<library- und use-Ausdrücke>]
package body <Package-Name> is
[<Deklarationen>]
end [package body] [<Package-Name>];
VHDL-Syntax F. Schubert 05/01
package
Beispiel:
package MY_PACK is -- Package-Deklaration
type V_LOGIC is (‘0‘,‘1‘,‘Z‘,‘X‘);
type V_LOGIC_ARRAY is array (natural range) ofV_LOGIC;
function V_LOG_F (F_ARRAY: in V_LOGIC_ARRAY )
return V_LOGIC;
end package MY_PACK;
package body MY_PACK is -- Package-Block
type .......;
function V_LOG_F (F_ARRAY: in V_LOGIC_ARRAY )
return V_LOGIC is
.......
return ...... ;
end function;
end package body MY_PACK;
siehe library, use
VHDL-Syntax F. Schubert 05/01
port
port
Mit Hilfe der port-Anweisung erfolgt die Deklaration der Anschlüsseinnerhalb der entity.
Syntax:
entity <Entityname> is
port(
<Deklaration der Ein- und Ausgänge>
);
end <Entityname>;
Beispiel:
entity MUX is
port( S: in bit_vector(1 downto 0);
E: in bit_vector(3 downto 0);
Y: out bit );
end MUX;
siehe entity
VHDL-Syntax F. Schubert 05/01
port map
port map
Mit Hilfe der port map-Anweisung werden die Schnittstellen an einecomponent übergeben.
Syntax:
[Bezeichner :] <Komponentenname>
port map(
<Deklaration der Ein- und Ausgänge>
);
Beispiel:
library ieee;
use work.SNETZ;
entity TBENCH is
end TBENCH;
VHDL-Syntax F. Schubert 05/01
port map
architecture SIGNALE of TBENCH is
component SNETZ is
port( E: in std_logic_vector(3 downto 0);
M: out std_logic);
end component;
signal TE: std_logic_vector(3 downto 0);
signal TM: std_logic;
begin
DUT: SNETZ port map (TE, TM);
..........
end SIGNALE;
siehe component, open
VHDL-Syntax F. Schubert 05/01
positive
positive
Datentyp.
Wertevorrat: In den meisten Fällen (bei 32 Bit) von 1 bis+2147483647.
Beispiel:
port( S: in positive range 0 to 7);
siehe integer, natural, range
VHDL-Syntax F. Schubert 05/01
procedure
procedure
Eine Prozedur ist ein Unterprogramm, das einen, mehrere oder keinenRückgabewert liefert. Ein Prozeduraufruf wird in VHDL wie eineAnweisung behandelt. Prozeduren liefern nur Ergebnisse, wennAusgabeparameter innerhalb der Parameterliste deklariert wurden.
Syntax:
procedure <Prozedurname>
[<Liste der Parameter und ihrer Typen>] is
[<Deklarationen>]
begin
{<Sequentielle Anweisung>}
end [procedure] [<Prozedurname>];
Beispiel:
procedure ADDIERER (variable SUMMAND1: in integer;
variable SUMMAND2: in integer;
variable SUMME: out integer) is
begin
SUMME := SUMMAND1 + SUMMAND2;
end ADDIERER;
.......
ADDIERER(3, 7, Y); -- Y = 10
.......
siehe function
VHDL-Syntax F. Schubert 05/01
process
process
Nebenläufige Anweisung.
Für die Modellierung des zeitabhängigen Verhaltens digitalerSchaltungen wurde in VHDL eine eigene Klasse von Anweisungendefiniert (sequential statements, sequentielle Anweisungen). Diesekönnen nur in einem Prozeß (process) verwendet werden.
Syntax:
[<Prozess-Name>]: process [( <Empfindlichkeitsliste> )]
-- Deklarationsteil
begin
{<sequentielle Anweisung>}
end process [<Prozess-Name>];
<Prozess-Name>:
Bezeichner für einen Prozeß. Kann weggelassen werden, ist aber nichtzu empfehlen.
<Empfindlichkeitsliste>:
Liste von Signalen, die durch Kommata getrennt werden. Der Prozeßwird dann gestartet, wenn einem Signal in der Empfindlichkeitsliste einneuer Wert zugewiesen wird. Die Empfindlichkeitsliste kannweggelassen werden. In diesem Fall muß der Prozeß mindestens einewait-Anweisung beinhalten.
VHDL-Syntax F. Schubert 05/01
process
Deklarationsteil:
Liste von Deklarationen für Datentypen, Konstanten und Variablen.Variablen sind nur innerhalb des Prozesses gültig, in dem sie deklariertwurden. Als Datentypen für Variablen können alle die verwendetwerden, die auch für Signale erlaubt sind. Der Wert einer Variablenwird sofort nach der Zuweisung verändert, während Signale erst amEnde des Prozesses aktualisiert werden. Wird der Prozeß verlassen, sobleibt der letzte Variablenwert bis zum nächsten Durchlauf erhalten.
Innerhalb eines Prozesses sind nur sequentielle Anweisungen erlaubt.
Beispiel (mit und ohne Empfindlichkeitsliste):
entity ZAEHLER is
port( CLK, RESET: in bit;
Q1, Q2: buffer integer range 0 to 15);
end ZAEHLER;
architecture Verhalten of ZAEHLER is
begin
ZLR1: process ( CLK, RESET )
begin
if RESET =‘1‘ then -- asynchroner Reset
Q1 <= 0;
elsif (CLK =‘1‘ and CLK’event) then
Q1 <= Q1 + 1;
end if;
end process ZLR1;
VHDL-Syntax F. Schubert 05/01
process
ZLR2: process
begin
wait until (CLK =‘1‘ and CLK’event);
if RESET =‘1‘ then -- synchroner Reset
Q2 <= 0;
else
Q2 <= Q2 + 1;
end if;
end process ZLR2;
end VERHALTEN;
siehe variable, wait until
VHDL-Syntax F. Schubert 05/01
range
rangesiehe integer, natural, positive, subtype, type
VHDL-Syntax F. Schubert 05/01
record
record
Mit der record-Deklaration wird ein zusammengesetzter Datentyp mitseinen verschiedenen Elementen festgelegt.
Syntax:
type <Record-Name> is record
{<Element-Name> : <Element-Typ>;}
end record <Record-Name>;
Zugriff auf die Elemente:
<Record-Name>.<Element-Name>
Beispiel:
architecture SYSTEM of COMPUTER is
. . . . .
type OPCODE is (ADD, SUB, LDA, STA, XOR, ....);
type REG_NR is range 0 to 7;
. . . . .
type INSTRUCTION is record -- enthält 3 Elemente
OPC : OPCODE;
Q_REG1, Q_REG2, Z_REG : REG_NR;
OFFSET : integer;
end record INSTRUCTION;
VHDL-Syntax F. Schubert 05/01
record
type WORT is record -- enthält record und bit_vector
INSTR : INSTRUCTION;
DATEN : bit_vector (15 downto 0);
end record WORT;
. . . . .
begin
signal READ_WORT : WORT;
. . . . .
CPU: process is
variable INS_REG: INSTRUCTION;
. . . . .
begin
. . . . .
INS_REG := READ_WORT.INSTR; -- Zuweisung
. . . . .
case INS_REG.OPC is -- Abfrage
. . . . .
end case;
end process CPU;
. . . . .
end architecture SYSTEM;
siehe access, array, file
VHDL-Syntax F. Schubert 05/01
reject
reject 93
siehe after
VHDL-Syntax F. Schubert 05/01
rem
rem
Operator für Werte vom Typ integer. Synthesefähigkeit nur beiPotenzen von 2!
Funktion: Modulo-Operator (A = (A/B)*B + (A rem B)).
Beispiele:
Y := A rem B;
Y <= A rem B;
VHDL-Syntax F. Schubert 05/01
report
reportsiehe assert
VHDL-Syntax F. Schubert 05/01
return
returnsiehe function
VHDL-Syntax F. Schubert 05/01
rising_edge
rising_edge
Mit der Funktion rising_edge kann die ansteigende Taktflanke einesSignals vom Typ std_ulogic bzw. std_logic abgefragt werden (Giltnicht für Signale vom Typ bit).
Beispiel:
process(CLK)
begin
.......
if rising_edge(CLK) then
.......
end process;
siehe falling_edge
VHDL-Syntax F. Schubert 05/01
rol
rol 93
Operator für eindimensionale Arrays vom Typ boolean oder bit (rollleft).
Funktion: Rotationsoperator.
Beispiele:
B“10100111“ rol 1 = B“01001111“
B“10100111“ rol -1 = B“11010011“
siehe ror, sla, sll, sra, srl
VHDL-Syntax F. Schubert 05/01
ror
ror 93
Operator für eindimensionale Arrays vom Typ boolean oder bit (rollright).
Funktion: Rotationsoperator.
Beispiele:
B“10100111“ ror 2 = B“11101001“
B“10100111“ ror -2 = B“10100111“
siehe rol, sla, sll, sra, srl
VHDL-Syntax F. Schubert 05/01
select
selectsiehe with
VHDL-Syntax F. Schubert 05/01
severity
severitysiehe assert
VHDL-Syntax F. Schubert 05/01
signal
signal
Mit dem Schlüsselwort signal können Signale lokal innerhalb einerArchitektur deklariert werden. Die Deklaration muß vor dem beginerfolgen.
Beispiel:
architecture VERHALTEN of TEST is
signal A: bit;
signal E, F: bit_vector(3 downto 0);
signal VEKTOR : std_logic_vector (0 to 3) := “0000“;
-- Das Signal VEKTOR hat 4 Elemente, die alle auf ‘0‘
-- gesetzt werden
begin
.......
end VERHALTEN;
VHDL-Syntax F. Schubert 05/01
signed
signed
Datentyp. Erfordert ieee.numeric_std bzw. ieee.std_logic_arith.
Wertevorrat: Vorzeichenbehaftete ganze Zahlen im Zweier-komplement.
Beispiel:
port( S: in signed (15 downto 0));
siehe unsigned
VHDL-Syntax F. Schubert 05/01
sla
sla 93
Operator für eindimensionale Arrays vom Typ boolean oder bit (shiftleft arithmetic). Die links stehenden Elemente gehen verloren, rechtswird das äußerste Bit kopiert.
Funktion: Schiebeoperator: arithmetisch links schieben.
Beispiele:
B“10100111“ sla 2 = B“10011111“
B“10100111“ sla -2 = B“11101001“
siehe rol, ror, sll, sra, srl
VHDL-Syntax F. Schubert 05/01
sll
sll 93
Operator für eindimensionale Arrays vom Typ boolean oder bit (shiftleft logical). Die links stehenden Elemente gehen verloren, von rechtswird mit Nullen aufgefüllt.
Funktion: Schiebeoperator: logisch links schieben.
Beispiele:
B“10100111“ sll 2 = B“10011100“
B“10100111“ sll -2 = B“00101001“
siehe rol, ror, sll, sra, srl
VHDL-Syntax F. Schubert 05/01
sra
sra 93
Operator für eindimensionale Arrays vom Typ boolean oder bit (shiftright arithmetic). Die rechts stehenden Elemente gehen verloren, linkswird das äußerste Bit kopiert.
Funktion: Schiebeoperator: arithmetisch rechts schieben.
Beispiele:
B“10100111“ sra 2 = B“11101001“
B“10100111“ sra -2 = B“10011111“
siehe rol, ror, sll, sla, srl
VHDL-Syntax F. Schubert 05/01
srl
srl 93
Operator für eindimensionale Arrays vom Typ boolean oder bit (shiftright logical). Die rechts stehenden Elemente gehen verloren, von linkswird mit Nullen aufgefüllt.
Funktion: Schiebeoperator: logisch rechts schieben.
Beispiele:
B“10100111“ srl 2 = B“00101001“
B“10100111“ srl -2 = B“10011100“
siehe rol, ror, sla, sll, sra
VHDL-Syntax F. Schubert 05/01
std_logic
std_logic
Datentyp aus der VHDL-Bibliothek ieee.std_logic_1164. Beimstd_logic Typ können mehrere Treiber auf ein und dasselbe Signalzugreifen. Die Entscheidung, welches Signal sich durchsetzen soll, triffteine im IEEE 1164 Standard definierte Auflösungsfunktion (resolutionfunction). Der Wertevorrat ist im Vergleich zum Bit-Typ erweitert.
Wertevorrat: ‘U‘, ‘X‘, ‘0‘, ‘1‘, ‘Z‘, ‘W‘, ‘L‘, ‘H‘oder ‘-‘.
‘U‘ unbekannt Simulator, nicht initialisiert‘X‘ unb., stark Simulator, z.B. Buskonflikt ‘0‘ und ‘1‘‘0‘ 0, stark‘1‘ 1, stark‘Z‘ High_Z Tristate‘W‘ schw. Simulator, z.B. Buskonflikt ‘L‘ und ‘H‘ ‘L‘ 0, schwach open emitter‘H‘ 1, schwach open collector ‘-‘ don’t care
Auflösungsfunktion:
‘U‘ ‘X‘ ‘0‘ ‘1‘ ‘Z‘ ‘W‘ ‘L‘ ‘H‘ ‘-‘‘U‘ ‘U‘ ‘U‘ ‘U‘ ‘U‘ ‘U‘ ‘U‘ ‘U‘ ‘U‘ ‘U‘‘X‘ ‘U‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘‘0‘ ‘U‘ ‘X‘ ‘0‘ ‘X‘ ‘0‘ ‘0‘ ‘0‘ ‘0‘ ‘X‘‘1‘ ‘U‘ ‘X‘ ‘X‘ ‘1‘ ‘1‘ ‘1‘ ‘1‘ ‘1‘ ‘X‘‘Z‘ ‘U‘ ‘X‘ ‘0‘ ‘1‘ ‘Z‘ ‘W‘ ‘L‘ ‘H‘ ‘X‘‘W‘ ‘U‘ ‘X‘ ‘0‘ ‘1‘ ‘W‘ ‘W‘ ‘W‘ ‘W‘ ‘X‘‘L‘ ‘U‘ ‘X‘ ‘0‘ ‘1‘ ‘L‘ ‘W‘ ‘L‘ ‘W‘ ‘X‘‘H‘ ‘U‘ ‘X‘ ‘0‘ ‘1‘ ‘H‘ ‘W‘ ‘W‘ ‘H‘ ‘X‘‘-‘ ‘U‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘ ‘X‘
VHDL-Syntax F. Schubert 05/01
std_logic
Beispiel:
library ieee;
use ieee.std_logic_1164.all;
entity EINS is
.......
end EINS;
architecture VERHALTEN of EINS is
port( S: out std_logic);
.......
end VERHALTEN;
VHDL-Syntax F. Schubert 05/01
std_ulogic
std_ulogic
Datentyp aus der VHDL-Bibliothek ieee.std_logic_1164. Beimstd_ulogic Typ können nicht mehrere Treiber auf ein und dasselbeSignal zugreifen. Der Wertevorrat ist im Vergleich zum Bit-Typerweitert.
Wertevorrat: ‘U‘, ‘X‘, ‘0‘, ‘1‘, ‘Z‘, ‘W‘, ‘L‘, ‘H‘oder ‘-‘.
‘U‘ unbekannt Simulator, nicht initialisiert‘X‘ unb., stark Simulator, z.B. Buskonflikt ‘0‘ und ‘1‘‘0‘ 0, stark‘1‘ 1, stark‘Z‘ High_Z Tristate‘W‘ schw. Simulator, z.B. Buskonflikt ‘L‘ und ‘H‘ ‘L‘ 0, schwach open emitter‘H‘ 1, schwach open collector ‘-‘ don’t care
Beispiel:
library ieee;
use ieee.std_logic_1164.all;
entity EINS is
.......
end EINS;
architecture VERHALTEN of EINS is
port( S: out std_ulogic);
.......
end VERHALTEN;
VHDL-Syntax F. Schubert 05/01
subtype
subtype
Ein Subtyp (subtype) ist ein Typ mit einer Beschränkung.
Beispiele:
type A is range 0 to 31;
type AMPLITUDE is range –2.5 to +2.5;
subtype A_NEU is A range 16 to 23;
subtype HALBE_AMPL is AMPLITUDE range –1.25 to +1.25;
siehe type
VHDL-Syntax F. Schubert 05/01
then
thensiehe if
VHDL-Syntax F. Schubert 05/01
to
to
Aufsteigende Indizierung eines Busses vom Typ bit_vektor oderstd_logic_vector.
Beispiele:
S : in bit_vector(0 to 1);
E : in std_logic_vector(0 to 3);
siehe downto, subtype, type
VHDL-Syntax F. Schubert 05/01
transport
transportsiehe after
VHDL-Syntax F. Schubert 05/01
true
truesiehe boolean
VHDL-Syntax F. Schubert 05/01
type
type
Ein Typ (type) ist charakterisiert durch eine Gruppe von Werten. DieTypen in VHDL sind:
Ganzzahlen (integer)
Fließkommazahlen (real)
Aufzählungen (enumeration)
Physikalische Typen (physical types)
Folge (array)
Gruppe (record)
Zeiger (access)
Datei (file)
Beispiele:
type A is range 0 to 31;
type AMPLITUDE is range –2.5 to +2.5;
type BOOL_TYP is (JA, NEIN);
type ZUSTAENDE is (Z0, Z1, Z2, Z3, Z4, Z5);
siehe subtype, units
VHDL-Syntax F. Schubert 05/01
units
units
Ein physikalischer Datentyp ist ein Aufzählungstyp, der physikalischeGrößen repräsentiert. Die Deklaration dieses Typs beinhaltet dieSpezifizierung einer Basiseinheit (unit). Vielfache der Basiseinheitkönnen ebenfalls deklariert werden.
Syntax:
units
<Basiseinheit>;
[<abgeleitete Einheit>];
end units;
Beispiele:
type LAENGE is range 0 to 1E12
units
um;
mm = 1000 um;
m = 1000 mm;
km = 1000 m;
end units;
type SPANNUNG is range 0 to 1E6
units
mV;
V = 1000 mV;
end units;
VHDL-Syntax F. Schubert 05/01
units
Vordefinierter Datentyp TIME:
type TIME is range implementation_defined
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
end units;
siehe type
VHDL-Syntax F. Schubert 05/01
unsigned
unsigned
Datentyp. Erfordert ieee.numeric_std oder ieee.std_logic_arith.
Wertevorrat: Vorzeichenlose ganze Zahlen.
Beispiel:
port( S: in unsigned (15 downto 0));
siehe signed
VHDL-Syntax F. Schubert 05/01
until
untilsiehe wait
VHDL-Syntax F. Schubert 05/01
use
use
Mit der use-Anweisung wird angegeben, welches Paket einer Bibliothekverwendet werden soll.
Beispiel:
library ieee;
use ieee.std_logic_1164.all;
entity EINS is
port( S: out std_ulogic);
.......
end EINS;
architecture VERHALTEN of EINS is
.......
end VERHALTEN;
siehe library, package
VHDL-Syntax F. Schubert 05/01
variable
variable
Mit dem Schlüsselwort variable können Variable innerhalb einesProzesses lokal deklariert werden. Damit können innerhalb desProzessdurchlaufs Größen geändert werden und der Prozeß kann aufdiese Änderungen reagieren. Wenn der Wert der Variablen außerhalbdes Prozesses benötigt wird, so ist die Variable am Prozeßende an einSignal gleichen Typs zu übergeben.
Beispiele:
architecture KORREKT of TEST is
signal A: bit;
process ( CLK )
variable A_VAR: bit;
variable VEKTOR : bit_vector (7 downto 0)
:= (others => ‘1‘);
-- Die Variable VEKTOR hat 8 Elemente, die alle
-- auf ‘1‘ gesetzt werden
begin
.......
A <= A_VAR;
end process;
end KORREKT;
VHDL-Syntax F. Schubert 05/01
wait
wait
Sequentielle Anweisung.
Prozesse ohne Empfindlichkeitsliste müssen mindestens eine wait-Anweisung enthalten. Diese dient zur Synchronisation. DerartigeProzesse werden automatisch bis zur nächsten wait-Anweisungausgeführt. Die dabei auszuführenden Signaländerungen erfolgen erst zudiesem Zeitpunkt. Mit wait on (nicht synthesefähig!) wird dieBearbeitung des Prozesses ausgesetzt, solange die angegebenen Signalekeine Pegelwechsel aufweisen. Mit wait until wird die Bearbeitung desProzesses ausgesetzt, solange die angegebene Bedingung nicht erfüllt ist.Mit wait for (nicht synthesefähig!) wird die Bearbeitung des Prozessesfür die angegebene Zeit ausgesetzt.
Syntax:
[<Bezeichner>:]
wait [on <Signalname>]
[until <Boolescher_Ausdruck>]
[for <Zeit>];
VHDL-Syntax F. Schubert 05/01
wait
Beispiele:
process
begin
.......
wait on A, B, C;
.......
end process;
process
begin
.......
wait until (CLK=‘1‘ and CLK’event);
.......
end process;
process
begin
.......
wait for 20 ns;
end process;
siehe process
VHDL-Syntax F. Schubert 05/01
when
when
Nebenläufige Anweisung.
Mit when läßt sich eine bedingte Signalzuweisung durchführen
Funktion: Bedingte Signalzuweisung.
Syntax:
[ Bezeichner :]
<Signalname> <= <logischer Ausdruck_1>
when <Bedingung_1> else
<logischer Ausdruck_2>
when <Bedingung_2> else
........
<logischer Ausdruck_n>;
Beispiel:
Y <= ‘0‘ when I = “00“ else
‘0‘ when I = “11“ else
‘1‘;
siehe case, select, with
VHDL-Syntax F. Schubert 05/01
while
while
Sequentielle Anweisung.
In der while-Schleife wird die Schleifenausführung durch das Eintreteneiner Abbruchbedingung beendet. Deshalb ist sie nur bedingtsynthesefähig!
Funktion: Programmschleife, die solange ausgeführt wird, wie dieBedingung wahr ist.
Syntax:
while <Bedingung> loop
{<Sequentielle Anweisung>}
end loop;
Die Bedingung wird vor der Ausführung getestet.
Beispiel:
while (A < 6) loop
Y <= 3 * A;
A := A + 1;
end loop;
siehe exit, for, loop, next when
VHDL-Syntax F. Schubert 05/01
with
with
Nebenläufige Anweisung.
Die with-Anweisung ermöglicht eine selektive Signalzuweisung.Funktional gesehen entspricht sie einer Auswahl aus einer Reihegleichberechtigter Möglichkeiten und hat eine Multiplexer-Struktur.
Funktion: Selektive Signalzuweisung.
Syntax:
[ Bezeichner :]
with <Signal-Kombination> select
<Signalname> <= <logischer Ausdruck_1>
when <Signal-wert_1>,
<logischer Ausdruck_2>
when <Signal-wert_2>,
.........
[<logischer Ausdruck_n> when others];
Beispiel:
with I select
Y <= ‘0‘ when “00“,
‘0‘ when “11“,
‘1‘ when others;
VHDL-Syntax F. Schubert 05/01
X, x
X, x
Kennbuchstabe zur Kennzeichnung der Zahlenbasis.
Basis: Hexadezimal.
Beispiele:
x“A F f E“
X“AF_fE“
VHDL-Syntax F. Schubert 05/01
xnor
xnor 93
Operator für Werte vom Typ bit oder boolean und eindimensionaleArrays dieser Typen.
Funktion: Äquivalenz -Verknüpfung der Werte. Bei Arrays werden diekorrespondierenden Komponenten verknüpft.
Beispiele:
Y := A xnor B;
Y <= A xnor B;
VHDL-Syntax F. Schubert 05/01
xor
xor
Operator für Werte vom Typ bit oder boolean und eindimensionaleArrays dieser Typen.
Funktion: Exklusiv-Oder-Verknüpfung der Werte (Antivalenz). BeiArrays werden die korrespondierenden Komponenten verknüpft.
Beispiele:
Y := A xor B;
Y <= A xor B;