Inhaltsverzeichnis:

2-Spieler-Konkurrenz-VS-Timing-Spiel - Gunook
2-Spieler-Konkurrenz-VS-Timing-Spiel - Gunook

Video: 2-Spieler-Konkurrenz-VS-Timing-Spiel - Gunook

Video: 2-Spieler-Konkurrenz-VS-Timing-Spiel - Gunook
Video: Salut Salon "Wettstreit zu viert" | "Competitive Foursome" 2024, November
Anonim
2-Spieler-Konkurrenz-VS-Timing-Spiel
2-Spieler-Konkurrenz-VS-Timing-Spiel

Du wirst brauchen:

1. Digilent Basys 3, FPGA-Board (oder jedes andere FPGA)

2. Eine relativ aktuelle Version von Vivado oder einer anderen VHDL-Umgebung

3. Ein Computer, auf dem das erwähnte Programm ausgeführt werden kann.

Schritt 1: Das Spiel selbst

Das Spiel selbst
Das Spiel selbst

Wie die FSM mit den Modulen interagiert.

Spielanleitung

Zum Starten drücken Sie die mittlere Taste. Dies führt dazu, dass „99“, was die Gesundheit von Spieler zwei darstellt, auf der Sieben-Segment-Anzeige angezeigt wird. Dann leuchten die LEDs nacheinander von rechts nach links auf. Dies bildet einen Leistungsbalken. Sobald die Energieleiste voll ist, wird sie zurückgesetzt. Das Ziel von Spieler 1 ist es, den Schalter umzulegen, wenn die Latte so hoch wie möglich ist. Je mehr LEDs aufleuchten, desto mehr Schaden fügt Spieler eins Spieler zwei zu. Nachdem Spieler 1 seinen Schalter umgelegt hat, wird der zugefügte Schaden von der Gesundheit von Spieler 2 abgezogen. Dann wechselt es zum Zug von Spieler 2. Die angezeigte Zahl stellt nun die Gesundheit des Spielers dar und die Leistungsleiste füllt sich von links nach rechts. Sobald Spieler 2 seinen Zug macht, wird der Schaden abgezogen und Spieler 1 ist wieder an der Reihe. Dies wiederholt sich, bis ein Spieler 0 Gesundheit erreicht. Video dieser Funktion ist beigefügt.

Schritt 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Dieses Spiel ist im Wesentlichen eine große endliche Zustandsmaschine, bei der eine komplexe Logik basierend auf dem Zustand des FSM stattfindet.

Zustand 1: MenüDer erste Zustand ist der Menübildschirm, der einer der einfacheren Zustände ist. Es enthält die Sieben-Segment-Anzeige, die das Wort „PLAY“anzeigt, und die Schaltfläche, die das Spiel startet. Der Button, BTN, führt uns zum nächsten Zustand, der Spieler ist an der Reihe.

Zustand 2: Spieler 1 ist an der Reihe

Der Zug von Spieler 1 aktiviert ein Signal, das die Sieben-Segment-Anzeige veranlasst, die Gesundheit von Spieler 2 anzuzeigen. Ein weiteres Signal wird eingeschaltet, um ein Schieberegister zu aktivieren, das aus einem anderen von uns erstellten Modul (Pone.vhd) importiert wurde. Dieses Schieberegister lässt die LEDs aufleuchten, wie dies bei einer zunehmenden Leistungsanzeige in anderen Spielen der Fall wäre, und wird dann auf 0 zurückgesetzt, wenn die maximale Anzahl von LEDs erreicht wird, die leuchten können. Es aktualisiert sich mit der steigenden Flanke der Uhr aus barclock.vhd, die aus einer geliehenen Labordatei geändert wird. Wir ließen die Leiste von Spieler eins von rechts beginnen und sich nach links füllen, da sich der Schalter von Spieler eins auch auf der linken Seite befindet (für eine intuitive Benutzererfahrung). Sobald der Schalter umgelegt wird, geht der Status zum Abzug von Spieler 1 über, und die Anzahl der aktiven LEDs wird in einem Signal gespeichert.

Zustand 3: Spieler Eins Abzug Das Signal mit der Anzahl der aktiven LEDs bestimmt die Menge an Gesundheit, die abgezogen wird. Dies geschieht durch ein weiteres Schieberegister (deductor1.vhd), das die LEDs nicht inkrementiert, sondern dekrementiert. Dies dekrementiert bei der steigenden Flanke eines der Clock-Div-Module, die wir ausgeliehen und modifiziert haben (downcounterclock.vhd). Sobald eine LED erlischt, wird ein Gesundheitspunkt von der Gesamtgesundheit von Spieler 2 abgezogen. Wenn Spieler 2 während dieses Prozesses 0 Gesundheit erreicht, stoppen wir und gehen sofort in den Zustand „Game over“über. Andernfalls, sobald der LED-Vektor „0000000000000000“erreicht, gehen wir zum Zug von Spieler zwei über.

Zustand 4: Der Zug von Spieler 2 Der Zug von Spieler 2 ist genau wie der Zug von Spieler 1, außer dass das Schieberegister dafür (Ptwo.bhd) von links nach rechts geht und sich der Schalter auf der rechten Seite des Bretts befindet. Ein Signal wird aktiviert, um die Gesundheitsanzeige von Spieler 1 anzuzeigen. Sobald Schalter 2 aktiv ist, geht es weiter zum Abzugszug von Spieler 2.

Phase 5: Abzug von Spieler zwei Genau wie der Abzug von Spieler zwei verhält sich der Abzug von Spieler zwei ähnlich wie der Abzug von Spieler eins. Der Hauptunterschied besteht darin, dass das Schieberegister, das das Ausschalten der LEDs steuert, in die entgegengesetzte Richtung geht, was eine einfache Änderung ist, sobald der Abzug des Spielers ordnungsgemäß funktioniert.

Phase 6: Game Over Wenn einer der Spieler zu irgendeinem Zeitpunkt null Gesundheit erreicht, wechselt das Spiel in diesen Zustand. Nichts Besonderes zeigt. Wenn BTN eins gedrückt wird, wird die Gesundheit auf 99 zurückgesetzt und der Status kehrt zum Menü zurück, wodurch das Spiel effektiv von vorne beginnt.

Schritt 3: Module

Module
Module

Black-Box-Diagramm für Spiel

Downcounterclock (basierend auf dem clk_div.vhd-Modul von Bryan Mealy):

Dies ist die Uhr, die das Timing der Abzüge behandelt. Die Konstante mit dem Namen max_count ist 3x größer als die max_count-Konstante von barclock. Dadurch werden die Abzugsvorrichtungen 3x langsamer als die Geschwindigkeit des Balkens.

Barclock - (basierend auf dem clk_div.vhd-Modul von Bryan Mealy):

Diese Uhr regelt das Timing der Leistungsanzeigen, die wir schnell erhöht haben, um das Spiel schwieriger zu machen. Dieses Timing kann nach Ihren Wünschen angepasst werden, indem Sie die Geschwindigkeit erhöhen, indem Sie die Konstante max_count auf eine größere Zahl setzen, oder sie verringern, indem Sie max_count auf eine kleinere Zahl setzen. Sseg_dec - (Geschrieben von Bryan Mealy): Dieses Modul nimmt eine 8-Bit-Zahl als Eingabe, die es dekodiert, die Zahl in ihr dezimales Äquivalent umwandelt und dann an die Sieben-Segment-Anzeige ausgibt. Damit diese Datei funktioniert, müssen Sie sicherstellen, dass Ihre Einschränkungen mit unseren übereinstimmen.

Pony:

Dies ist ein Schieberegister, das Bits nach links verschiebt und ein heißes Bit hinzufügt, damit es so aussieht, als ob die Leistungsanzeige zunimmt. Wenn alle Bits heiß sind, werden alle Bits auf „0“zurückgesetzt und der Zyklus beginnt von vorne.

Pzwei:

Dies ist eine umgedrehte Version des P1-Moduls.

Abzug1:

Dies ist eine Kombination aus einem Schieberegister und einem Subtrahierer. Das Schieberegister geht in die entgegengesetzte Richtung des Schieberegisters von P1, was einen Abzug anzeigt. Dies zieht auch 1 von der Gesundheit von Spieler 2 für jeden Taktzyklus ab. Mit der Kombination dieser beiden Funktionen sieht es so aus, als würde die Gesundheit des Gegners um 1 sinken für jede LED der Gesundheitsleiste, die ausfällt.

Deductor2: Dies ist eine umgedrehte Version des Deductor1-Moduls.

PlayDecoder (ausgeliehen und leicht modifiziert von ekchen35649 sein 133 instructable): Dies wird im Menüzustand verwendet, um das Wort "PLAY" auf dem Sieben-Segment-Decoder anzuzeigen.

Schritt 4: Testen

Dieses Spiel wurde ursprünglich von einem der Minispiele von Kirby inspiriert. Es ist ein einfaches Spiel für zwei Spieler, das auf einem Basys 3-Board oder einem beliebigen FPGA gespielt werden kann.

Schritt 1: Benötigte Materialien

Sie benötigen: Digilent Basys 3, FPGA-Board (oder ein anderes) Eine relativ aktuelle Version von Vivado oder eine andere vhdl-Umgebung Einen Computer, der das erwähnte Programm ausführen kann Ein Gehirn

Schritt 2: Das Spiel selbst

Spielanleitung

Zum Starten drücken Sie die mittlere Taste. Dies führt dazu, dass „99“, was die Gesundheit von Spieler zwei darstellt, auf der Sieben-Segment-Anzeige angezeigt wird. Dann leuchten die LEDs nacheinander von rechts nach links auf. Dies bildet einen Leistungsbalken. Sobald die Energieleiste voll ist, wird sie zurückgesetzt. Das Ziel von Spieler eins ist es, seinen Schalter umzulegen, wenn der Balken so hoch wie möglich ist. Je mehr LEDs leuchten, desto mehr Schaden fügt Spieler eins Spieler zwei zu. Nachdem Spieler 1 seinen Schalter umgelegt hat, wird der zugefügte Schaden von der Gesundheit von Spieler 2 abgezogen. Dann wechselt es zum Zug von Spieler 2. Die angezeigte Zahl stellt nun die Gesundheit des Spielers dar und die Leistungsleiste füllt sich von links nach rechts. Sobald Spieler 2 seinen Zug macht, wird der Schaden abgezogen und Spieler 1 ist wieder an der Reihe. Dies wiederholt sich, bis ein Spieler 0 Gesundheit erreicht. Video dieser Funktion ist beigefügt.

Um das Spiel zu spielen, laden Sie es auf ein basys-Board und drücken Sie die mittlere Taste. Versuchen Sie, den Schalter mit so vielen aktiven LEDs wie möglich umzulegen, und warten Sie dann, wie das Board diese Punkte von der Gesundheit Ihres Gegners abzieht. Gib es dann an deinen Freund weiter und

Schritt 3: FSM

Dieses Spiel ist im Wesentlichen eine große endliche Zustandsmaschine, bei der eine komplexe Logik basierend auf dem Zustand des FSM stattfindet.

(Zustandsdiagramm)

Zustand 1: Menü

Der erste Zustand ist der Menübildschirm, der einer der einfacheren Zustände ist. Es enthält die Sieben-Segment-Anzeige, die das Wort "PLAY" anzeigt, und die Schaltfläche, die das Spiel startet. Der Button, BTN, führt uns zum nächsten Zustand, der Spieler ist an der Reihe.

Zustand 2: Spieler Eins ist an der Reihe

Der Zug von Spieler 1 aktiviert ein Signal, das die Sieben-Segment-Anzeige veranlasst, die Gesundheit von Spieler 2 anzuzeigen. Ein weiteres Signal wird eingeschaltet, um ein Schieberegister zu aktivieren, das aus einem anderen von uns erstellten Modul (Pone.vhd) importiert wurde. Dieses Schieberegister lässt die LEDs aufleuchten, wie dies bei einer zunehmenden Leistungsanzeige in anderen Spielen der Fall wäre, und wird dann auf 0 zurückgesetzt, wenn die maximale Anzahl von LEDs erreicht wird, die leuchten können. Es aktualisiert sich mit der steigenden Flanke der Uhr aus barclock.vhd, die aus einer geliehenen Labordatei geändert wird. Wir ließen die Leiste von Spieler eins von rechts beginnen und sich nach links füllen, da sich der Schalter von Spieler eins auch auf der linken Seite befindet (für eine intuitive Benutzererfahrung). Sobald der Schalter umgelegt wird, geht der Status zum Abzug von Spieler 1 über, und die Anzahl der aktiven LEDs wird in einem Signal gespeichert.

Zustand 3: Spieler Eins Abzug

Das Signal mit der Anzahl der aktiven LEDs bestimmt die Gesundheit, die abgezogen wird. Dies geschieht durch ein weiteres Schieberegister (deductor1.vhd), das die LEDs nicht inkrementiert, sondern dekrementiert. Dies dekrementiert bei der steigenden Flanke eines der Clock-Div-Module, die wir ausgeliehen und modifiziert haben (downcounterclock.vhd). Sobald eine LED erlischt, wird ein Gesundheitspunkt von der Gesamtgesundheit von Spieler 2 abgezogen. Wenn Spieler 2 während dieses Prozesses 0 Gesundheit erreicht, stoppen wir und gehen sofort in den Zustand „Game over“über. Andernfalls, sobald der LED-Vektor „0000000000000000“erreicht, gehen wir zum Zug von Spieler zwei über.

Zustand 4: Spieler 2 ist an der Reihe

Der Zug von Spieler zwei ist genau wie der von Spieler eins, außer dass das Schieberegister dafür (Ptwo.bhd) von links nach rechts geht und sich der Schalter auf der rechten Seite des Bretts befindet. Ein Signal wird aktiviert, um die Gesundheitsanzeige von Spieler 1 anzuzeigen. Sobald Schalter 2 aktiv ist, geht es weiter zum Abzugszug von Spieler 2.

Phase 5: Abzug von Spieler 2

Genau wie der Zug von Spieler zwei verhält sich der Abzug von Spieler zwei ähnlich wie der Abzug von Spieler eins. Der Hauptunterschied besteht darin, dass das Schieberegister, das das Ausschalten der LEDs steuert, in die entgegengesetzte Richtung geht, was eine einfache Änderung ist, sobald der Abzug des Spielers ordnungsgemäß funktioniert.

Phase 6: Game Over Wenn einer der Spieler zu irgendeinem Zeitpunkt null Gesundheit erreicht, wechselt das Spiel in diesen Zustand. Nichts Besonderes zeigt. Wenn BTN eins gedrückt wird, wird die Gesundheit auf 99 zurückgesetzt und der Status kehrt zum Menü zurück, wodurch das Spiel effektiv von vorne beginnt.

Flugschreiber

Schritt 4: Module

Downcounterclock (basierend auf dem clk_div.vhd-Modul von Bryan Mealy):

Dies ist die Uhr, die das Timing der Abzüge regelt. Die Konstante mit dem Namen max_count ist 3x größer als die max_count-Konstante von barclock. Dadurch werden die Abzugsvorrichtungen 3x langsamer als die Geschwindigkeit des Balkens.

Barclock - (basierend auf dem clk_div.vhd-Modul von Bryan Mealy): Diese Uhr verarbeitet das Timing der Leistungsmesser, die wir schnell erhöht haben, um das Spiel schwieriger zu machen. Dieses Timing kann nach Ihren Wünschen angepasst werden, indem Sie die Geschwindigkeit erhöhen, indem Sie die Konstante max_count auf eine größere Zahl setzen, oder sie verringern, indem Sie max_count auf eine kleinere Zahl setzen. Sseg_dec - (Geschrieben von Bryan Mealy): Dieses Modul nimmt eine 8-Bit-Zahl als Eingabe, die es dekodiert, die Zahl in ihr dezimales Äquivalent umwandelt und dann an die Sieben-Segment-Anzeige ausgibt. Damit diese Datei funktioniert, müssen Sie sicherstellen, dass Ihre Einschränkungen mit unseren übereinstimmen.

Pone: Dies ist ein Schieberegister, das Bits nach links verschiebt und ein heißes Bit hinzufügt, damit es so aussieht, als ob die Leistungsanzeige zunimmt. Wenn alle Bits heiß sind, werden alle Bits auf „0“zurückgesetzt und der Zyklus beginnt von vorne.

Ptwo: Dies ist eine umgedrehte Version des P1-Moduls.

Deduktor1: Dies ist eine Kombination aus einem Schieberegister und einem Subtrahierer. Das Schieberegister geht in die entgegengesetzte Richtung des Schieberegisters von P1, was einen Abzug anzeigt. Dies zieht auch 1 von der Gesundheit von Spieler 2 für jeden Taktzyklus ab, so dass es mit der Kombination dieser beiden Funktionen so aussieht, als würde die Gesundheit des Gegners um 1 sinken, wenn die LED des Gesundheitsbalkens sinkt.

Deductor2: Dies ist eine umgedrehte Version des Deductor1-Moduls.

PlayDecoder (ausgeliehen und leicht modifiziert von ekchen35649 seinem 133 instructable):

Dies wird im Menüzustand verwendet, um das Wort „PLAY“auf dem Sieben-Segment-Decoder anzuzeigen.

To Do: Bilder, Videos