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.
Einschaltverzögerung 
Vorbereitung 
- Projekt led_toggle/led_toggle.xise öffnen
Aufgabenstellung 
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 
5 Punkte
Zur Realisierung wird eine Zustandsmaschine genutzt.
- Bearbeite die Datei led_toggle_fsm.vhd
- Definiere die drei Zuständen
OFF,LED1undLED2 - Der Startzustand ist
OFF - Der Eingang
toggle_iwechselt vonOFFnachLED1bzw. wechselt vonLED1nachLED2und umgekehrt - Der Eingang
off_iwechselt immer in den ZustandOFF - Der Eingang
off_ihat die höhere Priorität als der Eingangtoggle_i - Der Ausgang
led1_oist auf'1', wenn die Zustandmaschine im ZustandLED1ist - Der Ausgang
led2_oist auf'1', wenn die Zustandmaschine im ZustandLED2ist
Implementierung des Top Levels 
5 Punkte
Zur Verfügung stehen die Komponenten button_detect 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_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_toggle_fsm mit dem Namen
led_toggle_fsm_componenttoggle_iist mit dem Signaltoggle_detectverbundenoff_iist mit dem Signaloff_detectverbundenled1_oist mit dem Ausgangled1_overbundenled2_oist mit dem Ausgangled2_overbunden
- Jede Komponente hat einen Takteingang
clk, welcher mit dem globalenclkverbunden wird
Erweiterung der Constraints Datei 
2 Punkte
In der Datei led_toggle.ucf ist nur das Signal clk definiert. Erweitere die Datei um folgende Zuordnungen
button_toggle_iwird durch den Taster BTN0 angesteuertbutton_off_iwird durch den Taster BTN1 angesteuertled1_oist die LED LD0led2_oist die LED LD1
Test am Board 
1 Punkt
Synthetisiere das Projekt und teste das Ergebnis am Board
Ampel mit Überwachung 
Vorbereitung 
- Projekt lights/lights.xise öffnen
Aufgabenstellung 
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 
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_ieine gültige Kombination an (z.B."001"für Grün) soll diese Kombination am Ausgangresult_oerscheinen - 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_ORANGEundOFF
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 
5 Punkte
Erstelle die Komponente lights_fsm durch Bearbeitung der Datei lights_fsm.vhd.
- Die Ampel wechselt nur den Zustand, wenn
next_igleich'1'ist - Ist der Eingang
mode_igleich'0'soll die Ampel zwischen den ZuständenORANGEundOFFwechseln - Bei
mode_igleich'1'soll die Ampel zyklisch zwischenGREEN,ORANGE,RED,RED_ORANGEwechseln und anschließend beiGREENwieder starten - Ist die Ampel im Zustand
GREEN,REDoderRED_ORANGEundmode_iist'0'soll der nächste ZustandORANGEsein - Ist die Ampel im Zustand
OFFundmode_iist'1'soll der nächste ZustandORANGEsein - Der Startzustand ist
ORANGE
Implementierung des Top Levels 
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:

Gegebenenfalls müssen noch Signale definiert werden.
Test am Board 
1 Punkt
Synthetisiere das Projekt und teste das Ergebnis am Board