Cuprins:

2 jucători competitivi VS sincronizare joc: 4 pași
2 jucători competitivi VS sincronizare joc: 4 pași

Video: 2 jucători competitivi VS sincronizare joc: 4 pași

Video: 2 jucători competitivi VS sincronizare joc: 4 pași
Video: LECTURA VS TOP 1 ROMANIA pe ROCKET LEAGUE 2024, Iulie
Anonim
2 jucători competitivi VS joc de sincronizare
2 jucători competitivi VS joc de sincronizare

Vei avea nevoie:

1. Digilent Basys 3, placa FPGA (sau orice alt FPGA)

2. O versiune relativ actualizată a Vivado sau a altui mediu VHDL

3. Un computer care poate rula programul menționat.

Pasul 1: Jocul în sine

Jocul în sine
Jocul în sine

Cum interacționează FSM cu modulele.

Cum se joacă

Pentru a începe, apăsați butonul din mijloc. Acest lucru va determina afișarea „99”, reprezentând sănătatea jucătorului doi, pe afișajul cu șapte segmente. Apoi, LED-urile se vor aprinde secvențial de la dreapta la stânga. Aceasta formează o bară de alimentare. Odată ce bara de alimentare este plină, se resetează. Obiectivul jucătorului unu este să-și întoarcă comutatorul atunci când bara este cât mai sus posibilă. Cu cât se aprind mai multe LED-uri, cu atât mai mult se dăunează jucătorului doi jucătorului doi. După ce jucătorul unu își răstoarnă comutatorul, daunele provocate sunt deduse din sănătatea jucătorului doi. Apoi, trece la rândul jucătorului doi. Acum, numărul afișat reprezintă starea de sănătate a jucătorului, iar bara de alimentare se umple de la stânga la dreapta. Odată ce jucătorul doi își face mișcarea, daunele sunt deduse și revin din nou la rândul jucătorului. Aceasta se repetă până când un jucător atinge 0 sănătate. Videoclipul acestei funcționări este atașat.

Pasul 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Acest joc este în esență o mare mașină de stări finite, în care există o logică complexă bazată pe starea în care se află FSM.

Starea 1: Meniu Prima stare este ecranul meniului, care este una dintre stările mai simple. Include afișajul pe șapte segmente care afișează cuvântul „JUCĂ” și butonul care determină pornirea jocului. Butonul, BTN, ne conduce la următoarea stare, care este rândul jucătorului.

Starea 2: rândul jucătorului unu

Turnul jucătorului unu activează un semnal care face ca afișajul de șapte segmente să afișeze starea de sănătate a jucătorului doi. Un alt semnal se activează pentru a activa un registru de schimbare importat dintr-un alt modul pe care l-am creat (Pone.vhd). Acest registru de schimbare face ca LED-urile să se aprindă ca un indicator de putere în creștere în alte jocuri și apoi se va reseta la 0 când atinge cantitatea maximă de LED-uri care ar putea fi aprinse. Se actualizează pe marginea ascendentă a ceasului obținut de la barclock.vhd, care este modificat dintr-un fișier de laborator împrumutat. Am făcut ca bara jucătorului să înceapă de la dreapta și să se umple până la stânga, deoarece comutatorul jucătorului unu este, de asemenea, în stânga (pentru o experiență intuitivă a utilizatorului). Odată ce comutatorul este răsturnat, starea trece la jucător cu o deducere, iar cantitatea de LED activă este salvată într-un semnal.

Starea 3: deducerea jucătorului 1 Semnalul cu cantitatea de LED activ determină cantitatea de sănătate care se deduce. Acest lucru se face având un alt registru de schimbare (deductor1.vhd) care, mai degrabă decât crește LED-urile, le scade. Acest lucru scade pe marginea ascendentă a unuia dintre modulele div ceas pe care le-am împrumutat și le-am modificat (downcounterclock.vhd). Chiar când un LED este oprit, un punct de sănătate este dedus din sănătatea totală a jucătorului doi. Dacă în acest proces jucătorul atinge 0 sănătate, ne oprim și trecem imediat la starea „Joc terminat”. În caz contrar, odată ce vectorul LED ajunge la „0000000000000000”, trecem la rândul jucătorului doi.

Starea 4: rândul jucătorului doi Turnul jucătorului doi este exact ca rândul jucătorului unu, cu excepția registrului de schimbare a acestuia (Ptwo.bhd) merge de la stânga la dreapta, iar comutatorul se află pe partea dreaptă a tabloului. Se activează un semnal pentru a afișa starea de sănătate a Playerului 1. Odată ce comutatorul 2 este activ, acesta trece la rândul de deducere al jucătorului doi.

Etapa 5: Deducerea jucătorului doi La fel ca rândul jucătorului doi, jucătorul doi deduc acționează foarte mult ca un jucător deduce. Principala diferență constă în faptul că registrul de schimbare care controlează oprirea LED-ului merge în direcția opusă, ceea ce este o modificare ușor de realizat odată ce ai jucător, deducerea funcționează corect.

Etapa 6: Joc terminat Dacă, în orice moment, fiecare jucător atinge zero sănătate, jocul trece la această stare. Nu se afișează nimic fantezist. Dacă este apăsat unul BTN, starea de sănătate este resetată la 99, iar starea revine la meniu, începând efectiv jocul.

Pasul 3: Module

Module
Module

Diagrama Black Box pentru joc

Downcounterclock (bazat pe modulul clk_div.vhd de Bryan Mealy):

Acesta este ceasul care gestionează sincronizarea deductoarelor. Constanta numită max_count este de 3 ori mai mare decât constanta max_count a barclock-ului. Acest lucru va face deductorii de 3x mai lent decât viteza barei.

Barclock - (bazat pe modulul clk_div.vhd de Bryan Mealy):

Acest ceas se ocupă de sincronizarea măsurătorilor de putere, pe care am făcut-o să creștem rapid pentru a adăuga dificultăți jocului. Această sincronizare poate fi ajustată după dorința dvs., crescând viteza făcând ca numărul max_count constant să fie un număr mai mare sau scăzând-o făcând din max_count un număr mai mic. Sseg_dec - (Scris de Bryan Mealy): Acest modul ia ca intrare un număr de 8 biți, pe care îl decodifică, convertind numărul în echivalentul său zecimal, și apoi iese pe afișajul cu șapte segmente. Pentru ca acest fișier să funcționeze, trebuie să vă asigurați că constrângerile dvs. se potrivesc cu ale noastre.

Pone:

Acesta este un registru de deplasare care deplasează biții spre stânga, adăugând un bit fierbinte pentru a face să pară că indicatorul de putere crește. Când toți biții sunt fierbinți, toți biții se resetează la „0” și ciclul începe din nou.

Ptwo:

Aceasta este o versiune răsturnată a modulului P1.

Deductor1:

Aceasta este o combinație între un registru de schimbare și un subtractor. Registrul de deplasare merge în direcția opusă registrului de deplasare al lui P1, indicând o deducere. Acest lucru scade, de asemenea, 1 din sănătatea jucătorului 2 pentru fiecare ciclu de ceas, astfel încât, combinând aceste două funcții, se va părea că sănătatea adversarului scade cu 1 pentru fiecare led din bara de sănătate care coboară.

Deductor2: Aceasta este o versiune răsturnată a modulului Deductor1.

PlayDecoder (împrumutat și modificat ușor din ekchen35649 133 instructabile): Acesta este utilizat în starea meniului pentru a afișa cuvântul „PLAY” pe decodorul cu șapte segmente.

Pasul 4: Testează

Acest joc a fost inspirat inițial de unul dintre mini-jocurile de la Kirby. Este un joc simplu cu doi jucători, care poate fi jucat pe o placă Basys 3 sau pe orice FPGA.

Pasul 1: Materiale necesare

Veți avea nevoie de: Digilent Basys 3, FPGA Board (sau orice altul) O versiune relativ actualizată de Vivado sau alt mediu vhdl Un computer care poate rula programul menționat Un creier

Pasul 2: Jocul în sine

Cum se joacă

Pentru a începe, apăsați butonul din mijloc. Acest lucru va determina afișarea „99”, reprezentând sănătatea jucătorului doi, pe afișajul cu șapte segmente. Apoi, LED-urile se vor aprinde secvențial de la dreapta la stânga. Aceasta formează o bară de alimentare. Odată ce bara de alimentare este plină, se resetează. Obiectivul jucătorului unu este de a răsturna comutatorul atunci când bara este cât mai sus posibilă. Cu cât sunt mai multe LED-uri aprinse, cu atât mai mult se dăunează jucătorului doi jucătorului doi. După ce jucătorul unu își răstoarnă comutatorul, daunele provocate sunt deduse din sănătatea jucătorului doi. Apoi, trece la rândul jucătorului doi. Acum, numărul afișat reprezintă starea de sănătate a jucătorului, iar bara de alimentare se umple de la stânga la dreapta. Odată ce jucătorul doi își face mișcarea, daunele sunt deduse și revin la rândul său. Aceasta se repetă până când un jucător atinge 0 sănătate. Videoclipul acestei funcționări este atașat.

Pentru a juca jocul, încărcați-l pe o tablă de bază și apăsați butonul din mijloc. Încercați să rotiți comutatorul cu cât mai multe LED-uri active, apoi așteptați și urmăriți cum tabloul deduce aceste puncte din sănătatea adversarului. Apoi, dă-i prietenului tău și

Pasul 3: FSM

Acest joc este în esență o mare mașină de stări finite, în care există o logică complexă bazată pe starea în care se află FSM.

(Diagrama de stat)

Starea 1: Meniu

Prima stare este ecranul meniului, care este una dintre stările mai simple. Include afișajul pe șapte segmente care afișează cuvântul „JUCĂ” și butonul care determină pornirea jocului. Butonul, BTN, ne conduce la următoarea stare, care este rândul jucătorului.

Starea 2: rândul jucătorului unu

Turnul jucătorului unu activează un semnal care face ca afișajul de șapte segmente să afișeze starea de sănătate a jucătorului doi. Un alt semnal se activează pentru a activa un registru de schimbare importat dintr-un alt modul pe care l-am creat (Pone.vhd). Acest registru de schimbare face ca LED-urile să se aprindă ca un indicator de putere în creștere în alte jocuri și apoi se va reseta la 0 când atinge cantitatea maximă de LED-uri care ar putea fi aprinse. Se actualizează pe marginea ascendentă a ceasului obținut de la barclock.vhd, care este modificat dintr-un fișier de laborator împrumutat. Am făcut ca bara jucătorului să înceapă de la dreapta și să se umple până la stânga, deoarece comutatorul jucătorului unu este, de asemenea, în stânga (pentru o experiență intuitivă a utilizatorului). Odată ce comutatorul este răsturnat, starea trece la jucător cu o deducere, iar cantitatea de LED activă este salvată într-un semnal.

Starea 3: deducerea jucătorului unu

Semnalul cu cantitatea de LED activ determină cantitatea de sănătate care se deduce. Acest lucru se face având un alt registru de schimbare (deductor1.vhd) care, mai degrabă decât crește LED-urile, le scade. Acest lucru scade pe marginea ascendentă a unuia dintre modulele div ceas pe care le-am împrumutat și le-am modificat (downcounterclock.vhd). Chiar când un LED este oprit, un punct de sănătate este dedus din sănătatea totală a jucătorului doi. Dacă în acest proces jucătorul atinge 0 sănătate, ne oprim și trecem imediat la starea „Joc terminat”. În caz contrar, odată ce vectorul LED ajunge la „0000000000000000”, trecem la rândul jucătorului doi.

Starea 4: rândul jucătorului doi

Turnul jucătorului doi este exact ca rândul jucătorului unu, cu excepția registrului de schimbare a acestuia (Ptwo.bhd) merge de la stânga la dreapta, iar comutatorul este în partea dreaptă a tabloului. Se activează un semnal pentru a afișa starea de sănătate a Playerului 1. Odată ce comutatorul 2 este activ, acesta trece la rândul de deducere al jucătorului doi.

Etapa 5: Deducerea jucătorului doi

La fel ca rândul jucătorului doi, jucătorul doi deduce acționează foarte mult ca jucătorul unu deduce. Principala diferență constă în faptul că registrul de schimbare care controlează oprirea LED-ului merge în direcția opusă, ceea ce este o modificare ușor de realizat odată ce ai jucător, deducerea funcționează corect.

Etapa 6: Joc terminat Dacă, în orice moment, fiecare jucător atinge zero sănătate, jocul trece la această stare. Nu se afișează nimic fantezist. Dacă este apăsat unul BTN, starea de sănătate este resetată la 99, iar starea revine la meniu, începând efectiv jocul.

Cutie neagră

Pasul 4: Module

Downcounterclock (bazat pe modulul clk_div.vhd de Bryan Mealy):

Acesta este ceasul care gestionează sincronizarea deductoarelor. Constanta numită max_count este de 3 ori mai mare decât constanta max_count a barclock-ului. Acest lucru va face deductorii de 3x mai lent decât viteza barei.

Barclock - (bazat pe modulul clk_div.vhd de Bryan Mealy): Acest ceas se ocupă de sincronizarea indicatorilor de putere, pe care am făcut-o să creștem rapid pentru a adăuga dificultăți jocului. Această sincronizare poate fi ajustată după dorința dvs., crescând viteza făcând constanta max_count un număr mai mare sau scăzând-o făcând din max_count un număr mai mic. Sseg_dec - (Scris de Bryan Mealy): Acest modul ia ca intrare un număr de 8 biți, pe care îl decodifică, convertind numărul în echivalentul său zecimal, și apoi iese pe afișajul cu șapte segmente. Pentru ca acest fișier să funcționeze, trebuie să vă asigurați că constrângerile dvs. se potrivesc cu ale noastre.

Pone: Acesta este un registru de deplasare care deplasează biții spre stânga, adăugând un bit fierbinte pentru a face să pară că indicatorul de putere crește. Când toți biții sunt fierbinți, toți biții se resetează la „0” și ciclul începe din nou.

Ptwo: Aceasta este o versiune răsturnată a modulului P1.

Deductor1: Aceasta este o combinație dintr-un registru de schimbare și un subtractor. Registrul de deplasare merge în direcția opusă registrului de deplasare al lui P1, indicând o deducere. Acest lucru scade, de asemenea, 1 din sănătatea jucătorului 2 pentru fiecare ciclu de ceas, astfel încât, combinând aceste două funcții, se va părea că sănătatea adversarului scade cu 1 pentru fiecare led al barei de sănătate care coboară.

Deductor2: Aceasta este o versiune răsturnată a modulului Deductor1.

PlayDecoder (împrumutat și ușor modificat din ekchen35649 133 instructabile):

Acesta este utilizat în starea meniului pentru a afișa cuvântul „PLAY” pe decodorul cu șapte segmente.

De făcut: imagini, video

Recomandat: