İçindekiler:

2 Kişilik Rekabetçi Zamanlamaya Karşı Oyun: 4 Adım
2 Kişilik Rekabetçi Zamanlamaya Karşı Oyun: 4 Adım

Video: 2 Kişilik Rekabetçi Zamanlamaya Karşı Oyun: 4 Adım

Video: 2 Kişilik Rekabetçi Zamanlamaya Karşı Oyun: 4 Adım
Video: Beyaz Futbol 2 Nisan 2023 Tek Parça / Fenerbahçe 2-4 Beşiktaş 2024, Kasım
Anonim
2 Kişilik Rekabetçi VS Zamanlama Oyunu
2 Kişilik Rekabetçi VS Zamanlama Oyunu

İhtiyacın olacak:

1. Digilent Basys 3, FPGA Board (veya başka herhangi bir FPGA,)

2. Vivado'nun nispeten güncel bir sürümü veya başka bir VHDL ortamı

3. Bahsedilen programı çalıştırabilen bir bilgisayar.

Adım 1: Oyunun Kendisi

Oyunun Kendisi
Oyunun Kendisi

FSM'nin modüllerle nasıl etkileşime girdiği.

Nasıl oynanır

Başlamak için orta düğmeye basın. Bu, yedi segmentli ekranda ikinci oyuncunun sağlığını temsil eden “99”un görüntülenmesine neden olur. Ardından, LED'ler sırayla sağdan sola yanacaktır. Bu bir güç çubuğu oluşturur. Güç çubuğu dolduğunda, sıfırlanır. Birinci oyuncunun amacı, çubuk mümkün olduğu kadar yüksek olduğunda anahtarı çevirmektir. LED'ler ne kadar çok yanarsa, birinci oyuncu ikinci oyuncuya o kadar fazla hasar verir. Birinci oyuncu anahtarı çevirdikten sonra, verilen hasar ikinci oyuncunun sağlığından düşülür. Ardından, ikinci oyuncunun sırasına geçer. Şimdi, görüntülenen sayı oyuncunun sağlığını temsil ediyor ve güç çubuğu soldan sağa doluyor. İkinci oyuncu hamlesini yaptığında, hasar düşülür ve sıra tekrar birinci oyuncuya döner. Bu, bir oyuncu 0 sağlığa ulaşana kadar tekrar eder. Bu işleyişin videosu ektedir.

2. Adım: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Bu oyun esasen büyük bir sonlu durum makinesidir ve FSM'nin içinde bulunduğu duruma dayalı olarak bazı karmaşık mantıklar gerçekleşir.

Durum 1: Menüİlk durum, daha basit durumlardan biri olan menü ekranıdır. “PLAY” kelimesini gösteren yedi bölümlü ekranı ve oyunun başlamasına neden olan düğmeyi içerir. BTN düğmesi bizi bir sonraki duruma, yani oyuncunun sırası olana götürür.

Durum 2: Birinci Oyuncunun sırası

Birinci oyuncunun sırası, yedi segmentli ekranın Oyuncu ikinin sağlığını göstermesine neden olan bir sinyali etkinleştirir. Oluşturduğumuz başka bir modülden (Pone.vhd) aktarılan bir kaydırma kaydını etkinleştirmek için başka bir sinyal açılır. Bu kaydırma kaydı, LED'lerin diğer oyunlarda artan bir güç göstergesi gibi yanmasını sağlar ve daha sonra, yanabilecek maksimum LED miktarına ulaştığında 0'a sıfırlanır. Ödünç alınan bir laboratuvar dosyasından değiştirilen barclock.vhd'den elde edilen saatin yükselen kenarında güncellenir. Birinci oyuncunun çubuğunun sağdan başlayıp sola doğru doldurmasını sağladık, çünkü birinci oyuncunun anahtarı da soldadır (sezgisel kullanıcı deneyimi için). Anahtar çevrildiğinde, durum oyuncu bir kesintiye geçer ve LED'in aktif miktarı bir sinyale kaydedilir.

Durum 3: Oyuncu Bir kesinti LED'in aktif miktarına sahip sinyal, düşülen sağlık miktarını belirler. Bu, LED'leri artırmak yerine azaltan başka bir kaydırma kaydına (deductor1.vhd) sahip olarak yapılır. Bu, ödünç aldığımız ve değiştirdiğimiz saat div modüllerinden birinin yükselen kenarında azalır (downcounterclock.vhd). Bir LED kapatıldığında, ikinci oyuncunun toplam sağlığından bir sağlık puanı düşülür. Bu işlem sırasında 2. oyuncu 0 sağlığa ulaşırsa, durur ve hemen “Oyun bitti” durumuna geçeriz. Aksi takdirde, LED vektörü “0000000000000000” değerine ulaştığında, ikinci oyuncunun sırasına geçiyoruz.

Durum 4: Oyuncu İki'nin sırası İkinci oyuncunun sırası, birinci oyuncunun sırası gibidir, bunun için vardiya kaydının (Ptwo.bhd) soldan sağa gitmesi ve anahtarın tahtanın sağ tarafında olması dışında. Oyuncu 1'in sağlık göstergesine sahip olmak için bir sinyal etkinleştirilir. Anahtar 2 aktif olduğunda, bu, Oyuncu İki'nin kesinti sırasına geçer.

Aşama 5: İkinci Oyuncu Kesintisi Tıpkı ikinci oyuncunun sırası gibi, ikinci oyuncunun düşülmesi, oyuncunun bir kesintisi gibi davranır. Ana fark, LED'in kapanmasını kontrol eden kaydırma yazmacının ters yönde gitmesidir; bu, oyuncunun kesintisinin düzgün bir şekilde çalışmasını sağladıktan sonra yapılması kolay bir değişikliktir.

Aşama 6: Oyun Bitti Herhangi bir noktada oyunculardan herhangi biri sıfır sağlığa ulaşırsa, oyun bu duruma geçer. Gösterişli bir şey yok. BTN one'a basılırsa, sağlık 99'a sıfırlanır ve durum menüye geri dönerek oyunu etkin bir şekilde başlatır.

Adım 3: Modüller

Modüller
Modüller

Oyun için Kara Kutu Şeması

Downcounterclock (Bryan Mealy'nin clk_div.vhd modülüne göre):

Bu, indirgeyicilerin zamanlamasını yöneten saattir. max_count adlı sabit, barclock'un max_count sabitinden 3 kat daha fazladır. Bu, indirgeyicileri çubuğun hızından 3 kat daha yavaş yapacaktır.

Barclock - (Bryan Mealy'nin clk_div.vhd modülüne göre):

Bu saat, oyuna zorluk eklemek için hızlı bir şekilde artırdığımız güç göstergelerinin zamanlamasını yönetiyor. Bu zamanlama, beğeninize göre ayarlanabilir, sabit max_count'u daha büyük bir sayı yaparak hızı artırabilir veya max_count'u daha küçük bir sayı yaparak azaltabilirsiniz. Sseg_dec - (Yazan Bryan Mealy): Bu modül girdi olarak 8 bitlik bir sayı alır, kodunu çözer, sayıyı ondalık eşdeğerine dönüştürür ve ardından yedi segmentli ekrana çıktı verir. Bu dosyanın çalışması için, kısıtlamalarınızın bizimkilerle eşleştiğinden emin olmanız gerekir.

ponpon:

Bu, güç göstergesi artıyormuş gibi görünmesi için bir sıcak bit ekleyerek bitleri sola kaydıran bir kaydırma yazmacıdır. Tüm bitler sıcak olduğunda, tüm bitler '0'a sıfırlanır ve döngü baştan başlar.

2. bölüm:

Bu, P1 modülünün çevrilmiş bir versiyonudur.

çıkarıcı1:

Bu, bir kaydırma yazmacı ve bir çıkarıcının birleşimidir. Kaydırmalı yazmaç, P1'in kaydırma yazmacının ters yönüne gider ve bir kesinti gösterir. Bu aynı zamanda her saat döngüsü için Oyuncu 2'nin sağlığından 1 çıkarır, bu nedenle bu iki işlevin kombinasyonu ile, düşen sağlık çubuğunun her ledi için rakibin sağlığı 1 azalıyor gibi görünecektir.

Deductor2: Bu, Deductor1 modülünün çevrilmiş bir versiyonudur.

PlayDecoder (ekchen35649'un 133 talimatından ödünç alınmış ve kısmen değiştirilmiştir): Bu, menü durumunda yedi segmentli kod çözücüde “OYNAT” kelimesini görüntülemek için kullanılır.

4. Adım: Test edin

Bu oyun orijinal olarak Kirby'nin mini oyunlarından birinden esinlenmiştir. Basys 3 Board veya herhangi bir FPGA üzerinde oynanabilen basit iki oyunculu bir oyundur.

Adım 1: Gerekli Malzemeler

Şunlara ihtiyacınız olacak: Digilent Basys 3, FPGA Board (veya başka herhangi bir) Vivado'nun nispeten güncel bir sürümü veya başka bir vhdl ortamı Söz konusu programı çalıştırabilen bir bilgisayar Bir beyin

2. Adım: Oyunun Kendisi

Nasıl oynanır

Başlamak için orta düğmeye basın. Bu, yedi segmentli ekranda ikinci oyuncunun sağlığını temsil eden “99”un görüntülenmesine neden olur. Ardından, LED'ler sırayla sağdan sola yanacaktır. Bu bir güç çubuğu oluşturur. Güç çubuğu dolduğunda, sıfırlanır. Birinci oyuncunun amacı, çubuk mümkün olduğu kadar yüksek olduğunda anahtarı çevirmektir. LED'ler ne kadar çok yanarsa, birinci oyuncu ikinci oyuncuya o kadar fazla hasar verir. Birinci oyuncu anahtarı çevirdikten sonra, verilen hasar ikinci oyuncunun sağlığından düşülür. Ardından, ikinci oyuncunun sırasına geçer. Şimdi, görüntülenen sayı oyuncunun sağlığını temsil ediyor ve güç çubuğu soldan sağa doluyor. İkinci oyuncu hamlesini yaptığında, hasar düşülür ve sıra tekrar birinci oyuncuya döner. Bu, bir oyuncu 0 sağlığa ulaşana kadar tekrarlanır. Bu işleyişin videosu ektedir.

Oyunu oynamak için bir basys tahtasına yükleyin ve orta tuşa basın. Mümkün olduğu kadar çok LED aktifken anahtarı çevirmeye çalışın ve ardından tahtanın bu puanları rakibinizin sağlığından düşürmesini bekleyin ve izleyin. Ardından, arkadaşınıza iletin ve

3. Adım: FSM

Bu oyun esasen büyük bir sonlu durum makinesidir ve FSM'nin içinde bulunduğu duruma dayalı olarak bazı karmaşık mantıklar gerçekleşir.

(Durum diyagramı)

Durum 1: Menü

İlk durum, daha basit durumlardan biri olan menü ekranıdır. “PLAY” kelimesini gösteren yedi bölümlü ekranı ve oyunun başlamasına neden olan düğmeyi içerir. BTN düğmesi bizi bir sonraki duruma, yani oyuncunun sırası olana götürür.

Durum 2: Birinci Oyuncunun sırası

Birinci oyuncunun sırası, yedi segmentli ekranın Oyuncu ikinin sağlığını göstermesine neden olan bir sinyali etkinleştirir. Oluşturduğumuz başka bir modülden (Pone.vhd) aktarılan bir kaydırma kaydını etkinleştirmek için başka bir sinyal açılır. Bu kaydırma kaydı, LED'lerin diğer oyunlarda artan bir güç göstergesi gibi yanmasını sağlar ve daha sonra, yanabilecek maksimum LED miktarına ulaştığında 0'a sıfırlanır. Ödünç alınan bir laboratuvar dosyasından değiştirilen barclock.vhd'den elde edilen saatin yükselen kenarında güncellenir. Birinci oyuncunun çubuğunun sağdan başlayıp sola doğru doldurmasını sağladık, çünkü birinci oyuncunun anahtarı da soldadır (sezgisel kullanıcı deneyimi için). Anahtar çevrildiğinde, durum oyuncu bir kesintiye geçer ve LED'in aktif miktarı bir sinyale kaydedilir.

Durum 3: Oyuncu Bir kesintisi

LED'in aktif miktarı ile sinyal, düşülen sağlık miktarını belirler. Bu, LED'leri artırmak yerine azaltan başka bir kaydırma kaydına (deductor1.vhd) sahip olarak yapılır. Bu, ödünç aldığımız ve değiştirdiğimiz saat div modüllerinden birinin yükselen kenarında azalır (downcounterclock.vhd). Bir LED kapatıldığında, ikinci oyuncunun toplam sağlığından bir sağlık puanı düşülür. Bu işlem sırasında 2. oyuncu 0 sağlığa ulaşırsa, durur ve hemen “Oyun bitti” durumuna geçeriz. Aksi takdirde, LED vektörü “0000000000000000” değerine ulaştığında, ikinci oyuncunun sırasına geçiyoruz.

Durum 4: İkinci Oyuncunun sırası

İkinci oyuncunun sırası, birinci oyuncunun sırası gibidir, bunun için vardiya kaydının (Ptwo.bhd) soldan sağa gitmesi ve anahtarın tahtanın sağ tarafında olması dışında. Oyuncu 1'in sağlık göstergesine sahip olmak için bir sinyal etkinleştirilir. Anahtar 2 aktif olduğunda, bu, Oyuncu İki'nin kesinti sırasına geçer.

Aşama 5: İkinci Oyuncu Kesintisi

Tıpkı ikinci oyuncunun sırası gibi, ikinci oyuncunun düşülmesi, oyuncunun bir kesintisi gibi davranır. Ana fark, LED'in kapanmasını kontrol eden kaydırma yazmacının ters yönde gitmesidir; bu, oyuncunun kesintisinin düzgün bir şekilde çalışmasını sağladıktan sonra yapılması kolay bir değişikliktir.

Aşama 6: Oyun Bitti Herhangi bir noktada oyunculardan herhangi biri sıfır sağlığa ulaşırsa, oyun bu duruma geçer. Gösterişli bir şey yok. BTN one'a basılırsa, sağlık 99'a sıfırlanır ve durum menüye geri dönerek oyunu etkin bir şekilde başlatır.

Siyah kutu

Adım 4: Modüller

Downcounterclock (Bryan Mealy'nin clk_div.vhd modülüne göre):

Bu, indirgeyicilerin zamanlamasını yöneten saattir. max_count adlı sabit, barclock'un max_count sabitinden 3 kat daha fazladır. Bu, indirgeyicileri çubuğun hızından 3 kat daha yavaş yapacaktır.

Barclock - (Bryan Mealy'nin clk_div.vhd modülüne dayalı): Bu saat, oyuna zorluk eklemek için hızlı bir şekilde artırdığımız güç göstergelerinin zamanlamasını yönetir. Bu zamanlama, beğeninize göre ayarlanabilir, sabit max_count'u daha büyük bir sayı yaparak hızı artırabilir veya max_count'u daha küçük bir sayı yaparak azaltabilirsiniz. Sseg_dec - (Yazan Bryan Mealy): Bu modül girdi olarak 8 bitlik bir sayı alır, kodunu çözer, sayıyı ondalık eşdeğerine dönüştürür ve ardından yedi segmentli ekrana çıktı verir. Bu dosyanın çalışması için, kısıtlamalarınızın bizimkilerle eşleştiğinden emin olmanız gerekir.

Pone: Bu, bitleri sola kaydıran ve güç göstergesi artıyormuş gibi görünmesi için bir sıcak bit ekleyen bir kaydırma yazmacıdır. Tüm bitler sıcak olduğunda, tüm bitler '0'a sıfırlanır ve döngü baştan başlar.

Ptwo: Bu, P1 modülünün çevrilmiş bir versiyonudur.

Deductor1: Bu, bir kaydırma yazmacı ve bir çıkarıcının birleşimidir. Kaydırmalı yazmaç, P1'in kaydırma yazmacının ters yönüne gider ve bir kesinti gösterir. Bu aynı zamanda her saat döngüsü için Oyuncu 2'nin sağlığından 1 çıkarır, bu nedenle bu iki işlevin kombinasyonu ile, düşen sağlık çubuğunun her ledi için rakibin sağlığı 1 azalıyor gibi görünecektir.

Deductor2: Bu, Deductor1 modülünün çevrilmiş bir versiyonudur.

PlayDecoder (ekchen35649'un 133 talimatından ödünç alındı ve biraz değiştirildi):

Bu, menü durumunda yedi segmentli kod çözücüde “OYNAT” kelimesini görüntülemek için kullanılır.

Yapılacaklar: resimler, video

Önerilen: