Mundarija:
Video: VHDL -dagi mastermind o'yini: 3 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:27
Loyihamiz uchun biz VHDLda "Mastermind" o'yinini yaratdik, uni Basys3 doskasida o'ynaymiz. Mastermind-bu an'anaviy tarzda qoziqlar va o'yin taxtasi bilan o'ynaydigan kodni buzuvchi o'yin. Bir o'yinchi, ikkinchi o'yinchidan yashirilgan, 4 ta qatorga turli xil rangdagi qoziqlarni qo'yadi. Ikkinchi o'yinchi "x" sonli taxminlarga ega bo'lib, taxtaga qoziqlarni birinchi o'yinchiga ko'rinadigan qilib qo'yadi. Har bir taxmindan so'ng, ikkinchi o'yinchiga 2 ta raqam ma'lum qilinadi: qoziqlarning qanchasi to'g'ri rangda va qancha qoziqlar qatorda to'g'ri holatda. Bu maslahatlardan foydalanib, ikkinchi o'yinchi ajratilgan raqamga qo'yilgan o'yinchi qo'ygan pinlarning to'g'ri ketma -ketligini taxmin qilishi kerak.
Bizning amaliyotimizda o'yin yagona o'yinchi. Dastur qoziqlarning tasodifiy kombinatsiyasini yaratadi va o'yinchi to'g'ri ketma -ketlikni aniqlash uchun Basys3 taxtasidan foydalanishi kerak. Ikkilik qiymatlar bilan ifodalangan to'rtta "rang" mavjud. 7 segmentli displeyda uchta qiymat ko'rsatiladi: qolgan burilishlar, to'g'ri holatdagi pinlar soni va noto'g'ri rangdagi to'g'ri rangdagi pinlar soni (bu qiymatlar 9, 0 va 0 dan boshlanadi). O'yinchi o'z taxminlari uchun ikkilik qiymatlarni tanlash uchun taxtadagi kalitlardan foydalanadi va taxminni yuborish uchun boshqa kalitni aylantiradi. Agar ular to'g'ri bo'lsa, o'yin tugaydi va 7 segmentli displeyda "GG" ko'rsatiladi. Aks holda, burilish hisoblagichi 1 ga kamayadi va o'yinchi ularning taxminida qancha pinlar kombinatsiyadagi pimlarning rangi yoki holatiga mos kelishiga qarab fikr oladi. Agar o'yinchi to'g'ri taxmin qilmasdan navbat bilan tugasa, displeyda "GO" ko'rsatiladi (o'yin tugaganini bildiradi). Shuningdek, o'yinchi istalgan vaqtda qayta boshlash uchun reset tugmachasini aylantirishi mumkin.
1 -qadam: materiallar
Butun o'yinni doskaning o'zida o'ynash mumkin bo'lgani uchun, faqat Basys3 taxtasi, taxtaga ulanish uchun mikro USB kabeli va kodlash uchun foydalaniladigan kompyuter/noutbuk kerak bo'ladi!
2 -qadam: Kod
Ushbu o'yin FPGA -da ishlashi uchun uni yozishning eng oddiy usuli shtat mashinasini yaratish bo'ladi. Davlat mashinasiga ega bo'lish o'yinning ishlashi uchun zarur bo'lgan ketma -ket va interaktiv tajribaga imkon beradi. Har bir narsa muammosiz ishlashi uchun davlat mashinasi FPGA -ning ichki soat signaliga asoslanadi va hamma narsa sinxronlashini ta'minlaydi. Asosiy modul - bu to'rtta holatga ega bo'lgan davlat mashinasi; Boshlang'ich holat (boshlang'ich), SubmitAnswer holati (SubAns), ko'rsatish holati (Dis) va CheckEndGame holati (CheckEnd). Davlat mashinasi bilan bir qatorda, asosiy modulda ikkita submodul, 4 xonali Seven segment displeyi (o'z ClkDivider submodulasi bor) va tasodifiy sonlar generatori (aslida psuedo-tasodifiy sonlar generatori) mavjud. Odamlar nima kiritayotganini osonroq ko'rish uchun, har bir kalit ustidagi LEDni yoqish uchun asosiy texnologik blok mavjud. Kodning asosiy ko'rinishini rasmdagi aqliy xaritada ko'rish mumkin.
Birinchi komponent - tasodifiy sonlar generatori (randomgen). Texnik uskuna yordamida tasodifiy sonlarni olish texnik jihatdan imkonsiz bo'lgani uchun, eng oddiy echim tasodifiy chiziqli chiziqli teskari aloqa almashish reestri (LFSR) bo'lishi edi. LFSRda clk kiritish va "a" (12-bitli raqam) chiqishi mavjud. Har bir soat tsiklida "000000000001" dan boshlab yangi 12-bitli raqam ishlab chiqariladi va oxir-oqibat takrorlanishidan oldin 1 va 0 ning 12-bitli barcha kombinatsiyalaridan o'tadi. "A" chiqishi har bir tsiklda beriladi, shuning uchun u doimiy ravishda ishlaydi. Clk asosiy moduldan Clk -ga, "a" esa asosiy moduldagi RandNum signaliga xaritalanadi.
Ikkinchi submodul-bu 4 xonali etti segmentli displey. Bu 4 xonali etti segmentli displeyni namoyish qilishning juda oddiy usuli. Displey Clk -da asosiy moduldan o'rnatiladi, lekin bu submodul o'zining ClkDivider submoduliga ega. ClkDivider (1298 Gts ga o'rnatilgan) barcha segmentlar bir vaqtning o'zida yonib turishi uchun Etti Segment uchun soatni tezlashtirish uchun ishlatiladi (chunki bir vaqtning o'zida faqat bitta raqam yoqilishi mumkin). "Raqam" o'zgaruvchisi displeydagi joylarni aylanib o'tish uchun ishlatiladi va har bir raqam bilan 0 dan 9 gacha raqamlarni ko'rsatish variantlari bo'lgan 4 bitli asosiy displeyning shartlari keladi. Displeydagi eng uzoq chap raqam hech narsaga o'rnatilmagan, chunki u bu o'yinda ishlatilmaydi.
Asosiy modul davlat mashinasidan iborat. Jarayonda to'rtta holat - boshlang'ich, SubAns, Dis va CheckEnd. Dastlabki holatda, agar SubmitBtn (tekshirish uchun javobingizni yuborish uchun ishlatiladigan kalit) "1" ga o'rnatilgan bo'lsa, u holda mashina SubAns holatiga o'tadi. Har doim Rbtn (mashinani qayta o'rnatish uchun ishlatiladigan kalit) "1" ga o'rnatiladi, keyin mashina boshlang'ich holatiga qaytadi. SubAns holatida, SubmitBtn = '0' yana bo'lsa, u Dis holatiga o'tadi. Dis holatida, agar "Countdown = 0" (taxmin qilish uchun chapga burilish 0 ga to'g'ri keladi) yoki RSpotCount = 4 (o'yinchini to'g'ri joylardagi barcha to'g'ri ranglarni bildiradi) bo'lsa, mashina CheckEnd holatiga o'tadi. Agar bularning hech biri ro'y bermasa, SubmitBtn = '1' yana qaytadan taxmin qilish uchun SubAns holatiga qaytadi. CheckEnd shtatida bo'lganida, bu o'yinning oxiri va undan chiqishning yagona yo'li - dastlabki holatga qaytarish, uni asl holatiga qaytarish. Buni davlat mashinasi diagrammasida ko'rish mumkin. Xulq -atvori bo'yicha dastlabki holat hamma narsani boshlang'ich pozitsiyasiga qaytaradi. Qayta hisoblash (o'yinchi qancha burilish o'tkazishini saqlaydigan signal) 9 ga o'rnatiladi, RSpotCount (siz taxmin qilgan ranglarning ko'pi to'g'ri joyda saqlanadi) 0, RColorCount (qancha sonni saqlaydigan signal) Siz taxmin qilgan ranglar to'g'ri, lekin noto'g'ri joyda) 0 ga o'rnatiladi va kichik hisoblash (oxir -oqibat har bir burilishni o'zgartiradigan Countdown bilan xaritada ko'rsatiladigan signal) 9 ga o'rnatiladi. Shuningdek, boshlang'ich holatda RandNum (psuedo-tasodifiy hosil qilingan raqam) to'rt xil tekshiruvga bo'linadi (har 3-bitli rang uchun bittadan) va check1, check2, check3, check4 signallariga saqlanadi. Bu tekshiruvlar sizning taxminingiz bilan taqqoslanadi, shuning uchun LFSR har doim RandNum -ni har bir tsiklni o'zgartirishga olib kelgan bo'lsa -da, siz boshlang'ich holatdan chiqqandan so'ng, cheklar saqlanib qoladi va bu sizning javobingizni solishtirish imkonini beradi. Bu shuni anglatadiki, qachonki mashinani qayta tiklasangiz, o'yinchi taxmin qilish uchun yangi qiymatga ega bo'ladi.
SubmitAnswer holati (SubAns) hisoblagichni ("o'zgarish" signalini) "1" ga o'zgartiradi. Bu navbatni kuzatish ishlashi uchun keyinchalik kerak bo'ladi. Shundan so'ng, davlat pleyerning kirishini yuqoridagi holatda bajarilgan tekshiruvlarga taqqoslaydi. Signal rs1, rs2, rs3, rs4 va rc1, rc2, rc3, rc4 signallari butun sonlar bo'lib, If ifodalariga qarab 1 yoki 0 ga o'rnatiladi. Rs signali to'g'ri nuqta uchun va rc to'g'ri rang uchun. Masalan, agar 1 -rang o'yinchi taxminlari RandNumning check1 -ga teng bo'lsa, u holda rs1 = 1 to'g'ri rang to'g'ri joyda ekanligini bildiradi. Agar rang 1 check1 ga teng bo'lmasa, lekin boshqa tekshiruvlardan biriga teng bo'lsa, u holda rc = 1. Bu har bir rang va har bir chek uchun bajariladi.
Ko'rsatish holati (Dis) birinchi navbatda, hisoblagichni hisoblagichni qidiradi. Agar bu "1" bo'lsa, unda kichik hisob 1 ga kamayadi (birinchi navbatda 9dan 8gacha va hokazo). Aks holda, burilish o'zgarmaydi. Bunga qaramasdan, yuqoridagi barcha rs qiymatlari qo'shiladi va RSpotCounter signaliga beriladi. Bundan tashqari, barcha rc qiymatlari qo'shiladi va RColorCounter -ga tayinlanadi. Nihoyat, Countdownga kichik hisoblash qiymati beriladi. RSpotCounter, RColorCounter va Countdown signallari jarayondan tashqari 4-bitli std_logic_veectors-ga aylantiriladi va port xaritasi orqali Seven Segment displeyi submoduliga o'tkaziladi. Shunday qilib, siz yangi javob yubormaguningizcha, displey to'g'ri narsalarni ko'rsatadi.
CheckEnd shtati siz yutdingizmi yoki yo'qotganingiz uchun. Agar siz g'alaba qozongan bo'lsangiz (4 rangning hammasi to'g'ri joyda, boshqacha qilib aytganda RSpotCounter = 4), keyin "GG" (texnik jihatdan 66 sifatida ko'rsatilgan) sizning g'alaba qozonganingizni ko'rsatish uchun yetti segmentda ko'rsatiladi. Agar siz yutqazgan bo'lsangiz (Countdown 0 ga yetdi), displeyda Game Over tugadi. Ikkala holatda ham, qayta o'rnatish tugmachasini bosish, mashinani yana boshlang'ich holatiga qaytaradi.
Manba kodini bu erda topishingiz mumkin.
3 -qadam: Xulosa
Ushbu loyihani yakunlash bizga murakkab sxemalarni qurish haqida ko'p narsalarni o'rgatdi. Bizning dastlabki dizaynimiz cheklangan davlat mashinasi emas edi. Bizga turli usullar (shu jumladan FSM) yordamida kodni disk raskadrovka qilish va qayta yozish qiyin bo'lgan. O'qituvchining taklifiga binoan biz FSM yondashuviga rioya qildik va o'yinni tugatishga muvaffaq bo'ldik. Biz kodni an'anaviy dasturlash usulidan ko'ra, qo'shimcha qurilmalarga asoslangan holda ishlab chiqish ancha samarali ekanligini bilib oldik. Shuningdek, biz etti segmentli displey bilan bog'liq bir qancha qiyinchiliklarga duch keldik. Uni "ghosting" qilmasdan bir nechta raqamlarni ko'rsatishga erishish juda qiyin edi va biz buni amalga oshirish uchun soat taqsimlagichidan foydalanishimiz kerak edi. Agar biz bu loyihani yanada rivojlantirmoqchi bo'lsak, biz rangli LEDlarni Basys3 -ga ulagan bo'lardik, shunda foydalanuvchi ranglarning raqamli ko'rinishini emas, balki ranglarni (an'anaviy o'yinda bo'lgani kabi) ko'ra oladi. Oxir -oqibat, biz simulyatsiyani mukammal sharoitda ishlatishdan ko'ra, murakkab sxemalar dizayni, real hayotiy ilovalar va apparatdan foydalanish muammolari haqida ko'proq ma'lumotga ega bo'ldik.
Tavsiya:
DIY 37 Led Arduino ruletka o'yini: 3 qadam (rasmlar bilan)
DIY 37 Led Arduino Ruletka O'yini: Ruletka - bu g'ildirak ma'nosini anglatuvchi frantsuzcha so'z bilan atalgan kazino o'yini
LDR dan foydalanadigan DINO O'YINI: 5 qadam
DDR o'yinidan foydalanish: Dinozavr o'yini, T-Rex Game va Dino Runner deb ham ataladi, bu Google Chrome veb-brauzerida o'rnatilgan brauzer o'yini. O'yin 2014 yilda Sebastyan Gabriel tomonidan yaratilgan va unga Google Chrome -da oflayn rejimda bo'sh joyni bosish orqali kirish mumkin
BBC Micro: bit and Scratch - Rulda va haydashning interaktiv o'yini: 5 qadam (rasmlar bilan)
BBC Micro: bit and Scratch - Rulda va haydashning interaktiv o'yini: Bu hafta mening dars vazifalarimdan biri - biz yozgan Scratch dasturi bilan bog'lanish uchun BBC Micro: bitdan foydalanish. Men bu ThreadBoard -dan o'rnatilgan tizimni yaratish uchun ajoyib imkoniyat deb o'yladim! Tirilish uchun ilhomim p
Arduino MEGA bilan Mastermind Star Wars: 5 qadam (rasmlar bilan)
Mastermind Star Wars Arduino MEGA bilan: Bu isyon uchun noqulay vaqtlar. O'lim yulduzi vayron qilingan bo'lsa -da, imperiya qo'shinlari maxfiy qurol sifatida bepul uskunalar va Arduino -dan foydalanmoqdalar. Bu bepul texnologiyalarning afzalligi, har qanday odam (yaxshi yoki yomon) ulardan foydalanishi mumkin
8x8 RGB LED matritsali mastermind: 5 qadam (rasmlar bilan)
8x8 RGB LED matritsali mastermind: Kerakli qismlar: GEEETECH9V batareyali Basys3 FPGA 8x8 RGB LED matritsasi 32 ta umumiy pin. Umumiy anod har bir satr degan ma'noni anglatadi