Mundarija:

2 o'yinchi raqobatbardosh va boshqa vaqt o'yini: 4 qadam
2 o'yinchi raqobatbardosh va boshqa vaqt o'yini: 4 qadam

Video: 2 o'yinchi raqobatbardosh va boshqa vaqt o'yini: 4 qadam

Video: 2 o'yinchi raqobatbardosh va boshqa vaqt o'yini: 4 qadam
Video: RONALDU NEGA TOSHKENTGA KELGAN? 2024, Noyabr
Anonim
2 o'yinchi raqobatbardosh va boshqa vaqt o'yini
2 o'yinchi raqobatbardosh va boshqa vaqt o'yini

Sizga kerak bo'ladi:

1. Digilent Basys 3, FPGA kengashi (yoki boshqa har qanday FPGA,)

2. Vivado yoki boshqa VHDL muhitining nisbatan yangilangan versiyasi

3. Ko'rsatilgan dasturni ishga tushiradigan kompyuter.

1 -qadam: O'yinning o'zi

O'yin o'zi
O'yin o'zi

FSM modullar bilan qanday aloqada.

Qanday o'ynash kerak

Boshlash uchun siz o'rta tugmani bosishingiz kerak. Bu "o'yinchi" ning sog'lig'ini aks ettiruvchi "99" raqamini etti segmentli displeyda ko'rsatilishiga olib keladi. Keyin LEDlar ketma -ket o'ngdan chapga yonadi. Bu quvvat paneli hosil qiladi. Quvvat paneli to'ldirilgach, u qayta tiklanadi. Birinchi o'yinchining maqsadi - bar iloji boricha balandroq bo'lsa, kalitni almashtirish. LEDlar qancha ko'p yonsa, o'yinchi ikkinchi o'yinchiga shunchalik ziyon etkazadi. Bir o'yinchi o'z kalitini almashtirgandan so'ng, etkazilgan zarar ikkinchi o'yinchining sog'lig'idan olinadi. Keyin, u o'yinchining ikki navbatiga o'tadi. Endi ko'rsatilgan raqam o'yinchining sog'lig'ini anglatadi va quvvat paneli chapdan o'ngga to'ldiriladi. Ikkinchi o'yinchi harakat qilgandan so'ng, zarar ushlab qolinadi va yana o'yinchi navbatiga qaytadi. Bu bitta o'yinchi sog'lig'i 0 ga yetguncha takrorlanadi. Bu ishning videosi ilova qilingan.

2 -qadam: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Bu o'yin, aslida, bitta katta cheklangan holatli mashina bo'lib, u FSM joylashgan holatga asoslanib sodir bo'ladi.

1 -holat: Menyu Birinchi holat - bu oddiy holatlardan biri bo'lgan menyu ekrani. U "PLAY" so'zini ko'rsatadigan ettita segmentli displeyni va o'yinni boshlaydigan tugmani o'z ichiga oladi. BTN tugmasi bizni navbatdagi holatga olib boradi, bu esa o'yinchi o'z navbatida.

2 -holat: Birinchi o'yinchi navbat

O'yinchining bir burilishi signalni faollashtiradi, bu etti segmentli displeyda ikkinchi o'yinchining sog'lig'ini ko'rsatadi. Biz yaratgan boshqa moduldan (Pone.vhd) import qilingan smenali registrni faollashtirish uchun boshqa signal yoqiladi. Bu smenali registr LEDning yorug'ligini boshqa o'yinlarda kuchayib borayotgan quvvat o'lchagichi kabi yondiradi va u yoqilishi mumkin bo'lgan LEDlarning maksimal miqdoriga yetganda 0 ga qaytariladi. U qarz olingan laboratoriya faylidan o'zgartirilgan barclock.vhd -dan olingan soatning ko'tarilgan chekkasida yangilanadi. Bizda pleyerning bir satri o'ngdan boshlanadi va chapga to'ldiriladi, chunki o'yinchining kommutatori ham chapda (foydalanuvchi intuitiv tajribasi uchun). Kalit aylantirilgandan so'ng, davlat o'yinchiga bitta chegirmaga o'tadi va LED faolligi signalda saqlanadi.

3 -holat: Birinchi o'yinchi chegirmasi LED faolligi ko'rsatilgan signal, sog'liqni saqlash miqdorini belgilaydi. Bu svetodiodlarni ko'paytirish o'rniga ularni kamaytiradigan boshqa smenali registrga (deductor1.vhd) ega bo'lish orqali amalga oshiriladi. Bu biz qarz olgan va o'zgartirgan soat div modullaridan birining ko'tarilish chekkasida kamayadi (downcounterclock.vhd). Xuddi bitta LED o'chirilganida, ikkinchi o'yinchining umumiy sog'lig'idan bir nuqta sog'ligi chiqarib tashlanadi. Agar bu jarayon davomida ikki o'yinchi sog'lig'i 0 ga yetsa, biz to'xtab, darhol "O'yin tugadi" holatiga o'tamiz. Aks holda, LED vektori "0000000000000000" ga yetganda, biz ikkinchi o'yinchining navbatiga o'tamiz.

4 -holat: Ikkinchi o'yinchining burilishi Ikkinchi o'yinchining burilishi aynan o'yinchining navbatiga o'xshaydi, faqat uning almashish registri (Ptwo.bhd) chapdan o'ngga o'tadi va kalit taxtaning o'ng tomonida joylashgan. 1 -o'yinchining sog'lig'ini ko'rsatish uchun signal yoqiladi. 2 -tugmachani ishga tushirgandan so'ng, bu ikkinchi o'yinchining chegirmali navbatiga o'tadi.

5 -bosqich: Ikkinchi o'yinchining chegirmasi Ikki o'yinchining navbatida bo'lgani kabi, ikkita o'yinchi ham bir o'yinchiga o'xshaydi. Asosiy farq shundaki, LEDni o'chirishni boshqaruvchi smenali registr qarama -qarshi tomonga o'tadi, bu sizning o'yinchining chegirmasi to'g'ri ishlagandan so'ng uni o'zgartirish oson.

6 -bosqich: O'yin tugadi Agar biron bir o'yinchining sog'lig'i nolga yetsa, o'yin shu holatga o'tadi. Hech narsa chiroyli ko'rinmaydi. Agar BTN tugmachasi bosilsa, sog'lik 99 ga tiklanadi va shtat menyuga qaytadi va o'yinni samarali boshlaydi.

3 -qadam: Modullar

Modullar
Modullar

O'yin uchun qora quti diagrammasi

Quyi soat (Bryan Meali tomonidan clk_div.vhd moduliga asoslangan):

Bu deduktorlarning vaqtini boshqaradigan soat. Max_count deb nomlangan doimiy shtrixning max_count sobitidan 3 barobar ko'p. Bu deduktorlarni bar tezligidan 3 barobar sekinroq qiladi.

Barclock - (Bryan Mealy tomonidan clk_div.vhd moduli asosida):

Bu soat quvvat o'lchagichlarining vaqtini boshqaradi, biz o'yinga qiyinchilik qo'shish uchun tezlik bilan oshirdik. Bu vaqtni sizning xohishingizga ko'ra sozlash mumkin, max_count doimiy sonini kattaroq qilib tezlikni oshirish yoki max_countni kichikroq qilib kamaytirish. Sseg_dec - (Bryan Meali tomonidan yozilgan): Ushbu modul kirish uchun 8 bitli raqamni oladi, u dekodlanadi, raqamni o'nlik ekvivalentiga aylantiradi va keyin etti segmentli displeyga chiqadi. Bu fayl ishlashi uchun siz cheklovlaringiz biznikiga mos kelishiga ishonch hosil qilishingiz kerak.

Pone:

Bu bitni chapga siljitadigan, registrni quvvat o'lchagichi ortib borayotganga o'xshab ko'rinishi uchun bitta issiq tugmani qo'shadigan smenali registr. Barcha bitlar qizib ketganda, barcha bitlar "0" ga qaytariladi va tsikl qayta boshlanadi.

Ptwo:

Bu P1 modulining burilgan versiyasi.

Deduktor1:

Bu smenali registr va olib tashlovchining kombinatsiyasi. Shift registri P1 smenali registrining teskari yo'nalishi bo'yicha ketadi, bu chegirmani ko'rsatadi. Bu, shuningdek, har bir soat tsikli uchun 2 -o'yinchining sog'lig'idan 1 -ni olib tashlaydi, shuning uchun bu ikkita funktsiyani birlashtirganda, raqibning sog'lig'i pastga tushadigan har bir chiziq uchun 1 -ga kamayadi.

Deductor2: Bu Deductor1 modulining burilgan versiyasi.

PlayDecoder (ekchen35649 -dan qarzga olingan va o'zgartirilgan, uning 133 ko'rsatmasi): Bu menyu holatida etti segmentli dekoderda "PLAY" so'zini ko'rsatish uchun ishlatiladi.

4 -qadam: Sinov

Bu o'yin dastlab Kirbining mini o'yinlaridan biridan ilhomlangan. Bu oddiy ikki o'yinchi o'yini, uni Basys 3 taxtasida yoki har qanday FPGA-da o'ynash mumkin.

1 -qadam: kerakli materiallar

Sizga kerak bo'ladi: Digilent Basys 3, FPGA platasi (yoki boshqa) Vivadoning nisbatan yangilangan versiyasi yoki boshqa vhdl muhiti, yuqorida aytib o'tilgan A dasturini ishga tushiradigan kompyuter.

2 -qadam: O'yinning o'zi

Qanday o'ynash kerak

Boshlash uchun siz o'rta tugmani bosishingiz kerak. Bu "o'yinchi" ning sog'lig'ini aks ettiruvchi "99" raqamini etti segmentli displeyda ko'rsatilishiga olib keladi. Keyin LEDlar ketma -ket o'ngdan chapga yonadi. Bu quvvat paneli hosil qiladi. Quvvat paneli to'ldirilgach, u qayta tiklanadi. Birinchi o'yinchining maqsadi - bar iloji boricha balandroq bo'lsa, kalitni almashtirish. LEDlar qancha ko'p yonsa, o'yinchi ikkinchi o'yinchiga shunchalik ziyon etkazadi. Bir o'yinchi o'z tugmachasini aylantirgandan so'ng, etkazilgan zarar ikkinchi o'yinchining sog'lig'idan olinadi. Keyin, u o'yinchining ikki navbatiga o'tadi. Endi ko'rsatilgan raqam o'yinchining sog'lig'ini anglatadi va quvvat paneli chapdan o'ngga to'ldiriladi. Ikkinchi o'yinchi harakat qilgandan so'ng, zarar ushlab qolinadi va yana o'yinchi navbatiga qaytadi. Bu bitta o'yinchi sog'lig'i 0 ga yetguncha takrorlanadi. Bu ishning videosi ilova qilingan.

O'yinni o'ynash uchun uni asosiy taxtaga yuklang va o'rta tugmani bosing. Kommutatorni iloji boricha faol LED yoritgichi bilan aylantirishga harakat qiling, so'ngra taxtada bu fikrlar raqibingizning sog'lig'idan chiqarilishini kuting. Keyin uni do'stingizga topshiring va

3 -qadam: FSM

Bu o'yin, aslida, FSM joylashgan holatga asoslanib sodir bo'ladigan murakkab mantiqiy bitta katta cheklangan davlat mashinasidir.

(Davlat diagrammasi)

1 -holat: Menyu

Birinchi holat - bu menyu ekrani, bu oddiy holatlardan biri. U "PLAY" so'zini ko'rsatadigan ettita segmentli displeyni va o'yinni boshlaydigan tugmani o'z ichiga oladi. BTN tugmasi bizni navbatdagi holatga olib boradi, bu esa o'yinchi o'z navbatida.

2 -holat: Birinchi o'yinchi navbat

O'yinchining bir burilishi signalni faollashtiradi, bu esa etti segmentli displeyda ikkinchi o'yinchining sog'lig'ini ko'rsatadi. Biz yaratgan boshqa moduldan (Pone.vhd) import qilingan smenali registrni faollashtirish uchun boshqa signal yoqiladi. Bu smenali registr LEDning yorug'ligini boshqa o'yinlarda kuchayib borayotgan quvvat o'lchagichi kabi yoritadi va u yoqilishi mumkin bo'lgan LEDlarning maksimal miqdoriga yetganda 0 ga qaytadi. U qarz olingan laboratoriya faylidan o'zgartirilgan barclock.vhd -dan olingan soatning ko'tarilgan chekkasida yangilanadi. Bizda pleyerning bir satri o'ngdan boshlanadi va chapga to'ldiriladi, chunki o'yinchining kommutatori ham chapda (foydalanuvchi intuitiv tajribasi uchun). O'chirish tugmasi bosilgandan so'ng, davlat o'yinchiga bitta chegirmaga o'tadi va LED faolligi signalda saqlanadi.

3 -holat: Birinchi o'yinchi chegirma

Svetodiod faolligini ko'rsatadigan signal, sog'liqni saqlash miqdorini aniqlaydi. Bu svetodiodlarni ko'paytirish o'rniga ularni kamaytiradigan boshqa smenali registrga (deductor1.vhd) ega bo'lish orqali amalga oshiriladi. Bu biz qarz olgan va o'zgartirgan soat div modullaridan birining ko'tarilish chekkasida kamayadi (downcounterclock.vhd). Xuddi bitta LED o'chirilganida, ikkinchi o'yinchining umumiy sog'lig'idan bir nuqta sog'ligi chiqarib tashlanadi. Agar bu jarayon davomida ikkita o'yinchi sog'lig'i 0 ga yetsa, biz to'xtab, darhol "O'yin tugadi" holatiga o'tamiz. Aks holda, LED vektori "0000000000000000" ga yetganda, biz ikkinchi o'yinchining navbatiga o'tamiz.

4 -holat: Ikkinchi o'yinchi navbat

Ikkinchi o'yinchining burilishi aynan o'yinchining navbatiga o'xshaydi, faqat uning almashish registri (Ptwo.bhd) chapdan o'ngga o'tadi va kalit taxtaning o'ng tomonida joylashgan. 1 -o'yinchining sog'lig'ini ko'rsatish uchun signal yoqiladi. 2 -tugmachani ishga tushirgandan so'ng, bu ikkinchi o'yinchining chegirmali navbatiga o'tadi.

5 -bosqich: Ikkinchi o'yinchi chegirma

Xuddi ikkinchi o'yinchi navbatida bo'lgani kabi, ikkita o'yinchi ham bir chegirmaga o'xshaydi. Asosiy farq shundaki, LEDni o'chirishni boshqaruvchi smenali registr qarama -qarshi yo'nalishda harakat qiladi, bu sizning o'yinchining chegirmasi to'g'ri ishlagandan so'ng uni o'zgartirish oson.

6 -bosqich: O'yin tugadi Agar biron bir o'yinchining sog'lig'i nolga yetsa, o'yin shu holatga o'tadi. Hech narsa chiroyli ko'rinmaydi. Agar BTN tugmachasi bosilsa, sog'lik 99 ga tiklanadi va shtat menyuga qaytadi va o'yinni samarali boshlaydi.

Qora quti

4 -qadam: Modullar

Quyi soat (Bryan Meali tomonidan clk_div.vhd moduliga asoslangan):

Bu deduktorlarning vaqtini boshqaradigan soat. Max_count nomli doimiy shtrixning max_count sobitidan 3 barobar ko'p. Bu deduktorlarni bar tezligidan 3 barobar sekinroq qiladi.

Barclock - (Bryan Mealy tomonidan ishlab chiqarilgan clk_div.vhd moduliga asoslangan): Bu soat o'yinni qiyinlashtirishi uchun biz tezlik bilan oshirgan quvvat o'lchagichlarining vaqtini boshqaradi. Bu vaqtni sizning xohishingizga ko'ra sozlash mumkin, max_count doimiy sonini kattaroq qilib tezlikni oshirish yoki max_countni kichikroq qilib kamaytirish. Sseg_dec - (Bryan Meali tomonidan yozilgan): Ushbu modul kirish uchun 8 bitli raqamni oladi, u dekodlanadi, raqamni o'nlik ekvivalentiga aylantiradi va keyin etti segmentli displeyga chiqadi. Bu fayl ishlashi uchun siz cheklovlaringiz biznikiga mos kelishiga ishonch hosil qilishingiz kerak.

Pone: Bu registr registr bo'lib, u bitlarni chapga siljitadi va quvvat o'lchagichi ortib borayotganga o'xshab ko'rinishi uchun bitta hot bit qo'shadi. Barcha bitlar qizib ketganda, barcha bitlar "0" ga qaytariladi va tsikl qayta boshlanadi.

Ptwo: Bu P1 modulining burilgan versiyasi.

Deductor1: Bu smenali registr va olib tashlovchining kombinatsiyasi. Shift registri P1 smenali registrining teskari yo'nalishi bo'yicha ketadi, bu chegirmani ko'rsatadi. Bu, shuningdek, har bir soat tsikli uchun 2 -o'yinchining sog'lig'idan 1 -ni olib tashlaydi, shuning uchun bu ikki funktsiyani birlashtirganda, raqibning sog'lig'i pastga tushadigan har bir chiziq uchun 1 -ga kamayadi.

Deductor2: Bu Deductor1 modulining burilgan versiyasi.

PlayDecoder (ekchen35649dan olingan va biroz o'zgartirilgan, uning 133 ko'rsatmasi):

Bu menyu holatida etti segmentli dekoderda "PLAY" so'zini ko'rsatish uchun ishlatiladi.

Amal qilish: rasmlar, video

Tavsiya: