[list=1]
[*] Block
[*] Signal
[/list]
Blöcke: Zähler, Multiplexer, Dekoder, ...
Blöcke werden über Signale miteinander verbunden
[list=1]
[*] Konventionen
[list=1]
[*] Namensregeln
[*] Kommentare
[*] Zuweisungen
[/list]
[*] Typologie
[*] Vektoren
[*] Aufbau der Schaltungsbeschreibung
[list=1]
[*] Header mit Bibliothek und Packageeinbindungen
[*] Entity für Schnittstellendefinition
[*] Architecture für Funktionsbeschreibung
[/list]
[*] Nebenläufige oder sequentielle Umgebungen
[list=1]
[*] Nebenläufig
[*] Sequentiell
[/list]
[*] Anweisungen
[list=1]
[*] Einfache Verknüpfungen
[*] Arithmetische Operatoren
[*] with/select
[*] when/else
[*] if/then
[*] case/is
[/list]
[/list]
[list=1]
[*] Konventionen
[list=1]
[*] Namensregeln
[list]
[*] Zwischen Gross und Kleinschreibung wird in VHDL nicht unterschieden
[*] ... das übliche
[/list]
[*] Kommentare
[list]
[*] Komentare werden durch doppelten Bindestrich eingeleitet --
[/list]
[*] Zuweisungen
[list]
[*] Zuweisungen
[list]
[*] Signal an ein anderes Signal
[*] konstanter Wert an Signal
[/list]
[*] Zeichenkombination <=
[*] Von rechts nach links
[/list]
Beispiel:
[code]
Y <= S;
Y <= A or B;
-- Falsch A => Y; -- Falsch
[/code]
[/list]
[*] Typologie
[list]
[*] VHDL ist streng typgebundene Sprache
[/list]
Es genügt:
[list]
[*] boolean
[*] bit
[*] std_logic
[/list]
[list=1]
[*] Typ: boolean
[list=1]
[*] Wertevorrat: true, false
[*] Verwendung: logische Abfragen (if)
[/list]
[*] Typ: bit
[list=1]
[*] Wertevorrat: 0, 1
[*] Verwendung: Entwurf
[/list]
[*] Typ: std_logic:
[list=1]
[*] Wertevorrat: 0, 1, Z, -, L, H, X, W
[*] Entwurf und Simulation
[/list]
[/list]
Deklartion:
[code]
signale <signalname>: typ;
signal x0, x1, x2, x3: bit;
signal EN: std_logic;
signal on_of: boolean;
[/code]
Bei Verknüpfungen müssen einzelne Signale vom selben Typ sein
[code]
0: starke 0
1: starke 1
Z: hochohmig
-: don't care
U: unbekannt
X: konflikt
L: Schwache 0
H: Schwache 1
W: Schwaches X
[/code]
[*] Vektoren
[list=1]
[*] Deklaration
[code]
signal <signalname>: typ (<lower> to <upper>);
signal <signalname>: typ (<upper> downto <lower>);
signal x: bit_vector(0 to 7);
signal a: std_logic_vector(2 to 4);
signal r: bit_vector(3 downto 0);
[/code]
[*] Zuweisungen
[code]
c <= a or b;
c <= ('1', '0', '0', '0');
c <= "1000";
[/code]
[/list]
[*] Aufbau der Schaltungsbeschreibung
[list=1]
[*] Header mit Bibliothek und Packageeinbindungen
[*] Entity für Schnittstellendefinition
[*] Architecture für Funktionsbeschreibung
[/list]
[list=1]
[*] Header
[list]
[*] Definitionen die für Schaltungsbeschreibung gelten sollen
[/list]
[code]
library ieee;
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
[/code]
[*] Entity
[list=1]
[*] Eingang
[*] Ausgang
[*] Bidirektional
[/list]
[list=1]
[*] Eingang: in
[*] Ausgang: out
[*] Bidirektional: inout
[/list]
[code]
entity <blockname> is
port
(
<signalnamen>: <richtung> <typ>;
<signalnamen>: <richtung> <typ>;
<signalnamen>: <richtung> <typ>
);
end;
[/code]
[code]
entity multiplexer is
port
(
a0, a1, a2, a3: in bit;
b0, b1, b2, b3: in bit;
s: in bit;
y0, y1, y2, y3: out bit;
);
end;
[/code]
[code]
entity counter is
port
(
clk: in bit;
rst: in bit;
q: out bit_vector (3 downto 0)
);
end;
[/code]
[*] Die Funktion - Architecture
[code]
architecture <beschreibungsname> of <blockname> is
-- locale signale
begin
-- functionsbeschreibung
end;
[/code]
[code]
architecture mymux of multiplexer is
signal a, b, y: bit_vector (0 to 3);
begin
a <= (a0, a1, a2, a3);
b <= (b0, b1, b2, b3);
y <= a when (s='0') else b;
y0 <= y(0);
y1 <= y(1);
y2 <= y(2);
y3 <= y(3);
end mymux
[/code]
[*] Nebenläufige oder sequentielle Umgebungen
[list=1]
[*] Nebenläufige
[list]
[*] In C werden alle Anweisungen hintereinander abgearbeitet
[*] Anweisungen in VHDL in der Regel nebenläufig, d.h. parallel
[*] Befindet man sich in einer nebenläufigen oder Sequentiellen Umgebung?
[/list]
Aus:
[code]
architecture verhalten of multiplexer is
signal a, b, y: bit_vector (0 to 3);
begin
a <= (a0, a1, a2, a3);
b <= (b0, b1, b2, b3);
y <= a when (s='0') else b;
y0 <= y(0);
y1 <= y(1);
y2 <= y(2);
y3 <= y(3);
end verhalten
[/code]
Wird:
[code]
architecture mymux of multiplexer is
signal a, b, y: bit_vector (0 to 3);
begin
a <= (a0, a1, a2, a3);
b <= (b0, b1, b2, b3);
y <= a when (s='0') else b;
y0 <= y(0);
y1 <= y(1);
y2 <= y(2);
y3 <= y(3);
end mymux
[/code]
[*] Die erste umgebung ist nebenläufig
[*] Squentielle Umgebung
[list=1]
[*] Prozess
[code]
process <empfindlichkeitsliste>
-- lokale signale
begin
-- sequentielle umgebung
end process;
[/code]
[list]
[*] Ist eine Sequentielle Umgebung abgearbeitet, startet die Ausführung von vorne
[*] Eine parallele Umgebung kann mehrere sequentielle enthalten, die parallel ausgeführt werden
[*] Empfindlichkeitsliste: Alle signale die sich potentiell ändern können
[/list]
[code]
architecture verhalten of counter is
signal qint: std_logic_vector ( 3 downto 0);
begin
process (reset, clk)
begin
if (reset='0') then
quint <= x"0";
elseif (clk='1') and clk'event
then
qint <= qint+1;
end if;
end process;
q<=qint;
end;
[/code]
Variablen im Prozess
[code]
process ..
variable V std_logic_vector (3 downto 0);
begin
V := ...
end;
[/code]
[/list]
[/list]
[/list]
[*] Anweisungen
[list=1]
[*] Einfache Verknüpfungen
[list]
[*] not
[*] and
[*] or
[*] nand
[*] nor
[*] xor
[*] not
[/list]
[*] Arithmetische Operatoren
[list]
[*] Addition +
[*] Subtraktion -
[*] gleich =
[*] ungleich /=
[*] kleiner <
[*] kleiner gleich <=
[*] groesser >
[*] groesser gleich >=
[/list]
[*] with/select
[list]
[*] nebenläufig
[code]
with <auswahlsignal> select
ergebnis <= <Verknüpfung_1> when <auswahlwert_1>,
<Verknüpfung_2> when <auswahlwert_2>,
<Verknüpfung_n> when others;
[/code]
[/list]
[*] when/else
[list]
[*] nebenläufig
[code]
<ergebnis> <= <Verknüpfung_1> when <Bedingung_1>,
else <Verknüpfung_2> when <Bedingung_2>,
else <Vernüpfung_n>;
[/code]
[/list]
[*] if/then
[list]
[*] sequentiell
[/list]
[code]
if <Bedingung_1> then <Sequentielle Anweisungen 1>;
elseif <Bedingung_2> then <Sequentielle Anweisungen 2>;
elseif <Bedingung_3> then <Sequentielle Anweisungen 3>;
else <Sequentielle Anweisungen n>;
end if;
[/code]
Bedingung muss vom Typ Boolean sein
[*] case/is
[list]
[*] wie with/select nur in sequentiell
[/list]
[code]
case <testsignal> is
when <Wert_1> => <Sequentielle Anweisungen 1>;
when <Wert_2> => <Sequentielle Anweisungen 2>;
when <Wert_3> => <Sequentielle Anweisungen 3>;
when others => <Sequentielle Anweisungen n>;
end case;
[/code]