VHDL Test (3)

URL: ../../..dic/programmierbare_logik/test_vhdl/test3.html

VHDL Test (3)

Allgemeines link symbol

  • Projektordner herunterladen und entpacken
  • Insgesamt gibt es 29 Punkte
  • Die einzelnen Punkte bauen meist nicht aufeinander auf. Statt langer Fehlersuche lieber auf das nächste Beispiel wechseln.

Einschaltverzögerung link symbol

Vorbereitung link symbol

  • Projekt led_toggle/led_toggle.xise öffnen

Aufgabenstellung link symbol

Zwei LEDs sollen mittels zwei Taster angesteuert werden.

  • button_toggle - Wechselt zwischen LED1 und LED2, bzw. schaltet LED1 ein, falls die LEDs ausgeschaltet waren.
  • button_off - Schaltet die LEDs aus

Entwurf der Zustandsmaschine link symbol

5 Punkte

Zur Realisierung wird eine Zustandsmaschine genutzt.

  • Bearbeite die Datei led_toggle_fsm.vhd
  • Definiere die drei Zuständen OFF, LED1 und LED2
  • Der Startzustand ist OFF
  • Der Eingang toggle_i wechselt von OFF nach LED1 bzw. wechselt von LED1 nach LED2 und umgekehrt
  • Der Eingang off_i wechselt immer in den Zustand OFF
  • Der Eingang off_i hat die höhere Priorität als der Eingang toggle_i
  • Der Ausgang led1_o ist auf '1', wenn die Zustandmaschine im Zustand LED1 ist
  • Der Ausgang led2_o ist auf '1', wenn die Zustandmaschine im Zustand LED2 ist
Testbenchseverity symbol

Teste die Implementierung mittels der Testbench led_toggle_fsm_tb.vhd. Mittels F6 lässt sich der gesamte Bereich zoomen.

Implementierung des Top Levels link symbol

5 Punkte

Zur Verfügung stehen die Komponenten button_dectect und led_toggle_fsm. Diese Komponenten werden genutzt, um im Top Level led_toggle.vhd die gewünschte Funktionalität zu realisieren.

  • Die Instanz der Komponente button_detect mit dem Namen toggle_detect_component ist bereits erstellt
    • button_i ist mit dem Eingang button_toggle_i verbunden
    • detect_o ist mit dem (bereits definiertem) Signal toggle_detect verbunden
  • Erstelle eine Instanz der Komponente button_detect mit dem Namen off_detect_component analog zu toggle_detect_component
    • button_i ist mit dem Eingang button_off_i verbunden
    • detect_o ist mit dem (bereits definiertem) Signal off_detect verbunden
  • Erstelle eine Instanz der Komponente led_toggle_fsm mit dem Namen led_toggle_fsm_component
    • toggle_i ist mit dem Signal toggle_detect verbunden
    • off_i ist mit dem Signal off_detect verbunden
    • led1_o ist mit dem Ausgang led1_o verbunden
    • led2_o ist mit dem Ausgang led2_o verbunden
  • Jede Komponente hat einen Takteingang clk, welcher mit dem globalen clk verbunden wird
Testbenchseverity symbol

Teste die Implementierung mittels der Testbench led_toggle_tb.vhd.

Erweiterung der Constraints Datei link symbol

2 Punkte

In der Datei led_toggle.ucf ist nur das Signal clk definiert. Erweitere die Datei um folgende Zuordnungen

  • button_toggle_i wird durch den Taster BTN0 angesteuert
  • button_off_i wird durch den Taster BTN1 angesteuert
  • led1_o ist die LED LD0
  • led2_o ist die LED LD1
Pinout des BASYS2 Boards
Pinout des BASYS2 Boards (Quelle: Digilent Inc. BASYS2 Manual, Lizenz © Digilent)

Test am Board link symbol

1 Punkt

Synthetisiere das Projekt und teste das Ergebnis am Board

Ampel mit Überwachung link symbol

Vorbereitung link symbol

  • Projekt lights/lights.xise öffnen

Aufgabenstellung link symbol

Es soll eine Ampel mit zwei Modis realisiert werden:

  • Orange-Blinken (Orange Leuchte geht ein und aus)
  • Wechsel zwischen Grün, Orange, Rot, Rot-Orange und wieder Grün

Die Ausgänge für die drei Farben der Ampel werden mittels drei Bit Vektor dargestellt:

  • Bit0 (ganz rechts) entspricht der grünen Leuchte
  • Bit1 entspricht der orangen Leuchte
  • Bit2 (ganz links) entspricht der roten Leuchte.

So steht z.B. "110" für eine Ampel, bei der Rot und Orange leuchtet. Bei OFF soll nichts leuchten.

Zusätzlich soll eine Überwachung vorhanden sein, die feststellt, ob es zu ungültigen Kombinationen gekommen ist (z.B. wenn Rot und Grün gleichzeitig leuchten). Die Überwachung würde in diesem Fall die Ampel Rot leuchten lassen.

Überwachung link symbol

5 Punkte

Die Komponente supervisor (deutsch Überwacher) soll die Zustände der drei Lampen überprüfen. Dazu hat die Komponente den Eingang monitor_i und den Ausgang result_o.

  • Liegt an monitor_i eine gültige Kombination an (z.B. "001" für Grün) soll diese Kombination am Ausgang result_o erscheinen
  • Liegt eine ungültige Kombination an (z.B. "101") soll stattdessen die Kombination für Rot ausgegeben werden ("100")
  • Gültige Kombinationen sind alle Ausgaben der Zustände GREEN, ORANGE, RED, RED_ORANGE und OFF

Die Komponente ist in vier Ausführungen (Architectures) bereits in der Datei supervisor.vhd beschrieben. Die Architectures lauten behave1, behave2, behave3 und behave4.

Erstelle in der Datei supervisor_tb.vhd eine Testbench, die herausfindet, welche der vier Ausführungen funktioniert (es ist genau eine).

Komponente lights_fsm link symbol

5 Punkte

Erstelle die Komponente lights_fsm durch Bearbeitung der Datei lights_fsm.vhd.

  • Die Ampel wechselt nur den Zustand, wenn next_i gleich '1' ist
  • Ist der Eingang mode_i gleich '0' soll die Ampel zwischen den Zuständen ORANGE und OFF wechseln
  • Bei mode_i gleich '1' soll die Ampel zyklisch zwischen GREEN, ORANGE, RED, RED_ORANGE wechseln und anschließend bei GREEN wieder starten
  • Ist die Ampel im Zustand GREEN, RED oder RED_ORANGE und mode_i ist '0' soll der nächste Zustand ORANGE sein
  • Ist die Ampel im Zustand OFF und mode_i ist '1' soll der nächste Zustand ORANGE sein
  • Der Startzustand ist ORANGE
Testbenchseverity symbol

Teste die Implementierung mittels der Testbench lights_fsm_tb.vhd.

Implementierung des Top Levels link symbol

5 Punkte

Zur Verfügung stehen die Komponenten counter, light_fsm und supervisor. Diese Komponenten werden genutzt, um im Top Level lights.vhd die gewünschte Funktionalität zu realisieren.

Mit dem counter soll ein 700 Millisekunden Takt generiert werden. Wieviel Takte des 50 Mhz Taktes sind dazu notwendig und wieviel Bits werden benötigt, um diesen Wert darstellen zu können? Trage diese Werte in der Default-Einstellung von COUNTER_WIDTH und COUNTER_MAXIMUM ein:

entity lights is
    generic (
    COUNTER_WIDTH : integer := 4; -- <<< TODO
    COUNTER_MAXIMUM : integer := 9 -- <<< TODO
    );
    port (
    clk : in std_ulogic; -- 50 MHz clock
    mode_i : in std_ulogic;
    leds_o : out std_ulogic_vector(2 downto 0)
    );
end entity;

Erstelle das Top Level anhand des folgenden Blockschaltbildes:

Top Level für Lights

Gegebenenfalls müssen noch Signale definiert werden.

Testbenchseverity symbol

Teste die Implementierung mittels der Testbench lights_tb.vhd.

Test am Board link symbol

1 Punkt

Synthetisiere das Projekt und teste das Ergebnis am Board