Inhaltsverzeichnis:

FPGA-Reaktionsspiel - Gunook
FPGA-Reaktionsspiel - Gunook

Video: FPGA-Reaktionsspiel - Gunook

Video: FPGA-Reaktionsspiel - Gunook
Video: Project 3: Two Player Reaction Timer 2024, Juli
Anonim
FPGA-Reaktionsspiel
FPGA-Reaktionsspiel

Von Summer Rutherford und Regita Soetandar

Schritt 1: Einführung

Für unser Abschlussprojekt für CPE 133 haben wir ein Reaktionsspiel in VHDL für ein Basys3-Board entworfen. Dieses Spiel kann am ehesten mit dem Arcade-Spiel „Stacker“verglichen werden, bei dem der Spieler die Blöcke zum richtigen Zeitpunkt fallen lassen muss. Das Basys3-Board ist mit einem Steckbrett verbunden, das die abwechselnden LEDs hat. Diese LED-Leuchten wechseln je nach Pegel mit einer bestimmten Frequenz ab. Dieses Spiel verwendet den Taktteiler und die 4-stellige 7-Segment-Anzeige sowie eine endliche Zustandsmaschine. Wenn der Spieler den richtigen Schalter aktiviert, während die mittlere LED aufleuchtet, wechselt der Spieler zum nächsten Level des Spiels und erhöht die Frequenz der abwechselnden LEDs. Dies macht jedes nachfolgende Level schwieriger als das vorherige Level. Wenn der Spieler Level 7, das höchste Level, erfolgreich schlägt, wird eine Meldung auf der Segmentanzeige angezeigt und alle LEDs blinken gleichzeitig an und aus.

Schritt 2: Materialien

Materialien
Materialien
Materialien
Materialien
Materialien
Materialien

Die Materialien, die Sie benötigen, sind:

  • Digilent Basys3-Board mit Micro-USB-Kabel
  • Steckbrett
  • 5 LEDs
  • 5 Widerstände (wir haben 220 Ohm verwendet)
  • 11 Überbrückungsdrähte
  • Computer mit Vivado

Schritt 3: Top-Level-Diagramm-Black-Box-Design

Top-Level-Diagramm-Black-Box-Design
Top-Level-Diagramm-Black-Box-Design
Top-Level-Diagramm-Black-Box-Design
Top-Level-Diagramm-Black-Box-Design

Wie Sie sehen können, beginnt unser Blockschaltbild auf oberster Ebene damit, die erforderlichen Takte von unserem Untermodul ClkDivide zu erhalten. Diese Takte sind Eingaben in die verschiedenen Prozessblöcke. Im Wesentlichen muss das Spiel erkennen, dass wenn ein Benutzer den Schalter richtig einschaltet, die LEDs schneller wechseln müssen und die Anzeige eine Ebene höher gehen muss. Das Blockdiagramm sieht vielleicht etwas verrückt aus, aber das liegt daran, dass viele Signale in einem bestimmten Prozess erstellt werden und dieses Signal dann ein anderes Signal in einem anderen Prozessblock definiert.

Letztendlich sind die einzigen Eingaben, die das Spiel benötigt, der Eingangstakt auf dem Basys3-Board, das mit 100 MHz läuft, sieben Schalter auf dem Basys3-Board und der Reset-Knopf. Ausgegeben wird die Anode für die Siebensegmentanzeige, die sieben Segmente für die Anzeige und die LEDs.

Schritt 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Dieses Taktteiler-Submodul erzeugt eine langsamere Uhr, abhängig von dem Wert, den wir ihm in unserer Hauptdatei zugeordnet haben. Wir haben dieses Submodul verwendet, um Clk400, PushClk und newlck zu bestimmen. Dieses Submodul verwendet einen Taktgeber und einen 32-Bit-Teiler als Eingänge. Ein verlangsamter Takt wird ausgegeben. Es gibt einen Prozessblock für den Teiler und den verlangsamten Takt. Dabei handelt es sich um eine temporäre Variable, die wir count nennen, die jedes Mal, wenn eine steigende Flanke des eingegebenen Takts erreicht wird, um eins hochzählt. Sobald die Teilerzahl erreicht ist, schaltet die verlangsamte Uhr um und der Zähler wird auf Null zurückgesetzt.

Schritt 5: Prozessblock verschieben

Prozessblock verschieben
Prozessblock verschieben

Der Prozessblock Shift steuert die abwechselnde Bewegung und Geschwindigkeit der LEDs. In der Empfindlichkeitsliste befinden sich die Signale newclk und Stop. Stop verursacht eine kurze Verzögerung, wenn der Benutzer die Ebene passiert. Wenn Stop nicht hoch ist, wechseln die LEDs normal basierend auf der Geschwindigkeit von newclk. Dieses alternierende Muster wird durch zwei Variablen gesteuert: Track und count. Count bestimmt, welche LED leuchten soll, während Track bestimmt, ob Count aufwärts oder abwärts zählen soll. Es gibt ein weiteres Signal, Final, das nur gilt, wenn das Level „111“ist und anzeigt, dass der Spieler das Spiel geschlagen hat. Final wechselt bei jeder Taktflanke zwischen 0 und 1, um die LEDs kontinuierlich ein- und auszuschalten. Dies ist nur ein visuelles Element für die endgültige Anzeige.

Dieser Schichtprozess ist der perfekte Ausgangspunkt für dieses Projekt. Wenn Sie Ihre LEDs korrekt und gleichmäßig abwechseln können, müssen Sie von hier aus nur das Verhalten beim Aufleveln hinzufügen!

Schritt 6: Finite State Machine

Endliche Zustandsmaschine
Endliche Zustandsmaschine

Wir haben eine Finite State Machine erstellt, um das Verhalten zu bestimmen, wenn der Eingangsschalter oder die Reset-Taste gedrückt wird. Jeder Zustand ist ein „Level“und wenn der Schalter zum falschen Zeitpunkt eingeschaltet oder Reset gedrückt wird, kehrt der Level auf „000“zurück. Andernfalls, wenn der Schalter richtig eingeschaltet ist, bewegt sich die Ebene nach oben, bis sie den Endzustand „111“erreicht und die Endanzeige erfolgt. Die FSM basiert auf den beiden Prozessblöcken sync_proc und comb_proc. Sync_proc verwendet die Uhr, die wir PushClk genannt haben. Dieser Takt steuert, wie schnell der nächste Zustand zum aktuellen Zustand wird. Diese Uhr sollte ziemlich schnell sein; Wir wählten eine Geschwindigkeit, die ungefähr zweimal schneller war als unsere schnellste LED-Geschwindigkeit.

Wir haben diesen Code mit einem FSM für die Level implementiert; Nach diesem Projekt haben wir jedoch festgestellt, dass ein effizienterer Einsatz eines FSM darin bestehen könnte, einen Aufwärtszählzustand, einen Rücksetzzustand oder einen Haltezustand zu haben. Wenn nichts gedrückt wird, befindet es sich im Ruhezustand. Wenn Reset gedrückt wird oder der Player durcheinander gebracht wird, befindet er sich im Reset-Zustand. Wenn es richtig gedrückt wird, befindet es sich im Aufwärtszählzustand. Es gibt auch viele andere Möglichkeiten, einen FSM in diesem Spiel zu verwenden!

Schritt 7: Steuerung des Anzeigeprozessblocks mit Level

Steuerung des Anzeigeprozessblocks mit Level
Steuerung des Anzeigeprozessblocks mit Level

Level steuert den Prozessblock Anzeige. Die Variablen in der Empfindlichkeitsliste sind Level, Reset und Clk400. Die 7-Segment-Anzeige beginnt mit der Anzeige von „1“für die erste Ebene. Es zählt jedes Mal bis 7 hoch, wenn der Benutzer ein Level passiert, um dem Benutzer zu zeigen, auf welchem Level er sich befindet. Sobald der Benutzer Level 7 bestanden hat, wird „COOL“angezeigt, um anzuzeigen, dass der Spieler das Spiel geschlagen hat. Dieses „COOL“-Display läuft mit einem 400-Hz-Takt, den wir Clk400 nannten. Wenn Reset gedrückt wird, geht die Anzeige zurück auf „1“.

Schritt 8: Steuern der LED-Geschwindigkeit mit Level

Steuern der LED-Geschwindigkeit mit Level
Steuern der LED-Geschwindigkeit mit Level

Schließlich steuert Level die Geschwindigkeit der LEDs. Level ist das einzige Signal in der Empfindlichkeitsliste. D1 ist das Signal, das in den Clock Divider-Prozess eingeht, um newclk zu erhalten. Jedes Mal, wenn Level geändert wird oder sich der Zustand ändert, wird der Prozessblock „Speed“. Dieser Vorgang bestimmt den Wert von D1. Es gibt 8 definierte Werte von D1, die wir basierend auf der gewünschten Geschwindigkeit jedes Levels ausgewählt haben. D1 wird jedes Mal kleiner, wenn der Level ansteigt, damit der newclk schneller läuft.

Schritt 9: Hardware-Montage

Hardware-Montage
Hardware-Montage

Wir haben das Steckbrett mit einem der pmod-Anschlüsse mit dem Basys3 verbunden. Sechs der pmod-Ports wurden verwendet, um einen Stecker mit einem Stecker anzuschließen, einen für Masse und die anderen fünf für die 5 LEDs. Wir haben auch einen Widerstand für jede LED platziert. Diese Widerstände sind 220 Ω und verhindern, dass die LEDs kurzgeschlossen und durchgebrannt werden. Obwohl jede LED einen gewissen Widerstand hat, reicht der Widerstand nicht aus, um die Spannung von der Quelle zu behindern.

Schritt 10: Viel Spaß

Dieses Spiel ist sehr einfach zu spielen. Der Spieler beginnt auf dem ganz rechten Schalter 1 des Bretts, V17. Sie müssen den Schalter hochschalten, wenn die mittlere LED leuchtet. Dann bewegen sie einen Schalter nach links und machen dasselbe! Wenn der Spieler es bis zum Ende schafft, landet er auf dem siebten Schalter, W14. Wenn sie das Spiel schlagen, sehen sie eine wirklich lustige Endanzeige!

Zu beachten ist, dass die Geschwindigkeit beim Erstellen dieses Spiels ganz bei Ihnen liegt! Wenn die von uns gewählten Geschwindigkeiten zu langsam sind, können Sie sie gerne beschleunigen und noch anspruchsvoller machen! Es gibt auch keine festgelegte Anzahl von Ebenen. Wenn Sie noch mehr Ebenen haben möchten, müssen Sie Änderungen am FSM und den von Ebene festgelegten Prozessblöcken vornehmen, aber dies sind sehr einfache Änderungen.

Wir haben uns auch dafür entschieden, Schalter auf der Platine als Benutzereingabe zu verwenden, dies ist jedoch auch mit einem Taster auf der Basys3-Platine möglich; die Taste macht das Zurücksetzen der Schalter bei jedem Neustart überflüssig. Wir haben anfangs eine Schaltfläche verwendet, dies führte jedoch zu Fehlern bei der Definition der Ebene, da sie mehrere Ebenen überspringen würde, wenn zwei steigende Flanken von PushClk getroffen wurden, während die Schaltfläche gedrückt gehalten wurde.

Unten ist ein Video, das zeigt, wie man spielt, die ersten 4 Level durchläuft und die letzte Endanzeige zeigt.

Die Hauptdatei für dieses Projekt ist unten enthalten.

Quellen

Basys3 Referenzhandbuch

Inspiration für das Projekt - Arduino Stop It Spiel