Daftar Isi:

Game Mastermind di VHDL: 3 Langkah
Game Mastermind di VHDL: 3 Langkah

Video: Game Mastermind di VHDL: 3 Langkah

Video: Game Mastermind di VHDL: 3 Langkah
Video: Programming Language Tier List 2024, Juli
Anonim
Game Mastermind di VHDL
Game Mastermind di VHDL
Game Mastermind di VHDL
Game Mastermind di VHDL

Untuk proyek kami, kami membuat game "Mastermind" di VHDL untuk dimainkan di papan Basys3. Mastermind adalah permainan pemecah kode yang secara tradisional dimainkan dengan pasak dan papan permainan. Pemain satu menempatkan pasak berbagai macam warna di deretan 4, tersembunyi dari pemain dua. Pemain dua kemudian memiliki jumlah tebakan 'x' yang menempatkan pasak di papan dalam satu baris yang terlihat oleh pemain satu. Setelah setiap tebakan, pemain dua diberitahu tentang 2 angka: berapa banyak pasak dengan warna yang benar, dan berapa banyak pasak yang berada di posisi yang benar dalam barisan. Dengan menggunakan petunjuk itu, pemain dua harus menebak urutan pin yang benar yang ditempatkan pemain satu di nomor tebakan yang diberikan.

Dalam implementasi kami, game ini adalah pemain tunggal. Kombinasi acak pasak dihasilkan oleh program, dan pemain harus menggunakan papan Basys3 untuk menebak urutan yang benar. Ada empat “warna”, yang diwakili oleh nilai biner. Tampilan 7-segmen menunjukkan tiga nilai: sisa putaran, jumlah pin pada posisi yang benar, dan jumlah pin dengan warna yang benar pada posisi yang salah (nilai ini dimulai dari 9, 0, dan 0). Pemain menggunakan sakelar di papan untuk memilih nilai biner untuk tebakannya, dan membalik sakelar lain untuk mengirimkan tebakannya. Jika benar, permainan berakhir dan tampilan 7 segmen menunjukkan “GG”. Jika tidak, penghitung giliran berkurang 1 dan pemain menerima umpan balik berdasarkan berapa banyak pin dalam tebakannya yang cocok dengan warna atau posisi pin dalam kombinasi. Jika pemain kehabisan giliran tanpa menebak dengan benar, layar menunjukkan “GO” (mewakili game over). Pemain juga dapat membalik sakelar reset untuk memulai dari awal kapan saja.

Langkah 1: Bahan

Bahan
Bahan
Bahan
Bahan
Bahan
Bahan

Karena seluruh permainan dapat dimainkan di papan itu sendiri, satu-satunya bahan yang dibutuhkan adalah Basys3 Board, kabel micro USB untuk terhubung ke papan, dan komputer/laptop yang dapat Anda gunakan untuk membuat kode!

Langkah 2: Kode

Kode
Kode
Kode
Kode

Agar game ini dapat bekerja pada FPGA, cara termudah untuk menulisnya adalah dengan membuat state machine. Memiliki mesin negara memungkinkan pengalaman sekuensial dan interaktif yang diperlukan agar game benar-benar berfungsi. Agar semuanya berjalan lancar, mesin status akan didasarkan pada sinyal clock internal FPGA, memastikan semuanya sinkron. Modul utama adalah mesin status dengan empat status; Status Awal (Initial), Status SubmitAnswer (SubAns), Status Tampilan (Dis), dan Status CheckEndGame (CheckEnd). Seiring dengan mesin negara, modul utama memiliki dua submodul, Tampilan Tujuh Segmen 4 digit (yang memiliki submodul ClkDivider sendiri), dan Generator Angka Acak (sebenarnya merupakan generator angka acak psuedo). Ada juga blok proses dasar agar LED di atas setiap sakelar menyala saat dinyalakan sebagai cara bagi orang untuk melihat apa yang mereka masukkan dengan lebih mudah. Gambaran dasar kode dapat dilihat pada peta pikiran yang digambarkan.

Komponen pertama yang harus dilihat adalah Random Number Generator (randomgen). Karena secara teknis tidak mungkin untuk mendapatkan angka acak yang benar yang dihasilkan dari perangkat keras, solusi paling sederhana adalah membuat randomgen benar-benar menjadi Linear-feedback Shift Register (LFSR). LFSR memiliki input clk dan output "a" (nomor 12-bit). Setiap siklus clock, nomor 12-bit baru dihasilkan mulai dari "0000000000001", akhirnya melalui semua kombinasi 12-bit 1 dan 0 sebelum berulang. Output "a" diberikan setiap siklus clock, sehingga terus berjalan sepanjang. Clk dipetakan ke Clk dari modul utama, dan “a” dipetakan ke sinyal RandNum di modul utama.

Submodul kedua adalah Tampilan Tujuh Segmen 4-digit. Ini adalah cara yang cukup mudah untuk menampilkan Tampilan Tujuh Segmen 4 digit. Tampilan diatur pada Clk dari modul utama, namun submodul ini memiliki submodulnya sendiri dari ClkDivider. ClkDivider (diatur ke 1298 Hz) digunakan untuk mempercepat jam untuk Seven Segment sehingga semua digit tampak menyala pada waktu yang sama (karena hanya satu digit yang benar-benar dapat menyala pada satu waktu). Variabel "digit" digunakan untuk menggilir titik-titik pada tampilan, dan dengan setiap digit muncul kondisi tampilan input 4-bit dasar, dengan opsi untuk menampilkan angka 0 hingga 9 dan juga tidak ada apa-apa. Digit kiri terjauh pada tampilan disetel ke nol karena tidak digunakan dalam game ini.

Modul utama terdiri dari mesin negara. Empat status dalam proses adalah Initial, SubAns, Dis, dan CheckEnd. Ketika dalam keadaan awal, jika SubmitBtn (saklar yang digunakan untuk mengirimkan jawaban Anda untuk pemeriksaan) diatur ke '1', maka mesin akan pindah ke Status SubAns. Kapan saja Rbtn (saklar yang digunakan untuk mereset mesin) diatur ke '1', maka mesin kembali ke keadaan Awal. Ketika di SubAns State, ketika SubmitBtn = '0' lagi, itu pindah ke Dis State. Ketika dalam Keadaan Dis, jika Hitung Mundur = 0 (Belok kiri untuk menebak jatuh ke 0) atau jika RSpotCount = 4 (artinya pemain karena semua warna yang benar di tempat yang benar), mesin pergi ke Keadaan CheckEnd. Jika keduanya tidak terjadi, maka ketika SubmitBtn = '1' lagi, ia kembali ke status SubAns untuk memungkinkan tebakan lain. Saat berada di Status CheckEnd, ini adalah akhir dari permainan, dan satu-satunya jalan keluar adalah dengan menekan reset, mengembalikannya ke Status Awal. Ini dapat dengan mudah dilihat dalam diagram state machine. Secara perilaku, Status Awal menginisialisasi semuanya kembali ke posisi awal. Hitung Mundur (sinyal yang menyimpan berapa banyak belokan kiri yang dimiliki pemain) diatur ke 9, RSpotCount (sinyal yang menyimpan berapa banyak warna yang Anda tebak berada di tempat yang tepat) diatur ke 0, RColorCount (sinyal yang menyimpan berapa banyak warna yang Anda tebak benar tetapi di tempat yang salah) diatur ke 0, dan hitung mundur kecil (sinyal yang akhirnya dipetakan ke Hitung Mundur yang sebenarnya mengubah setiap belokan di negara bagian selanjutnya) diatur ke 9. Juga, di Status Awal RandNum (nomor yang dihasilkan secara acak semu) dibagi menjadi empat pemeriksaan berbeda (satu untuk setiap warna 3-bit) dan disimpan ke sinyal pemeriksaan1, pemeriksaan2, pemeriksaan3, pemeriksaan4. Pemeriksaan ini adalah apa yang sebenarnya dibandingkan dengan tebakan Anda, jadi meskipun LFSR selalu menyebabkan RandNum berubah setiap siklus, setelah Anda meninggalkan status Awal, pemeriksaan tetap sama, memungkinkan nilai yang disimpan untuk membandingkan jawaban Anda. Ini juga berarti setiap kali mesin direset, pemain memiliki nilai baru untuk ditebak.

Status SubmitAnswer (SubAns) mengubah pengaktif hitung mundur (sinyal "ubah") menjadi '1'. Ini diperlukan nanti agar pelacakan belokan berfungsi. Setelah itu, status membandingkan input pemain dari sakelar dengan pemeriksaan yang dilakukan di status di atas. Sinyal rs1, rs2, rs3, rs4 dan sinyal rc1, rc2, rc3, rc4 adalah tipe integer yang bergantung pada pernyataan If yang diset ke 1 atau 0. Sinyal rs untuk titik kanan dan rc untuk warna kanan. Misalnya jika warna 1 tebakan pemain sama dengan check1 dari RandNum, maka rs1 = 1 karena itu berarti warna yang tepat ada di tempat yang tepat. Jika warna 1 tidak sama dengan centang1, tetapi sama dengan salah satu dari pemeriksaan lainnya, maka rc = 1. Hal ini dilakukan untuk setiap warna dan setiap pemeriksaan.

Status Tampilan (Dis) pertama-tama mencari pengaktif hitung mundur. Jika '1', maka hitungan mundur kecil turun 1 (jadi pada putaran pertama berubah dari 9 menjadi 8 dst.). Kalau tidak, giliran tidak berubah. Terlepas dari pengaktifan itu, semua nilai rs dari atas ditambahkan dan ditetapkan ke sinyal RSpotCounter. Juga semua nilai rc ditambahkan dan ditetapkan ke RColorCounter. Akhirnya Countdown diberi nilai smallcountdown. Sinyal RSpotCounter, RColorCounter, dan Countdown semuanya dikonversi ke 4-bit std_logic_vectors di luar proses, dan didorong ke submodul tampilan Seven Segment melalui peta port. Dengan cara ini, tampilan menunjukkan hal yang benar sampai Anda mengirimkan jawaban baru.

Status CheckEnd adalah untuk mengetahui apakah Anda menang atau kalah. Jika Anda telah menang (semua 4 warna berada di tempat yang tepat, atau dikenal sebagai RSpotCounter = 4), maka “GG” (secara teknis ditunjukkan sebagai 66) ditampilkan di Seven Segment untuk menunjukkan bahwa Anda telah menang. Jika Anda kalah (Hitung mundur telah mencapai 0) maka "GO" (secara teknis ditunjukkan sebagai 60) ditampilkan pada tampilan untuk Game Over. Dengan salah satu hasil, menekan tombol reset ke hidup akan memindahkan mesin kembali ke keadaan Awal untuk bermain lagi.

Kode Sumber dapat ditemukan di sini.

Langkah 3: Kesimpulan

Menyelesaikan proyek ini mengajari kami banyak hal tentang membangun sirkuit yang lebih rumit. Desain awal kami bukanlah mesin keadaan terbatas. Kami merasa sulit untuk men-debug, dan menulis ulang kode beberapa kali menggunakan metode yang berbeda (termasuk FSM). Atas saran instruktur, kami terjebak dengan pendekatan FSM dan kami dapat menyelesaikan permainan. Kami belajar bahwa jauh lebih efektif untuk merancang kode berdasarkan perangkat keras daripada dengan pendekatan pemrograman tradisional. Kami juga menghadapi beberapa tantangan terkait dengan tampilan tujuh segmen. Mendapatkannya untuk menampilkan banyak angka tanpa "ghosting" itu sulit, dan kami harus menggunakan pembagi jam untuk mencapai ini. Jika kami mengembangkan proyek ini lebih lanjut, kami akan menghubungkan LED berwarna ke Basys3 sehingga pengguna dapat melihat warna (seperti dalam permainan tradisional) daripada representasi numerik warna. Pada akhirnya, kami memperoleh pemahaman yang lebih besar tentang desain sirkuit yang kompleks, aplikasi kehidupan nyata, dan tantangan menggunakan perangkat keras daripada menjalankan simulasi dengan kondisi sempurna.

Direkomendasikan: