Mundarija:
- 1 -qadam: Tez ma'lumot va materiallar
- 2 -qadam: uskunani ulash
- 3 -qadam: Texnik tushuntirish: Ekran
- 4 -qadam: Texnik tushuntirish: Ko'rsatilgan ma'lumotni o'zgartirish
- 5 -qadam: kod
Video: VHDL Basys3: 4 o'yinni ulang: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:26
Kirish:
Bu Vivado dasturiy ta'minoti yordamida VHDL -da ishlab chiqilgan va Basys3 taxtasida dasturlashtirilgan Connect 4 raqamli mantiqiy o'yini. Ushbu loyihaning qurilishi va dizayni oraliq, lekin yangi kelganlar qadamlarni nusxalashlari va raqamli o'yinni qurishlari mumkin.
O'yin Connect 4 o'yini kabi ishlaydi. O'yinchilar kursorni doskada joylashgan chap va o'ng tugmalar yordamida ekran bo'ylab harakatlantirishi mumkin. Taxtadagi o'rta tugmachani bosish o'yinchining markerini o'sha ustunga qo'yishiga olib keladi va keyingi o'yinchi navbatiga aylanadi. O'yinchi g'alaba qozonganidan so'ng, taxtadagi yuqoriga bosish orqali o'yinni tiklash mumkin.
1 -qadam: Tez ma'lumot va materiallar
Tezkor texnik tafsilotlar:
-
Bortda uchta PMOD ulanishidan foydalaniladi (JA, JB, JC)
- Har bir PMOD ulagichi uchun ishlatiladigan 8 ta pin (Vcc va GND pinlaridan tashqari)
- JA - qatorlarni boshqarish
- JB - Yashil ustunlarni boshqarish
- JC - Qizil ustunlar nazorati
-
Ekran soati 960 gigagertsli chastotada ishlaydi
Ma'lum bir vaqtda faqat 8 ta LED yonadi. Ekran soat tezligida tez yangilanadi, bunda ma'lum bir vaqtda 8dan ortiq LED yonadi
- Tugmachali soat 5 Gts tezlikda ishlaydi; Ixtiyoriy ravishda, VHDL kodini tahrirlash orqali sozlanishi mumkin.
- Darlington massivlarining ichki qarshiligi LEDning yonishini oldini olish uchun etarli
O'yin quyidagi komponentlar va vositalar yordamida qurilgan:
- (1) Basys3 kengashi
- (2) Ikki rangli 8x5 LED matritsasi:
- (2) ULN2803 - Darlington tranzistor massivlari - ma'lumotlar jadvali
- Tel g'altaklari
- Jumper simlari
- Tel -stripper
- Non paneli (Katta maydon etarli bo'lishi kerak)
- Multimetr va quvvat manbai (nosozliklarni tuzatish)
2 -qadam: uskunani ulash
Ko'rsatmalar:
Loyihaning simlari juda murakkab bo'lishi mumkin, iltimos, shoshilmang va barcha ulanishlar bir vaqtning o'zida to'g'ri ekanligini tekshiring.
Loyiha ikkita LED displeydan foydalanishni o'z ichiga oladi, lekin ular birlashtirilib bitta katta ekranni hosil qiladi. Buni barcha satrlarni bir nuqtaga ulash orqali amalga oshirish mumkin. Har bir ekran ikki rangli bo'lgani uchun bitta ekranning qizil va yashil qatorlari boshqa ekranning qizil va yashil qatorlariga bog'langan bo'lishi kerak. Shunday qilib, biz barcha qatorlarni atigi 8 ta pin bilan boshqarishimiz mumkin. Qolgan 16 ta pim displey ustunlarini boshqarish uchun ishlatiladi. 8 ta pinni to'g'ridan -to'g'ri o'tish kabellari orqali pmod ulagichlariga ulash mumkin. Pmod ulanishlari avval ULN2083A kirishiga o'tadi va ULN2083A chiqishi to'g'ridan -to'g'ri ekrandagi ustunga ulanadi. Dizayn 8x8 bo'lgani uchun ba'zi ustunlar jismonan ulanmaydi.
- JA: Qatorli ulanishlar: 1 dan JAgacha: 1 dan 8 gacha JA: 10.
- JA: Qizil ustunli ulanishlar:
- JC: Yashil ustunli ulanishlar
Qaysi pinlar qaysi satrlarga/ustunlarga mos kelishini bilish uchun joylashtirilgan rasmlarga qarang.
Eslatma: Transistorlar qarshilikka ega, shuning uchun LEDlar ularga ketma -ket ulanish uchun qo'shimcha qarshilik talab qilmaydi.
3 -qadam: Texnik tushuntirish: Ekran
Ekran ko'rishning barqarorligi bilan ishlaydi. Ekran shunchalik tez tetiklanadiki, inson ko'zlari ba'zi LEDlarning tez o'chib va yoqilishini aniq sezmaydi. Aslida, displey soatining sekinlashuvi bilan miltillovchi miltillashni sezish mumkin.
Bu satrlar uchun saqlangan ma'lumotlarga ko'ra displey sakkiz qatorni yoqadi va displey bitta ustunga aylanadi. Keyin u tezda sakkiz qator uchun keyingi ma'lumot kiritishga o'tadi va boshqa ustunlar o'chirilgan holda keyingi ustuni yoqadi. Bu jarayon soat tezligida davom etadi, shuning uchun LEDning miltillashi sezilmaydi.
VHDL faylidagi arxitekturadan so'ng displey uchun ma'lumotlarni saqlash quyidagi tarzda boshlanadi:
signal RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 dan 0 gacha): = "00000000";
signal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 dan 0 gacha): = "00000000"; - Qator ma'lumotlari ustunga bog'liq: Yashil
LED displey matritsasini boshqaradigan jarayonning kichik bir qismi.
- LED displey matritsa displeyini boshqaradigan jarayon: jarayon (ColCLK) - 0 - 16, 8x8 RED va 8x8 GREEn matritsali RowCount yangilanishi uchun: 0 dan 16 gacha bo'lgan tamsayı diapazoni: = 0; if if (ko'tarilish_kiri (ColCLK)), keyin agar (RowCount = 0) bo'lsa, DORow <= RedA; - mos keladigan DOCol ustuni uchun satr ma'lumotlari <= "1000000000000000"; - Ustun tetik- bu kodni "0000000000000001" ga qadar takrorlang- RedB, RedC … GreenA, GreenB … GreenH ga o'zgartiring.
GreenH oxirida, jarayon tugashidan oldin, bu parcha RowCount -ni nolga qaytarish uchun kiritilgan.
if (RowCount = 15) keyin - A ustunidan yangilanishni qayta boshlang RowCount: = 0; else RowCount: = RowCount + 1; - Ustunlar orasidagi o'tish, agar;
Endi, displey jarayonining sezgirlik ro'yxatidagi soatni tushuntirib bering. Basys3 taxtasida 100 MGts chastotada ishlaydigan ichki soat bor. Bizning maqsadimiz uchun bu soat juda tez, shuning uchun biz quyidagi jarayon yordamida soatni 960 gigagertsli soatga bo'lishimiz kerak bo'ladi.
- 960 Gts chastotada ishlaydigan soat jarayoni boshlang, agar (ko'tarilish_ qirrasi (CLK)) keyin clkcount: = clkcount + 1; agar (clkcount = 52083) keyin ColCLK <= emas (ColCLK); clkcount: = 0; tugatish, agar; tugatish, agar; jarayonni tugatish;
4 -qadam: Texnik tushuntirish: Ko'rsatilgan ma'lumotni o'zgartirish
VHDL kodida ekranga chiqadigan ma'lumot yoki ma'lumotlar kursor jarayoni orqali boshqariladi, uning sezgirlik ro'yxatida boshqa soat bor. Bu kod BtnCLK deb nomlangan bo'lib, tugma bosilganda ularni o'chirishni minimallashtirish uchun mo'ljallangan. Agar shu tugma bosilsa, yuqori satrdagi kursor ustunlar bo'ylab tez harakatlanmasligi uchun kiritilgan.
- 5 Gts da ishlaydigan soat jarayoni. ButtonCLK: jarayon (CLK) o'zgarmaydigan btnclkcount: 0 dan 10000001 gacha bo'lgan butun sonlar oralig'i: = 0; agar boshlang (ko'tarilish_ qirrasi (CLK)) keyin agar (btnclkcount = 10000000) btnclkcount: = 0; BtnCLK <= emas (BtnCLK); boshqa btnclkcount: = btnclkcount + 1; tugatish, agar; tugatish, agar; jarayonni tugatish;
Bu jarayonning BtnCLK signal chiqishi bilan biz endi kursor jarayonini tushuntira olamiz. Kursor jarayonining sezgirlik ro'yxatida faqat BtnCLK bor, lekin kod blokida tugmalar holati tekshiriladi va bu RedA, RedB… GreenH ma'lumotlarining o'zgarishiga olib keladi. Mana, kursor kodining parchasi, u reset blokini va birinchi ustunning blokini o'z ichiga oladi.
kursor: jarayon (BtnCLK) o'zgaruvchisi OCursorCol: STD_LOGIC_VECTOR (2 dan 0 gacha): = "000"; - OCursorCol oldingi NCursorCol ustun o'zgaruvchisini kuzatib boradi: STD_LOGIC_VECTOR (2 pastga 0): = "000"; -NCursorCol kursor ustunining yangi boshlanishini belgilaydi-RESET sharti (YUQORI TUGMASI)-O'yinni qayta boshlash uchun taxtasi tozalanadi, agar (ko'tarilish_ qirrasi (BtnCLK)), agar (RST = '1') bo'lsa, RedA <= "00000000"; RedB <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; RedH <= "00000000"; GreenA <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; GreenD <= "00000000"; GreenE <= "00000000"; GreenF <= "00000000"; GreenG <= "00000000"; GreenH if (Lbtn = '1') keyin NCursorCol: = "111"; - H elsif ustuni (Rbtn = '1') keyin NCursorCol: = "001"; - B elsif ustuni (Cbtn = '1') keyin NCursorCol: = OCursorCol; - Ustun bir xil bo'lib qoladi NTurnState <= not (TurnState); - Keyingi o'yinchining navbatini ishga tushiradi- joriy ustunni pastdan yuqoriga tekshiradi va birinchi yonmagan LEDni yoqadi. Rang joriy o'yinchi kursor rangiga bog'liq. ck uchun 7 ta pastga 1 ta pastadir, agar (RedA (0) = '1') va (RedA (ck) = '0') va (GreenA (ck) = '0'), keyin RedA (Ck) <= '1'; RedA (0) <= '0'; CHIQISH; tugatish, agar;
agar (GreenA (0) = '1') va (RedA (ck) = '0') va (GreenA (ck) = '0') bo'lsa
GreenA (Ck) <= '1'; GreenA (0) - Qizil o'yinchi GreenA (0) <= '0'; if (NCursorCol = OCursorCol) keyin - Agar hech narsa bosilmagan bo'lsa RedA (0) <= '1'; elsif (NCursorCol = "111") keyin - Lbtn bosilsa RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") keyin - Iff Rbtn RedB (0) <= '1' bosildi; RedA (0) - Yashil o'yinchi RedA (0) <= '0'; if (NCursorCol = OCursorCol) keyin GreenA (0) <= '1'; elsif (NCursorCol = "111") keyin GreenH (0) <= '1'; YashilA (0) <= '0'; elsif (NCursorCol = "001") keyin GreenB (0) <= '1'; YashilA (0) <= '0'; tugatish, agar; oxirgi holat;
E'tibor bering, OCursorCol (eski kursor ustuni ma'nosini anglatadi) deb nomlangan birinchi holat bayoni cheklangan holat mashinasining boshlanishi hisoblanadi. Displeyning har bir ustuni FSMda o'z holati sifatida qabul qilinadi. 8 ta ustun bor, shuning uchun har bir ustunni holat sifatida aniqlash uchun 3-bitli ikkilik raqamlar to'plami ishlatilgan. FSM holati qanday o'zgarishi bosilgan tugmachaga bog'liq. Yuqoridagi parchada, agar chap tugma bosilsa, FSM displeyning oxirgi ustuni bo'lgan "111" ga o'tadi. Agar o'ng tugma bosilsa, FSM displeyning ikkinchi ustuni bo'lgan "001" ga o'tadi.
Agar o'rta tugma bosilsa, FSM yangi holatga o'tmaydi, aksincha TurnState signalining o'zgarishiga olib keladi, bu qaysi o'yinchining navbatini bildirish uchun bitta bitli signal. Bundan tashqari, o'rta tugma kod blokini ishga tushiradi, u pastda bo'sh satr borligini tekshiradi. U markerni eng past, to'ldirilmagan qatorga qo'yishga harakat qiladi. Esingizda bo'lsin, bu to'rtta o'yinni birlashtiruvchi o'yin.
"TurnState" deb nomlangan ichki holatlar bayonotida biz kursor rangi nima ekanligini va ma'lumotlarni birinchi qatorning qaysi ustuniga o'zgartirmoqchi bo'lamiz, shunda ko'rsatish jarayoni o'zgarishni aks ettirishi mumkin.
Qolgan etti holat uchun biz bu asosiy kodni takrorlaymiz. FSM diagrammasi shtatlar qanday o'zgarayotganini tushunishga yordam beradi.
5 -qadam: kod
Bu Vivado dasturi yordamida VHDLda to'planishi mumkin bo'lgan Connect 4 uchun funktsional kod.
O'yinni boshlashga imkon beradigan cheklov ham mavjud.
Biz har bir jarayonning kirish va chiqishlari o'zaro bog'liqligini tushuntiruvchi blok -diagrammani taqdim etdik.
Tavsiya:
(YANGILANISH - YUQORI MASLAQA bor) USB O'YINNI KONTROLLASH: 10 qadam (rasmlar bilan)
(YANGILANISH - YUQORI MASALA YO'Q.) PC uchun USB O'YINNI KONTROLLASH: HAR QANDAY O'YINLAR UCHUN O'YIN NAZORI (deyarli)
O'yinni jonli efirni qanday boshlash kerak: 9 qadam
O'yinni jonli translatsiya qilishni qanday boshlash kerak: Bu ko'rsatma sizga Open Broadcaster Software yoki OBST yordamida translyatsiyani qanday sozlash kerakligini ko'rsatib beradi, siz OBS yordamida jonli translyatsiyani boshlash uchun sizga quyidagi narsalar kerak bo'ladi: Sizning o'yiningizni boshqaradigan kompyuter. va oqimli dasturiy ta'minot
Buzz simli o'yinni qanday qilish kerak: 4 qadam
Buzz simli o'yinni qanday qilish kerak: Shubhasiz, Arduino ko'plab elektron loyihalarda, shu jumladan o'yinlarda ishlatiladi. Ushbu loyihada biz shov -shuvli o'yin yoki barqaror qo'l o'yini deb nomlangan maxsus o'yinni ishlab chiqdik. Ushbu loyiha uchun po'lat sim ishlatiladi, uni halqa shaklida aylantirish kerak
VHDL va Basys3 taxtasi yordamida asosiy sekundomer: 9 qadam
VHDL va Basys3 taxtasidan foydalanadigan asosiy sekundomer: Asosiy VHDL va Basys 3 taxtasi yordamida sekundomerni yaratish bo'yicha ko'rsatmaga xush kelibsiz. Siz bilan loyihamizni bo'lishishdan xursandmiz! Bu 2016 yilning kuzida, Cal Poly, SLOda o'tkaziladigan CPE 133 (Raqamli dizayn) kursining yakuniy loyihasi edi. Biz qurayotgan loyiha
Arduino va Neopixel yordamida 4 ta o'yinni ulang: 7 qadam (rasmlar bilan)
Arduino va Neopixel yordamida 4-o'yinni ulang: Men o'yinchoqlarga o'yinchoq sovg'a qilishning o'rniga, jiyanlarimga o'ziga xos sovg'a berishni xohladim. Ushbu loyihaning Arduino kodini tushunish qiyin bo'lishi mumkin, lekin asosiy tushunchalar