/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/vhdl/vhdl.txt


1. Block
2. Signal

Blöcke: Zähler, Multiplexer, Dekoder, ...

Blöcke werden über Signale miteinander verbunden


1.) Konventionen
2.) Typologie
3.) Vektoren
4.) Aufbau der Schaltungsbeschreibung
5.) Nebenläufige oder sequentielle Umgebungen
6.) Anweisungen 


1.) Konventionen
1.1.) Namensregeln
1.2.) Kommentare
1.3.) Zuweisungen
2.) Typologie
3.) Vektoren
4.) Aufbau der Schaltungsbeschreibung
4.1.) Header mit Bibliothek und Packageeinbindungen
4.2.) Entity für Schnittstellendefinition
4.3.) Architecture für Funktionsbeschreibung
5.) Nebenläufige oder sequentielle Umgebungen
5.1.) Nebenläufig
5.2.) Sequentiell
6.) Anweisungen 
6.1.) Einfache Verknüpfungen
6.2.) Arithmetische Operatoren 
6.3.) with/select
6.4.) when/else
6.5.) if/then 
6.6.) case/is


1.) Konventionen
1.1.) Namensregeln

- Zwischen Gross und Kleinschreibung wird in VHDL nicht unterschieden
- ... das übliche

1.2.) Kommentare
- Komentare werden durch doppelten Bindestrich eingeleitet --

1.3.) Zuweisungen 
- Zuweisungen 
    - Signal an ein anderes Signal
    - konstanter Wert an Signal
- Zeichenkombination <=
- Von rechts nach links

Beispiel:

Y <= S;
Y <= A or B;
-- Falsch A => Y; -- Falsch

2.) Typologie 
- VHDL ist streng typgebundene Sprache

Es genügt:
- boolean
- bit
- std_logic

1.) Typ: boolean
1.1.) Wertevorrat: true, false
1.2.) Verwendung: logische Abfragen (if)
2.) Typ: bit
2.1.) Wertevorrat: 0, 1
2.2.) Verwendung: Entwurf
3.) Typ: std_logic:
2.1.) Wertevorrat: 0, 1, Z, -, L, H, X, W
2.2.) Entwurf und Simulation

Deklartion:

signale <signalname>: typ;

signal x0, x1, x2, x3: bit;
signal EN: std_logic;
signal on_of: boolean;

Bei Verknüpfungen müssen einzelne Signale vom selben Typ sein

0: starke 0
1: starke 1
Z: hochohmig
-: don't care
U: unbekannt
X: konflikt
L: Schwache 0
H: Schwache 1
W: Schwaches X

3.) Vektoren
3.1.) Deklaration
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);

3.2.) Zuweisungen

c <= a or b;
c <= ('1', '0', '0', '0');
c <= "1000";

4.) Aufbau der Schaltungsbeschreibung
4.1.) Header mit Bibliothek und Packageeinbindungen
4.2.) Entity für Schnittstellendefinition
4.3.) Architecture für Funktionsbeschreibung

4.1.) Header 
- Definitionen die für Schaltungsbeschreibung gelten sollen

library ieee;
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all

4.2.) Entity

1.) Eingang
2.) Ausgang
3.) Bidirektional

1.) Eingang: in
2.) Ausgang: out
3.) Bidirektional: inout

entity <blockname> is
port
(
    <signalnamen>: <richtung> <typ>;
    <signalnamen>: <richtung> <typ>;
    <signalnamen>: <richtung> <typ>
);
end;

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;

entity counter is
port
(
    clk: in bit;
    rst: in bit;
    q: out bit_vector (3 downto 0)
);
end;

3.) Die Funktion - Architecture

architecture <beschreibungsname> of <blockname> is
-- locale signale 
begin 
-- functionsbeschreibung
end;
    
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


5.) Nebenläufige oder sequentielle Umgebungen
5.1.) Nebenläufige 
5.2.) sequentielle Umgebungen

- 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?


Aus:

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


Wird:

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

- Die erste umgebung ist nebenläufig


5.2.) Squentielle Umgebung
5.2.1.) Prozess 

process <empfindlichkeitsliste>
-- lokale signale   
begin 
-- sequentielle umgebung
end process;

- 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

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;

Variablen im Prozess

process ..
    variable V std_logic_vector (3 downto 0);
begin 
    V := ...
end;

6.) Anweisungen 
6.1.) Einfache Verknüpfungen
- not
- and
- or
- nand
- nor
- xor
- not
6.2.) Arithmetische Operatoren 
- Addition + 
- Subtraktion - 
- gleich = 
- ungleich /=
- kleiner < 
- kleiner gleich <=
- groesser >
- groesser gleich >=
6.3.) with/select
- nebenläufig 

with <auswahlsignal> select 
ergebnis <= <Verknüpfung_1> when <auswahlwert_1>,
            <Verknüpfung_2> when <auswahlwert_2>,
            <Verknüpfung_n> when others;
            
6.4.) when/else

- nebenläufig 

<ergebnis> <=   <Verknüpfung_1> when <Bedingung_1>, 
                else <Verknüpfung_2> when <Bedingung_2>, 
                else <Vernüpfung_n>;
                
6.5.) if/then 
- sequentiell

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;

Bedingung muss vom Typ Boolean sein 

6.6.) case/is 
- wie with/select nur in sequentiell 

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;
          


Beispiel Codes:

-- 2_zu_1 Multiplexer

entity multiplexer is
port
(
    S:      in bit;
    A, B:   in bit;
    Y:      out bit;
);
end;