Mundarija:

VHDL Basys3: 4 o'yinni ulang: 5 qadam
VHDL Basys3: 4 o'yinni ulang: 5 qadam

Video: VHDL Basys3: 4 o'yinni ulang: 5 qadam

Video: VHDL Basys3: 4 o'yinni ulang: 5 qadam
Video: 4.FPGA FOR BEGINNERS- Combining logic gates in VHDL (DIGILENT Basys3) 2024, Noyabr
Anonim
VHDL Basys3: Connect 4 o'yini
VHDL Basys3: Connect 4 o'yini

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

Uskunani ulash
Uskunani ulash
Uskunani ulash
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

Texnik tushuntirish: Ko'rsatilgan ma'lumotni o'zgartirish
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

Kod
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: