Digilent Inc. BASYS2 Manual, Lizenz © Digilent)
1 Punkt
Synthetisiere das Projekt und teste das Ergebnis am Board
Es soll eine Ampel mit zwei Modis realisiert werden:
Die Ausgänge für die drei Farben der Ampel werden mittels drei Bit Vektor dargestellt:
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.
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
.
monitor_i
eine gültige Kombination an (z.B. "001"
für Grün) soll diese Kombination am Ausgang result_o
erscheinen"101"
) soll stattdessen die Kombination für Rot ausgegeben werden ("100"
)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).
lights_fsm
5 Punkte
Erstelle die Komponente lights_fsm
durch Bearbeitung der Datei lights_fsm.vhd.
next_i
gleich '1'
istmode_i
gleich '0'
soll die Ampel zwischen den Zuständen ORANGE
und OFF
wechselnmode_i
gleich '1'
soll die Ampel zyklisch zwischen GREEN
, ORANGE
, RED
, RED_ORANGE
wechseln und anschließend bei GREEN
wieder startenGREEN
, RED
oder RED_ORANGE
und mode_i
ist '0'
soll der nächste Zustand ORANGE
seinOFF
und mode_i
ist '1'
soll der nächste Zustand ORANGE
seinORANGE
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.
1 Punkt
Synthetisiere das Projekt und teste das Ergebnis am Board