Daftar Isi:

VHDL Basys3: Hubungkan 4 Game: 5 Langkah
VHDL Basys3: Hubungkan 4 Game: 5 Langkah

Video: VHDL Basys3: Hubungkan 4 Game: 5 Langkah

Video: VHDL Basys3: Hubungkan 4 Game: 5 Langkah
Video: How to code Verilog for a servo! Using the basys2 FPGA board. 2024, November
Anonim
VHDL Basys3: Hubungkan 4 Game
VHDL Basys3: Hubungkan 4 Game

Pengantar:

Ini adalah Connect 4 Digital Logic Game yang dirancang dalam VHDL menggunakan Perangkat Lunak Vivado dan diprogram ke Basys3 Board. Konstruksi dan desain proyek ini menengah, tetapi pendatang baru dapat menyalin langkah-langkah dan membangun game digital.

Gim ini beroperasi seperti gim Connect 4. Pemain dapat memindahkan kursor mereka melintasi layar menggunakan tombol kiri dan kanan yang ada di papan. Menekan tombol tengah di papan akan menyebabkan pemain menempatkan penanda mereka di kolom itu dan kemudian giliran pemain berikutnya. Setelah pemain menang, permainan dapat diatur ulang dengan menekan tombol atas di papan.

Langkah 1: Detail Cepat dan Bahan

Detail Teknis Cepat:

  • Memanfaatkan tiga set koneksi PMOD di papan (JA, JB, JC)

    • 8 Pin (Tidak Termasuk Pin Vcc & GND) yang digunakan untuk setiap konektor PMOD
    • JA - Kontrol Baris
    • JB - Kontrol Kolom Hijau
    • JC - Kontrol Kolom Merah
  • Jam layar beroperasi pada 960Hz

    Hanya 8 LED yang menyala pada waktu tertentu. Layar disegarkan dengan kecepatan clock yang cukup cepat sehingga memberikan ilusi bahwa lebih dari 8 LED menyala pada waktu tertentu

  • Jam tombol beroperasi pada 5Hz; Opsional dapat didenda disetel dengan mengedit kode VHDL.
  • Resistansi internal Darlington Arrays cukup untuk mencegah pemadaman LED

Gim ini dibangun menggunakan komponen dan alat berikut:

  • (1) Papan Basys3
  • (2) Matriks LED Bi-warna 8x5:
  • (2) ULN2803 - Array Transistor Darlington - Lembar Data
  • gulungan kawat
  • Kabel Jumper
  • Pengupas Kawat
  • Breadboards (Large Square sudah cukup)
  • Multimeter dan Catu Daya (Pemecahan Masalah)

Langkah 2: Menghubungkan Perangkat Keras

Menghubungkan Perangkat Keras
Menghubungkan Perangkat Keras
Menghubungkan Perangkat Keras
Menghubungkan Perangkat Keras

Pedoman:

Pengkabelan proyek bisa sangat berbelit-belit, harap luangkan waktu Anda dan verifikasi bahwa semua koneksi sudah benar satu per satu.

Proyek ini melibatkan penggunaan dua layar LED tetapi digabungkan untuk membentuk satu layar besar. Ini dapat dicapai dengan menghubungkan semua baris ke titik yang sama. Karena setiap layar adalah dua warna, baris merah dan hijau dari satu layar juga harus diikat ke baris merah dan hijau dari layar lainnya. Dengan melakukan ini, kita dapat mengontrol semua baris hanya dengan 8 pin. 16 pin lainnya digunakan untuk mengontrol kolom tampilan. 8 pin untuk dapat dihubungkan langsung melalui kabel jumper ke konektor pmod. Koneksi Pmod pertama masuk ke input ULN2083A dan output ULN2083A terhubung langsung ke kolom di layar. Karena desainnya berukuran 8x8, beberapa kolom secara fisik tidak akan terhubung.

  • JA: Koneksi baris: Baris 1 hingga JA:1 hingga Baris 8 untuk JA:10.
  • JA: Koneksi Kolom Merah:
  • JC: Koneksi Kolom Hijau

Silakan lihat gambar yang diposting untuk mengetahui pin mana yang sesuai dengan baris/kolom mana.

Catatan: Transistor memiliki resistansi bawaan, sehingga LED tidak memerlukan resistansi tambahan untuk dihubungkan secara seri.

Langkah 3: Penjelasan Teknis: Layar

Layar beroperasi pada kegigihan visi. Layar menyegarkan begitu cepat, sehingga mata manusia tidak dapat mendeteksi dengan jelas bahwa beberapa LED dimatikan dan dihidupkan dengan cepat. Bahkan, dengan memperlambat tampilan jam, seseorang dapat melihat kedipan.

Layar menyalakan semua delapan baris sesuai dengan data yang disimpan untuk baris tersebut, dan layar menyalakan satu kolom. Kemudian dengan cepat beralih ke entri data berikutnya untuk delapan baris dan menyalakan kolom berikutnya -- sambil menonaktifkan semua kolom lainnya. Proses ini berlanjut pada kecepatan clock yang cukup cepat sehingga kedipan LED menjadi tidak terlalu mencolok.

Penyimpanan data untuk tampilan diinisialisasi segera setelah arsitektur dalam file VHDL dengan cara berikut:

sinyal RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 turun ke 0):= "00000000";

sinyal HijauA, HijauB, HijauC, HijauD, HijauE, HijauF, HijauG, HijauH: std_logic_vector (7 turun ke 0):= "00000000"; -- Data Baris tergantung pada kolom: HIJAU

Berikut cuplikan kecil dari proses yang mengontrol matriks tampilan LED.

-- Proses yang Mengontrol tampilan LED matrixdisplay: proses (ColCLK) -- 0 - 16 untuk menyegarkan variabel matriks 8X8 RED dan 8x8 GREEn RowCount: integer range 0 hingga 16:= 0; mulai if (rising_edge(ColCLK)) lalu if (RowCount = 0) lalu DORow <= RedA; -- Data Baris untuk Kolom DOCol yang sesuai <= "1000000000000000"; -- Pemicu Kolom -- Ulangi kode ini hingga "00000000000000001" -- Ubah ke RedB, RedC…GreenA, GreenB…GreenH

Di akhir GreenH, tepat sebelum proses berakhir, cuplikan ini disertakan untuk mengatur ulang RowCount kembali ke nol.

if (RowCount = 15) then -- Restart refresh dari kolom A RowCount:= 0; lain RowCount:= RowCount + 1; -- Pergeseran melalui kolom berakhir jika;

Sekarang, untuk menjelaskan jam yang ada di daftar sensitivitas proses tampilan. Papan Basys3 memiliki jam internal yang beroperasi pada 100MHz. Untuk tujuan kita, jam ini terlalu cepat sehingga kita perlu membagi jam ini menjadi jam 960Hz menggunakan proses berikut.

-- Proses jam yang beroperasi pada 960HzCLKDdivider: proses (CLK) variabel clkcount: rentang bilangan bulat 0 hingga 52083:= 0; mulai if (rising_edge(CLK)) lalu clkcount:= clkcount + 1; jika (clkcount = 52083) maka ColCLK <= tidak (ColCLK); clkcount:= 0; berakhir jika; berakhir jika; proses akhir;

Langkah 4: Penjelasan Teknis: Mengubah Informasi yang Ditampilkan

Penjelasan Teknis: Mengubah Informasi yang Ditampilkan
Penjelasan Teknis: Mengubah Informasi yang Ditampilkan

Dalam kode VHDL, informasi atau data yang akan ditampilkan ke layar dikendalikan oleh proses kursor, yang memiliki jam berbeda dalam daftar sensitivitasnya. Kode ini disebut BtnCLK, jam yang dirancang untuk meminimalkan pelepasan tombol saat ditekan. Ini disertakan agar jika tombol ditekan, kursor di baris atas tidak bergerak terlalu cepat melintasi kolom.

-- Proses clock beroperasi pada 5 Hz. ButtonCLK: variabel proses (CLK) btnclkcount: rentang bilangan bulat 0 hingga 10000001:= 0; mulai if (rising_edge(CLK)) lalu if (btnclkcount = 10000000) lalu btnclkcount:= 0; BtnCLK <= tidak(BtnCLK); lain btnclkcount:= btnclkcount + 1; berakhir jika; berakhir jika; proses akhir;

Dengan output sinyal BtnCLK dari proses ini, sekarang kita dapat menjelaskan proses kursor. Proses kursor hanya memiliki BtnCLK dalam daftar sensitivitasnya tetapi di blok kode, status tombol dicentang dan ini akan menyebabkan data untuk RedA, RedB…GreenH berubah. Berikut adalah potongan kode kursor, yang mencakup blok reset dan blok untuk kolom pertama.

