İçindekiler:

FPGA Reaksiyon Oyunu: 10 Adım
FPGA Reaksiyon Oyunu: 10 Adım

Video: FPGA Reaksiyon Oyunu: 10 Adım

Video: FPGA Reaksiyon Oyunu: 10 Adım
Video: Eğitsel Oyunlar 9 Algı ve Dikkat Oyunu ( Çok eğlendik çoook) 2024, Temmuz
Anonim
FPGA Tepki Oyunu
FPGA Tepki Oyunu

Yaz Rutherford ve Regita Soetandar tarafından

Adım 1: Giriş

CPE 133 için son projemiz için, bir Basys3 kartı için VHDL'de bir tepki oyunu tasarladık. Bu oyun, oyuncunun blokları doğru zamanda düşürmesi gereken arcade oyunu “Stacker” ile en yakından karşılaştırılabilir. Basys3 kartı, değişen LED'lere sahip bir devre tahtasına bağlıdır. Bu LED ışıklar, seviyeye bağlı olarak belirli bir frekansta değişecektir. Bu oyun, saat bölücü ve 4 haneli 7 segmentli ekranın yanı sıra sonlu durum makinesini kullanır. Oyuncu, ortadaki LED yandığında doğru anahtarı etkinleştirdiğinde, oyuncu, değişen LED'lerin frekansını artırarak oyunun bir sonraki düzeyine ilerleyecektir. Bu, birbirini izleyen her seviyeyi bir önceki seviyeden daha zor hale getirir. Oyuncu en yüksek seviye olan 7. seviyeyi başarıyla geçtiğinde, segment ekranında bir mesaj görüntülenecek ve tüm LED'ler aynı anda yanıp sönecektir.

Adım 2: Malzemeler

Malzemeler
Malzemeler
Malzemeler
Malzemeler
Malzemeler
Malzemeler

İhtiyacınız olacak malzemeler şunlardır:

  • Mikro USB kablolu Digilent Basys3 kartı
  • ekmek tahtası
  • 5 LED
  • 5 direnç (220 ohm kullandık)
  • 11 atlama teli
  • Vivado'lu bilgisayar

Adım 3: Üst Düzey Diyagram Kara Kutu Tasarımı

Üst Düzey Diyagram Kara Kutu Tasarımı
Üst Düzey Diyagram Kara Kutu Tasarımı
Üst Düzey Diyagram Kara Kutu Tasarımı
Üst Düzey Diyagram Kara Kutu Tasarımı

Gördüğünüz gibi, üst seviye blok diyagramımız, ClkDivide alt modülümüzden gerekli saatleri alarak başlıyor. Bu saatler, çeşitli işlem bloklarına girdilerdir. Temel olarak, oyun, bir kullanıcı anahtarı doğru bir şekilde açtığında, LED'lerin daha hızlı değişmeye başlaması gerektiğini ve ekranın bir seviye yukarı çıkması gerektiğini anlamalıdır. Blok diyagramı biraz çılgın görünebilir, ancak bunun nedeni belirli bir süreçte oluşturulmuş birçok sinyalin olması ve ardından bu sinyalin başka bir süreç bloğunda başka bir sinyali tanımlamasıdır.

Sonunda, oyunun aldığı tek giriş, 100 Mhz'de çalışan Basys3 kartındaki giriş saati, Basys3 kartındaki yedi anahtar ve sıfırlama düğmesidir. Çıktı, yedi segmentli ekran için anot, ekran için yedi segment ve LED'lerdir.

Adım 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Bu saat bölücü alt modülü, ana dosyamızda ona eşlediğimiz değere bağlı olarak daha yavaş bir saat yarattı. Bu alt modülü Clk400, PushClk ve newlck'i belirlemek için kullandık. Bu alt modül giriş olarak bir saat ve 32 bitlik bir bölücü alır. Yavaşlamış bir saat çıktısı alınır. Ayırıcı ve yavaşlatılmış saat için bir işlem bloğu vardır. Bu süreçte, girilen saatin yükselen kenarına her vurulduğunda bir tane sayan, sayım olarak adlandırdığımız geçici bir değişkendir. Bölen sayıya ulaştığında, yavaşlayan saat değişir ve sayım sıfırlanır.

Adım 5: İşlem Bloğunun Kaydırılması

Vardiya İşlem Bloğu
Vardiya İşlem Bloğu

Shift işlem bloğu, LED'lerin değişen hareketini ve hızını kontrol eder. Duyarlılık listesinde yeniclk ve Stop sinyalleri bulunur. Durdurma, kullanıcı seviyeyi geçtiğinde kısa bir gecikmeye neden olur. Stop yüksek değilse, LED'ler newclk hızına göre normal olarak değişir. Bu alternatif model iki değişken tarafından kontrol edilir: Takip et ve say. Count, hangi LED'in açık olacağını belirlerken Track, sayımın yukarı mı yoksa aşağı mı sayılacağını belirler. Yalnızca Seviye “111” olduğunda geçerli olan ve oyuncunun oyunu yendiğini gösteren başka bir sinyal olan Final vardır. Son, LED'leri sürekli olarak açıp kapatmak için her saat kenarında 0 ile 1 arasında değişir. Bu sadece son gösterim için görsel bir unsurdur.

Bu vardiya süreci, bu proje için başlamak için mükemmel bir yerdir. LED'lerinizi doğru ve tutarlı bir şekilde değiştirebiliyorsanız, buradan seviye atlarken davranışı eklemeniz yeterlidir!

Adım 6: Sonlu Durum Makinesi

Sonlu durum makinesi
Sonlu durum makinesi

Giriş anahtarına veya sıfırlama düğmesine basıldığında davranışı dikte etmek için bir Sonlu Durum Makinesi oluşturduk. Her durum bir “seviye”dir ve eğer anahtar yanlış zamanda açılırsa veya reset basılırsa seviye tekrar “000”e döner. Aksi takdirde, anahtar doğru bir şekilde açılırsa, seviye “111” son durumuna ulaşana kadar yükselir ve bitiş ekranı oluşur. FSM, sync_proc ve comb_proc olmak üzere iki işlem bloğunu temel alır. Sync_proc, PushClk adını verdiğimiz saati kullanır. Bu saat, bir sonraki durumun mevcut duruma ne kadar hızlı dönüşeceğini kontrol eder. Bu saat oldukça hızlı olmalıdır; en hızlı LED hızımızdan yaklaşık iki kat daha hızlı bir hız seçtik.

Bu kodu, seviyeler için bir FSM kullanarak uyguladık; ancak bu projeden sonra, bir FSM'nin daha verimli kullanımının bir sayım durumu, bir sıfırlama durumu veya bir bekleme durumu olabileceğini fark ettik. Hiçbir şeye basılmıyorsa, bekleme durumundadır. Sıfırlamaya basılıyorsa veya oynatıcıda hata varsa, sıfırlama durumundadır. Doğru basıldığında, yukarı sayma durumundadır. Bu oyunda da FSM kullanmanın birçok başka yolu var!

Adım 7: Düzeyli Görüntü İşlem Bloğunun Kontrolü

Seviyeli Ekran Proses Bloğunun Kontrolü
Seviyeli Ekran Proses Bloğunun Kontrolü

Seviye, Görüntüleme işlemi bloğunu kontrol eder. Duyarlılık listesindeki değişkenler Level, Reset ve Clk400'dür. 7 segmentli ekran, birinci seviye için '1' görüntülenerek başlar. Kullanıcının hangi seviyede olduğunu göstermek için kullanıcı bir seviyeyi her geçtiğinde 7'ye kadar sayar. Kullanıcı 7. seviyeyi geçtiğinde, oyuncunun oyunu yendiğini belirtmek için “COOL” görüntülenir. Bu “SOĞUK” ekran, Clk400 adını verdiğimiz 400 Hz'lik bir saatten çalışır. Sıfırla'ya basılırsa, ekran “1”e döner.

Adım 8: Seviye ile LED Hızını Kontrol Etme

Seviye ile LED Hızını Kontrol Etme
Seviye ile LED Hızını Kontrol Etme

Son olarak Level, LED'lerin hızını kontrol eder. Seviye, hassasiyet listesindeki tek sinyaldir. D1, yeniclk almak için Saat Bölücü işlemine giren sinyaldir. Seviye veya durum her değiştiğinde, süreç bloğu “Hız”. Bu işlem D1'in değerini belirler. Her seviyenin ne kadar hızlı çalışmasını istediğimize bağlı olarak seçtiğimiz 8 tanımlanmış D1 değeri vardır. D1 seviyesi her arttığında küçülür, böylece newclk daha hızlı çalışır.

Adım 9: Donanım Montajı

Donanım Montajı
Donanım Montajı

Breadboard'u pmod konektörlerinden biri ile Basys3'e bağladık. Pmod bağlantı noktalarından altısı, biri toprak için, diğer beşi 5 LED için bir erkek-erkek konektörü takmak için kullanıldı. Ayrıca her LED için bir direnç yerleştirdik. Bu dirençler 220Ω olup ledlerin kısa devre yapıp yanmasını engeller. Her LED'in bir miktar direnci olmasına rağmen, direnç kaynaktan gelen voltajı engellemeye yetmez.

Adım 10: Eğlenin

Bu oyunu oynamak çok kolaydır. Oyuncu, tahtanın en sağındaki 1 numaralı düğme olan V17'den başlar. Ortadaki LED yandığında anahtarı yukarı çevirmeleri gerekir. Daha sonra bir düğmeyi sola kaydırırlar ve aynı şeyi yaparlar! Oyuncu sona ulaşırsa, yedinci anahtar olan W14'te sona erer. Oyunu yenerlerse, gerçekten eğlenceli bir bitiş ekranı görürler!

Unutulmaması gereken bir şey, bu oyunu yaratırken hızların tamamen size kalmış olmasıdır! Seçtiğimiz hızlar çok yavaşsa, hızlandırmaktan ve daha da zorlu hale getirmekten çekinmeyin! Ayrıca belirli bir seviye sayısı yoktur. Daha da fazla level olmasını istiyorsanız FSM'de ve Level tarafından belirlenen işlem bloklarında yapılması gereken değişiklikler var ama bunlar çok basit değişiklikler.

Ayrıca kullanıcı girişi olarak kart üzerindeki anahtarları kullanmayı seçtik, ancak bu Basys3 kartındaki bir düğme ile de mümkündür; düğme, kullanıcı her yeniden başladığında anahtarları sıfırlama ihtiyacını ortadan kaldıracaktır. Başlangıçta bir düğme kullandık, ancak bu, düğme basılı tutulurken PushClk'un yükselen iki kenarına vurulursa birden çok düzeye atlayacağından seviye tanımlamada hatalara neden oldu.

Aşağıda, nasıl oynanacağını, ilk 4 seviyeden geçmeyi ve son bitiş ekranını gösteren bir video bulunmaktadır.

Bu proje için ana dosya aşağıda yer almaktadır.

Kaynaklar

Basys3 başvuru kılavuzu

Proje için ilham - Arduino Stop It oyunu

Önerilen: