Mündəricat:

VHDL -də Mastermind Oyunu: 3 addım
VHDL -də Mastermind Oyunu: 3 addım

Video: VHDL -də Mastermind Oyunu: 3 addım

Video: VHDL -də Mastermind Oyunu: 3 addım
Video: Tennis "Pong" inspired game Digilent Basys 3 Xilinx / VHDL 2024, Iyul
Anonim
VHDL -də Mastermind Oyunu
VHDL -də Mastermind Oyunu
VHDL -də Mastermind Oyunu
VHDL -də Mastermind Oyunu

Layihəmiz üçün Basys3 lövhəsində oynanacaq VHDL -də "Mastermind" oyununu yaratdıq. Mastermind, ənənəvi olaraq dirəklər və oyun lövhəsi ilə oynanan bir kod pozan oyundur. Bir oyunçu, iki oyunçudan gizlədilən 4 rəngli rəngli dirəklər qoyur. İkinci oyunçunun, lövhədə dirəkləri bir oyunçuya görünən bir sıra yerləşdirən 'x' təxminləri var. Hər bir təxmindən sonra, iki oyunçuya 2 ədəd məlumat verilir: dirəklərin neçə rəngi düzgündür və neçə dirək düzgün vəziyyətdədir. Bu ipuçlarını istifadə edərək, ikinci oyunçu, bir oyunçunun ayrılmış nömrəni tapdığı yerə yerləşdirdiyi pinlərin düzgün ardıcıllığını təxmin etməlidir.

Bizim tətbiqimizdə oyun tək oyunçudur. Proqram tərəfindən təsadüfi bir dirək birləşməsi yaradılır və oyunçu düzgün ardıcıllığı tapmaq üçün Basys3 lövhəsindən istifadə etməlidir. İkili dəyərlərlə təmsil olunan dörd "rəng" var. 7 seqmentli ekranda üç dəyər göstərilir: qalan dönüşlər, düzgün mövqedəki sancaqlar sayı və yanlış vəziyyətdə doğru rəngli sancaqlar sayı (bu dəyərlər 9, 0 və 0-dan başlayır). Oyunçu, tahmin üçün ikili dəyərləri seçmək üçün lövhədəki açarlardan istifadə edir və başqa bir açarı çevirərək təxmini təqdim edir. Düzgündürsə, oyun başa çatır və 7 hissəli ekranda "GG" göstərilir. Əks təqdirdə, döngə sayğacı 1 azalır və oyunçu, təxminlərində neçə sancağın birləşmədəki sancaqlar rənginə və ya mövqeyinə uyğun olduğuna əsaslanaraq rəy alır. Oyunçu düzgün təxmin etmədən növbələri bitərsə, ekranda "GO" (oyunu başa vuran) göstərilir. Oyunçu istənilən vaxt yenidən başlamaq üçün sıfırlama düyməsini çevirə bilər.

Addım 1: Materiallar

Materiallar
Materiallar
Materiallar
Materiallar
Materiallar
Materiallar

Bütün oyunu lövhədə oynaya biləcəyiniz üçün lazım olan yeganə material Basys3 Board, lövhəyə qoşulmaq üçün mikro USB kabeli və kodlaşdırmaq üçün istifadə edə biləcəyiniz bir kompüter/noutbukdur!

Addım 2: Kod

Kod
Kod
Kod
Kod

Bu oyunun FPGA üzərində işləməsi üçün yazmağın ən sadə yolu bir dövlət maşını yaratmaq olar. Bir dövlət maşınına sahib olmaq, oyunun əslində işləməsi üçün lazım olan ardıcıl və interaktiv təcrübəyə imkan verir. Hər şeyin düzgün işləməsi üçün dövlət maşını, hər şeyin sinxron olmasını təmin edərək FPGA -nın daxili saat siqnalına əsaslanacaq. Əsas modul dörd vəziyyətdə olan bir dövlət maşınıdır; Başlanğıc Vəziyyəti (Başlanğıc), SubmitAnswer Durumu (SubAns), Görüntünün Vəziyyəti (Dis) və CheckEndGame Vəziyyəti (CheckEnd). Dövlət maşını ilə yanaşı, əsas modulda iki alt modul, 4 rəqəmli Yeddi Segment Ekranı (öz ClkDivider alt modulu var) və Təsadüfi Sayı Generatoru (əslində bir psuedo təsadüfi ədəd generatoru) var. İnsanların daha asan daxil etdiklərini görmələri üçün hər açarın üstündəki LED -in yandırılması üçün əsas bir proses bloku var. Kodun əsas icmalını şəkildəki ağıl xəritəsində görmək olar.

