Menempatkan game "Snake" di papan tempat memotong roti. Bagian 1: mesin negara

Di waktu luang, anak saya dan saya belajar elektronik digital. Baru-baru ini, kita sampai pada bab tentang mesin negara yang terbatas. Topik ini penuh dengan tugas-tugas khas, seperti semaphore atau mesin penjual otomatis. Tetapi mereka semua membosankan dan terlalu sederhana, dan beberapa secara umum, terus terang, dibuat-buat. Setelah mempelajari contoh-contoh sederhana, saya ingin melakukan sesuatu yang lebih menarik dan kompleks. Permainan klasik "ular" menarik perhatian saya (anak saya memainkannya di telepon), dan saya menyarankan membuatnya di mesin negara. Bagaimanapun, keadaan gim ini cukup final (terutama jika Anda membatasi diri ke bidang kecil), dan dari input hanya ada 4 tombol. Dan inilah yang kami dapatkan.


Permainan Snake (dia adalah ular, ular sanca, boa constrictor, dll.) Dikenal luas oleh semua orang. Dia berasal dari tahun 70-an yang jauh, tetapi saya tidak akan mengulangi ceritanya, yang dapat Anda baca di Wikipedia atau banyak artikel tentang HabrΓ©. Gim ini memiliki aturan yang cukup sederhana dan pada saat yang sama kecanduan gameplay)) Berkat ini, sering digunakan untuk tutorial atau contoh kode . Dalam bahasa pemrograman tingkat tinggi, membuat game seperti itu cukup mudah. Tetapi dalam kondisi yang lebih terbatas, yang paling menarik dimulai, misalnya, implementasi pada LabVIEW . Ada juga banyak pilihan pada FPGA: tautan 1 , tautan 2 , tautan 3, Tautan 4 . Tetapi belum ada opsi tunggal pada terpisah TTL-chip seri standar. Jadi itulah yang akan kami lakukan.

Tampaknya solusi FPGA adalah yang terdekat bagi kami, dan Anda dapat meminjam banyak dari sana? Tetapi dalam semua opsi yang saya lihat, mereka mudah tersebar oleh register kiri dan kanan. Misalnya, sangat sering bit atau angka terpisah dialokasikan untuk setiap sel bidang. Kita tidak dapat melakukan ini dengan bubuk longgar, karena setiap register baru adalah mikrosirkuit terpisah yang perlu ditempatkan di suatu tempat, dan kemudian dihubungkan. Karena itu, kami mencoret semua pengalaman yang diakumulasikan oleh pengembang lain dan akan melakukan semuanya dari awal. Sebagai bonus, kami akan mengumpulkan semua yang ada di chip domestik (dan lebih baik - Soviet) dari seri k555 / kr1533, dengan pengecualian ROM, yang harus diambil segar.

Perumusan masalah


Kami akan memiliki batasan seperti itu: bidang ukuran 8 Γ— 8 sel ( matriks LED Cina ), panjang ekor 8 sel. Seekor ular dapat melewati dinding, tetapi kami tidak akan memproses persimpangan dengan ekor pada awalnya (agar tidak menyulitkan desain, Anda dapat menambahkan ini nanti). Untuk menggambarkan seluruh kondisi permainan yang kita butuhkan:

  1. Posisi kepala (X = 0..7, Y = 0..7, 6 bit)
  2. Arah gerakan (↑ ↓ ← β†’, 2 bit)
  3. Posisi Apple (X, Y, 6 Bit)
  4. Panjang Ekor (0..7, 3 bit)
  5. Posisi sel-sel ekor (dari 0 hingga 7 buah masing-masing 6 bit)

Secara total, 65 bit diperoleh, bahkan jika kita mengambil register masing-masing 8 bit, hanya 8 sirkuit mikro seperti itu (dan satu pemicu lagi) yang diperlukan untuk menyimpan keadaan, ini cukup banyak.

Tetapi ekor tidak dapat ditemukan di mana pun ia inginkan, ia "tumbuh" dari kepala. Oleh karena itu, kita tidak dapat menyimpan koordinat penuh dari setiap bagian dari ekor, tetapi hanya arah ke arah mana dari sel sebelumnya (atau kepala) yang perlu digambar. Kemudian, bukannya 6 Γ— 8 = 48 bit, kita membutuhkan 4 Γ— 8 = 16 bit, dan ini adalah penghematan sebanyak empat kasing register!

Mesin otomatis


Mari kita coba melakukan semuanya pada mesin yang mirip dengan Moore atau Miles. Untuk mengimplementasikan otomat seperti itu, cukup memiliki sedikit memori keadaan (register) dan logika kombinasional untuk beralih di antara mereka.


Gambar Wikipedia

Biasanya mesin negara digambarkan sebagai grafik negara dan transisi di antara mereka. Terkadang lebih mudah untuk membuat tabel transisi ke keadaan baru, contoh paling sederhana (dari Wikipedia):

Anda dapat menemukan lebih banyak informasi dan gambar-gambar indah, misalnya, dalam artikel ini di HabrΓ©

Penyimpangan kecil
, , . , ROM , ROM. ( , ).

, , .


, Β« Β» .



Seekor ular dari berbagai negara (jika Anda tidak memperhitungkan posisi apel) dapat memiliki 2 ^ 8 + 2 ^ 10 + ... + 2 ^ 24 β‰ˆ 32 juta. Tidak mungkin untuk menuliskannya di tabel, dan terlebih lagi untuk menggambar grafik transisi. Tetapi sebagian besar transisi cukup sama (kepala hanya bergerak satu sel yang berdekatan, dan ekor bergerak satu bagian per putaran). Dalam hal ini, kita tidak dapat menggambarkan masing-masing negara bagian, tetapi merumuskan negara baru sebagai fungsi dari yang sebelumnya. Selain itu, kita dapat membagi seluruh permainan menjadi beberapa automata paralel: 1) mesin otomatis arah, 2) mesin otomatis posisi kepala, 3) mesin otomatis untuk ekor. Dan untuk mengatur masing-masing karena akan lebih mudah:

1) ,  β”‚  
  ────────────────────┼───────────────────
   ←        ←/↓/↑     β”‚ ←
   ←          β†’       β”‚ β†’
   ↑        ↑/←/β†’     β”‚ ↑
   ↑          ↓       β”‚ ↓
   ......          β”‚

2) ,  β”‚  
  ─────────────────────┼──────────────
   ←             (x,y) β”‚ (x-1, y)
   β†’             (x,y) β”‚ (x+1, y)
   ↑             (x,y) β”‚ (x, y-1)
   ↓             (x,y) β”‚ (x, y+1)

3) ,                       β”‚  
  ─────────────────────────────────────────┼──────────────────────────
   ←            (t1,t2,t3,t4,t5,t6,t7,t8)  β”‚ (←,t1,t2,t3,t4,t5,t6,t7)
   ......                               β”‚


Arah


Mari kita mulai dengan mesin directional. Jika Anda berpikir dengan hati-hati, Anda dapat menyusunnya pada logika yang terpisah. Tetapi, karena tugas secara keseluruhan agak besar, saya memutuskan bahwa akan lebih mudah untuk membuat tabel pencarian dari EEPROM, dan menulis tabel transisi secara manual. Ini akan memiliki 6 input, yang berarti hanya 64 nilai, yang dapat kita arahkan ke hex editor.



Kepala


Untuk mesin posisi kepala, menulis tabel seperti itu akan jauh lebih sulit. Tetapi pada dasarnya hanya berisi 2 operasi: +1 dan -1. Mereka dapat diimplementasikan pada penambah 4-bit K155IM6. Untuk +1, kami akan menambahkan koordinat kami dengan b'0001, dan untuk -1 dengan b'1111 (yang sebenarnya adalah -1 dalam kode tambahan ). Kita akan membutuhkan dua adders (untuk x dan y), sedikit logika, dan kita akan menyimpan status dalam register IR27 8-bit (kita masih membutuhkan banyak dari mereka):



Mari kita kumpulkan di papan tulis, dan untuk verifikasi kita akan segera menghubungkan matriks LED dengan dua decoder. Dekoder dengan output terbalik adalah ID7, dan untuk yang langsung dimungkinkan untuk mengambil K561ID1 (CD4028), tetapi saya tidak memilikinya. Pilihan lain adalah mengambil 8 transistor sebagai kunci, tetapi saya tidak ingin melakukan ini, jadi saya harus dengan bodoh menghabiskan EEPROM lain (hanya menulis 8 sel di sana). Logika posisi kepala baru di papan terpisah di atas penyimpangan lain





Mari kita istirahat sejenak dan menyimpan papan tempat memotong roti (dan beberapa kasing chip). Kami akan kembali mengambil keuntungan dari fakta bahwa setiap rangkaian kombinasi dapat diganti oleh LUT dengan menulis tabel ke ROM. Tetapi bagaimana melakukan ini untuk meja yang begitu besar? Kami akan menggunakan trik lain - kami akan melakukan yang sebaliknya: ganti EEPROM dengan rangkaian logika kami dan memasukkannya ke dalam programmer. Kaki yang tidak digunakan terhubung ke tanah melalui resistor. (Ini tidak bisa dilakukan jika Anda mempelajari pengaturan programmer) Sekarang kita akan membaca diagram logika kita sebagai ROM dan mendapatkan tabel. Kami menulisnya dengan programmer yang sama ke dalam EEPROM nyata, yang kami tempatkan bukan rangkaian elemen yang terpisah.







Ekor


Ekor memiliki panjang (dalam batasan kita) dari 2 hingga 8 sel. Untuk menyimpan panjang ini, Anda dapat menggunakan penghitung konvensional dengan input resolusi akun. Bahkan, itu akan menjadi mesin negara terbatas yang sama, di mana negara baru S 'akan sama dengan S +1 atau hanya S (jika akun itu dilarang). Ekor itu sendiri (atau lebih tepatnya, arah pertumbuhannya) kita akan menyimpan dalam dua register 8 bit. Secara teoritis, orang dapat mengambil register geser yang sudah jadi (misalnya, IR8), tetapi mereka tidak siap, sehingga IR27 yang sama digunakan. Pada setiap langkah, arah gerakan kepala saat ini ditulis dalam bit pertama dari register, dan nilai yang sebelumnya di kedua dan berikutnya. Untuk mendapatkan arah pertumbuhan ekor, kita hanya perlu membalik sedikit. Anda dapat melakukan ini segera saat merekam, tetapi saya memutuskan lebih baik meninggalkan invers untuk sirkuit yang tersisa.

Skema


Secara total, mesin langkah kami berikutnya mengambil formulir ini: Gambar ini (seperti orang lain) dapat diklik. Ini adalah bagian yang agak β€œmurni” (dari sudut pandang teoretis) dari skema ini. Contoh yang hampir sempurna untuk mesin kode keluaran Moore . U1 bertanggung jawab untuk arah baru, U2 untuk posisi kepala, yang disimpan di U5. U3 dan U4 digunakan untuk ekor, dan panjangnya disimpan (dan meningkat) di U6. Selanjutnya, kita perlu membuat tampilan semua yang kita miliki di layar, dan juga akan ada pesawat ruang angkasa, hanya dalam bentuk yang lebih kotor. Serta generator bilangan acak primitif, transisi antara sirkuit dengan sinyal clock berbeda dan peretasan lainnya.







Subtotal


Saya harap artikel ini menarik bagi Anda dan saya akan mencoba untuk menyelesaikan bagian kedua dengan cepat.

Dan jika Anda sudah merobek pertempuran, diisi dengan papan tempat memotong roti, microchip dan layar dot, maka file dengan sirkuit ROM dan firmware terpasang ke artikel ini. Mini-spoiler: untuk mengulangi desain Anda membutuhkan sekitar 6 prototipe, 4 EEPROM 28C16 dan sedikit lebih dari dua lusin chip lainnya.

Yah, sebagaimana mestinya: seperti, berbagi, retweet, mendaftar, tekan bel, dll ...)) Dan untuk hari ini semuanya, terima kasih atas perhatian Anda! Bersambung…



Arsip dengan firmware ROM dan skema

UPD umum : bagian kedua tersedia di sini .

All Articles