Mündəricat:

FPGA Reaksiya Oyunu: 10 addım
FPGA Reaksiya Oyunu: 10 addım

Video: FPGA Reaksiya Oyunu: 10 addım

Video: FPGA Reaksiya Oyunu: 10 addım
Video: İlham Əliyev ölkədə üsyan olacağından narahatdır - Ölkə çevrilişin bir addımlığında 2024, Iyul
Anonim
FPGA Reaksiya Oyunu
FPGA Reaksiya Oyunu

Yaz Rutherford və Regita Soetandar tərəfindən

Addım 1: Giriş

CPE 133 üçün son layihəmiz üçün Basys3 lövhəsi üçün VHDL -də bir reaksiya oyunu hazırladıq. Bu oyun, oyunçunun blokları lazımi anda atmalı olduğu "Stacker" arcade oyunu ilə ən yaxından müqayisə edilə bilər. Basys3 lövhəsi alternativ LEDləri olan bir çörək taxtasına bağlıdır. Bu LED işıqlar səviyyədən asılı olaraq müəyyən bir tezlikdə dəyişəcək. Bu oyunda saat bölücü və 4 rəqəmli 7 seqmentli ekran və sonlu dövlət maşını istifadə olunur. Orta LED yanarkən oyunçu düzgün açarı işə saldıqda, oyunçu alternativ LEDlərin tezliyini artıraraq oyunun növbəti səviyyəsinə keçəcək. Bu, hər bir ardıcıl səviyyəni əvvəlki səviyyədən daha çətinləşdirir. Oyunçu ən yüksək səviyyə 7 -ni uğurla keçdikdə, seqmentin ekranında bir mesaj görünəcək və bütün LEDlər eyni anda yanıb sönəcək.

Addım 2: Materiallar

Materiallar
Materiallar
Materiallar
Materiallar
Materiallar
Materiallar

Ehtiyac duyacağınız materiallar bunlardır:

  • Mikro USB kabel ilə Digilent Basys3 lövhəsi
  • Çörək lövhəsi
  • 5 LED
  • 5 rezistor (220 ohm istifadə etdik)
  • 11 keçid teli
  • Vivado ilə kompüter

Addım 3: Üst Səviyyə Diaqramı Qara Kutu Dizaynı

Üst Səviyyə Diaqramı Qara Kutu Dizaynı
Üst Səviyyə Diaqramı Qara Kutu Dizaynı
Üst Səviyyə Diaqramı Qara Kutu Dizaynı
Üst Səviyyə Diaqramı Qara Kutu Dizaynı

Gördüyünüz kimi, ən yüksək səviyyəli blok diaqramımız, ClkDivide altmodulumuzdan lazımi saatları əldə etməklə başlayır. Bu saatlar müxtəlif proses bloklarına girişlərdir. Əslində, oyun bir istifadəçi açarı düzgün açdıqda, LEDlərin daha sürətli dəyişməyə başlamalı olduğunu və ekranın bir pillə yuxarı qalxması lazım olduğunu qəbul etməlidir. Blok diaqramı bir az dəli görünə bilər, amma bunun səbəbi, müəyyən bir prosesdə qurulan və sonra başqa bir blokda başqa bir siqnal təyin edən bir çox siqnalın olmasıdır.

Sonda, oyunun aldığı yeganə giriş 100 Mhz -də işləyən Basys3 lövhəsindəki giriş saatı, Basys3 lövhəsindəki yeddi açar və sıfırlama düyməsidir. Çıxarılan şey yeddi seqmentli ekran üçün anod, ekran üçün yeddi seqment və LED -lərdir.

Addım 4: CLKDivide

CLK bölün
CLK bölün
CLK bölün
CLK bölün
CLK bölün
CLK bölün

Bu saat bölücü alt modulu, əsas faylımızda xəritələndirdiyimiz dəyərdən asılı olaraq daha yavaş bir saat yaratdı. Bu alt moduldan Clk400, PushClk və newlck təyin etmək üçün istifadə etdik. Yavaş bir saat çıxdı. Bölücü və yavaşlatılmış saat üçün bir proses bloku var. Bu müddətdə, sayım dediyimiz müvəqqəti bir dəyişən var və bu, girilən saatın yüksələn kənarı hər vurulduqda bir dəfə sayılır. Bölücü nömrəsinə çatdıqda yavaşlayan saat dəyişdi və say sıfıra döndü.

Addım 5: Proses Blokunu dəyişdirin

Proses Blokunu dəyişdirin
Proses Blokunu dəyişdirin

Shift proses bloku LED -lərin dəyişən hərəkətini və sürətini idarə edir. Həssaslıq siyahısında newclk və Stop siqnalları var. İstifadəçi səviyyəni keçəndə Stop qısa bir gecikməyə səbəb olur. Stop yüksək deyilsə, LEDlər newclk sürətinə görə normal olaraq dəyişir. Bu dəyişən model iki dəyişən tərəfindən idarə olunur: İzlə və say. Say, hansı LED -in yandırılmalı olduğunu, Track isə sayımın yuxarı və ya aşağı sayılması lazım olduğunu təyin edir. Başqa bir siqnal var, Final, yalnız Səviyyə "111" olduqda tətbiq olunur ki, bu da oyunçunun oyunu məğlub etdiyini göstərir. LEDləri davamlı olaraq yandırmaq və söndürmək üçün hər saat kənarında 0 ilə 1 arasında dəyişir. Bu, son görüntü üçün yalnız əyani bir elementdir.

Bu dəyişmə prosesi bu layihə üçün başlamaq üçün mükəmməl bir yerdir. LED -lərinizi düzgün və ardıcıl olaraq dəyişə bilsəniz, buradan düzəldərkən davranışınızı əlavə etməlisiniz!

Addım 6: Sonlu Vəziyyət Maşını

Sonlu vəziyyət maşını
Sonlu vəziyyət maşını

Giriş açarı və ya sıfırlama düyməsinə basıldığında davranışı diktə etmək üçün sonlu vəziyyət maşını yaratdıq. Hər bir vəziyyət "səviyyə" dir və açar yanlış zamanda açılırsa və ya sıfırlanırsa, səviyyə "000" ə qayıdır. Əks təqdirdə, keçid düzgün açılırsa, səviyyə son vəziyyətə çatana qədər yuxarı qalxır, "111" və son ekran görünür. FSM, sync_proc və comb_proc iki proses blokuna əsaslanır. Sync_proc, PushClk adlandırdığımız saatı istifadə edir. Bu saat, sonrakı vəziyyətin indiki vəziyyətə nə qədər sürətli çıxacağını idarə edir. Bu saat olduqca sürətli olmalıdır; ən sürətli LED sürətimizdən təxminən iki qat daha sürətli bir sürət seçdik.

Səviyyələr üçün bir FSM istifadə edərək bu kodu tətbiq etdik; lakin, bu layihədən sonra, FSM-dən daha səmərəli istifadə etmə sayım vəziyyətinə, sıfırlama vəziyyətinə və ya qalma vəziyyətinə malik ola biləcəyimizi başa düşdük. Heç bir şey sıxılmırsa, qalma vəziyyətindədir. Sıfırlama sıxılırsa və ya oyunçu qarışıqdırsa, sıfırlama vəziyyətindədir. Düzgün basıldığı təqdirdə sayma vəziyyətindədir. Bu oyunda bir FSM istifadə etməyin bir çox başqa yolu var!

Addım 7: Ekran Prosesi Blokunu Səviyyə ilə İdarə Edin

Səviyyə ilə Ekran Proses Blokuna Nəzarət
Səviyyə ilə Ekran Proses Blokuna Nəzarət

Səviyyə Ekran proses blokunu idarə edir. Həssaslıq siyahısındakı dəyişənlər Level, Reset və Clk400 -dür. 7 seqmentli ekran birinci səviyyə üçün '1' göstərilməklə başlayır. İstifadəçi, istifadəçiyə hansı səviyyədə olduğunu göstərmək üçün bir səviyyədən keçəndə 7 -yə qədər sayılır. İstifadəçi 7 -ci səviyyəni keçdikdə, oyunçunun oyunu məğlub etdiyini bildirmək üçün "COOL" yazır. Bu "COOL" ekranı Clk400 adlandırdığımız 400 Hz saatla işləyir. Sıfırlama düyməsinə basarsanız, ekran "1" ə qayıdır.

Addım 8: Səviyyə ilə LED Sürətinə Nəzarət

Səviyyə ilə LED Sürətinə Nəzarət
Səviyyə ilə LED Sürətinə Nəzarət

Nəhayət, Level LED -lərin sürətinə nəzarət edir. Səviyyə həssaslıq siyahısındakı yeganə siqnaldır. D1, newclk əldə etmək üçün Saat Bölücü prosesinə gedən siqnaldır. Hər dəfə Səviyyə dəyişdirildikdə və ya vəziyyət dəyişdikdə "Sürət" proses bloku. Bu proses D1 -in dəyərini təyin edir. Hər bir səviyyənin nə qədər sürətli olmasını istədiyimizə görə seçdiyimiz D1 -in 8 müəyyən edilmiş dəyəri var. D1, səviyyəsi hər dəfə artdıqca kiçilir, belə ki, newclk daha sürətli işləyir.

Addım 9: Avadanlıq Montajı

Avadanlıq Montajı
Avadanlıq Montajı

Çörək taxtasını Basys3 -ə pmod bağlayıcılarından biri ilə bağladıq. PMod portlarının altısı, bir kişi üçün kişi konnektoru, biri torpaq üçün, digəri 5 LED üçün bağlamaq üçün istifadə edilmişdir. Hər LED üçün bir rezistor da qoyduq. Bu rezistorlar 220Ω -dir və LED -lərin qısa qapanmasını və yanmasını maneə törədir. Hər bir LED müəyyən müqavimət göstərsə də, müqavimət mənbədən gələn gərginliyi maneə törətmək üçün kifayət deyil.

Addım 10: Əylən

Bu oyunu oynamaq çox asandır. Oyunçu, lövhənin 1 sağ kənarındakı V17 düyməsindən başlayır. Orta LED yanarkən açarı yuxarı çevirməlidirlər. Sonra bir açarı sola köçürürlər və eyni şeyi edirlər! Oyunçu sona çatsa, yeddinci keçid W14 -də sona çatacaq. Oyunu məğlub etsələr, həqiqətən əyləncəli bir sonlu ekran görərlər!

Qeyd etmək lazım olan bir şey, bu oyunu yaratarkən sürətlərin tamamilə sizə aid olmasıdır! Seçdiyimiz sürətlər çox yavaşdırsa, sürətləndirin və daha da çətinləşdirin! Səviyyələrin müəyyən bir sayı da yoxdur. Daha çox səviyyəyə sahib olmaq istəyirsinizsə, FSM -də və Səviyyə tərəfindən təyin olunan proses bloklarında dəyişikliklər edilməlidir, lakin bunlar çox sadə dəyişikliklərdir.

İstifadəçi girişi olaraq lövhədəki açarları istifadə etməyi də seçdik, ancaq bu da Basys3 lövhəsindəki bir düymə ilə mümkündür; istifadəçi yenidən başladıqda düymə açarları sıfırlama ehtiyacını aradan qaldıracaq. Əvvəlcə bir düymə istifadə etdik, lakin bu, səviyyəni təyin etməkdə səhvlərə səbəb oldu, çünki düyməni basılı tutarkən PushClk -in iki yüksələn kənarı vurularsa birdən çox səviyyəyə tullanacaqdı.

Aşağıda necə oynanacağını, ilk 4 səviyyədən keçməsini və son bitən ekranı göstərən bir video var.

Bu layihənin əsas faylı aşağıda verilmişdir.

Mənbələr

Basys3 istinad təlimatı

Layihə üçün ilham - Arduino Stop It oyunu

Tövsiyə: