Allgemeines 
- 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 
Vorbereitung 
- Projekt led_control/led_control.xise öffnen
Aufgabenstellung 
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. ausbutton_off- Schaltet das Licht in 5 Sekunden aus
Entwurf der Zustandsmaschine 
5 Punkte
Zur Realisierung wird eine Zustandsmaschine genutzt.
- Bearbeite die Datei led_control_fsm.vhd
- Definiere die drei Zuständen
OFF,LIGHTundDOZE - Der Startzustand ist
OFF - Der Eingang
toggle_iwechselt vonOFFnachLIGHTbzw. vonLIGHToderDOZEnachOFF - Der Eingang
off_iwechselt vonLIGHTnachDOZE, bei den anderen Zuständen hat er keine Auswirkung - Der Eingang
timeout_ibewirkt ein Wechsel vonDOZEnachOFF, bei den anderen Zuständen hat er keine Auswirkung - Der Ausgang
led_oist auf'1', wenn die Zustandsmaschine im ZustandLIGHToderDOZEist - Der Ausgang
timer_enable_oist im ZustandDOZEauf'1', ansonsten'0' - Der Ausgang
timer_clear_oist im ZustandLIGHTauf'1', ansonsten'0'
Implementierung des Top Levels 
5 Punkte
Zur Verfügung stehen die Komponenten counter, button_detect 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_componentist bereits erstelltbutton_iist mit dem Eingangbutton_toggle_iverbundendetect_oist mit dem (bereits definiertem) Signaltoggle_detectverbunden
- Erstelle eine Instanz der Komponente button_detect mit dem Namen
off_detect_componentanalog zutoggle_detect_componentbutton_iist mit dem Eingangbutton_off_iverbundendetect_oist mit dem (bereits definiertem) Signaloff_detectverbunden
- Erstelle eine Instanz der Komponente led_control_fsm mit dem Namen
led_control_fsm_componenttoggle_iist mit dem Signaltoggle_detectverbundenoff_iist mit dem Signaloff_detectverbundentimeout_iist mit dem (bereits definiertem) Signaltimeoutverbundenled_oist mit dem Ausgangled_overbundentimer_enable_oist mit dem (bereits definiertem) Signaltimer_enableverbundentimer_clear_oist mit dem (bereits definiertem) Signaltimer_clearverbunden
- Erstelle eine Instanz der Komponente counter mit dem Namen
timeout_componentWIDTHin der generic map wird auf 28 gestellt (28 Bit)MAXIMUMwird aufCLK_TIMEOUT_DIVIDERgestellt (ist im generic Teil des Top Levels bereits definiert)enable_iist mit dem Signaltimer_enableverbundenreset_iist mit dem Signaltimer_clearverbundenvalue_oist nicht verbunden (open)overflow_oist mit dem Signaltimeoutverbunden
- Jede Komponente hat einen Takteingang
clk, welcher mit dem globalenclkverbunden wird
Erweiterung der Constraints Datei 
2 Punkte
In der Datei led_control.ucf ist nur das Signal clk definiert. Erweitere die Datei um folgende Zuordnungen
button_toggle_iliegt an PinG12button_off_iliegt an PinC11led_oliegt an PinM5
Test am Board 
1 Punkt
Synthetisiere das Projekt und teste das Ergebnis am Board
Helligkeitssteuerung mittels PWM 
Vorbereitung 
- Projekt led_pwm/led_pwm.xise öffnen
Aufgabenstellung 
Die LED wird in diesem Beispiel mittels PWM angesteuert. Zwei Tasten steuern dabei die Helligkeit:
button_brighterlässt die LED heller leuchtenbutton_darkerlässt die LED dunkler leuchten
Insgesamt gibt es 8 Helligkeitsstufen (3 Bit).
PWM Erzeugung 
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).
- Bearbeite die Datei pwm_generator.vhd.
- Der interne Zähler
counter_regzä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_iverglichen - sind beide gleich wirdpwm_regauf'0'gesetzt - Der interne Zähler wird weiters mit 0 verglichen - ist dies der Fall wird
pwm_regauf'1'gesetzt - Für die Umwandlung des std_ulogic_vector
level_iin ein unsigned verwendeunsigned(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_owird vom Registerspwm_regangesteuert

Helligkeitseinstellung 
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 aktivemdown_iwird 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_regzählt hinauf, wennup_igleich'1'ist bzw. hinunter wenndown_igleich'1'ist - Wenn
level_regam Maximum ist undup_iaktiv ist sollte der Wert sich nicht verändern - Wenn
level_regam Minimum (0) ist unddown_iaktiv ist sollte der Wert sich nicht verändern
Implementierung des Top Levels 
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:

Test am Board 
1 Punkt
Synthetisiere das Projekt und teste das Ergebnis am Board