Baxılacaq ilk komponent Random Number Generator (randomgen) -dir. Texniki olaraq aparatdan əldə edilən təsadüfi ədədləri əldə etmək mümkün olmadığından, ən sadə həll təsadüfi faktiki olaraq Lineer-Feedback Shift Register (LFSR) olması idi. LFSR-də clk girişi və "a" (12 bitlik nömrə) çıxışı var. Hər saat dövrü, "000000000001" -dən başlayaraq yeni bir 12 bitlik rəqəm yaradılır və nəticədə təkrarlanmadan əvvəl 1 və 0-ın 12 bitlik bütün birləşmələrindən keçir. "A" çıxışı hər saat dövrü üçün verilir, buna görə də fasiləsiz işləyir. Clk əsas moduldan Clk -ə və "a" əsas moduldakı RandNum siqnalına uyğunlaşdırılır.

İkinci alt modul 4 rəqəmli yeddi seqmentli ekrandır. Bu, 4 rəqəmli Yeddi Segment Ekranı nümayiş etdirməyin olduqca sadə bir yoludur. Ekran əsas moduldan Clk üzərində qurulub, lakin bu alt modulun öz ClkDivider alt modulu var. ClkDivider (1298 Hz olaraq təyin olunur), Yeddi Segmentin saatını sürətləndirmək üçün istifadə olunur, beləliklə bütün rəqəmlər eyni vaxtda görünür (çünki bir anda yalnız bir rəqəm aktiv ola bilər). Dəyişən "rəqəm", ekrandakı ləkələri keçmək üçün istifadə olunur və hər rəqəmlə birlikdə 0-dan 9-a qədər rəqəmləri göstərmək imkanı olan 4 bitlik əsas giriş ekranının şərtləri gəlir. Ekrandakı ən uzaq sol rəqəm bu oyunda istifadə edilmədiyi üçün heç bir yerə qoyulmur.

Əsas modul dövlət maşınından ibarətdir. Prosesdəki dörd vəziyyət Başlanğıc, SubAns, Dis və CheckEnddir. Başlanğıc vəziyyətində, SubmitBtn (yoxlama üçün cavabınızı təqdim etmək üçün istifadə olunan keçid) '1' olaraq təyin olunarsa, maşın SubAns vəziyyətinə keçir. İstənilən vaxt Rbtn (maşını sıfırlamaq üçün istifadə olunan keçid) '1' olaraq təyin olunur, sonra maşın Başlanğıc vəziyyətinə qayıdır. SubAns Vəziyyətində olduqda, SubmitBtn = '0' yenidən olanda Dis vəziyyətinə keçir. Dis vəziyyətində olduqda, geri sayma = 0 (təxmin etmək üçün sola dönmə 0 -a düşərsə) və ya RSpotCount = 4 olarsa (oyunçunu düzgün nöqtələrdə bütün düzgün rənglər kimi ifadə edirsə), maşın CheckEnd vəziyyətinə keçir. Bunlardan heç biri baş vermirsə, SubmitBtn = ‘1’ yenidən olduqda, başqa bir ehtimala icazə vermək üçün SubAns vəziyyətinə qayıdır. CheckEnd Vəziyyətində olduqda, bu oyunun sonudur və yeganə çıxış yolu sıfırlama düyməsini vuraraq Başlanğıc vəziyyətə qaytarır. Bunu dövlət maşın diaqramında görmək mümkündür. Davranışla İlkin vəziyyət hər şeyi başlanğıc vəziyyətinə qaytarır. Geri sayma (oyunçunun neçə dönüş buraxdığını qoruyan siqnal) 9, RSpotCount (təxmin etdiyiniz rənglərin nə qədərinin doğru yerdə olduğunu qeyd edən siqnal) 0, RColorCount (neçə ədədini saxlayan siqnal) təxmin etdiyiniz rənglər doğru, lakin yanlış yerdə) 0 olaraq təyin olunur və kiçik sayma (nəticədə sonrakı vəziyyətlərdə hər dönüşü dəyişən Geri sayma ilə eşlenen siqnal) 9 olaraq təyin olunur. Həmçinin, Başlanğıc vəziyyətdə RandNum (təsadüfi yaradılan nömrə) dörd fərqli çekə bölünür (hər 3-bit rəng üçün bir) və check1, check2, check3, check4 siqnallarına qeyd olunur. Bu çeklər, təxmininizin müqayisə edildiyi şeydir, buna görə LFSR həmişə RandNum -un hər dövrü dəyişməsinə səbəb olsa da, Başlanğıc vəziyyətdən çıxdıqdan sonra çeklər eyni qalacaq və bu, qənaət edilmiş bir dəyərlə cavabınızı müqayisə etməyə imkan verəcəkdir. Bu, maşının sıfırlandığı zaman, oyunçunun təxmin etmək üçün yeni bir dəyərə sahib olması deməkdir.

SubmitAnswer State (SubAns), geri sayma imkanını ("dəyişiklik" siqnalı) "1" olaraq dəyişir. Bu növbə izləmənin işləməsi üçün daha sonra lazımdır. Bundan sonra, dövlət oyunçu girişlərini yuxarıdakı vəziyyətdə edilən çeklərlə müqayisə edir. Sinyal rs1, rs2, rs3, rs4 və rc1, rc2, rc3, rc4 siqnalları If ifadələrindən asılı olaraq 1 və ya 0 olaraq təyin olunan tam ədədlərdir. Sinyal rs doğru yer üçün və rc doğru rəng üçündür. Məsələn, 1 rəngli oyunçunun təxmin etməsi RandNumun çek1 -ə bərabərdirsə, rs1 = 1 deməkdir, çünki doğru rəng doğru yerdədir. Əgər rəng 1 yoxlama1 -ə bərabər deyilsə, digər yoxlamalardan birinə bərabərdirsə, rc = 1. Bu hər rəng və hər çek üçün edilir.

Ekran vəziyyəti (Dis) əvvəlcə geri sayım aktivatorunu axtarır. '1' olarsa, kiçik sayma 1 azalır (ilk növbədə 9 -dan 8 -ə və s.). Əks halda növbə dəyişməz. Daxil olmasından asılı olmayaraq, yuxarıdakı bütün rs dəyərləri əlavə olunur və RSpotCounter siqnalına verilir. Həmçinin bütün rc dəyərləri əlavə olunur və RColorCounter -ə təyin edilir. Nəhayət Countdown kiçik hesablama dəyərini təyin edir. RSpotCounter, RColorCounter və Countdown siqnalları hamısı proses xaricində 4 bitlik std_logic_veectors çevrilir və bir liman xəritəsi vasitəsilə Seven Segment display submodule keçir. Bu şəkildə, yeni bir cavab göndərməyinizə qədər ekranda doğru şeylər göstərilir.

CheckEnd Dövləti qazandığınız və ya itirdiyiniz üçündür. Qazandınızsa (4 rəngin hamısı doğru yerdədir, başqa şəkildə RSpotCounter = 4 olaraq da bilinir), onda "GG" (texniki olaraq 66 olaraq göstərilir), qazandığınızı göstərmək üçün Yeddi Segmentdə göstərilir. Əgər uduzmusunuzsa (Geri sayım 0 -a çatıb), onda Game Over üçün ekranda "GO" (texniki olaraq 60 olaraq göstərilir) göstərilir. Hər iki nəticə ilə də sıfırlama düyməsini yandırmaq maşını yenidən oynamaq üçün Başlanğıc vəziyyətinə qaytaracaq.

Mənbə Kodunu burada tapa bilərsiniz.

Addım 3: Nəticə

Bu layihənin tamamlanması bizə daha mürəkkəb sxemlərin qurulması haqqında çox şey öyrətdi. İlkin dizaynımız sonlu bir dövlət maşını deyildi. Fərqli üsullardan (FSM də daxil olmaqla) istifadə edərək kodu düzəltmək və kodu bir neçə dəfə yenidən yazmaqda çətinlik çəkdik. Təlimçinin təklifi ilə FSM yanaşması ilə məşğul olduq və oyunu bitirə bildik. Kodun aparata əsaslanaraq dizaynının ənənəvi proqramlaşdırma yanaşmasından daha təsirli olduğunu öyrəndik. Yeddi seqmentli ekranla əlaqədar bir neçə problemlə də üzləşdik. Bir çox nömrəni "xəyal etmədən" göstərmək çətin idi və bunu həyata keçirmək üçün saat ayırıcıdan istifadə etməli olduq. Bu layihəni daha da inkişaf etdirsək, rəngli LED -ləri Basys3 -ə bağlayarıq ki, istifadəçi rənglərin rəqəmsal təsvirlərindən çox rəngləri (ənənəvi oyundakı kimi) görə bilsin. Nəticədə, mükəmməl şərtlərlə simulyasiya işlətmək əvəzinə, kompleks sxem dizaynı, real həyat tətbiqləri və aparatdan istifadə çətinlikləri haqqında daha çox anlayış əldə etdik.

Tövsiyə: