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
,LIGHT
undDOZE
- Der Startzustand ist
OFF
- Der Eingang
toggle_i
wechselt vonOFF
nachLIGHT
bzw. vonLIGHT
oderDOZE
nachOFF
- Der Eingang
off_i
wechselt vonLIGHT
nachDOZE
, bei den anderen Zuständen hat er keine Auswirkung - Der Eingang
timeout_i
bewirkt ein Wechsel vonDOZE
nachOFF
, bei den anderen Zuständen hat er keine Auswirkung - Der Ausgang
led_o
ist auf'1'
, wenn die Zustandmaschine im ZustandLIGHT
oderDOZE
ist - Der Ausgang
timer_enable_o
ist im ZustandDOZE
auf'1'
, ansonsten'0'
- Der Ausgang
timer_clear_o
ist im ZustandLIGHT
auf'1'
, ansonsten'0'
Implementierung des Top Levels
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 erstelltbutton_i
ist mit dem Eingangbutton_toggle_i
verbundendetect_o
ist mit dem (bereits definiertem) Signaltoggle_detect
verbunden
- Erstelle eine Instanz der Komponente button_detect mit dem Namen
off_detect_component
analog zutoggle_detect_component
button_i
ist mit dem Eingangbutton_off_i
verbundendetect_o
ist mit dem (bereits definiertem) Signaloff_detect
verbunden
- Erstelle eine Instanz der Komponente led_control_fsm mit dem Namen
led_control_fsm_component
toggle_i
ist mit dem Signaltoggle_detect
verbundenoff_i
ist mit dem Signaloff_detect
verbundentimeout_i
ist mit dem (bereits definiertem) Signaltimeout
verbundenled_o
ist mit dem Ausgangled_o
verbundentimer_enable_o
ist mit dem (bereits definiertem) Signaltimer_enable
verbundentimer_clear_o
ist mit dem (bereits definiertem) Signaltimer_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 aufCLK_TIMEOUT_DIVIDER
gestellt (ist im generic Teil des Top Levels bereits definiert)enable_i
ist mit dem Signaltimer_enable
verbundenreset_i
ist mit dem Signaltimer_clear
verbundenvalue_o
ist nicht verbunden (open
)overflow_o
ist mit dem Signaltimeout
verbunden
- Jede Komponente hat einen Takteingang
clk
, welcher mit dem globalenclk
verbunden 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_i
liegt an PinG12
button_off_i
liegt an PinC11
led_o
liegt 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_brighter
lässt die LED heller leuchtenbutton_darker
lä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_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 wirdpwm_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 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_o
wird vom Registerspwm_reg
angesteuert
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_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, wennup_i
gleich'1'
ist bzw. hinunter wenndown_i
gleich'1'
ist - Wenn
level_reg
am Maximum ist undup_i
aktiv ist sollte der Wert sich nicht verändern - Wenn
level_reg
am Minimum (0) ist unddown_i
aktiv 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