Mundarija:

VHDL -dagi mastermind o'yini: 3 qadam
VHDL -dagi mastermind o'yini: 3 qadam

Video: VHDL -dagi mastermind o'yini: 3 qadam

Video: VHDL -dagi mastermind o'yini: 3 qadam
Video: Mastermind on FPGA 2024, Noyabr
Anonim
VHDL bo'yicha mastermind o'yini
VHDL bo'yicha mastermind o'yini
VHDL bo'yicha mastermind o'yini
VHDL bo'yicha mastermind o'yini

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

Materiallar
Materiallar
Materiallar
Materiallar
Materiallar
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

Kodeks
Kodeks
Kodeks
Kodeks

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: