Erläuterungen zum praktischen Teil (VHDL)
Mit obigen Schritten wurde das Verzeichnis VHDL erzeugt, dem Simulator bekanntgemacht und die physikalische Position festgelegt. Die folgenden Schritte dienen dazu, dieses Verzeichnis als Arbeitsverzeichnis festzulegen:
Wählen Sie nun im Menue File den Programmpunkt Edit. Anschließend erscheint folgender Dialog:
Geben Sie nun in das Fenster Source File den Namen der zu erstellenden
Datei ein. In diesem Falle lautet er HALF_ADDER.vhd.
Sollten Sie mit einem anderen Editor als dem Standardeditor arbeiten
wollen, so können Sie die Schaltfläche editor aktivieren und
anschliessend den Namen dieses Editors in das untere Fenster eintragen.
Nach Betätigung der OK-Taste erscheint das gewünschte Editor-Fenster.
Geben Sie dort folgendn Text ein:
-- Beispielprogramm 1: Halbaddierer
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity HALF_ADDER is
port(A, B: in BIT := '0';
SUM, CARRY: out BIT);
end HALF_ADDER;
architecture HA_STRUCTURE of HALF_ADDER is
component XOR2
port(X, Y: in BIT := '0';
Z
: out BIT);
end component;
component AND2
port(L, M: in BIT := '0';
N
: out BIT);
end component;
begin
X1: XOR2 port map(A, B, SUM);
A1: AND2 port map(A, B, CARRY);
end HA_STRUCTURE;
Gehen Sie nun folgendermaßen vor:
Enhält die eingegebene VHDL-Datei syntaktische Fehler, so werden diese im unteren Teil des Fensters ausgegeben.
Im Eingabefeld Unit Name ist der Name
des Entitys einzugeben, dessen Architektur festgelegt werden soll. Dies
kann auch automatisch geschehen, indem der entsprechende Teil im Library-Browser
markiert wird. Die Einträge in die anderen Fenster sind manuell vorzunehmen.
Eine ausführliche Erklaerung dieser Felder erfolgt bei Betätigung
des Schalters Help.
Nach Betätigung des OK-Schalters
wird die Konfigurationsdatei erzeugt und erscheint im Browser. Sie hat
folgenden Inhalt:
--
-- Configurations for top-level unit VHDL.HALF_ADDER:HA_STRUCTURE
-- Configuration Model: Hierarchical
-- No priority list of architectures specified
--
-- Configuration
configuration CFG_HALF_ADDER_HA_STRUCTURE of HALF_ADDER is
for HA_STRUCTURE
end for;
end CFG_HALF_ADDER_HA_STRUCTURE;
2.4 Generierung einer Testbench
Zum Test der Funktion der beschriebenen Schaltung soll nun eine Testbench angelegt werden. Dazu ist im Menü Utilities der Programmpunkt Testbench... auszuwählen. Daraufhin erscheint folgendes Fenster:
Im Eingabefeld Unit Name ist der Name
der zu testenden Komponente anzugeben, im Beispiel vhdl.HALF_ADDER.
Im Feld output unit ist der Name anzugeben,
unter dem auf die Testbench zugegriffen werden kann. Ausführliche
Informationen zu allen Elementen dieses Fensters erhalten Sie nach der
Betätigung des Schalters Help.
Nachdem Sie alle Einstellungen getätigt haben, ist der Schalter
OK zu betätigen. Die Testbench wird nun automatisch erzeugt
und erscheint im Browser. Sie besteht aus zwei Dateien mit folgendem Inhalt:
Entity-Deklaration:
-- Author : martin
-- Created On: Thu Jul 2 18:59:32 1998
-- Testbench for vhdl.half_adder
library STD;
library WORK;
library IEEE;
library vhdl;
use STD.STANDARD.ALL;
use IEEE.STD_LOGIC_1164.ALL;
use WORK.ALL;
entity test_half_adder is
end test_half_adder;
Architecture-Deklaration:
-- Author : martin
-- Created On: Thu Jul 2 18:59:32 1998
-- Testbench for vhdl.half_adder
architecture BENCH of test_half_adder is
component half_adder
PORT(
A: IN BIT;
B: IN BIT;
SUM: OUT BIT;
CARRY: OUT BIT
);
end component;
signal t_A:BIT;
signal t_B:BIT;
signal t_SUM:BIT;
signal t_CARRY:BIT;
begin
half_adder_I1: half_adder
port map (
A => t_A,
B => t_B,
SUM => t_SUM,
CARRY => t_CARRY
);
half_adder_driver: process
begin
end process;
end BENCH;
-- Author : martin
-- Created On: Wed Jun 3 18:04:31 1998
-- Testbench for testlib.half_adder
architecture BENCH of libtest is
component half_adder
PORT(
A: IN BIT;
B: IN BIT;
SUM: OUT BIT;
CARRY: OUT BIT
);
end component;
signal t_A:BIT;
signal t_B:BIT;
signal t_SUM:BIT;
signal t_CARRY:BIT;
begin
half_adder_I1: half_adder
port map (
A => t_A,
B => t_B,
SUM => t_SUM,
CARRY => t_CARRY
);
half_adder_driver: process
begin
t_A <=
'0';
t_B <=
'0';
wait for 10 ns;
assert (t_SUM
= '0') and (t_CARRY = '0')
report "Fehler 1!!!"
severity ERROR;
t_A <=
'0';
t_B <=
'1';
wait for 10 ns;
assert (t_SUM
= '1') and (t_CARRY = '0')
report "Fehler 2!!!"
severity ERROR;
t_A <=
'1';
t_B <=
'0';
wait for 10 ns;
assert (t_SUM
= '1') and (t_CARRY = '0')
report "Fehler 3!!!"
severity ERROR;
t_A <=
'1';
t_B <=
'1';
wait for 10 ns;
assert (t_SUM
= '0') and (t_CARRY = '1')
report "Fehler 4!!!"
severity ERROR;
t_A <=
'0';
t_B <=
'0';
wait for 10 ns;
assert (t_SUM
= '1') and (t_CARRY = '0')
report "kein Feler!!!"
severity ERROR;
end process;
end BENCH;
Die Simulation kann mit dem Schalter Run gestartet und mit dem Schalter Stop beendet werden.