Mündəricat:

VHDL Basys3: 4 Oyunu birləşdirin: 5 addım
VHDL Basys3: 4 Oyunu birləşdirin: 5 addım

Video: VHDL Basys3: 4 Oyunu birləşdirin: 5 addım

Video: VHDL Basys3: 4 Oyunu birləşdirin: 5 addım
Video: VHDL : Labs 2024, Bilər
Anonim
VHDL Basys3: Connect 4 Oyunu
VHDL Basys3: Connect 4 Oyunu

Giriş:

Bu Vivado Software istifadə edərək VHDL -də hazırlanmış və Basys3 Board -a proqramlaşdırılmış Connect 4 Rəqəmsal Məntiq Oyunu. Bu layihənin inşası və dizaynı aralıqdır, lakin yeni gələnlər addımları kopyalayıb rəqəmsal oyunu qura bilərlər.

Oyun Connect 4 oyunu kimi işləyir. Oyunçular, lövhədə tapılan sol və sağ düymələrdən istifadə edərək imlecini ekran boyunca hərəkət etdirə bilərlər. Lövhədə orta düyməni basmaq, oyunçunun markerini həmin sütuna yerləşdirməsinə səbəb olacaq və sonra növbəti oyunçunun növbəsi olacaq. Oyunçu qalib gəldikdən sonra lövhədəki yuxarı düyməni basaraq oyunu sıfırlaya bilərsiniz.

Addım 1: Tez Təfərrüatlar və Materiallar

Tez Texniki Təfərrüatlar:

  • Lövhədə üç dəst PMOD bağlantısından istifadə edir (JA, JB, JC)

    • Hər bir PMOD konnektoru üçün istifadə olunan 8 pin (Vcc və GND pinləri istisna olmaqla)
    • JA - Satırlara Nəzarət
    • JB - Yaşıl Sütunlara Nəzarət
    • JC - Qırmızı Sütunlara Nəzarət
  • Ekran saatı 960Hz -də işləyir

    Bir anda yalnız 8 LED yanır. Ekran, kifayət qədər sürətli bir saat sürətində təzələnir ki, müəyyən bir zamanda 8 -dən çox LED yanır

  • Düymə saatı 5Hz -də işləyir; İsteğe bağlı olaraq VHDL kodunu düzəltməklə tənzimlənən cərimələnə bilər.
  • LED yanmasının qarşısını almaq üçün Darlington Arrays-ın daxili müqaviməti kifayətdir

Oyun aşağıdakı komponentlər və vasitələrdən istifadə etməklə qurulmuşdur:

  • (1) Basys3 Board
  • (2) LED Matrix İki rəngli 8x5:
  • (2) ULN2803 - Darlington Transistor Diziləri - Məlumat Cədvəli
  • Tel makaraları
  • Jumper telləri
  • Tel çıxarıcı
  • Çörək taxtası (Böyük Meydan kifayətdir)
  • Multimetre və Güc Təchizatı (Problem Giderme)

Addım 2: Avadanlıqların birləşdirilməsi

Avadanlıq Bağlanması
Avadanlıq Bağlanması
Avadanlıq Bağlanması
Avadanlıq Bağlanması

Təlimatlar:

Layihənin naqilləri son dərəcə qarışıq ola bilər, zəhmət olmasa vaxt ayırın və bütün bağlantıların bir dəfəyə doğru olduğunu yoxlayın.

Layihə iki LED ekranın istifadəsini nəzərdə tutur, lakin bir böyük ekran yaratmaq üçün birləşdirilir. Bu, bütün satırları eyni nöqtəyə bağlamaqla edilə bilər. Hər bir ekran iki rəngli olduğundan bir ekranın qırmızı və yaşıl satırları digər ekranın qırmızı və yaşıl satırlarına da bağlanmalıdır. Bunu etməklə bütün satırları cəmi 8 sancaqla idarə edə bilərik. Digər 16 pin ekran sütunlarını idarə etmək üçün istifadə olunur. Qutunun 8 sancağı jumper kabelləri vasitəsilə pmod bağlayıcılarına birbaşa qoşula bilər. Pmod əlaqələri əvvəlcə ULN2083A girişinə gedir və ULN2083A çıxışı birbaşa ekrandakı sütuna bağlanır. Dizayn 8x8 olduğundan, bəzi sütunlar fiziki olaraq bağlanmayacaq.

  • JA: Satır əlaqələri: 1 -dən JA -ya: 1 -dən 8 -ə, JA üçün: 10.
  • JA: Qırmızı Sütun əlaqələri:
  • JC: Yaşıl Sütun əlaqələri

Hansı pinlərin hansı satırlara/sütunlara uyğun olduğunu bilmək üçün yerləşdirilmiş şəkillərə baxın.

Qeyd: Transistorlar müqavimət qurduqlarına görə LED -lərin onlara əlavə olaraq müqavimət göstərməsinə ehtiyac yoxdur.

Addım 3: Texniki İzahat: Ekran

Ekran görmə davamlılığı üzərində işləyir. Ekran o qədər təzələnir ki, insan gözü bəzi LED -lərin sürətlə sönüb açıldığını gözlə görə bilmir. Əslində, ekran saatını yavaşlatmaqla yanıb -sönənləri görə bilərsiniz.

Ekran, bu satırlar üçün saxlanılan məlumatlara görə səkkiz satırın hamısını açır və ekran bir sütunu açır. Sonra tez bir zamanda səkkiz sıra üçün növbəti məlumat girişinə keçir və digər sütunları söndürərkən növbəti sütunu açır. Bu proses kifayət qədər sürətli bir sürətlə davam edir ki, LED -in titrəməsi gözə çarpmır.

VHDL sənədindəki arxitekturadan dərhal sonra ekran üçün məlumat saxlama sistemi aşağıdakı qaydada işə salınır:

siqnal RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 aşağıya 0): = "00000000";

siqnal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 aşağıya 0): = "00000000"; - Satır məlumatları sütundan asılıdır: YAŞIL

LED ekran matrisini idarə edən prosesin kiçik bir parçası.

- LED ekran matrisini idarə edən proses: proses (ColCLK) - 0 - 16, həm 8X8 RED, həm də 8x8 GREEn matris dəyişənini yeniləmək üçün RowCount: 0 -dan 16 -dək tamsayı aralığı: = 0; başlamaq əgər (yüksələn_kiymət (ColCLK)) sonra əgər (RowCount = 0) sonra DORow <= RedA; - Müvafiq DOCol Sütunu üçün Satır Məlumatları <= "1000000000000000"; - Sütun Tetikleyici- Bu kodu "0000000000000001" ə qədər təkrarlayın- RedB, RedC… GreenA, GreenB… GreenH olaraq dəyişdirin.

GreenH -in sonunda, proses sona çatmazdan dərhal əvvəl, RowCount -un sıfıra qaytarılması üçün bu snippet daxil edilir.

if (RowCount = 15) sonra - A sütunundan yeniləməni yenidən başladın RowCount: = 0; başqa RowCount: = RowCount + 1; - Sütunlar arasında keçin, əgər;

İndi ekran prosesinin həssaslıq siyahısında olan saatı izah edək. Basys3 lövhəsi 100 MHz -də işləyən daxili saata malikdir. Məqsədlərimiz üçün, bu çox sürətli bir saatdır, buna görə aşağıdakı prosesi istifadə edərək bu saatı 960 Hz saata bölməliyik.

- 960Hz-də işləyən saat prosesi başlamaq əgər (yüksələn_kiymət (CLK)) sonra clkcount: = clkcount + 1; əgər (clkcount = 52083) onda ColCLK <= deyil (ColCLK); clkcount: = 0; bitərsə; bitərsə; prosesi bitirmək;

Addım 4: Texniki İzahat: Göstərilən Məlumatın dəyişdirilməsi

Texniki İzahat: Göstərilən Məlumatın Dəyişdirilməsi
Texniki İzahat: Göstərilən Məlumatın Dəyişdirilməsi

VHDL kodunda, ekranda görünəcək məlumatlar və ya məlumatlar həssaslıq siyahısında fərqli bir saata malik olan kursor prosesi ilə idarə olunur. Bu kod BtnCLK adlanırdı, düymələrə basıldıqda onların boşalmasını minimuma endirmək üçün nəzərdə tutulmuşdu. Bu, bir düyməyə basıldığı təqdirdə, üst sıradakı imlecin sütunlar arasında çox sürətlə hərəkət etməməsi üçün daxil edilir.

- 5 Hz-də işləyən saat prosesi. ButtonCLK: proses (CLK) dəyişən btnclkcount: 0-dan 10000001-ə qədər tam aralıq: = 0; if if (Yüksələn_Kənar (CLK)) sonra sonra (btnclkcount = 10000000) sonra btnclkcount: = 0; BtnCLK <= yox (BtnCLK); başqa btnclkcount: = btnclkcount + 1; bitərsə; bitərsə; prosesi bitirmək;

Bu prosesin BtnCLK siqnal çıxışı ilə indi kursor prosesini izah edə bilərik. Kursor prosesində həssaslıq siyahısında yalnız BtnCLK var, ancaq kod blokunda düymələrin vəziyyəti yoxlanılır və bu RedA, RedB… GreenH üçün verilənlərin dəyişməsinə səbəb olacaq. Burada sıfırlama blokunu və birinci sütunun blokunu ehtiva edən kursor kodunun bir parçası var.

kursor: proses (BtnCLK) dəyişən OCursorCol: STD_LOGIC_VECTOR (2 aşağıya 0): = "000"; - OCursorCol əvvəlki sütun dəyişənini NCursorCol izləyir: STD_LOGIC_VECTOR (2 aşağıya 0): = "000"; -NCursorCol yeni kursor sütununun başlanğıcını təyin edir-RESET şərti (YUKARI Düyməsini)-Lövhə oyunun yenidən başlaması üçün təmizlənir (yüksələn_kiymət (BtnCLK)), sonra (RST = '1') sonra RedA <= "00000000"; RedB <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; RedH <= "00000000"; GreenA <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; GreenD <= "00000000"; GreenE <= "00000000"; GreenF <= "00000000"; GreenG <= "00000000"; GreenH if (Lbtn = '1') sonra NCursorCol: = "111"; - H sütunu H elsif (Rbtn = '1') sonra NCursorCol: = "001"; - B sütunu elsif (Cbtn = '1') sonra NCursorCol: = OCursorCol; - Sütun eyni NTurnState qalır <= deyil (TurnState); - Növbəti oyunçunun növbəsini tetikler- Cari sütunu aşağıdan yuxarıya doğru yoxlayır və yanmayan ilk LED-i yandırır. Rəng cari oyunçunun kursor rəngindən asılıdır. (RedA (0) = '1') və (RedA (ck) = '0') və (GreenA (ck) = '0') və sonra RedA (Ck) <= '1' olarsa, 7 aşağı 1 döngədə ck üçün; RedA (0) <= '0'; Çıxış; bitərsə;

əgər (GreenA (0) = '1') və (RedA (ck) = '0') və (GreenA (ck) = '0') onda

YaşılA (Ck) <= '1'; GreenA (0) - Qırmızı Oyunçu GreenA (0) <= '0'; if (NCursorCol = OCursorCol) sonra - RedA (0) heç bir şeyə basılmadıysa <= '1'; elsif (NCursorCol = "111") sonra - Lbtn RedH (0) <= '1' düyməsinə basılsa; RedA (0) <= '0'; elsif (NCursorCol = "001") sonra - Iff Rbtn RedB (0) <= '1' basıldı; RedA (0) - Yaşıl Oyunçu RedA (0) <= '0'; əgər (NCursorCol = OCursorCol) sonra GreenA (0) <= '1'; elsif (NCursorCol = "111") sonra GreenH (0) <= '1'; YaşılA (0) <= '0'; elsif (NCursorCol = "001") sonra GreenB (0) <= '1'; YaşılA (0) <= '0'; bitərsə; son hal;

Diqqət yetirin: OCursorCol (Köhnə Kursor Sütunu deməkdir) son hal maşınının başlanğıcıdır. Ekranın hər bir sütunu FSM -də öz vəziyyəti kimi qəbul edilir. 8 sütun var, buna görə hər bir sütunu bir vəziyyət olaraq təyin etmək üçün 3 bitlik ikili ədəd dəsti istifadə edilmişdir. FSM -in vəziyyət arasında necə hərəkət etməsi basılan düymədən asılıdır. Yuxarıdakı parçada, sol düyməyə basılırsa, FSM ekranın son sütunu olacaq "111" ə keçəcək. Sağ düyməyə basılırsa, FSM ekranın ikinci sütunu olacaq "001" ə keçəcək.

Orta düyməyə basılırsa, FSM yeni bir vəziyyətə keçməyəcək, əksinə, TurnState siqnalında bir dəyişikliyə səbəb olacaq, bu da hansı oyunçunun növbəsinin olduğunu qeyd etmək üçün bir bitlik bir siqnaldır. Əlavə olaraq, orta düymənin ən aşağı hissəsində yuxarıya qədər boş bir sətrin olub olmadığını yoxlayan bir kod bloku işləyəcək. Ən aşağı, doldurulmamış sıraya bir marker qoymağa çalışacaq. Unutmayın, bu dörd oyunu birləşdirir.

Daxil olan vəziyyət ifadəsində: TurnState, kursor rənginin nə olduğunu və məlumatları dəyişdirmək istədiyimiz birinci sətirdə dəyişiklik edirik, beləliklə görüntü prosesi dəyişikliyi əks etdirə bilər.

Qalan yeddi hal üçün bu əsas kodu təkrar edirik. FSM diaqramı, əyalətlərin necə dəyişdiyini anlamaqda faydalı ola bilər.

Addım 5: Kod

Kod
Kod

Bu, Vivado Software istifadə edərək VHDL -də tərtib edilə bilən Connect 4 -ün funksional kodudur.

Oyunu işə salmaq üçün bir məhdudiyyət də verilir.

Hər bir prosesin giriş və çıxışlarının bir -biri ilə necə əlaqəli olduğunu izah edən bir blok diaqramı təqdim etdik.

Tövsiyə: