Erläuterungen

Hier werden die neuen VHDL-Elemente noch einmal etwas detaillierter beschrieben.

for Schleifen in synthetisierbaren Prozessen

for <Laufvariable> in <MinVal> to <MaxVal> loop
    {Anweisungen}
end loop;

Damit wird eine Schleife innerhalb eines Prozesses definiert. Die Anweisungen werden für jeden Wert der Laufvariable durchlaufen und jeweils parallel laufende Hardware synthetisiert.

Damit können mehrere Instanzen identischer Hardware mit unterschiedlicher Verknüpfung zum Rest der Schaltung erzeugt werden.

Ein Anwendungsfall ist es einzelne Bits von Registern gleichartig zu verarbeiten.

for Schleifen in Prozessen werden nicht hintereinander, sondern nebeneinander durchlaufen.

Die Laufvariable muss nicht extra deklariert werden.

Geschachtelte Schleifen sind natürlich möglich.

for generate Schleifen

label: for <Laufvariable> in <MinVal> to <MaxVal> generate
    {Anweisungen}
end generate;

Damit wird eine Schleife außerhalb eines Prozesses definiert. Die Anweisungen werden für jeden Wert der Laufvariable durchlaufen und jeweils parallel laufende Hardware synthetisiert.

Damit können mehrere Instanzen identischer Hardware mit unterschiedlicher Verknüpfung zum Rest der Schaltung synthetisiert werden.

Anwendungsfälle sind:

  • Mehrere Instanzen eines Untermoduls zu instanziieren.
  • Einzelne Signale eines Vektors mit dem gleichen Algorithmus zu erzeugen.

for Schleifen außerhalb von Prozessen synthetisieren mehrere Instanzen der gleichen Hardware.

Die Laufvariable muss nicht extra deklariert werden.

Geschachtelte Schleifen sind natürlich möglich.

Typen (type)

Typen benötigt man, um Datentypen zu deklarieren, die es so nicht in VHDL gibt. Dazu gehören schon eindimensionale Felder von Standardtypen.

1. Felder
type tDecadeChain is array(7 downto 0) of integer range 0 to 9;
type tBcdSegments is array(3 downto 0 of std_logic_vector(6 downto 0);

2. Strukturen (records)
type tDebug is record
  signal1:    std_logic;
  signal2:    std_logic;
  signal3:    integer;
  signal4:    std_logic_vector(7 downto 0);  
end record;

3. enum
type TOpState is (Reset, BootA, BootB, BootC, InitPrm, Start, Operative);

Untertypen (subtype)

Subtypes dienen dazu einen bereits definierten Typ einzuschränken. Z.B.:
subtype TFreq is integer range 0 to 7;

Das gibt zum einen der Synthese zusätzliche Informationen z.B. über die Bitbreite die für ein so definiertes Signal benötigt wird. Des weiteren kann der Compiler den Wertebereich auf zulässige Werte überprüfen wodurch Fehler schon zur Compile-Zeit erkannt werden können.

Zustandsmaschinen

In VHDL gibt es sehr viele Anwendungsfälle für Zustandsmaschinen. Selbst wenn manchmal ein Zähler (der ja im Prinzip auch eine Zustandsmaschine ist) ausreichen würde, kann es ratsam sein eine Zustandsmaschine zu definieren, da dadurch die einzelnen Zustände Namen bekommen und somit das Programm lesbarer wird.

Es gibt unterschiedliche Möglichkeiten eine Zustandsmaschine in VHDL zu implementieren. Der hier vorgestellte Stil ist mir deswegen am liebsten, weil man die Kombinatorik sauber von den Registern getrennt hat.

Weiter zu den Übungen