kursor: proses (BtnCLK) variabel OCursorCol: STD_LOGIC_VECTOR (2 turun ke 0):= "000"; -- OCursorCol melacak variabel kolom sebelumnya NCursorCol: STD_LOGIC_VECTOR (2 turun ke 0):= "000"; -- NCursorCol menyetel kolom kursor baru dimulai --kondisi RESET (Tombol UP) --Board dikosongkan agar game dimulai ulang jika (rising_edge(BtnCLK)) lalu if (RST = '1') lalu RedA <= "00000000"; MerahB <= "00000000"; MerahC <= "00000000"; MerahD <= "00000000"; Merah <= "00000000"; MerahF <= "00000000"; MerahG <= "00000000"; MerahH <= "00000000"; HijauA <= "00000000"; HijauB <= "00000000"; HijauC <= "00000000"; HijauD <= "00000000"; HijauE <= "00000000"; HijauF <= "00000000"; HijauG <= "00000000"; HijauH jika (Lbtn = '1') maka NCursorCol:= "111"; -- Kolom H elsif (Rbtn = '1') lalu NCursorCol:= "001"; -- Kolom B elsif (Cbtn = '1') lalu NCursorCol:= OCursorCol; -- Kolom tetap sama NTurnState <= not(TurnState); -- Memicu giliran pemain berikutnya -- Memeriksa kolom saat ini dari bawah ke atas dan menyalakan LED pertama yang tidak menyala. Warna tergantung pada warna kursor pemain saat ini. untuk ck dalam 7 turun menjadi 1 loop jika (RedA(0) = '1') dan (RedA(ck) = '0') dan (GreenA(ck) = '0') maka RedA(Ck) <= '1'; MerahA(0) <= '0'; KELUAR; berakhir jika;

jika (HijauA(0) = '1') dan (MerahA(ck) = '0') dan (HijauA(ck) = '0') maka

HijauA(Ck) <= '1'; HijauA(0) -- Pemain Merah HijauA(0) <= '0'; if (NCursorCol = OCursorCol) then -- Jika tidak ada yang ditekan RedA(0) <= '1'; elsif (NCursorCol = "111") maka -- Jika Lbtn ditekan RedH(0) <= '1'; MerahA(0) <= '0'; elsif (NCursorCol = "001") maka -- Jika Rbtn ditekan RedB(0) <= '1'; RedA(0) -- Pemain Hijau RedA(0) <= '0'; if (NCursorCol = OCursorCol) maka GreenA(0) <= '1'; elsif (NCursorCol = "111") lalu HijauH(0) <= '1'; HijauA(0) <= '0'; elsif (NCursorCol = "001") lalu HijauB(0) <= '1'; HijauA(0) <= '0'; berakhir jika; kasus akhir;

Catatan, pernyataan kasus pertama yang disebut: OCursorCol (yang merupakan singkatan dari Kolom Kursor Lama) adalah awal dari mesin keadaan hingga. Setiap kolom tampilan diperlakukan sebagai statusnya sendiri di FSM. Ada 8 kolom sehingga set angka biner 3 bit digunakan untuk mengidentifikasi setiap kolom sebagai status. Bagaimana FSM berpindah antar keadaan tergantung pada tombol yang ditekan. Dalam cuplikan di atas, jika tombol kiri ditekan, FSM akan pindah ke "111" yang akan menjadi kolom terakhir tampilan. Jika tombol kanan ditekan, FSM akan berpindah ke "001" yang akan menjadi kolom kedua dari tampilan.

Jika tombol tengah ditekan, FSM TIDAK akan pindah ke keadaan baru tetapi akan memicu perubahan sinyal TurnState, yang merupakan sinyal satu bit untuk mencatat giliran pemain mana. Selain itu, tombol tengah akan menjalankan blok kode yang memeriksa apakah ada baris kosong di bagian paling bawah sampai ke atas. Ini akan mencoba menempatkan penanda di baris terendah yang tidak terisi. Ingat, ini adalah permainan connect four.

Dalam pernyataan kasus bersarang yang disebut: TurnState, kami mengubah warna kursor dan kolom mana pada baris pertama yang ingin kami ubah datanya sehingga proses tampilan dapat mencerminkan perubahan tersebut.

Kami mengulangi kode dasar ini untuk tujuh kasus yang tersisa. Diagram FSM dapat membantu untuk memahami bagaimana keadaan berubah.

Langkah 5: Kode

Kode
Kode

Ini adalah kode fungsional untuk Connect 4 yang dapat dikompilasi dalam VHDL menggunakan Perangkat Lunak Vivado.

Batasan juga disediakan untuk memungkinkan Anda menjalankan dan menjalankan game.

Kami menyediakan diagram blok yang menjelaskan bagaimana input dan output dari setiap proses saling berhubungan.

Direkomendasikan: