Hardwarebeschreibungssprachen

ZIELE

  • Verständnis der Sematik von Sprachen zur Modellierung des Verhaltens von digitalen Schlatkreisen
  • Verständnis und Anwendung der Grundelemente von VHDL
  • Unterscheidung von Struktur- und Verhaltensbeschreibung

Überblick

Hardwarebeschreibungssprachen (HDL)

  • HDLs führen keinen Übergang von VB zu RTL durch, d.h. die Systembeschreibung unter Verwendung einer HDL erfordert explizite Formulierung der RTL, anders als bei prozessororientierten Programmiersprachen wie C.

  • HDLs ermöglichen sowohl SB als auch VB des Systems, häufig gemischt und hierarchisch.

  • Eine HDL sollte technologieunabhängig sein, d.h. eine VB muß für FPGAs genauso wie für ASICs verwendbar sein, und muss die gleiche Funktionalität ergeben.

  • Die Abstraktionsebene einer HDL ist durch VB höher als reine SB, was kürzere Entwicklungszeiten und eine höhere Entwurfssicherheit bedeutet.

Überblick

  • Es gibt zwei weit verbreitete HDLs:
    1. Verilog HDL Gateway Design Automation [1985], Cadence [1989], Standardisierung durch IEEE [1995]
    2. VHSIC (Very High Speed IC) HDL IBM, Texas Instruments [1982], IEEE [1985,1987]. VHDL ist weit verbreiteter Standard im akademischen und industriellen Umfeld.

fighdlcomp1http://www.ucerd.com


Abb. 1. VHDL und Verilog decken einen Großteil der Modellierungsebenen beim Hardwarentwurf ab. VHDL bietet bessere Abstraktionsmöglichkeiten.

Überblick

fighdlcomp2


Abb. 2. Syntaktischer und semantischer Vergleich von VHDL und Verilog am Beispiel eines 8-Bit Schieberegsietrs

VHDL

  • VHDL bietet im Gegensatz zu Verilog HDL ein universelles und nutzerdefinierbares Typensystem. VHDL ist semantisch streng typisiert.

  • VHDL bietet ein

    • universelles [konkrete und abstrakte Datentypen],
    • umfangreiches [bit, signed, float, string, …],
    • erweiterbares [type defintion],
    • strenges [type atype b]

    Typsystem. Strenge Typisierung reduziert Entwurfsfehler, erhöht aber den syntaktischen und semantischen Programmieraufwand.

  • VHDL unterstützt statische Funktionen, die mit unterschiedlichen Funktionstypen überladen werden können.

VHDL

  • Beispiel einer überladenen Funktion in VHDL.
function ”+” (std_logic_vector;std_logic_vector)
  return std_logic_vector;
function ”+” (std_logic_vector;integer)
  return std_logic_vector;
function ”+” (signed;signed)
  return signed;
  • Eine Funktion beschreibt in VHDL eine Abbildungsvorschrift (i.A. kombinatorische Logik) von Eingangs- auf Ausgangssignale! Rein funktional ohne Speicher und sequenziellen Ablauf!

  • VHDL ist modulorientiert und hierarchisch strukturiert.

VHDL - Aufbau

Die Beschreibung einer Digitallogikschaltung, Komponente genannt, benötigt wenig- stens zwei Strukturelemente. Ein Modul (≡eine VHDL Quelldatei) ist daher unterteilt in:

Schnittstellenbeschreibung → Entity
In der Entity wird die extern sichtbare Schnittstelle der zu modellierenden Komponente beschrieben:
  • Ein- und Ausgänge (Ports)
  • Konstanten
  • Funktionen und Prozeduren
Architektur → Architecture
Eine Architektur enthält die Beschreibung der Funktionalität und/oder der Struktur eines Moduls.
  • Verhaltenbeschreibung VB, Strukturbeschreibung SB in Form einer Netzliste und Komponentent, die auch verschiedene VHDL-Module verbinden kann.
  • Eine Entity bzw. ein Modul kann durch verschiedene Architekturen beschrieben werden. Die Zuordnung einer Architektur zu einer Entity findet in der sog. Konfiguration statt.

VHDL - Aufbau

  • Ein Modul (≡eine VHDL Quelldatei) ist unterteilt in (Forts.):
Package [optional]
Ein Paket enthält Anweisungen wie Typ- und Objektdeklarationen sowie statische Funktionen und Prozeduren, die von mehreren Modulen verwendet werden können. Vordefiniert sind bei VHDL die Pakete STANDARD und TEXTIO.

figvhdlhier1


Abb. 3. Hierarchisch aufgebaute Struktur in VHDL

VHDL - Aufbau

Definition eines VHDL Moduls und Analogie zur einer IC-Komponente

  • Ein VHDL Modul beschreibt die äussere Schnittstelle einer Komponente (Black Box) in der Entity und deren Aufbau oder Funktion (Architecture)

figvhdlcomp1

VHDL - Aufbau

  • Die Port-Schnittstelle legt Typ und Richtung des Anschlüsse einer Entity fest. Die Architektur unterteilt sich in einen Deklarationsteil und einen Körper, der die eigentlichen VHDL-Anweisungen (VB & SB)aufnimmt.

  • Wie bei elektrischen Schaltkreisen können verschiedene Module gleichen oder verschiedenen Typs strukturell miteinander verbunden werden.

  • Diesen Vorgang der Einbindung bezeichnet man als Komponenteninstanzierung. Eine externe Komponente ≡ Modul muß im VHDL Deklarationskopf gemäß ihrer Anschlüsse deklariert werden, und kann im VHDL-Anweisungsteil (Architektur-Körper) eingebunden werden (SB).

VHDL - Komponenten

  • Die strukturelle Modellierung unter- scheidet zwischen der Komponentende- finition, der Verhaltensbeschreibung einer Komponente (Entity), und der Kom- ponenteninstanziierung, d.h. die Einbin- dung von Komponenten.

  • Die einzubindenden Komponenten müssen mit ihrer Port-Schnittstelle (identisch zum Entity-Port) im Dekla- rationsteil der Architektur eingeführt werden.

  • Eine Komponente eines bestimmten Typs kann beliebig oft dupliziert im Ar- chitekturkörper eingebunden werden.

  • Jede Komponenteninstanz ist unabhängig von jeder anderen, d.h. mit eigener Digitallogik synthetisiert.

VHDL - Komponenten

Definition 1. (Komponentendefinition)

\[\begin{mdmathpre}%mdk
\mathkw{entity}~\mathid{M}_{1}~\mathid{is}\\
\mdmathindent{2}\mathkw{port}~(..)\\
\mathkw{end}~\mathid{M}_{1};\\
\mathkw{architecture}~\mathid{A}~\mathid{of}~\mathid{M}_{1}~\mathid{is}\\
\mathkw{begin}\\
..\\
\mathkw{end}~\mathid{A};
\end{mdmathpre}%mdk
\]

Definition 2. (Komponenteninstanzierung)

\[\begin{mdmathpre}%mdk
\mathkw{entity}~\mathid{M}_{2}~\mathid{is}\\
\mdmathindent{2}\mathkw{port}~(..)\\
\mathkw{end}~\mathid{M}_{2};\\
\mathkw{architecture}~\mathid{A}~\mathid{of}~\mathid{M}_{2}~\mathid{is}\\
\mdmathindent{2}\mathkw{component}~\mathid{M}_{1}\\
\mdmathindent{4}\mathkw{port}~(..)\\
\mdmathindent{2}\mathkw{end}~\mathkw{component};\\
\mathkw{begin}\\
\mdmathindent{2}\mathid{Instance}_{1}:~\mathid{M}_{1}~\mathkw{port}~\mathkw{map}~(..);\\
\mdmathindent{2}\mathid{Instance}_{2}:~\mathid{M}_{1}~\mathkw{port}~\mathkw{map}~(..);\\
\mdmathindent{2}..\\
\mathkw{end}~\mathid{A};
\end{mdmathpre}%mdk
\]

VHDL - Komponenten

figvhdlcomp2


Abb. 4. Komponenteninstanzierung in VHDL.

VHDL - Signale

  • Signale sind die eigentlichen Datenobjekte in VHDL.

  • Der einfachste Signaltyp ist ein Bit mit der Wertemenge bit={0,1}.

  • Ein Signal kann aus einer Bitgruppe == Datenwort mit beliebiger Anzahl von Einzelsignalen bestehen, genannt Vektor.

  • Synthese von Signalen erfolgt durch

    • reine Verknüpfung bzw. verbindung zwischen einzelnen Komponenten eines Systems (”wire”)
    • durch Erzeugung eines Registers oder Latches.
  • Signale können in der Port-Deklaration global sichtbar oder innerhalb des Architekturdeklarationsteils lokal sichtbar erzeugt werden.

VHDL - Signale

  • Definition eines globalen Portsignals und Angabe der Signalrichtung.

Definition 3. (Portdeklaration einer Entity)

\[\begin{mdmathpre}%mdk
\mathkw{port}~(\\
\mdmathindent{1}\mathid{signalname}_{1}~:~\mathid{dir}_{1}~\mathid{type}_{1};\\
\mdmathindent{1}\mathid{signalname}_{2}~:~\mathid{dir}_{2}~\mathid{type}_{2};\\
\mdmathindent{1}..\\
)\\
\mathkw{typeof}~\mathid{dir}~=~\mathkw{in}~|~\mathkw{out}~|~\mathkw{inout}~|~\mathkw{buffer}\\
\mathkw{typeof}~\mathid{type}~=~\mathkw{bit}~|~\mathkw{std}\_\mathkw{logic}~|~\mathkw{bit}\_\mathkw{vector}~|~..
\end{mdmathpre}%mdk
\]

Beispiel einer Port-Deklaration:

port (
  data : in bit;
  addr : in bit_vector(7 downto 0)
);

VHDL - Signale

Definition 4. (Definition eines lokalen (internen) Architektursignals mit der Möglichkeit der Initialisierung)

\[\begin{mdmathpre}%mdk
\mathkw{signal}~\mathid{signalname}~:~\mathid{type}~:=~\mathid{init}~;\\
\mathkw{signal}~\mathid{signalname}~:~\mathid{type}_\mathid{vector}~(~\mathid{a}~\mathkw{downto}|\mathkw{to}~\mathid{b})~:=~\mathid{init}~;
\end{mdmathpre}%mdk
\]
  • Signalvektoren der Datenbreite N werden wie Signale definiert.

  • Der Typbezeichner wird um ”_vector” ergänzt. Die Angabe des Index-Intervalls kann auf zwei Arten erfolgen, entsprechend der Stelle des höchstwertigsten Bits (MSB).

  • Wird die Indexrichtung b downto a verwendet, befindet sich das MSB immer auf der linken Seite einer Binärzahl MSB .. LSB , wird die Indexrichtung a to b gewählt, auf der rechten Seite LSB .. MSB.

  • Der untere Index a kann mit jedem beliebigen natürlichen Zahlenwert gewählt werden. Der Wert 0 mit der b downto a Darstellung ist aber zweckmäßig anzuwenden.

VHDL - Signale

  • Beispiel einer Architekturdeklaration mit Signalen.
architecture main of en is
  signal incr: bit;
  signal data : signed(7 downto 0);
begin
  incr <= WE and ADDR=X"01" ;
  process (write,data) 
    if incr = '1' then
      data <= data + 1;
    else 
      data <= data - 1; 
    end if;
  end process;
end;

VHDL - Signale

  • Signalen können Werte zugewiesen werden, ähnlich einer Wertzuweisung einer Variable in imperativen Programmiersprachen. Beim Typ bit findet eine Zuweisung eines Logikpegels statt!

Definition 5. (Signalzuweisung)

\[\begin{mdmathpre}%mdk
\mathid{signalname}~<=~\mathid{expression};\\
\mathid{expression}~::=\\
\mdmathindent{2}[\mathid{Konstante}]~\rightarrow \mathid{vom}~\mathid{gleichen}~\mathid{Typ}~\mathid{wie}~\mathid{das}~\mathid{Signal}\\
\mdmathindent{3}\rightarrow \mathid{Bit}:~'0'~|~'1'\\
\mdmathindent{3}\rightarrow \mathid{Bitvektor}:~"\mathid{XX}..."~\mathid{mit}~\mathid{X}~=~\{0,1\}\\
\mdmathindent{2}[\mathid{Arithmetischer}~\mathid{Ausdruck}]\\
\mdmathindent{3}\rightarrow \mathid{operand}~\{+,-,*,...\}~\mathid{operand}\\
\mdmathindent{3}\rightarrow \mathid{Schachtelung}~\mathid{expr}_{1}(\mathid{expr}_{2}(\mathid{expr}_{3}(...)))\\
\mdmathindent{3}\rightarrow \mathid{alle}~\mathid{Operanden}~\mathid{vom}~\mathid{gleichen}~\mathid{Typ},~\mathid{nur}~\mathid{sinnvoll}~\mathid{mit}~\mathid{Vektoren}\\
\mdmathindent{2}[\mathid{Logischer}~\mathid{Ausdruck}]\\
\mdmathindent{3}\rightarrow \mathid{operand}~\{\mathid{and},\mathid{or},...\}~\mathid{operand}\\
\mdmathindent{2}[\mathid{Relationaler}~\mathid{Ausdruck}]\\
\mdmathindent{3}\rightarrow \mathid{operand}~\{=,<>,...\}~\mathid{operand}
\end{mdmathpre}%mdk
\]

VHDL - Signale

Nebenläufige Signalzuweisungen, dass sind alle Toplevelanweisungen im Architekturkörper und ausgenommen bedingte Ausrücke in Prozessen, dürfen immer nur eine Quelle besitzen, d.h. in obigen Beispiel ist immer nur eine Signalzuweisung erlaubt!

VHDL - Signaltypen

Vordefinierte (V) und erweiterte (E) Typen in VHDL

boolean (V)

Wertemenge {true,false}

integer (V)

{keine spezifische Datenbreite, wird bei der Syntehse bestimmt, i.A. wird aber nur eine Wertemenge von 32/64 Bit unterstützt}

natural (V)

Wertemenge {natural ⊆ integer ≥ 0}

positive (V)

Wertemenge {positive ⊆ integer > 0}

bit (V)

Wertemenge {0,1}

bit_vector(natural) (V)

Definiert ein Array von Bits

VHDL - Signaltypen

character (V)

Textzeichen, Wertemenge mit ASCII Kodierung

string(natural) (V)

Definiert ein Array von Textzeichen

std_logic (E)

Wertemenge {0,1,H,L,U,Z,-}, muss über das Paket IEEE.STD_LOGIC_1164.ALL eingebunden werden.

std_logic_vector (E)

Definiert ein Array von std_logic {0,1,H,L,U,Z,-}, muss über das Paket IEEE.STD_LOGIC_1164.ALL eingebunden werden.

signed, unsigned (E)

Vorzeichenbehaftete und vorzeichenlose ganze Zahlen mit Binärkodierung, muss über das Paket IEEE.NUMERIC_BIT.ALL eingebunden werden.

VHDL - Signaltypen

Aufzählungstyp

  • Abstrakte Aufzählungstypen werden z.B. zur symbolischen Beschreibung der Zustände eines Zustandsautomaten verwendet.

  • Abstrakte konstante Aufzählungstypen definieren eine Menge von Symbolen, die noch keine konkrete Kodierung zugeordnet sind.

Definition 6. (Aufzählungstyp und Signaldefinition eines Aufzählungstyps)

\[\begin{mdmathpre}%mdk
\mathkw{type}~\mathid{typename}~\mathkw{is}~(\\
\mdmathindent{2}\mathid{symbol}_{1},\\
\mdmathindent{2}\mathid{symbol}_{2},\\
\mdmathindent{2}..\\
);\\
\mathkw{signal}~\mathid{signalname}~:~\mathid{typename};
\end{mdmathpre}%mdk
\]
  • Der Symbolelementname ist ein beliebiger Identifizierername (nutzerdefiniert)

  • Datentypen werden i.A. im Kopfteil einer Architektur definiert.

VHDL - Signaltypen

  • Beispiel eines Aufzählungstyps:
...
type states is (
  S_start,
  S_loop,
  S_end
);
signal state: states;
signal next_state: states;
begin
  ...
  process fsm()
    case state is
      when S_start => next_state := S_loop;
      when S_loop => ...
    end case;
  end process;

VHDL - Signaltypen

Aufgabe

  1. Welche Kodierungen könnten die Symbolemente eines Aufzählungstyps in der Digitallogik besitzen?

  2. Nenne Vorteile und Nachteile der unterschiedlichen Kodierungen

VHDL - Arraytypen

  • VHDL unterstützt zur einsortigen Aggregation Arrays.

  • Der Arraytyp kann beliebig sein. Arrays können wie RAM-Blöcke mit adressierbaren Speicherzellen aufgefasst werden.

  • Ob jedoch ein monolithischer RAM-Block während der Synthese erzeugt werden kann, hängt von der Verwendung in der Verhaltensbeschreibung eines Arrays ab.

  • Wenn nebenläufig z.B. mehrere Arrayzellen gelesen werden, ist die Inferenz eines klassischen RAM Speicher mit nur einem Leseport nicht mehr möglich!

  • Arrays werden wie generische Typen aufgefasst, anders als in imperativen Programmiersprachen wie C.

VHDL - Arraytypen

Definition 7. (Arraytyp, Erzeugung eines Arrayobjekts und Zugriff auf Arrayzellen)

\[\begin{mdmathpre}%mdk
\mathkw{type}~\mathid{arrayname}~\mathkw{is}~\mathkw{array}(\{\mathid{range}\})~\mathkw{of}~\mathid{celltype};\\
\\
\mathkw{signal}~\mathid{signalname}:~\mathid{arrayname};\\
\\
\mathid{signalname}(\mathid{index}|\mathid{range})~:=~\mathid{expression}~(~\mathid{signalname}(\mathid{index}|\mathid{range})~)
\end{mdmathpre}%mdk
\]
  • Zuerst muss ein Arraytyp definiert werden, dann können Signale definiert werden.

  • Beispiel für Arrays

type ram is array(0 to 255) of bit_vector(7 downto 0);
signal ram1: ram;
signal data: bit_vector(7 downto 0);
... data <= ram1(addr); ...

VHDL - Prozesse

  • Bei der VB wird das Verhalten einer Komponente durch die Reaktion der Ausgangssignale auf Änderungen der Eingangssignale beschrieben.

  • Bei einer reinen VB findet keine weitere Verzweigung in Unterkomponenten statt.

  • In der VB werden zwei Anweisungsklassen unterschieden:

    1. Sequenzielle Anweisungen (Prozesse)
    2. Nebenläufige Anweisungen
  • Sequenzielle Anweisungen können nur in Prozessen verwendet werden und erzeugen Speicher.

  • Sequenzielle Anweisungen einer Hardwarebeschreibungssprache sind nicht mit Programmsequenzen zu verwechseln.

  • Wenn überhaupt ist eine Sequenz im Sinne einer Laufzeithierarchie und Evaluierungsreihenfolge zu verstehen.

VHDL - Prozesse

  • Register können nur in Prozessen erzeugt werden.

  • VHDL synthetisiert Register (FLIP-FLOPs, Latches) implizit, d.h. es gibt in VHDL keine Möglichkeit, ein Register explizit zu erzeugen. Die Registerinferenz ergibt sich aus der Verhaltenbeschreibung mit entsprechenden VHDL-Anweisungen.

Ein Prozess ist eine Blockkapselung von VHDL Anweisungen und gehört zur VB. Prozesse werden zusammen mit Toplevelanweisungen ausserhalb von Prozessen konkurrierend/nebenläufig ausgeführt.

  • Anweisungen (= Evaluierungsvorschriften) in einem Prozess sind auf gleicher Ebene zueinander nebenläufig zu betrachten.

  • Alle Anweisungen (Signalzuweisungen) in einem Prozess werden zu einem einzigen finalen Ausdruck synthetisiert!

VHDL - Prozesse

Definition 8. (Prozess)

\[\begin{mdmathpre}%mdk
[\mathid{name}:]~\mathkw{process}~(\mathid{sig}_{1},\mathid{sig}_{2},..)\\
\mdmathindent{2}[\mathid{Variablendeklaration}]\\
\mathkw{begin}\\
\mdmathindent{2}\mathid{statement}_{1};\\
\mdmathindent{2}\mathid{statement}_{2};\\
\mdmathindent{2}..\\
\mathkw{end}~\mathkw{process}~[\mathid{name}];
\end{mdmathpre}%mdk
\]

VHDL - Prozesse

  • Beispiel Multiplexer-Inferenz mit Signalzuweisung in beiden Zweigen der bedingten Verzweigung (linkes Bild).
  • Beispiel Multiplexer-Inferenz mit Standardsignalzuweisung (Default) und mehreren unvollständigen bedingten Verzweigung (rechtes Bild).

figvhdlmux1

VHDL - Prozesse

  • Unvollständige bedingte Verzweigungen können (und sollen!) Register erzeugen.

  • Immer wenn es einen bedingten Fall (Ausdruck) in einem Prozess gibt, der bei einer bestimmten Eingangsvektor kein Ergebnis eines bestimmten Ausgnagssignals ergibt, ist gemäss dem zu grundeliegenden Modell ein Register als Zustandsspeicher erforderlich.

  • Dabei muss man zwischen taktflankengesteuerten (dynamischen) und Registern und datengesteuerten (statischen) Latches unterscheiden.

  • Eine Signaländerung (Flanke) kann kombinatorisch durch ein event Attribut ageleitet werden: signalname'event.

VHDL - Prozesse

Definition 9. (Registererzeugung in VHDL)

\[\begin{mdmathpre}%mdk
\mathid{Statisch},~\mathid{Latch},~\mathid{nicht}~\mathid{taktgesteurt}~(\mathid{Zustand})\\
\mathkw{process}~(\mathid{clock},..)\\
\mdmathindent{2}\mathkw{if}~\mathid{clock}~=~\mathid{level}~\mathkw{then}\\
\mdmathindent{4}\mathid{register}~<=~\mathid{expression};\\
\mdmathindent{2}\mathkw{end}~\mathkw{if};\\
\mathkw{end}~\mathkw{process};\\
\\
\mathid{Dynamisch},~\mathid{Register},~\mathid{taktgesteuert}~(\mathid{Ereignis})\\
\mathkw{proecss}~(\mathid{clock},..)\\
\mdmathindent{2}\mathkw{if}~\mathid{clock}'\mathkw{event}~\mathkw{and}~\mathid{clock}~=~\mathid{level}~\mathkw{then}\\
\mdmathindent{4}\mathid{register}~<=~\mathid{expression};\\
\mdmathindent{2}\mathkw{end}~\mathkw{if};\\
\mathkw{end}~\mathkw{process};
\end{mdmathpre}%mdk
\]

VHDL - Prozesse

  • Beispiel Registerinferenz mit Datenmultiplexing über ein unvollständige bedingte Verzweigung

figvhdlmux3

VHDL - Prozesse

  • Prozesse modellieren prozedurale Vorgänge.

  • Das Modell eines prozeduralen Verhaltens sieht neben Ablaufsteuerung die “scheinbare” Aktivierung und Suspendierung (Blockierung) des Ablaufes eines Prozesses vor.

  • Toplevelanweisungen sind im Gegensatz zu Prozessen immer aktiv, worin begründet ist, daß Toplevelanweisungen keine Register modellieren können, da diese nur unter bestimmten Bedingungen aktiv sind, d.h. Daten für die Speicherung übernehmen können.

  • Prozesse werden durch zwei verschiedene Möglichkeiten aktiviert, die sich gegenseitig ausschliessen:

    1. Aktivierung bei Änderung von Signalen aus der Liste sensitiver Signale im Prozesskopf. Immer wenn sich eines dieser Signale ändert, wird der Prozess aktiviert, d.h. er evaluiert neue Werte der Ausgangssignale.
    2. Wait-Anweisung. Der Prozeß wird aktiviert, wenn die Bedingung einer Wait-Anweisung (ein boolescher Ausdruck) erfüllt ist.
  • Prozesse bestehen aus einem Deklarations- und Anweisungsteil (Körper).

VHDL - Prozesse

Prozesse mit Eingangssignalaktivierung

\[\begin{mdmathpre}%mdk
\mathkw{process}~(\mathid{sig}_{1},\mathid{sig}_{2},..)\\
\mathkw{begin}\\
\mdmathindent{2}\mathid{statement}_{1};\\
\mdmathindent{2}\mathid{statement}_{2};\\
\mdmathindent{2}..\\
\mathkw{end}~\mathkw{process};
\end{mdmathpre}%mdk
\]

Prozesse mit Wait Aktivierung

\[\begin{mdmathpre}%mdk
\mathkw{process}~()\\
\mathkw{begin}\\
\mdmathindent{2}\mathid{statement}_{1};\\
\mdmathindent{2}\mathid{statement}_{2};\\
\mdmathindent{2}..\\
\mdmathindent{2}\mathkw{wait}~\mathkw{on}~\mathid{signal};\\
\mdmathindent{2}\mathkw{wait}~\mathkw{until}~\mathid{expression};\\
\mdmathindent{2}\mathkw{wait}~\mathkw{for}~\mathid{time};~\\
\mathkw{end}~\mathkw{process}~\mathid{name};
\end{mdmathpre}%mdk
\]

VHDL - Prozesse

Verzögerungsmodelle

  • Das zeiltiche Konditional bei der wait Anweisung ist nicht synthetisierbar, nur simulierbar.

    • Technologische Verzögerung ist i.A. nicht parametrisierbar sondern durch Technologie und Design vorgegeben.
  • Es gibt in VHDL verschiedene temporale Verzögerungsmodelle die an die Ausdrucksevaluierung gebunden sind [I]:

Trägheitsverzögerung (Intertial Delay)

Standard-Verzögerungsmodell: Geeignet für die Modellierung von Verzögerungen durch Geräte mit Trägheit (z.B. Logikgattern). Impulse, die kürzer als die Verzögerung eines Geräts sind, werden nicht an den Ausgang weitergeleitet

Transportverzögerung:

Modellverzögerungen durch Elemente ohne “Trägheit”, z. B. Drähte. Keine Trägheit bedeutet alle Eingangsereignisse werden zu Ausgangssignalen übertragen. Ein beliebiger Impuls, nicht zu kurz, wird weitergeleitet.

VHDL - Prozesse

Delta Verzögerung
Was ist mit Modellen, bei denen keine Propagierungsverzögerungen angegeben sind? Eine unendlich kleine Verzögerung wird automatisch vom Simulator eingefügt ( 0ns), um die korrekte Reihenfolge der Ereignisse zu erhalten
  • Die Delta-Verzögerung ist ein Sonderfall der Verzögerung, die unendlich klein ist

  • Signalzuweisungen in Prozessen werden erst am Ende der Aktivierung eines Prozesses sichtbar!

    • D.h.: Innerhalb einer Prozessaktivierung kann ein Signal auf der linken Seite einer Zuweisung nicht unmittelbar wieder in einem Signalausdruck auf der rechten Seite einer Zuweisung verwendet werden!

VHDL - Prozesse

  • Folgende Entwicklung der Signalwerte zweier Signale x und y ergeben sich im folgenden Beispiel:
    tn: {a=1, x=1, y=1} tn+1: {a=1, x=2, y=0} tn+2: {x=2, y=1}!
signal a,x,y: integer;
process (a,x,y)
begin
  x <= a+1;
  y <= x-1;
  wait for 10ns; -- Nur zur Simulation
end process

VHDL - Prozesse

figvhdldelay1


Abb. 5. Allgemeine Form des delay Operators in Ausdrücken und Beispiele für die Trägheitsverzögerung

VHDL - Prozesse

figvhdldelay2


Abb. 6. Vergleich der Transport- mit der Trägheitsverzögerung

VHDL - Prozesse

figvhdldelay3


Abb. 7. Delta Verzögerung: Implizites Zeitmodell oder nur Abhängikseitsmodell?

VHDL - Prozesse

Zusammenfassung:

  • Inertial
    • Für Geräte mit Trägheit (d.h. Bei jedem physischen Gerät)
    • Impulse, die kürzer als die Verzögerung des modellierten Geräts sind, werden nicht weitergegeben.
    • VHDL 1993 unterstützt Impulsabstandbreiten
  • Transport
    • Gewährleistet die Propagierung aller Ereignisse (beliebiger Puls, wird propagiert)
    • Wird normalerweise zum Modellieren von Elementen verwendet, z.B. ideale Drähte.
  • Delta
    • Wird automatisch eingefügt, um die funktionale Korrektheit des Codes zu gewährleisten, der keine Verzögerung angibt
    • Erzwingt die im Code angegebenen Datenabhängigkeiten - Dies ist das Verzögerungsmodell für synthetisierbaren Code

VHDL - Prozesse

Variablen

  • In Prozessen können lokal sog. Variablen verwendet werden.
  • Eine Variable ist ein Signal, aber mit einem anderen zeitlichen Verhalten als herkömmliche Signale (bezogen auf Prozessverarbeitung):
  • Variablenwerte werden sofort bei der Evaluierung der Anweisungen zugewiesen (während Prozess noch aktiv ist)
  • Signalwerte werden erst nach der Abarbeitung des Prozesses nach einem sog. Delta Zyklus zugewiesen.
  • Konsequenz: Ein in einem Prozess zugewiesener Signalwert kann nicht unmittelbar in folgenden Ausdrücken verwendet werden, im Gegensatz zu Variablen. Die Schreibweise der Variablenzuweisungen unterscheidet sich daher von der von Signalen.
  • Einsatz von Variablen in Prozessen für temporäre Ausdrücke.

VHDL - Prozesse

Definition 10. (Prozessvariablen)

\[\begin{mdmathpre}%mdk
\mathkw{process}\\
\mdmathindent{2}\mathkw{variable}~\mathid{vname}~:~\mathid{typ};\\
\mathkw{begin}\\
\mdmathindent{2}\mathid{vname}~:=~\mathid{expression};\\
\mathkw{end}~\mathkw{process};
\end{mdmathpre}%mdk
\]
  • Beispiel für die Verwendung von Variablen in Prozessen zur Wahrung von Auswertereihenfolgen:
signal y: integer;
proces (a,b)
  variable v1,v2: integer;
begin
  v1 := 3 * a + 7 * b;
  v2 := a * b + 5 * v1;
  y <= v1 + v2;
end process;
  • Folgende Signaländerung sollte sich ergeben: tn: {a=1,b=1} {y=61}

VHDL - Prozesse

Aufgaben

  1. Prüfe den Vergleich von abhängigen Signal- und Variablezuweisung in Prozessen an einem einfachen Beispiel mit dem Simualtor ghdl (und Visualisierung mit gtkwave)

  2. Unetrusche und vergleiche die verschiedenen VHDL Verzögerungsemodelle in der Simulation

VHDL - Bedingte Ausdrücke und Anweisungen

Bedingte Ausdrücke

  • Nur ausserhalb von Prozessen in Toplevelanweisungen

Definition 11. (Bedingte Ausdrücke)

\[\begin{mdmathpre}%mdk
\mathid{signame}~<=~\mathid{expression}_{1}~\mathkw{when}~\mathid{condition}_{1}~\mathkw{else}\\
\mdmathindent{11}\mathid{expression}_{2}~\mathkw{when}~\mathid{condition}_{2}~\mathkw{else}~..\\
\mdmathindent{11}\mathid{expression}_{\mathid{default}}
\end{mdmathpre}%mdk
\]

Beispiel

Y <= '0' when I = "00" else
     '0' when I = "11" else
     '1';

VHDL - Bedingte Ausdrücke und Anweisungen

Bedingte Anweisung

  • Nur innerhalb von Prozessen verwendbar
    • Bei der bedingten Verzweigung ist der Else-Zweig optional.
    • Der Ausdruck muss vom Typ boolean sein.
    • Wenn aber die bedingte Anweisung nicht vollständig ist dann wird Speicher inferriert!
    • Bei der Schachtelung muß ein verändertes Schlüsselwort elsif verwendet werden.

Definition 12. (Bedingte Ausdrücke)

\[\begin{mdmathpre}%mdk
\mathkw{process}\\
\mdmathindent{2}\mathkw{if}~\mathid{condition}_{1}~\mathkw{then}\\
\mdmathindent{4}\mathid{statements}\\
\mdmathindent{2}[~\mathkw{elsif}~\mathid{condition}_{2}~\mathkw{then}~\mathid{statements}~]\\
\mdmathindent{2}[~\mathkw{else}~\mathid{statements}~]\\
\mdmathindent{2}\mathkw{end}~\mathkw{if};\\
\mathkw{end}~\mathkw{process};
\end{mdmathpre}%mdk
\]

VHDL - Bedingte Ausdrücke und Anweisungen

Beispiel

process
  if Y = "00" then
    I <= '0';
  elsif Y = "11" then
    I <= '0';
  else
    I <= '1';
  end if;
end process;
  • In imperativen Programmiersprachen sind geschachtelte IF-THEN-ELSE Anweisungen und die Mehrfachauswahl isomorph bzw. äquivalent.
  • Dies gilt nicht für eine Hardwarebeschreibungssprache. Bedingte Verzweigungen und die folgende Mehrfachauswahl besitzen unterschiedliche Prioritätsstrukur und zeitliches Verhalten:
    • CASE hat für alle Fälle i.A. konstante Signalverzögerungen bzw. Laufzeiten.
    • IF-THEN-ELSE besitzt aufsteigende Laufzeiten von Signalen für die verschiedenen Fälle (mutex).

VHDL - Bedingte Ausdrücke und Anweisungen

Mehrfachauswahl

  • Mit optionalen Restmengenfall others

Definition 13. (Mehrfachauswahl)

\[\begin{mdmathpre}%mdk
\mathkw{process}\\
\mdmathindent{2}\mathkw{case}~\mathid{expresssion}~\mathid{is}\\
\mdmathindent{4}\mathkw{when}~\mathid{value}_{1}~=>~\mathid{statements}\\
\mdmathindent{4}\mathkw{when}~\mathid{value}_{2}~=>~\mathid{statements}\\
\mdmathindent{4}..\\
\mdmathindent{4}[~\mathkw{when}~\mathid{others}~=>~\mathid{statements}~]\\
\mdmathindent{2}\mathkw{end}~\mathkw{case};\\
\mathkw{end}~\mathkw{process};
\end{mdmathpre}%mdk
\]

VHDL - Bedingte Ausdrücke und Anweisungen

figvhdlcase1


Abb. 8. Beispiel für bedingte Verzweigung und Mehrfachauswahl. Die Synthese beider Beschreibungen kann unterschiedliche Ergebnisse liefern (Links: Prioritätskodierer!).

VHDL - Schleifen

  • In VHDL lassen sich ähnlich wie in imperativen Programmiersprachen Anweisungsblöcke mit Schleifen iterativ wiederholen.

  • Man unterscheidet zwischen

    1. statischen Schleifen, die zur Synthesezeit die Blockanweisungen abrollen, d.h. jeder Schleifendurchlauf erzeugt neue Digitallogik, und daher feste Indexgrenzen fordern, beschränkt auf Zählschleifen,
    2. dynamische Schleifen, deren Indexgrenzen oder Durchlaufbedingung erst zur Lauf- zeit evaluiert. Diese Schleifen benötigen i.A. Zustandsautomaten für die (echte) sequentielle Abarbeitung. Diese Schleifen werden i.A. von Synthesewerkzeugen nicht unterstützt.
  • Bei statischen Zählschleifen in VHDL muss der Schleifenindex nicht deklariert werden.

  • Statische Schleifen werden bei der Synthese abgerollt, und die Statements im Schleifenkörper mit den entsprechenden Indexwert repliziert.

VHDL - Schleifen

Definition 14. (Zählschleife)

\[\begin{mdmathpre}%mdk
[\mathid{label}:]~\mathkw{for}~\mathid{index}~\mathkw{in}~\mathid{range}~\mathkw{loop}\\
\mdmathindent{2}\mathid{statements}\\
\mathkw{end}~\mathkw{loop}~[\mathid{label}]~;\\
\\
\mathid{range}~::=\\
\mdmathindent{2}\mathid{b}~\mathkw{downto}~\mathid{a}\\
\mdmathindent{2}\mathid{a}~\mathkw{to}~\mathid{b}
\end{mdmathpre}%mdk
\]

VHDL - Schleifen

figivhdlloop1


Abb. 9. Beispiel statische Zählschleife und Synthese in kombinatorische Logik.

VHDL - Simulation

  • Man unterscheidet zwei Klassen von Simulatoren und Simulationen:

    • High-level Verhaltenssimulation ohne Technologiemodell und Synthese
    • Low-level Simulation auf Gatterebene mit Technologiemodell und Synthese einer Gatternetzliste
  • Eine Simulation besteht aus dem Device under Test (DUT) und einer Testbesschreibung (Stimuli)

GHDL

  • GHDL ist ein Verhaltenssimulator für die VHDL-Sprache.

  • Mit GHDL kann VHDL-Code direkt in eine Maschinenprogramm kompiliert und ausgeführt werden.

    • GHDL unterstützt die Versionen IEEE 1076 VHDL (1987, 1993, 2002) und teilweise die letzte Version von 2008 (gut genug, um fixed_generic_pkg oder float_generic_pkg zu unterstützen).
  • Durch die Verwendung eines Codegenerators ist GHDL viel schneller als jeder interpretierende Simulatoren.

VHDL - Simulation

Simulationsablauf

  1. Erstellung eines DUT Modells in einer separaten Textdatei. Wichtig: Der Einheitsname und der Dateiname ohne Endung müssen identisch sein.

  2. Erstellung einer Testbench die folgende Teile enthält:

    • Taktgenerator
    • Stimulusgenerator (Temporale Muster der Eingangssignale)
    • Monitoring
  3. Analyse des VHDL Modells

> ghdl -a <testbench>.vhdl
  1. Eloberation des Designs unter Angabe der Testbench Einheit
> ghdl -e <testbench>

VHDL - Simulation

  1. Ausführen der Simulatorprogramms unter Angabe der Simulationszeit und der Ausgabedatei für Monitoringsignale (Port der Testbench Einheit)
> <testbench> --stop-time=xxus --vcd=<testbench>.vcd
  1. Darstellung der Signale (Stimuli und Ausgabesignale)
gtkwave <testbench>.vcd
  1. Bei neueren ghdl Versionen (ab 0.35?) fällt Eloberation und Ausführung durch den Run Modus zusammen:
> ghdl -r <testbench> --stop-time=xxus --vcd=<testbench>.vcd

VHDL - Simulation

Beispiel eines DUT Modells

library ieee ; use ieee.std_logic_1164.all ;
entity shift_reg is
  port ( serial_in , clk , shift_ena : in std_logic ;
         serial_out : out std_logic);
end shift_reg ;
 
architecture behav of shift_reg is
signal q : std_logic_vector (3 downto 0);
begin
  -- shift register process --
  process ( clk )
  begin
    if rising_edge ( clk ) then
      if shift_ena = '1' then
        q (3 downto 1) <= q (2 downto 0);
        q (0) <= serial_in ;
      end if ;
    end if ;
  end process ;
  serial_out <= q (3);
end behav;
 

VHDL - Simulation

Beispiel einer Testbench (1)

library ieee; use ieee.std_logic_1164.all;
entity shift_tb is
  port ( 
    clk_out : out std_logic;
    monitor : out std_logic
  );
end shift_tb ;
 
architecture behaviour of shift_tb is
  constant clk_period : time := 100 ns;
  component shift_reg
  port ( serial_in , clk , shift_ena : in std_logic ;
         serial_out : out std_logic );
  end component;
  signal clk, serial_in_test, shift_ena_test : std_logic;
begin
 ...
end behaviour;

VHDL - Simulation

Beispiel einer Testbench (2)

  clk_process: process
  begin
    clk <= '0';
    wait for clk_period/2;
    clk <= '1';
    wait for clk_period/2;
  end process;
  dut: shift_reg port map (
    serial_in_test,
    clk,
    shift_ena_test,
    monitor
  );
  -- Stimulus Generator --
  stimu_process: process
  begin
    serial_in_test <= '1';
    wait for 50 ns;
    serial_in_test <= '0';
    wait for 350 ns;
    serial_in_test <= '1';
    wait for 250 ns;
    serial_in_test <= '0';
  end process;
  clk_out <= clk;
  shift_ena_test <= '1';