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

VHDL Basys3: Connect 4 Παιχνίδι: 5 Βήματα
VHDL Basys3: Connect 4 Παιχνίδι: 5 Βήματα

Βίντεο: VHDL Basys3: Connect 4 Παιχνίδι: 5 Βήματα

Βίντεο: VHDL Basys3: Connect 4 Παιχνίδι: 5 Βήματα
Βίντεο: 4.FPGA FOR BEGINNERS- Combining logic gates in VHDL (DIGILENT Basys3) 2024, Νοέμβριος
Anonim
Παιχνίδι VHDL Basys3: Connect 4
Παιχνίδι VHDL Basys3: Connect 4

Εισαγωγή:

Αυτό είναι ένα 4ηφιακό λογικό παιχνίδι Connect 4 σχεδιασμένο σε VHDL χρησιμοποιώντας το λογισμικό Vivado και προγραμματισμένο στον πίνακα Basys3. Η κατασκευή και ο σχεδιασμός αυτού του έργου είναι ενδιάμεσος, αλλά οι νεοεισερχόμενοι μπορούν να αντιγράψουν τα βήματα και να δημιουργήσουν το ψηφιακό παιχνίδι.

Το παιχνίδι λειτουργεί όπως το παιχνίδι Connect 4. Οι παίκτες μπορούν να μετακινήσουν τον κέρσορα στην οθόνη χρησιμοποιώντας τα αριστερά και δεξιά κουμπιά που βρίσκονται στον πίνακα. Πατώντας το μεσαίο κουμπί στον πίνακα, ο παίκτης θα τοποθετήσει τον δείκτη του σε αυτήν τη στήλη και στη συνέχεια θα είναι η σειρά του επόμενου παίκτη. Μόλις κερδίσει ένας παίκτης, το παιχνίδι μπορεί να επαναρυθμιστεί πατώντας το κουμπί επάνω στον πίνακα.

Βήμα 1: Γρήγορες λεπτομέρειες και υλικά

Γρήγορες τεχνικές λεπτομέρειες:

  • Χρησιμοποιεί τρία σύνολα συνδέσεων PMOD στον πίνακα (JA, JB, JC)

    • 8 ακίδες (εξαιρούνται οι καρφίτσες Vcc & GND) που χρησιμοποιούνται για κάθε υποδοχή PMOD
    • JA - Έλεγχος σειρών
    • JB - Έλεγχος των πράσινων στηλών
    • JC - Έλεγχος κόκκινων στηλών
  • Το ρολόι οθόνης λειτουργεί στα 960Hz

    Μόνο 8 LED ανάβουν κάθε φορά. Η οθόνη ανανεώνεται με αρκετά γρήγορη ταχύτητα ρολογιού ώστε να υπάρχει η ψευδαίσθηση ότι περισσότερες από 8 λυχνίες LED είναι αναμμένες τη δεδομένη στιγμή

  • Το κουμπί ρολογιού λειτουργεί στα 5Hz. Προαιρετικά, μπορεί να επιβληθεί πρόστιμο με επεξεργασία κώδικα VHDL.
  • Η εσωτερική αντίσταση των συστοιχιών Darlington είναι αρκετή για να αποτρέψει την καύση των LED

Το παιχνίδι κατασκευάζεται χρησιμοποιώντας τα ακόλουθα στοιχεία και εργαλεία:

  • (1) Basys3 Board
  • (2) LED Matrix Bi-color 8x5:
  • (2) ULN2803 - Darlington Transistor Arrays - Datasheet
  • Καρούλια σύρματος
  • Jumper Wires
  • Wire Stripper
  • Breadboards (η μεγάλη πλατεία πρέπει να είναι αρκετή)
  • Πολύμετρο και τροφοδοτικό (Αντιμετώπιση προβλημάτων)

Βήμα 2: Σύνδεση του υλικού

Σύνδεση του υλικού
Σύνδεση του υλικού
Σύνδεση του υλικού
Σύνδεση του υλικού

Κατευθυντήριες γραμμές:

Η καλωδίωση του έργου μπορεί να είναι εξαιρετικά μπερδεμένη, πάρτε το χρόνο σας και βεβαιωθείτε ότι όλες οι συνδέσεις είναι σωστές μία φορά τη φορά.

Το έργο περιλαμβάνει τη χρήση δύο οθονών LED, αλλά συνδυάζονται για να σχηματίσουν μία μεγάλη οθόνη. Αυτό μπορεί να επιτευχθεί συνδέοντας όλες τις γραμμές στο ίδιο σημείο. Επειδή κάθε οθόνη είναι δίχρωμη, οι κόκκινες και πράσινες σειρές της μιας οθόνης πρέπει επίσης να είναι δεμένες με τις κόκκινες και πράσινες σειρές της άλλης οθόνης. Με αυτόν τον τρόπο, μπορούμε να ελέγξουμε όλες τις σειρές με μόνο 8 ακίδες. Οι άλλες 16 ακίδες χρησιμοποιούνται για τον έλεγχο των στηλών της οθόνης. Οι 8 ακίδες για το δοχείο μπορούν να συνδεθούν απευθείας μέσω καλωδίων βραχυκυκλώματος στους συνδέσμους pmod. Οι συνδέσεις Pmod πηγαίνουν πρώτα στην είσοδο του ULN2083A και η έξοδος του ULN2083A συνδέεται απευθείας με τη στήλη στην οθόνη. Επειδή ο σχεδιασμός είναι 8x8, ορισμένες στήλες δεν θα είναι φυσικά συνδεδεμένες.

  • JA: Σειρές συνδέσεων: Σειρά 1 προς JA: 1 έως σειρά 8 για JA: 10.
  • JA: Συνδέσεις κόκκινης στήλης:
  • JC: Συνδέσεις Green Column

Ανατρέξτε στις εικόνες που δημοσιεύτηκαν για να γνωρίζετε ποιες καρφίτσες αντιστοιχούν σε ποιες σειρές/στήλες.

Σημείωση: Τα τρανζίστορ έχουν ενσωματωμένες αντιστάσεις, οπότε τα LED δεν απαιτούν πρόσθετη αντίσταση για να συνδεθούν σε σειρά.

Βήμα 3: Τεχνική επεξήγηση: Οθόνη

Η οθόνη λειτουργεί με βάση την εμμονή της όρασης. Η οθόνη ανανεώνεται τόσο γρήγορα, ώστε το ανθρώπινο μάτι δεν μπορεί να εντοπίσει ορατά ότι ορισμένες λυχνίες LED σβήνουν και ενεργοποιούνται γρήγορα. Στην πραγματικότητα, επιβραδύνοντας το ρολόι της οθόνης, μπορεί κανείς να παρατηρήσει ότι αναβοσβήνει.

Η οθόνη ενεργοποιεί και τις οκτώ σειρές σύμφωνα με τα δεδομένα που είναι αποθηκευμένες για αυτές τις σειρές και η οθόνη ενεργοποιείται σε μία στήλη. Στη συνέχεια, μεταβαίνει γρήγορα στην επόμενη καταχώριση δεδομένων για τις οκτώ σειρές και ενεργοποιείται στην επόμενη στήλη - ενώ όλες οι άλλες στήλες είναι απενεργοποιημένες. Αυτή η διαδικασία συνεχίζεται με αρκετά γρήγορη ταχύτητα ρολογιού ώστε το τρεμόπαιγμα της λυχνίας LED να γίνει απαρατήρητο.

Η αποθήκευση δεδομένων για την οθόνη αρχικοποιείται αμέσως μετά την αρχιτεκτονική στο αρχείο VHDL με τον ακόλουθο τρόπο:

σήμα RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 προς 0): = "00000000";

σήμα GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 στο 0): = "00000000"; - Δεδομένα σειράς ανάλογα με τη στήλη: ΠΡΑΣΙΝΗ

Ακολουθεί ένα μικρό απόσπασμα της διαδικασίας που ελέγχει τη μήτρα οθόνης LED.

- Διαδικασία που ελέγχει τη μήτρα οθόνης LED οθόνη: διαδικασία (ColCLK) - 0 - 16 για ανανέωση τόσο της μεταβλητής RowCount 8X8 RED όσο και 8x8 GREEn μήτρας: ακέραιο εύρος 0 έως 16: = 0; ξεκινήστε εάν (αυξανόμενη_ακμή (ColCLK)) στη συνέχεια εάν (RowCount = 0) στη συνέχεια DORow <= RedA; - Δεδομένα σειράς για την αντίστοιχη στήλη DOCol <= "1000000000000000"; - Ενεργοποίηση στήλης- Επαναλάβετε αυτόν τον κωδικό μέχρι «0000000000000001»- Αλλαγή σε RedB, RedC… GreenA, GreenB… GreenH

Στο τέλος του GreenH, ακριβώς πριν τερματιστεί η διαδικασία, αυτό το απόσπασμα περιλαμβάνεται για επαναφορά του RowCount στο μηδέν.

εάν (RowCount = 15) τότε - Επανεκκίνηση ανανέωσης από τη στήλη A RowCount: = 0; else RowCount: = RowCount + 1; - Μετατόπιση στις στήλες τελειώνει εάν?

Τώρα, για να εξηγήσετε το ρολόι που βρίσκεται στη λίστα ευαισθησίας της διαδικασίας εμφάνισης. Ο πίνακας Basys3 διαθέτει εσωτερικό ρολόι που λειτουργεί στα 100MHz. Για τους σκοπούς μας, αυτό είναι πολύ γρήγορο για ένα ρολόι, οπότε θα χρειαστεί να διαιρέσουμε αυτό το ρολόι σε ένα ρολόι 960Hz χρησιμοποιώντας την ακόλουθη διαδικασία.

- Διαδικασία ρολογιού που λειτουργεί στα 960HzCLKDivider: διαδικασία (CLK) μεταβλητή clkcount: ακέραιο εύρος 0 έως 52083: = 0; ξεκινήστε εάν (άνοδος_ακράς (CLK)) τότε clkcount: = clkcount + 1; εάν (clkcount = 52083) τότε ColCLK <= όχι (ColCLK); clkcount: = 0; τέλος εαν; τέλος εαν; τελική διαδικασία?

Βήμα 4: Τεχνική εξήγηση: Αλλαγή των εμφανιζόμενων πληροφοριών

Τεχνική επεξήγηση: Αλλαγή των εμφανιζόμενων πληροφοριών
Τεχνική επεξήγηση: Αλλαγή των εμφανιζόμενων πληροφοριών

Στον κώδικα VHDL, οι πληροφορίες ή τα δεδομένα που θα εμφανιστούν στην οθόνη ελέγχονται από τη διαδικασία δρομέα, η οποία έχει διαφορετικό ρολόι στη λίστα ευαισθησίας. Αυτός ο κωδικός ονομάστηκε BtnCLK, ένα ρολόι που έχει σχεδιαστεί για να ελαχιστοποιεί την αποσύνδεση των κουμπιών όταν πιέζονται. Αυτό περιλαμβάνεται έτσι ώστε εάν πατηθεί ένα κουμπί, ο δρομέας στην επάνω σειρά δεν κινείται πολύ γρήγορα στις στήλες.

- Διαδικασία ρολογιού που λειτουργεί στα 5 Hz. Κουμπί CLK: διαδικασία (CLK) μεταβλητή btnclkcount: ακέραιο εύρος 0 έως 10000001: = 0; ξεκινήστε εάν (αυξανόμενη άκρη (CLK)) στη συνέχεια εάν (btnclkcount = 10000000) τότε btnclkcount: = 0; BtnCLK <= όχι (BtnCLK); else btnclkcount: = btnclkcount + 1; τέλος εαν; τέλος εαν; τελική διαδικασία?

Με την έξοδο σήματος BtnCLK αυτής της διαδικασίας, μπορούμε τώρα να εξηγήσουμε τη διαδικασία του δρομέα. Η διαδικασία δρομέα έχει μόνο το BtnCLK στη λίστα ευαισθησίας, αλλά στο μπλοκ κωδικών, ελέγχεται η κατάσταση των κουμπιών και αυτό θα προκαλέσει την αλλαγή των δεδομένων για τα RedA, RedB… GreenH. Εδώ είναι ένα απόσπασμα του κώδικα δρομέα, το οποίο περιλαμβάνει το μπλοκ επαναφοράς και το μπλοκ για την πρώτη στήλη.

δρομέας: μεταβλητή διεργασίας (BtnCLK) OCursorCol: STD_LOGIC_VECTOR (2 προς 0): = "000"; - Το OCursorCol παρακολουθεί την προηγούμενη μεταβλητή στήλης NCursorCol: STD_LOGIC_VECTOR (2 προς 0): = "000"; -Το NCursorCol ορίζει έναρξη νέας στήλης δρομέα-Συνθήκη επαναφοράς (Κουμπί ΕΠΑΝΩ) RedB <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; RedH <= "00000000"; GreenA <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; GreenD <= "00000000"; GreenE <= "00000000"; GreenF <= "00000000"; GreenG <= "00000000"; GreenH if (Lbtn = '1') τότε NCursorCol: = "111"; - Στήλη H elsif (Rbtn = '1') και στη συνέχεια NCursorCol: = "001"; - Στήλη Β elsif (Cbtn = '1') και μετά NCursorCol: = OCursorCol; - Η στήλη παραμένει η ίδια NTurnState <= όχι (TurnState). - Ενεργοποιεί τη σειρά του επόμενου παίκτη- Ελέγχει την τρέχουσα στήλη από κάτω προς τα πάνω και ανάβει την πρώτη λυχνία LED που δεν είναι αναμμένη. Το χρώμα εξαρτάται από το χρώμα του δρομέα της τρέχουσας συσκευής αναπαραγωγής. για ck σε 7 στο 1 βρόχο εάν (RedA (0) = '1') και [RedA (ck) = '0') και [GreenA (ck) = '0') στη συνέχεια RedA (Ck) <= '1' ? RedA (0) <= '0'; ΕΞΟΔΟΣ; τέλος εαν;

εάν (GreenA (0) = '1') και [RedA (ck) = '0') και [GreenA (ck) = '0') τότε

GreenA (Ck) <= '1'; GreenA (0) - Red Player GreenA (0) <= '0'; εάν (NCursorCol = OCursorCol) τότε - Εάν δεν πατήθηκε τίποτα RedA (0) <= '1'; elsif (NCursorCol = "111") στη συνέχεια - Εάν το Lbtn πιεζόταν RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") τότε - εάν το Rbtn πιέστηκε RedB (0) <= '1'; RedA (0) - Green Player RedA (0) <= '0'; εάν (NCursorCol = OCursorCol) τότε GreenA (0) <= '1'; elsif (NCursorCol = "111") στη συνέχεια GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001") στη συνέχεια GreenB (0) <= '1'; GreenA (0) <= '0'; τέλος εαν; τελική περίπτωση?

Σημείωση, η πρώτη πρόταση περίπτωσης που ονομάζεται: OCursorCol (που σημαίνει Στήλη Old Cursor) είναι η αρχή της μηχανής πεπερασμένης κατάστασης. Κάθε στήλη της οθόνης αντιμετωπίζεται ως η δική της κατάσταση στο FSM. Υπάρχουν 8 στήλες, οπότε χρησιμοποιήθηκε ένα δυαδικό σύνολο 3 bit για τον προσδιορισμό κάθε στήλης ως κατάστασης. Το πώς κινείται το FSM μεταξύ της κατάστασης εξαρτάται από το κουμπί που πατάτε. Στο παραπάνω απόσπασμα, αν πατήσετε το αριστερό κουμπί, το FSM θα μετακινηθεί στο "111" που θα ήταν η τελευταία στήλη της οθόνης. Εάν πατήσετε το δεξί κουμπί, το FSM θα μετακινηθεί στο "001" που θα ήταν η δεύτερη στήλη της οθόνης.

Εάν πατηθεί το μεσαίο κουμπί, το FSM ΔΕΝ θα μετακινηθεί σε νέα κατάσταση αλλά θα προκαλέσει μια αλλαγή στο σήμα TurnState, το οποίο είναι ένα σήμα ενός bit για να σημειωθεί η σειρά του παίκτη είναι. Επιπλέον, το μεσαίο κουμπί θα εκτελέσει ένα μπλοκ κώδικα που ελέγχει εάν υπάρχει μια κενή σειρά στο κάτω μέρος μέχρι το επάνω μέρος. Θα προσπαθήσει να τοποθετήσει έναν δείκτη στη χαμηλότερη, ανεκπλήρωτη σειρά. Θυμηθείτε, αυτό είναι ένα παιχνίδι Connect Four.

Στη δήλωση ένθεσης περίπτωσης που ονομάζεται: TurnState, αλλάζουμε ποιο είναι το χρώμα του δρομέα και ποια στήλη στην πρώτη γραμμή θέλουμε να αλλάξουμε τα δεδομένα, έτσι ώστε η διαδικασία εμφάνισης να αντικατοπτρίζει την αλλαγή.

Επαναλαμβάνουμε αυτόν τον βασικό κωδικό για τις υπόλοιπες επτά περιπτώσεις. Το διάγραμμα FSM μπορεί να είναι χρήσιμο για να καταλάβετε πώς αλλάζουν οι καταστάσεις.

Βήμα 5: Κωδικός

Κώδικας
Κώδικας

Αυτός είναι ο λειτουργικός κώδικας για το Connect 4 που μπορεί να καταρτιστεί σε VHDL χρησιμοποιώντας το Λογισμικό Vivado.

Παρέχεται επίσης ένας περιορισμός που σας επιτρέπει να ξεκινήσετε το παιχνίδι.

Παρέχουμε ένα μπλοκ διάγραμμα το οποίο εξηγεί πώς συνδέονται οι είσοδοι και οι έξοδοι κάθε διαδικασίας.

Συνιστάται: