VHDL Test (1)

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

VHDL Test (1)

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.

Lichtsteuerung link symbol

Vorbereitung link symbol

  • Projekt led_control/led_control.xise öffnen

Aufgabenstellung link symbol

Es ist eine einfache Lichtsteuerung zu entwerfen. Diese Lichtsteuerung steuert eine LED an und wird mittels zwei Tasten bedient:

  • button_toggle - Schaltet das Licht ein bzw. aus
  • button_off - Schaltet das Licht in 5 Sekunden aus

Entwurf der Zustandsmaschine link symbol

5 Punkte

Zur Realisierung wird eine Zustandsmaschine genutzt.

  • Bearbeite die Datei led_control_fsm.vhd
  • Definiere die drei Zuständen OFF, LIGHT und DOZE
  • Der Startzustand ist OFF
  • Der Eingang toggle_i wechselt von OFF nach LIGHT bzw. von LIGHT oder DOZE nach OFF
  • Der Eingang off_i wechselt von LIGHT nach DOZE, bei den anderen Zuständen hat er keine Auswirkung
  • Der Eingang timeout_i bewirkt ein Wechsel von DOZE nach OFF, bei den anderen Zuständen hat er keine Auswirkung
  • Der Ausgang led_o ist auf '1', wenn die Zustandmaschine im Zustand LIGHT oder DOZE ist
  • Der Ausgang timer_enable_o ist im Zustand DOZE auf '1', ansonsten '0'
  • Der Ausgang timer_clear_o ist im Zustand LIGHT auf '1', ansonsten '0'

FSM für Lichtsteuerung

Testbenchseverity symbol

Teste die Implementierung mittels der Testbench led_control_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 counter, button_dectect und led_control_fsm. Diese Komponenten werden genutzt, um im Top Level led_control.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_control_fsm mit dem Namen led_control_fsm_component
    • toggle_i ist mit dem Signal toggle_detect verbunden
    • off_i ist mit dem Signal off_detect verbunden
    • timeout_i ist mit dem (bereits definiertem) Signal timeout verbunden
    • led_o ist mit dem Ausgang led_o verbunden
    • timer_enable_o ist mit dem (bereits definiertem) Signal timer_enable verbunden
    • timer_clear_o ist mit dem (bereits definiertem) Signal timer_clear verbunden
  • Erstelle eine Instanz der Komponente counter mit dem Namen timeout_component
    • WIDTH in der generic map wird auf 28 gestellt (28 Bit)
    • MAXIMUM wird auf CLK_TIMEOUT_DIVIDER gestellt (ist im generic Teil des Top Levels bereits definiert)
    • enable_i ist mit dem Signal timer_enable verbunden
    • reset_i ist mit dem Signal timer_clear verbunden
    • value_o ist nicht verbunden (open)
    • overflow_o ist mit dem Signal timeout verbunden
  • Jede Komponente hat einen Takteingang clk, welcher mit dem globalen clk verbunden wird
Testbenchseverity symbol

Teste die Implementierung mittels der Testbench led_control_tb.vhd.

Erweiterung der Constraints Datei link symbol

2 Punkte

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

  • button_toggle_i liegt an Pin G12
  • button_off_i liegt an Pin C11
  • led_o liegt an Pin M5

Test am Board link symbol

1 Punkt

Synthetisiere das Projekt und teste das Ergebnis am Board

Helligkeitssteuerung mittels PWM link symbol

Vorbereitung link symbol

  • Projekt led_pwm/led_pwm.xise öffnen

Aufgabenstellung link symbol

Die LED wird in diesem Beispiel mittels PWM angesteuert. Zwei Tasten steuern dabei die Helligkeit:

  • button_brighter lässt die LED heller leuchten
  • button_darker lässt die LED dunkler leuchten

Insgesamt gibt es 8 Helligkeitsstufen (3 Bit).

PWM Erzeugung link symbol

5 Punkte

Ein PWM besteht aus einem Zähler, der ständig nach oben zählt. Bei einem Überlauf (im Bild mit N2 beschrieben) fängt der Zähler einfach bei 0 wieder an. Der Zählerstand wird verglichen mit einem vorgegebenen Pegel(N1) - sind diese gleich wird der Ausgang auf '0' gesetzt. Bei einem Zählerstand von 0 wird der Ausgang auf '1' gesetzt (es sei den der vorgegebene Pegel ist 0).

PWM Signalerzeugung
PWM Signalerzeugung (Quelle: Saure, Lizenz CC BY-SA 3.0)
  • Bearbeite die Datei pwm_generator.vhd.
  • Der interne Zähler counter_reg zählt bei jeder steigenden Taktflanke nach oben
  • Der Überlauf wird bewusst genutzt (es findet keine besondere Überprüfung statt)
  • Der interne Zähler wird mit level_i verglichen - sind beide gleich wird pwm_reg auf '0' gesetzt
  • Der interne Zähler wird weiters mit 0 verglichen - ist dies der Fall wird pwm_reg auf '1' gesetzt
  • Für die Umwandlung des std_ulogic_vector level_i in ein unsigned verwende unsigned(level_i)
  • Für den Vergleich des internen Zählers mit 0 wandle die 0 mittels to_unsigned(0, WIDTH) in ein unsigned um
  • Der Ausgang pwm_o wird vom Registers pwm_reg angesteuert

Blockschaltbild für PWM Erzeugung

Testbenchseverity symbol

Teste die Implementierung mittels der Testbench pwm_generator_tb.vhd.

Helligkeitseinstellung link symbol

5 Punkte

Um einen Pegel für die PWM vorzugeben benötigen wir eine Komponente den einen Pegel abhängig von Tastendrücken ändern kann. Diese Komponente hat folgende Eingänge:

  • up_i - Wenn dieser Eingang gleich '1' ist wird der Pegel um eins erhöht. Ist der Pegel auf Maximum wird nichts geändert.
  • down_i - Bei aktivem down_i wird der Pegel um eins erniedrigt. Ist der Pegel auf 0 wird nichts geändert.

Die Ausgabe der Komponente ist der Ausgang level_o.

  • Bearbeite die Datei level_adjust.vhd.
  • Der Register level_reg zählt hinauf, wenn up_i gleich '1' ist bzw. hinunter wenn down_i gleich '1' ist
  • Wenn level_reg am Maximum ist und up_i aktiv ist sollte der Wert sich nicht verändern
  • Wenn level_reg am Minimum (0) ist und down_i aktiv ist sollte der Wert sich nicht verändern
Testbenchseverity symbol

Teste die Implementierung mittels der Testbench level_adjust_tb.vhd.

Implementierung des Top Levels link symbol

5 Punkte

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

Das Generic PWM_WIDTH ist eine Konstante die genutzt werden kann, um das Generic WIDTH von pwm_generator und level_adjust zu setzen. Das bei diesen 3 die Default Einstellung ist, wird es nicht unbedingt benötigt.

Einige benötigte Signale sind bereits vordefiniert.

Erstelle das Top Level anhand des folgenden Blockschaltbildes:

Top Level für LED PWM

Testbenchseverity symbol

Teste die Implementierung mittels der Testbench led_pwm_tb.vhd.

Test am Board link symbol

1 Punkt

Synthetisiere das Projekt und teste das Ergebnis am Board