Πίνακας περιεχομένων:

Παιχνίδι αντίδρασης FPGA: 10 βήματα
Παιχνίδι αντίδρασης FPGA: 10 βήματα

Βίντεο: Παιχνίδι αντίδρασης FPGA: 10 βήματα

Βίντεο: Παιχνίδι αντίδρασης FPGA: 10 βήματα
Βίντεο: Παιχνίδια Ταχύτητας - Αντίδρασης 2024, Νοέμβριος
Anonim
Παιχνίδι αντίδρασης FPGA
Παιχνίδι αντίδρασης FPGA

Από τους Summer Rutherford και Regita Soetandar

Βήμα 1: Εισαγωγή

Για το τελευταίο μας έργο για το CPE 133, σχεδιάσαμε ένα παιχνίδι αντίδρασης σε VHDL για έναν πίνακα Basys3. Αυτό το παιχνίδι μπορεί να συγκριθεί πολύ με το arcade παιχνίδι "Stacker" όπου ο παίκτης πρέπει να ρίξει τα μπλοκ την κατάλληλη στιγμή. Ο πίνακας Basys3 είναι συνδεδεμένος με ένα breadboard, το οποίο διαθέτει τα εναλλασσόμενα LED. Αυτά τα φώτα LED εναλλάσσονται σε συγκεκριμένη συχνότητα, ανάλογα με το επίπεδο. Αυτό το παιχνίδι χρησιμοποιεί το διαχωριστή ρολογιού και την τετραψήφια οθόνη 7 τμημάτων, καθώς και μια μηχανή πεπερασμένης κατάστασης. Όταν η συσκευή αναπαραγωγής ενεργοποιήσει τον σωστό διακόπτη καθώς ανάβει το μεσαίο LED, ο παίκτης θα προχωρήσει στο επόμενο επίπεδο του παιχνιδιού, αυξάνοντας τη συχνότητα των εναλλασσόμενων LED. Αυτό καθιστά κάθε διαδοχικό επίπεδο πιο δύσκολο από το προηγούμενο επίπεδο. Όταν η συσκευή αναπαραγωγής χτυπήσει επιτυχώς το επίπεδο 7, το υψηλότερο επίπεδο, ένα μήνυμα θα εμφανιστεί στην οθόνη τμήματος και όλα τα LED θα αναβοσβήνουν ταυτόχρονα και θα σβήνουν.

Βήμα 2: Υλικά

Υλικά
Υλικά
Υλικά
Υλικά
Υλικά
Υλικά

Τα υλικά που θα χρειαστείτε είναι:

  • Πίνακας Digilent Basys3 με καλώδιο micro USB
  • Breadboard
  • 5 LED
  • 5 αντιστάσεις (χρησιμοποιήσαμε 220 ohm)
  • 11 καλώδια βραχυκυκλωτήρων
  • Υπολογιστής με Vivado

Βήμα 3: Σχέδιο μαύρου κουτιού διαγράμματος ανώτατου επιπέδου

Σχέδιο ανώτατου επιπέδου Black Box Design
Σχέδιο ανώτατου επιπέδου Black Box Design
Σχέδιο ανώτατου επιπέδου Μαύρο κουτί
Σχέδιο ανώτατου επιπέδου Μαύρο κουτί

Όπως μπορείτε να δείτε, το διάγραμμα μπλοκ ανώτερου επιπέδου ξεκινά με την λήψη των απαιτούμενων ρολογιών από την υπομονάδα μας, ClkDivide. Αυτά τα ρολόγια εισάγονται στα διάφορα μπλοκ διεργασιών. Ουσιαστικά, το παιχνίδι πρέπει να αναγνωρίσει ότι όταν ένας χρήστης ανοίξει σωστά τον διακόπτη, τα LED πρέπει να αρχίσουν να εναλλάσσονται γρηγορότερα και η οθόνη πρέπει να ανέβει ένα επίπεδο. Το μπλοκ διάγραμμα μπορεί να φαίνεται λίγο τρελό, αλλά αυτό συμβαίνει επειδή υπάρχουν πολλά σήματα που δημιουργούνται σε μια συγκεκριμένη διαδικασία και στη συνέχεια αυτό το σήμα ορίζει ένα άλλο σήμα σε ένα άλλο μπλοκ διεργασίας.

Στο τέλος, οι μόνες εισόδους που παίρνει το παιχνίδι είναι το ρολόι εισόδου στον πίνακα Basys3 που λειτουργεί στα 100 Mhz, επτά διακόπτες στον πίνακα Basys3 και το κουμπί επαναφοράς. Αυτό που εξάγεται είναι η άνοδος για την οθόνη των επτά τμημάτων, τα επτά τμήματα για την οθόνη και τα LED.

Βήμα 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Αυτή η υπομονάδα διαίρεσης ρολογιού δημιούργησε ένα πιο αργό ρολόι ανάλογα με την τιμή που αντιστοιχίσαμε σε αυτό στο κύριο αρχείο μας. Χρησιμοποιήσαμε αυτήν την υπομονάδα για τον προσδιορισμό Clk400, PushClk και newlck. Αυτή η υπομονάδα παίρνει ένα ρολόι και ένα διαχωριστικό 32 bit ως εισόδους. Εμφανίζεται ένα βραδύτερο ρολόι. Υπάρχει ένα μπλοκ διαδικασίας για το διαχωριστικό και το επιβραδυνόμενο ρολόι. Στη διαδικασία υπάρχει μια προσωρινή μεταβλητή, την οποία ονομάσαμε count, η οποία μετράει μία κάθε φορά που χτυπάει μια αυξανόμενη άκρη του εισερχόμενου ρολογιού. Μόλις φτάσει στον διαιρούμενο αριθμό, το επιβραδυνόμενο ρολόι άλλαξε και ο μετρητής επανέρχεται στο μηδέν.

Βήμα 5: Shift Process Block

Αποκλεισμός διαδικασίας μετατόπισης
Αποκλεισμός διαδικασίας μετατόπισης

Το μπλοκ διαδικασίας Shift ελέγχει την εναλλασσόμενη κίνηση και την ταχύτητα των LED. Στη λίστα ευαισθησίας βρίσκονται τα σήματα newclk και Stop. Η διακοπή προκαλεί μια σύντομη καθυστέρηση όταν ο χρήστης περάσει το επίπεδο. Εάν το Stop δεν είναι υψηλό, τότε τα LED εναλλάσσονται κανονικά με βάση την ταχύτητα του newclk. Αυτό το εναλλασσόμενο μοτίβο ελέγχεται από δύο μεταβλητές: Παρακολούθηση και καταμέτρηση. Η καταμέτρηση καθορίζει ποια λυχνία LED πρέπει να είναι αναμμένη, ενώ η διαδρομή καθορίζει εάν η μέτρηση πρέπει να μετρά πάνω ή κάτω. Υπάρχει ένα άλλο σήμα, Τελικό, που ισχύει μόνο όταν το Επίπεδο είναι "111", υποδεικνύοντας ότι ο παίκτης έχει κερδίσει το παιχνίδι. Το τελικό εναλλάσσεται μεταξύ 0 και 1 κάθε άκρου ρολογιού για να ανάβουν και να σβήνουν συνεχώς τα LED. Αυτό είναι απλώς ένα οπτικό στοιχείο για την τελική οθόνη.

Αυτή η διαδικασία αλλαγής είναι το ιδανικό μέρος για να ξεκινήσετε για αυτό το έργο. Εάν μπορείτε να κάνετε τα LED σας να εναλλάσσονται σωστά και με συνέπεια, τότε από εδώ πρέπει απλώς να προσθέσετε τη συμπεριφορά κατά την ισοπέδωση!

Βήμα 6: Μηχανή πεπερασμένης κατάστασης

Πεπερασμένη κατάσταση μηχανή
Πεπερασμένη κατάσταση μηχανή

Δημιουργήσαμε ένα μηχάνημα πεπερασμένης κατάστασης για να υπαγορεύσουμε τη συμπεριφορά όταν πατάτε το διακόπτη εισόδου ή το κουμπί επαναφοράς. Κάθε κατάσταση είναι ένα "επίπεδο" και εάν ο διακόπτης είναι ενεργοποιημένος σε λάθος χρόνο ή πατηθεί επαναφορά, το επίπεδο επιστρέφει πίσω στο "000". Διαφορετικά, εάν ο διακόπτης είναι σωστά ενεργοποιημένος, τότε το επίπεδο ανεβαίνει μέχρι να φτάσει στην τελική κατάσταση, "111" και εμφανίζεται η τελική οθόνη. Το FSM βασίζεται στα δύο μπλοκ διεργασιών sync_proc και comb_proc. Το Sync_proc χρησιμοποιεί το ρολόι που ονομάσαμε PushClk. Αυτό το ρολόι ελέγχει πόσο γρήγορα η επόμενη κατάσταση γίνεται η παρούσα κατάσταση. Αυτό το ρολόι πρέπει να είναι αρκετά γρήγορο. επιλέξαμε μια ταχύτητα που ήταν περίπου δύο φορές μεγαλύτερη από την υψηλότερη ταχύτητα LED.

Εφαρμόσαμε αυτόν τον κώδικα χρησιμοποιώντας ένα FSM για τα επίπεδα. Ωστόσο, μετά από αυτό το έργο συνειδητοποιήσαμε ότι μια πιο αποτελεσματική χρήση ενός FSM θα μπορούσε να ήταν η κατάσταση αντίστροφης μέτρησης, η κατάσταση επαναφοράς ή η κατάσταση παραμονής. Εάν δεν πιέζεται τίποτα, είναι στην κατάσταση παραμονής. Εάν πατηθεί η επαναφορά ή η συσκευή αναστατωθεί, είναι σε κατάσταση επαναφοράς. Εάν πιεστεί σωστά, βρίσκεται σε κατάσταση αντίστροφης μέτρησης. Υπάρχουν πολλοί άλλοι τρόποι χρήσης ενός FSM και σε αυτό το παιχνίδι!

Βήμα 7: Έλεγχος αποκλεισμού διαδικασίας εμφάνισης με επίπεδο

Έλεγχος αποκλεισμού διαδικασίας εμφάνισης με επίπεδο
Έλεγχος αποκλεισμού διαδικασίας εμφάνισης με επίπεδο

Το επίπεδο ελέγχει το μπλοκ διαδικασίας εμφάνισης. Οι μεταβλητές στη λίστα ευαισθησίας είναι Level, Reset και Clk400. Η οθόνη των 7 τμημάτων ξεκινά με την εμφάνιση του «1» για το πρώτο επίπεδο. Μετράει μέχρι το 7 κάθε φορά που ο χρήστης περνά ένα επίπεδο για να δείξει στον χρήστη σε ποιο επίπεδο βρίσκεται. Μόλις ο χρήστης περάσει το επίπεδο 7, εμφανίζει "COOL" για να δηλώσει ότι ο παίκτης έχει κερδίσει το παιχνίδι. Αυτή η οθόνη "COOL" λειτουργεί με ρολόι 400 Hz που ονομάσαμε Clk400. Εάν πατήσετε Reset, η οθόνη επιστρέφει στο "1."

Βήμα 8: Έλεγχος ταχύτητας LED με επίπεδο

Έλεγχος ταχύτητας LED με επίπεδο
Έλεγχος ταχύτητας LED με επίπεδο

Τέλος, το Level ελέγχει την ταχύτητα των LED. Το επίπεδο είναι το μόνο σήμα στη λίστα ευαισθησίας. Το D1 είναι το σήμα που μπαίνει στη διαδικασία Clock Divider για να πάρει newclk. Κάθε φορά που αλλάζει το επίπεδο ή αλλάζει η κατάσταση, το μπλοκ διαδικασίας "Ταχύτητα". Αυτή η διαδικασία καθορίζει την τιμή του D1. Υπάρχουν 8 καθορισμένες τιμές του D1 που επιλέξαμε με βάση το πόσο γρήγορα θέλουμε να εκτελείται κάθε επίπεδο. Το D1 γίνεται μικρότερο κάθε φορά που αυξάνεται το επίπεδο έτσι ώστε το newclk να τρέχει γρηγορότερα.

Βήμα 9: Συναρμολόγηση υλικού

Συναρμολόγηση υλικού
Συναρμολόγηση υλικού

Συνδέσαμε το breadboard στο Basys3 με έναν από τους συνδέσμους pmod. Έξι από τις θύρες pmod χρησιμοποιήθηκαν για να συνδέσετε έναν σύνδεσμο αρσενικού σε αρσενικό, ένας για τη γείωση και οι άλλοι πέντε για τα 5 LED. Τοποθετήσαμε επίσης μια αντίσταση για κάθε LED. Αυτές οι αντιστάσεις είναι 220Ω και αποτρέπουν το βραχυκύκλωμα και την καύση των LED. Αν και κάθε LED έχει κάποια αντίσταση, η αντίσταση δεν είναι αρκετή για να εμποδίσει την τάση από την πηγή.

Βήμα 10: Διασκεδάστε

Αυτό το παιχνίδι είναι πολύ εύκολο να παιχτεί. Ο παίκτης ξεκινά από τον ακροδεξιό διακόπτη 1 του πίνακα, V17. Πρέπει να αναποδογυρίσουν το διακόπτη ψηλά όταν η μεσαία λυχνία LED είναι αναμμένη. Στη συνέχεια μετακινούν έναν διακόπτη προς τα αριστερά και κάνουν το ίδιο πράγμα! Αν ο παίκτης φτάσει μέχρι το τέλος, θα καταλήξει στον έβδομο διακόπτη, W14. Αν νικήσουν το παιχνίδι, θα δουν μια πραγματικά διασκεδαστική εμφάνιση!

Κάτι που πρέπει να σημειωθεί είναι ότι κατά τη δημιουργία αυτού του παιχνιδιού οι ταχύτητες εξαρτώνται απόλυτα από εσάς! Εάν οι ταχύτητες που έχουμε επιλέξει είναι πολύ αργές, μη διστάσετε να το επιταχύνετε και να το κάνετε ακόμα πιο δύσκολο! Επίσης, δεν υπάρχει καθορισμένος αριθμός επιπέδων. Εάν θέλετε να το κάνετε να έχει ακόμα περισσότερα επίπεδα, υπάρχουν τροποποιήσεις που πρέπει να γίνουν στο FSM και τα μπλοκ διαδικασίας που καθορίζονται από το επίπεδο, αλλά αυτές είναι πολύ απλές αλλαγές.

Επιλέξαμε επίσης να χρησιμοποιούμε διακόπτες στον πίνακα ως είσοδο χρήστη, αλλά αυτό είναι επίσης δυνατό με ένα κουμπί στον πίνακα Basys3. το κουμπί θα εξαλείψει την ανάγκη επαναφοράς των διακοπτών κάθε φορά που ο χρήστης ξεκινά από την αρχή. Αρχικά χρησιμοποιήσαμε ένα κουμπί, ωστόσο αυτό προκάλεσε σφάλματα στον καθορισμό του επιπέδου επειδή θα ανέβαινε πολλά επίπεδα αν χτυπούσαν δύο ανερχόμενες άκρες του PushClk όταν το κουμπί κρατιόταν πατημένο.

Παρακάτω είναι ένα βίντεο που δείχνει πώς να παίζετε, περνώντας από τα πρώτα 4 επίπεδα και την τελική οθόνη λήξης.

Το κύριο αρχείο για αυτό το έργο περιλαμβάνεται παρακάτω.

Πηγές

Εγχειρίδιο αναφοράς Basys3

Έμπνευση για έργο - παιχνίδι Arduino Stop It

Συνιστάται: