Isi kandungan:

Permainan Mastermind dalam VHDL: 3 Langkah
Permainan Mastermind dalam VHDL: 3 Langkah

Video: Permainan Mastermind dalam VHDL: 3 Langkah

Video: Permainan Mastermind dalam VHDL: 3 Langkah
Video: Resident Evil Resistance - How to Play MASTERMIND Against GOOD Survivors - RE 3 Multiplayer Guide 2024, Julai
Anonim
Permainan Mastermind dalam VHDL
Permainan Mastermind dalam VHDL
Permainan Mastermind dalam VHDL
Permainan Mastermind dalam VHDL

Untuk projek kami, kami membuat permainan "Mastermind" di VHDL untuk dimainkan di papan Basys3. Mastermind adalah permainan pemecah kod yang dimainkan secara tradisional dengan pasak dan papan permainan. Pemain satu meletakkan pasak warna pelbagai dalam barisan 4, tersembunyi dari pemain dua. Pemain dua kemudian mempunyai 'x' bilangan tekaan meletakkan pasak di papan berturut-turut yang dapat dilihat oleh pemain. Selepas setiap tekaan, pemain dua diberitahu tentang 2 nombor: berapa banyak pasak warna yang betul, dan berapa banyak pasak berada di kedudukan yang betul di barisan. Dengan menggunakan petunjuk tersebut, pemain dua mesti meneka urutan pin yang betul yang pemain yang ditempatkan dalam nombor yang diperuntukkan.

Dalam pelaksanaan kami, permainan adalah pemain tunggal. Gabungan pasak secara rawak dihasilkan oleh program, dan pemain mesti menggunakan papan Basys3 untuk meneka urutan yang betul. Terdapat empat "warna", yang diwakili oleh nilai binari. Paparan 7 segmen menunjukkan tiga nilai: giliran yang tersisa, jumlah pin pada kedudukan yang betul, dan bilangan pin yang warna yang betul pada kedudukan yang salah (nilai ini bermula pada 9, 0, dan 0). Pemain menggunakan suis di papan untuk memilih nilai binari untuk tekaannya, dan membalikkan suis lain untuk menyerahkan tekaan. Sekiranya betul, permainan akan berakhir dan paparan 7 segmen menunjukkan "GG." Sekiranya tidak, kaunter giliran berkurang sebanyak 1 dan pemain menerima maklum balas berdasarkan berapa banyak pin pada tekaannya sesuai dengan warna atau kedudukan pin dalam kombinasi. Sekiranya pemain habis bergilir tanpa meneka dengan betul, paparan menunjukkan “GO” (mewakili permainan berakhir). Pemain juga boleh membalikkan suis tetapan semula untuk memulakannya pada bila-bila masa.

Langkah 1: Bahan

Bahan
Bahan
Bahan
Bahan
Bahan
Bahan

Oleh kerana keseluruhan permainan dapat dimainkan di papan itu sendiri, satu-satunya bahan yang diperlukan ialah Papan Basys3, kabel USB mikro untuk disambungkan ke papan, dan komputer / komputer riba yang boleh anda gunakan untuk membuat kod!

Langkah 2: Kodnya

Kod tersebut
Kod tersebut
Kod tersebut
Kod tersebut

Agar permainan ini dapat berfungsi pada FPGA, cara paling mudah untuk menulisnya adalah dengan membuat mesin negara. Memiliki mesin keadaan membolehkan pengalaman berurutan dan interaktif yang diperlukan agar permainan benar-benar berfungsi. Agar semuanya berjalan lancar, mesin keadaan akan berdasarkan isyarat jam dalaman FPGA, memastikan semuanya selari. Modul utama adalah mesin keadaan dengan empat keadaan; Status Permulaan (Initial), SubmitAnswer State (SubAns), Display State (Dis), dan CheckEndGame State (CheckEnd). Bersama dengan mesin negara, modul utama mempunyai dua submodul, Paparan Tujuh Segmen 4 digit (yang mempunyai submodul ClkDivider sendiri), dan Penjana Nombor Rawak (sebenarnya penjana nombor rawak psuedo). Terdapat juga blok proses asas untuk menghidupkan LED di atas setiap suis ketika dihidupkan sebagai cara bagi orang untuk melihat apa yang mereka masukkan lebih mudah. Gambaran keseluruhan kod asas dapat dilihat pada peta minda yang digambarkan.

Komponen pertama yang perlu dilihat ialah Penjana Nombor Rawak (randomgen). Oleh kerana secara teknikal tidak mustahil untuk mendapatkan nombor rawak sebenar yang dihasilkan dari perkakasan, maka penyelesaian yang paling mudah adalah dengan menggunakan randomgen sebenarnya sebagai Linear-feedback Shift Register (LFSR). LFSR mempunyai input clk dan output "a" (nombor 12-bit). Setiap pusingan jam, nombor 12-bit baru dihasilkan bermula dari "000000000001", akhirnya melalui semua kombinasi 12-bit 1 dan 0 sebelum mengulanginya sendiri. Output "a" diberikan setiap pusingan jam, sehingga terus berjalan sepanjang masa. Clk dipetakan ke Clk dari modul utama, dan "a" dipetakan ke isyarat RandNum di modul utama.

Submodul kedua ialah Paparan Tujuh Segmen 4 digit. Ini adalah cara yang cukup mudah untuk menunjukkan Paparan Tujuh Segmen 4 digit. Paparan diatur pada Clk dari modul utama, namun submodule ini mempunyai submodule sendiri dari ClkDivider. ClkDivider (diset ke 1298 Hz) digunakan untuk mempercepat jam untuk Segmen Tujuh sehingga semua digit kelihatan aktif pada masa yang sama (kerana hanya satu digit yang sebenarnya dapat menyala pada satu masa). Pemboleh ubah "digit" digunakan untuk menelusuri titik-titik di layar, dan dengan setiap digit muncul syarat paparan input 4-bit asas, dengan pilihan untuk menunjukkan angka 0 hingga 9 dan juga tidak ada. Digit kiri paling jauh pada paparan tidak digunakan kerana ia tidak digunakan dalam permainan ini.

Modul utama terdiri daripada mesin keadaan. Keempat keadaan dalam proses tersebut adalah Initial, SubAns, Dis, dan CheckEnd. Ketika dalam keadaan awal, jika SubmitBtn (suis yang digunakan untuk mengirimkan jawapan anda untuk diperiksa) diatur ke '1', mesin akan beralih ke Negeri SubAns. Bila-bila masa Rbtn (suis digunakan untuk menetapkan semula mesin) ditetapkan ke '1', maka mesin kembali ke keadaan awal. Ketika berada di SubAns State, ketika SubmitBtn = ‘0’ lagi, ia bergerak ke Dis State. Ketika berada di Dis State, jika Countdown = 0 (Belok kiri untuk menebak jatuh ke 0) atau jika RSpotCount = 4 (bermaksud pemain sebagai semua warna yang betul di tempat yang betul), mesin pergi ke CheckEnd State. Sekiranya tidak ada yang berlaku, maka apabila SubmitBtn = ‘1’ lagi, ia akan kembali ke keadaan SubAns untuk membenarkan tekaan lain. Ketika berada di CheckEnd State, ini adalah akhir permainan, dan satu-satunya jalan keluar adalah dengan menekan semula, mengembalikannya ke Status Permulaan. Ini dapat dilihat dengan mudah dalam gambarajah mesin keadaan. Secara tingkah laku Keadaan Awal memulakan semuanya kembali ke kedudukan permulaan. Countdown (isyarat yang menyimpan berapa banyak giliran kiri pemain) ditetapkan ke 9, RSpotCount (isyarat yang menyimpan berapa banyak warna yang anda duga berada di tempat yang tepat) ditetapkan ke 0, RColorCount (isyarat yang menyimpan berapa banyak warna yang anda duga betul tetapi di tempat yang salah) diatur ke 0, dan hitung kecil (isyarat yang akhirnya dipetakan ke Countdown yang sebenarnya mengubah setiap giliran di negeri kemudian) ditetapkan ke 9. Juga, di Negeri Permulaan, RandNum (psuedo-random number number) dibahagikan kepada empat cek berbeza (satu untuk setiap warna 3-bit) dan disimpan ke isyarat check1, check2, check3, check4. Pemeriksaan ini adalah perbandingan sebenar tekaan anda, jadi walaupun LFSR selalu menyebabkan RandNum berubah setiap kitaran, sebaik sahaja anda meninggalkan keadaan Awal, cek tetap sama, sehingga nilai yang disimpan dapat dibandingkan dengan jawapan anda. Ini juga bermaksud bila mesin diset semula, pemain mempunyai nilai baru untuk diteka.

SubmitAnswer State (SubAns) mengubah pemboleh ubah undur (isyarat “ubah”) menjadi ‘1’. Ini diperlukan kemudian agar penjejakan giliran berfungsi. Selepas itu, keadaan membandingkan input pemain dari suis ke pemeriksaan yang dibuat dalam keadaan di atas. Isyarat rs1, rs2, rs3, rs4 dan isyarat rc1, rc2, rc3, rc4 adalah jenis integer yang bergantung kepada pernyataan If diatur ke 1 atau 0. Sinyal rs adalah untuk tempat yang tepat dan rc untuk warna yang tepat. Contohnya jika tekaan pemain warna 1 sama dengan tanda 1 RandNum, maka rs1 = 1 kerana itu bermaksud warna yang tepat berada di tempat yang tepat. Sekiranya warna 1 tidak sama dengan tanda semak1, tetapi sama dengan tanda cek yang lain, maka rc = 1. Ini dilakukan untuk setiap warna dan setiap cek.

Status Paparan (Dis) pertama kali mencari pemboleh undur. Sekiranya ia adalah '1', maka jumlah kecil akan turun 1 (jadi pada giliran pertama ia akan berubah dari 9 hingga 8 dll). Jika tidak, giliran tidak berubah. Terlepas dari yang diaktifkan, semua nilai rs dari atas ditambahkan dan ditugaskan untuk memberi isyarat RSpotCounter. Juga semua nilai rc ditambahkan dan diberikan ke RColorCounter. Akhirnya Countdown diberikan nilai hitungan kecil. Sinyal RSpotCounter, RColorCounter, dan Countdown semuanya ditukar menjadi std_logic_vectors 4-bit di luar proses, dan didorong ke submodul paparan Seven Segment melalui peta port. Dengan cara ini, paparan menunjukkan perkara yang betul sehingga anda mengemukakan jawapan baru.

CheckEnd State adalah sama ada anda menang atau kalah. Sekiranya anda telah menang (semua 4 warna berada di tempat yang tepat, atau dikenali sebagai RSpotCounter = 4), maka "GG" (ditunjukkan secara teknis sebagai 66) akan ditampilkan di Segmen Tujuh untuk menunjukkan bahawa anda telah menang. Sekiranya anda kalah (Countdown telah mencapai 0) maka "GO" (ditunjukkan secara teknikal sebagai 60) akan dipaparkan pada paparan Game Over. Dengan mana-mana hasilnya, menekan suis reset ke hidup akan menggerakkan mesin kembali ke keadaan awal untuk dimainkan semula.

Kod Sumber boleh didapati di sini.

Langkah 3: Kesimpulannya

Menyiapkan projek ini banyak mengajar kita tentang membina litar yang lebih rumit. Reka bentuk awal kami bukan mesin keadaan terhingga. Kami sukar untuk melakukan debug, dan menulis semula kod tersebut beberapa kali menggunakan kaedah yang berbeza (termasuk FSM). Atas cadangan jurulatih, kami bertahan dengan pendekatan FSM dan kami dapat menyelesaikan permainan. Kami belajar bahawa jauh lebih berkesan untuk merancang kod berdasarkan perkakasan daripada dengan pendekatan pengaturcaraan tradisional. Kami juga menghadapi beberapa cabaran yang berkaitan dengan paparan tujuh segmen. Mendapatkannya untuk memaparkan banyak nombor tanpa “ghosting” adalah sukar, dan kami harus menggunakan pembahagi jam untuk mencapainya. Sekiranya kita mengembangkan projek ini lebih jauh, kita akan menyambungkan LED berwarna ke Basys3 sehingga pengguna dapat melihat warna (seperti dalam permainan tradisional) dan bukan representasi warna. Pada akhirnya, kami memperoleh pemahaman yang lebih besar mengenai reka bentuk litar kompleks, aplikasi kehidupan nyata, dan cabaran menggunakan perkakasan daripada menjalankan simulasi dengan keadaan yang sempurna.

Disyorkan: