Inhaltsverzeichnis:

FPGA-Asteroiden-Spiel - Gunook
FPGA-Asteroiden-Spiel - Gunook

Video: FPGA-Asteroiden-Spiel - Gunook

Video: FPGA-Asteroiden-Spiel - Gunook
Video: Cine multi FPGA in Asteroids cocktail CAB 2024, November
Anonim
FPGA Asteroiden-Spiel
FPGA Asteroiden-Spiel

Für unser CPE 133 Final Project haben wir uns entschieden, ein Asteroiden-Spiel auf unserem FPGA mit zwei Drucktastenschaltern und der 7-Segment-Anzeige zu erstellen. Das Spiel funktioniert so, dass ein Asteroid in einer von drei zufällig ausgewählten Reihen erscheint und auf der anderen Seite der 7-Segment-Anzeige auf das Schiff zurast. Mit der oberen und unteren Taste können Sie Ihr Schiff dem Asteroiden aus dem Weg räumen. Geschieht dies nicht, zeigt das Display für einen Moment „BAnG“an und startet dann das Spiel schnell neu, damit der Benutzer es erneut versuchen kann. Was folgt, ist eine kurze Beschreibung, wie das Projekt erstellt wurde, damit jeder Benutzer unser Design replizieren oder verbessern kann.

Schritt 1: Übersicht

Überblick
Überblick
Überblick
Überblick

Das Projekt besteht hauptsächlich aus Finite State Machines (FSMs), die mithilfe von Logik das FPGA zwischen Zuständen übertragen, die verschiedene Werte von Schiffs- und Felspositionen speichern und anzeigen. Die beiden Hauptmodule sind die Spiel-FSMs für Rock and Ship und der binäre bis 7-Segment-Display-Decoder FSM, die unter Verwendung eines sehr einfachen Strukturmodells in VHDL miteinander integriert sind.

FSMs wurden für die Schiffsposition, die Felsposition und für den 7-Segment-Decoder erstellt. Der Zweck des FSM des Schiffes besteht darin, dass sich das Schiff in die richtige Position bewegen kann, wenn der Spieler eine Auf- oder Ab-Taste drückt. Der FSM wird benötigt, weil er sich merken muss, an welcher Position er zuletzt war, um an die richtige Position zu gelangen.

Der Zweck des FSM des Felsens besteht darin, den Felsen in die richtige Position zu bringen, basierend auf der Reihe, in der er sich befindet, und der letzten Position in dieser Reihe. Darüber hinaus verfolgt es die Position des Moduls, das es anzeigt, und wählt pseudozufällig eine neue Zeile aus, die als nächstes angezeigt wird.

Das FSM für den 7-Segment-Anzeigedecoder wurde verwendet, um nicht nur das Schiff und den Felsen anzuzeigen, sondern auch "BAnG" anzuzeigen, wenn die Schiffsposition und die Felsenposition gleich sind.

Schritt 2: Materialien

Die im Projekt verwendeten Materialien waren:

  • Basys3-Entwicklungsboard von Digilent, Inc.
  • Vivado Designsuite
  • sseg_dec.vhd (Diese Datei wurde uns auf Polylearn zur Verfügung gestellt und wurde von Bryan Mealy geschrieben)
  • Clk_div.vhd (Diese Datei wurde uns auf Polylearn zur Verfügung gestellt und wurde von Bryan Mealy geschrieben)
  • Drei endliche Automaten (FSMs)

Schritt 3: Das Spiel erstellen

Das Spiel machen
Das Spiel machen
Das Spiel machen
Das Spiel machen
Das Spiel machen
Das Spiel machen
Das Spiel machen
Das Spiel machen

Das Spielmodul wurde unter Verwendung von Verhaltensmodellen erstellt, um die Zustände von Schiff und Fels für ihre jeweiligen FSMs zu beschreiben. Dies hat den Vorteil, dass es viel einfacher ist, die Schaltung verhaltensmäßig zu modellieren, indem beschrieben wird, was sie tut, anstatt alle Komponenten herauszufinden, die zum Entwerfen der Hardware erforderlich sind.

Die Gesteinszustände wurden mit einem Pseudozufallszahlengenerator für die erste Position des Gesteins erstellt. Um dies zu erreichen, haben wir dem Generator einen eigenen Taktgeber gegeben, der im Verhältnis zur Spielgeschwindigkeit extrem schnell war. Bei jeder steigenden Flanke wird eine Drei-Bit-Zahl inkrementiert, und alle ihre Werte entsprechen einem von drei Startzuständen für das Schiff. Daher entsprechen drei Werte Position 3 (oben rechts), drei entsprechen Position 7 (Mitte) und zwei entsprechen Position 11 (unten rechts).

Sobald die zufällige Erzeugung stattgefunden hat und der Asteroid einen Anfangszustand erhalten hat, fließt er ohne Unterbrechung horizontal auf das Schiff zu.

0 ← 1 ← 2 ← 3

4 ← 5 ← 6 ← 7

11 ← 10 ← 9 ← 8

Die Uhr, die für die Logik des nächsten Zustands des Felsens verwendet wird, steuert die Geschwindigkeit des Spiels; Wir haben durch Versuch und Irrtum festgestellt, dass 9999999 ein guter Wert für die maximale Anzahl ist.

Die Schiffslogik funktioniert durch Initialisierung in die Mittelposition (Position 4) ganz links. Wird der obere Knopf oder der untere Knopf gedrückt, bewegt sich das Schiff auf und ab in die Positionen 0 und 11, die dem gedrückten Knopf entsprechen.

Damit sich die Schiffsbewegung für den Benutzer gut anfühlt, haben wir die Bewegung nicht asynchron gemacht. Wir haben eine Uhr für ihre Zustandsänderungen verwendet und eine maximale Anzahl von 5555555 verwendet.

Schritt 4: Ergebnis anzeigen

Der binäre zu 7-Segment-Decoder nimmt die 4-Bit-Positionsvariablen für das Schiff und den Asteroiden auf und zeigt das entsprechende Bild (entweder das Schiff und den Felsen oder die Meldung „BAnG“) an.

Dies wird erreicht, indem zuerst geprüft wird, ob die beiden gleich sind, und dann die Meldung „BAnG“anzeigt, wenn die Prüfung wahr zurückgibt.

Wenn es nicht true zurückgibt, zeigt der Decoder das Schiff und den Felsen an, indem er mit einer sehr hohen Taktfrequenz zwischen ihnen wechselt und das Auge so vortäuscht, als ob sie gleichzeitig angezeigt würden.

Schritt 5: Alles zusammenfügen

Alles zusammenfügen
Alles zusammenfügen

Wir haben das FSM des Schiffes und des Felsens in einem großen FSM zusammengefasst, das wir mit dem Display-FSM verdrahtet haben. Die Eingaben für das Spiel sind die Auf- und Ab-Taste auf dem BASYS3-Board und die Systemuhr. Die Ausgänge sind die Segment- und Anodenvektoren Sieben-Segment-Anzeige.

Diese Ein- und Ausgaben werden in der Einschränkungsdatei angezeigt, in der sie dem Port zugeordnet sind.

Schritt 6: Zukünftige Änderungen

In Zukunft wäre es eine Verbesserung, dem Projekt mehr Schiffsbewegungsfunktionen hinzuzufügen. Dies kann einfach erreicht werden, indem man 2 weitere Tasteneingaben gibt und dem Schiff erlaubt, andere Positionen (Zustände) als 0, 4 und 8 einzunehmen 1,5x jedes Mal, wenn es das Schiff verfehlt, bis es einen Treffer bekommt, wo es neu gestartet und wieder langsam wird. Dies würde die Schwierigkeit des Spiels erhöhen und dem Benutzer mehr Spaß machen, wenn es implementiert würde 't hit, und setzt ihn jedes Mal auf seinen Anfangswert zurück, wenn der Stein trifft.

Schritt 7: Fazit

Dieses Projekt hat uns geholfen, endliche Automaten, Uhren und die interaktive Anzeige auf den Sieben-Segment-Anzeigen besser zu verstehen.

Das Größte an endlichen Zustandsautomaten ist, dass es wichtig ist zu wissen (sich zu erinnern), in welchem Zustand man sich gerade befindet, um zum nächsten gewünschten Zustand zu gelangen. Ironischerweise gute Lebensberatung; Sie müssen wissen, wo Sie sind, um zu wissen, wohin Sie gehen.

Durch die Manipulation verschiedener Uhreninstanzen waren wir in der Lage, zufällig Zahlen zu generieren, den Felsen zur nächsten Position zu bewegen und die Anzeige des Schiffes, des Felsens und der Meldung zum Ende des Spiels zu verwalten.

Wir haben gelernt, dass nicht mehr als eine Anode gleichzeitig angezeigt werden kann. Das uns übergebene Modul hat sich zu Nutze gemacht, dass das menschliche Auge den Unterschied nur bis zu einer bestimmten Frequenz wahrnehmen kann. Daher wurde eine höhere Schaltanodenfrequenz gewählt. Das gleichzeitige Betrachten von Schiff und Fels ist eigentlich eine Anspielung, da beide einzeln, aber sehr schnell dargestellt werden. Dieses Konzept wurde angewendet, um die Bewegung des Schiffes, des Felsens und der Meldung „BAnG“anzuzeigen.