Mündəricat:

2 Oyunçu Rəqabətli VS Zamanlama Oyunu: 4 Addım
2 Oyunçu Rəqabətli VS Zamanlama Oyunu: 4 Addım

Video: 2 Oyunçu Rəqabətli VS Zamanlama Oyunu: 4 Addım

Video: 2 Oyunçu Rəqabətli VS Zamanlama Oyunu: 4 Addım
Video: ПОЧЕМУ Я ЖДУ L4D3 2024, Noyabr
Anonim
2 Oyunçu Rəqabətli VS Zamanlama Oyunu
2 Oyunçu Rəqabətli VS Zamanlama Oyunu

Sizə lazım olacaq:

1. Digilent Basys 3, FPGA Board (və ya hər hansı digər FPGA,)

2. Vivadonun və ya başqa bir VHDL mühitinin nisbətən aktual versiyası

3. Qeyd olunan proqramı işlədə bilən kompüter.

Addım 1: Oyunun özü

Oyun Özü
Oyun Özü

FSM modullarla necə qarşılıqlı əlaqə qurur.

Necə oynamalı

Başlamaq üçün orta düyməni basın. Bu, iki oyunçunun sağlamlığını təmsil edən "99" un yeddi seqmentli ekranda göstərilməsinə səbəb olacaq. Sonra LEDlər sağdan sola ardıcıl olaraq yanacaq. Bu güc çubuğu meydana gətirir. Güc çubuğu dolduqdan sonra sıfırlanır. Bir oyunçunun məqsədi, çubuğu mümkün qədər yüksək olduqda açarını çevirməkdir. Nə qədər çox LED yanarsa, bir oyunçunun ikinci oyunçuya vurduğu ziyan daha çox olar. Bir oyunçu açarını çevirdikdən sonra vurulan zərər ikinci oyunçunun sağlamlığından çıxılır. Sonra iki oyunçunun növbəsinə keçir. İndi göstərilən nömrə oyunçunun sağlamlığını ifadə edir və güc çubuğu soldan sağa qədər dolur. İkinci oyunçu hərəkət etdikdən sonra, zərər çıxılır və yenidən oyunçunun növbəsinə qayıdır. Bu, bir oyunçunun sağlamlığı 0 -a çatana qədər təkrarlanır. Bu işin videosu əlavə olunur.

Addım 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Bu oyun, FSM -in vəziyyətinə əsaslanaraq bəzi kompleks məntiqlərin meydana gəldiyi böyük bir sonlu dövlət maşınıdır.

Vəziyyət 1: Menyu İlk vəziyyət, sadə vəziyyətlərdən biri olan menyu ekranıdır. "PLAY" sözünü göstərən yeddi seqmentli ekranı və oyunun başlamasına səbəb olan düyməni ehtiva edir. BTN düyməsi bizi oyunçunun növbəsi olan növbəti vəziyyətə aparır.

Vəziyyət 2: Birinci oyunçunun növbəsi

Bir oyunçunun növbəsi, yeddi seqmentin ikinci oyunçunun sağlamlığını göstərməsinə səbəb olan bir siqnal aktivləşdirir. Başqa bir siqnal, yaratdığımız başqa bir moduldan (Pone.vhd) idxal edilmiş bir qeyd qeydini aktivləşdirmək üçün açılır. Bu keçid qeydiyyatı, LED -in işığını digər oyunlarda artan bir güc göstəricisi kimi yandırır və daha sonra yandırıla bilən maksimum LED -ə çatdıqda sıfıra sıfırlanır. Borclanmış bir laboratoriya sənədindən dəyişdirilmiş barclock.vhd -dən əldə edilən saatın yüksələn kənarını yeniləyir. Bir oyunçunun çubuğu sağdan başlayır və sola qədər doldururduq, çünki oyunçunun keçidi də soldadır (intuitiv istifadəçi təcrübəsi üçün). Keçid çevrildikdən sonra, vəziyyət oyunçudan bir çıxmağa keçir və LED -in aktiv miqdarı bir siqnalda saxlanılır.

Vəziyyət 3: Oyunçu Bir kəsmə LED aktivliyi olan siqnal, kəsilən sağlamlıq miqdarını təyin edir. Bu, LED -ləri artırmaq əvəzinə onları azaldan başqa bir keçid reyestrinin (deductor1.vhd) olması ilə edilir. Bu, borc aldığımız və dəyişdirdiyimiz saat div modullarından birinin yüksələn kənarında azalır (downcounterclock.vhd). Bir LED söndürüldükdə, bir oyunçunun ümumi sağlamlığından bir sağlamlıq nöqtəsi çıxılır. Bu proses zamanı iki oyunçu 0 sağlamlıq əldə edərsə, dayandırırıq və dərhal "Oyun bitdi" vəziyyətinə keçirik. Əks təqdirdə, LED vektoru "0000000000000000" ə çatdıqda iki oyunçunun növbəsinə keçirik.

Vəziyyət 4: İkinci Oyunçunun növbəsi İkinci oyunçunun növbəsi tam olaraq bir oyunçunun növbəsinə bənzəyir, bunun üçün keçid reyestri (Ptwo.bhd) soldan sağa gedir və keçid lövhənin sağ tərəfindədir. Oyunçu 1 -in sağlamlıq ekranına sahib olmaq üçün bir siqnal işə düşür. 2 -ci keçid aktiv olduqdan sonra, bu, İkinci Oyunçunun çıxma növbəsinə keçir.

Mərhələ 5: İki Oyunçunun Çıxarılması İkinci oyunçunun növbəsi olduğu kimi, iki oyunçu da bir oyunçunun bir çıxması kimi davranır. Əsas fərq, LED -in sönməsini idarə edən keçid qeydinin əks istiqamətdə getməsidir ki, bu da oyunçunun çıxışı düzgün işlədikdən sonra etmək asan bir dəyişiklikdir.

Mərhələ 6: Oyun bitdi Hər hansı bir anda hər iki oyunçunun sağlamlığı sıfıra çatırsa, oyun bu vəziyyətə keçir. Görünüşlü heç nə yoxdur. BTN -ə basıldığı təqdirdə, sağlamlıq 99 -a sıfırlanır və vəziyyət oyuna təsirli bir şəkildə başlayaraq menyuya qayıdır.

Addım 3: Modullar

Modullar
Modullar

Oyun üçün qara qutu diaqramı

Saat əqrəbi (Bryan Mealy tərəfindən clk_div.vhd modulu əsasında):

Deduktorların vaxtını idarə edən saat budur. Max_count adlı sabit, barclockun max_count sabitindən 3 dəfə çoxdur. Bu, dedüktörleri çubuğun sürətindən 3x daha yavaş edəcək.

Barclock - (Bryan Mealy tərəfindən clk_div.vhd modulu əsasında):

Bu saat, oyuna çətinlik əlavə etmək üçün sürətlə artırdığımız güc göstəricilərinin vaxtını idarə edir. Bu vaxt sabit max_count'u daha böyük bir rəqəm halına gətirərək sürəti artırmaqla və ya max_count'u daha kiçik bir sayı etməklə azaltmaqla zövqünüzə görə tənzimlənə bilər. Sseg_dec - (Bryan Mealy tərəfindən yazılmışdır): Bu modul, şifrəsini açaraq, rəqəmi ondalık ekvivalentinə çevirərək, sonra yeddi seqmentli ekrana çıxardığı giriş olaraq 8 bitlik bir rəqəm alır. Bu faylın işləməsi üçün məhdudiyyətlərinizin bizimki ilə uyğun olduğundan əmin olmalısınız.

Pone:

Bu, güc göstəricisinin artdığını göstərmək üçün bitləri sola çevirən bir isti bit əlavə edən bir keçid qeydidir. Bütün bitlər isti olduqda, bütün bitlər '0' sıfırlanır və dövr yenidən başlayır.

Ptwo:

Bu P1 modulunun çevrilmiş versiyasıdır.

Deduktor1:

Bu, bir dəyişmə reyestri ilə çıxarılanın birləşməsidir. Dəyişdirmə reyestri, P1 -in keçid qeydinin əks istiqamətinə gedir və bu da kəsilməni göstərir. Bu, hər bir oyun dövrü üçün Oyunçu 2 -nin sağlamlığından 1 çıxarır, buna görə də bu iki funksiyanın birləşməsi ilə düşən sağlamlıq çubuğunun hər bir ledinə görə rəqibin sağlamlığının 1 azaldığı görünür.

Deductor2: Bu Deductor1 modulunun çevrilmiş versiyasıdır.

PlayDecoder (ekchen35649 -dan 133 təlimatlı olaraq götürüldü və dəyişdirildi): Bu, yeddi seqmentli dekoderdə "PLAY" sözünü göstərmək üçün menyu vəziyyətində istifadə olunur.

Addım 4: Test edin

Bu oyun əvvəlcə Kirby mini oyunlarından ilhamlandı. Basys 3 lövhəsində və ya hər hansı bir FPGA-da oynana bilən sadə iki oyunçulu bir oyundur.

Addım 1: Lazımi materiallar

Ehtiyacınız olacaq: Digilent Basys 3, FPGA Board (və ya hər hansı digər) Vivadonun nisbətən yenilənmiş bir versiyası və ya başqa bir vhdl mühiti Qeyd olunan proqramı A beyini işlədə bilən kompüter

Addım 2: Oyunun Özü

Necə oynamalı

Başlamaq üçün orta düyməni basın. Bu, iki oyunçunun sağlamlığını təmsil edən "99" un yeddi seqmentli ekranda göstərilməsinə səbəb olacaq. Sonra LEDlər sağdan sola ardıcıl olaraq yanacaq. Bu güc çubuğu meydana gətirir. Güc çubuğu dolduqdan sonra sıfırlanır. Bir oyunçunun məqsədi, çubuğu mümkün qədər yüksək olduqda açarını çevirməkdir. Nə qədər çox LED yanarsa, bir oyunçunun ikinci oyunçuya vurduğu ziyan daha çox olar. Bir oyunçu açarını çevirdikdən sonra vurulan zərər ikinci oyunçunun sağlamlığından çıxılır. Sonra iki oyunçunun növbəsinə keçir. İndi göstərilən nömrə oyunçunun sağlamlığını ifadə edir və güc çubuğu soldan sağa qədər dolur. İkinci oyunçu hərəkət etdikdən sonra, zərər çıxılır və yenidən oyunçunun növbəsinə qayıdır. Bu, bir oyunçunun sağlamlığı 0 -a çatana qədər təkrarlanır. Bu işin videosu əlavə olunur.

Oyunu oynamaq üçün onu bir lövhəyə yükləyin və orta düyməni basın. Açarı mümkün qədər çox LED ilə çevirməyə çalışın və sonra lövhənin bu nöqtələri rəqibinizin sağlamlığından çıxardığını gözləyin. Sonra dostunuza verin və

Addım 3: FSM

Bu oyun, FSM -in vəziyyətinə əsaslanan bəzi kompleks məntiqlərin meydana gəldiyi böyük bir sonlu dövlət maşındır.

(Dövlət Diaqramı)

Vəziyyət 1: Menyu

Birinci vəziyyət, ən sadə vəziyyətlərdən biri olan menyu ekranıdır. "PLAY" sözünü göstərən yeddi seqmentli ekranı və oyunun başlamasına səbəb olan düyməni ehtiva edir. BTN düyməsi bizi oyunçunun növbəsi olan növbəti vəziyyətə aparır.

Vəziyyət 2: Birinci oyunçunun növbəsi

Bir oyunçunun növbəsi, yeddi seqmentin ikinci oyunçunun sağlamlığını göstərməsinə səbəb olan bir siqnal aktivləşdirir. Başqa bir siqnal, yaratdığımız başqa bir moduldan (Pone.vhd) idxal edilmiş bir qeyd qeydini aktivləşdirmək üçün açılır. Bu keçid qeydiyyatı, LED -in işığını digər oyunlarda artan bir güc göstəricisi kimi yandırır və yandırıla bilən maksimum LED -ə çatdıqda 0 -a sıfırlanır. Borclanmış bir laboratoriya sənədindən dəyişdirilmiş barclock.vhd -dən əldə edilən saatın yüksələn kənarını yeniləyir. Oyunçunun bir çubuğu sağdan başlayır və sola qədər doldururduq, çünki oyunçunun keçidi də soldadır (intuitiv istifadəçi təcrübəsi üçün). Keçid çevrildikdən sonra, vəziyyət oyunçudan bir çıxmağa keçir və LED -in aktiv miqdarı bir siqnalda saxlanılır.

Vəziyyət 3: Oyunçu 1 -dən endirim

LED -in aktiv olduğu siqnal, çıxarılan sağlamlıq miqdarını təyin edir. Bu, LED -ləri artırmaq əvəzinə onları azaldan başqa bir keçid reyestrinin (deductor1.vhd) olması ilə edilir. Bu, borc aldığımız və dəyişdirdiyimiz saat div modullarından birinin yüksələn kənarında azalır (downcounterclock.vhd). Bir LED söndürüldükdə, bir oyunçunun ümumi sağlamlığından bir sağlamlıq nöqtəsi çıxılır. Bu proses zamanı iki oyunçu 0 sağlamlıq əldə edərsə, dayandırırıq və dərhal "Oyun bitdi" vəziyyətinə keçirik. Əks təqdirdə, LED vektoru "0000000000000000" ə çatdıqda iki oyunçunun növbəsinə keçirik.

Vəziyyət 4: İkinci oyunçunun növbəsi

İkinci oyunçunun növbəsi tam olaraq bir oyunçunun növbəsinə bənzəyir, bunun üçün növbənin qeydiyyatı (Ptwo.bhd) soldan sağa gedir və açar lövhənin sağ tərəfindədir. Oyunçu 1 -in sağlamlıq ekranına sahib olmaq üçün bir siqnal işə düşür. 2 -ci keçid aktiv olduqdan sonra, bu, İkinci Oyunçunun çıxma növbəsinə keçir.

Mərhələ 5: İki Oyunçu Çıxar

İki oyunçunun növbəsi olduğu kimi, iki oyunçu da bir oyunçunun bir çıxması kimi davranır. Əsas fərq, LED -in sönməsini idarə edən keçid qeydinin əks istiqamətdə getməsidir ki, bu da oyunçunun çıxışı düzgün işlədikdən sonra etmək asan bir dəyişiklikdir.

Mərhələ 6: Oyun bitdi Hər hansı bir anda hər iki oyunçunun sağlamlığı sıfıra çatırsa, oyun bu vəziyyətə keçir. Görünüşlü heç nə yoxdur. BTN -ə basıldığı təqdirdə, sağlamlıq 99 -a sıfırlanır və vəziyyət oyuna təsirli bir şəkildə başlayaraq menyuya qayıdır.

Qara qutu

Addım 4: Modullar

Saat əqrəbi (Bryan Mealy tərəfindən clk_div.vhd modulu əsasında):

Deduktorların vaxtını idarə edən saat budur. Max_count adlı sabit, barclockun max_count sabitindən 3 dəfə çoxdur. Bu, dedüktörleri çubuğun sürətindən 3x daha yavaş edəcək.

Barclock - (Bryan Mealy tərəfindən hazırlanmış clk_div.vhd moduluna əsaslanaraq): Bu saat, oyuna çətinlik əlavə etmək üçün sürətlə artırdığımız güc göstəricilərinin vaxtını idarə edir. Bu vaxt sabit max_count'u daha böyük bir rəqəm halına gətirərək sürəti artırmaqla və ya max_count'u daha kiçik bir sayı etməklə azaltmaqla zövqünüzə görə tənzimlənə bilər. Sseg_dec - (Bryan Mealy tərəfindən yazılmışdır): Bu modul, şifrəsini açaraq, rəqəmi ondalık ekvivalentinə çevirərək, sonra yeddi seqmentli ekrana çıxardığı giriş olaraq 8 bitlik bir rəqəm alır. Bu faylın işləməsi üçün məhdudiyyətlərinizin bizimki ilə uyğun olduğundan əmin olmalısınız.

Pone: Bu, güc göstəricisinin artdığını göstərmək üçün bitləri sola sürüşdürən, bir isti bit əlavə edən bir keçid qeydidir. Bütün bitlər isti olduqda, bütün bitlər '0' sıfırlanır və dövr yenidən başlayır.

Ptwo: Bu P1 modulunun çevrilmiş versiyasıdır.

Deductor1: Bu, bir qeyd registrinin və bir çıxarıcının birləşməsidir. Vəziyyət reyestri, P1 -in keçid qeydinin əks istiqamətinə gedir, bu da bir endirimi göstərir. Bu, hər bir oyun dövrü üçün Oyunçu 2 -nin sağlamlığından 1 çıxarır, buna görə də bu iki funksiyanın birləşməsi ilə düşən sağlamlıq çubuğunun hər bir ledinə görə rəqibin sağlamlığının 1 azaldığı görünür.

Deductor2: Bu Deductor1 modulunun çevrilmiş versiyasıdır.

PlayDecoder (ekchen35649 -dan götürülmüş və biraz dəyişdirilmiş, onun 133 təlimatı):

Bu, yeddi seqmentli dekoderdə "PLAY" sözünü göstərmək üçün menyu vəziyyətində istifadə olunur.

Ediləcək işlər: şəkillər, video

Tövsiyə: