Taula de continguts:

Joc de reacció FPGA: 10 passos
Joc de reacció FPGA: 10 passos

Vídeo: Joc de reacció FPGA: 10 passos

Vídeo: Joc de reacció FPGA: 10 passos
Vídeo: El Game Boy que ganó por accidente 2024, Desembre
Anonim
Joc de reacció FPGA
Joc de reacció FPGA

Per Summer Rutherford i Regita Soetandar

Pas 1: Introducció

Per al nostre projecte final de CPE 133, vam dissenyar un joc de reacció en VHDL per a un tauler Basys3. Aquest joc es pot comparar amb el joc arcade "Stacker", on el jugador ha de deixar caure els blocs en el moment adequat. La placa Basys3 està connectada a una placa de control, que té els LED alternatius. Aquests llums LED s’alternaran a una freqüència específica, en funció del nivell. Aquest joc utilitza el divisor de rellotge i la pantalla de 4 dígits de 7 segments, a més d'una màquina d'estats finits. Quan el jugador activa l’interruptor correcte quan s’encén el LED central, el jugador avançarà al següent nivell del joc, augmentant la freqüència dels LED alterns. Això fa que cada nivell successiu sigui més dur que el nivell anterior. Quan el jugador bat amb èxit el nivell 7, el nivell més alt, apareixerà un missatge a la pantalla del segment i tots els LEDs parpellejaran simultàniament.

Pas 2: materials

Materials
Materials
Materials
Materials
Materials
Materials

Els materials que necessiteu són:

  • Taula Digilent Basys3 amb cable micro USB
  • Taula de pa
  • 5 LEDs
  • 5 resistències (hem utilitzat 220 ohms)
  • 11 cables de pont
  • Ordinador amb Vivado

Pas 3: Disseny de quadre negre del diagrama de nivell superior

Diagrama de nivell superior Disseny de caixa negra
Diagrama de nivell superior Disseny de caixa negra
Diagrama de nivell superior Disseny de caixa negra
Diagrama de nivell superior Disseny de caixa negra

Com podeu veure, el nostre diagrama de blocs de nivell superior comença per obtenir els rellotges necessaris del nostre submòdul, ClkDivide. Aquests rellotges són entrades als diferents blocs de procés. Bàsicament, el joc ha de reconèixer que quan un usuari encén correctament l’interruptor, els LED han de començar a alternar-se més ràpidament i la pantalla ha de pujar d’un nivell. El diagrama de blocs pot semblar una mica boig, però això es deu al fet que hi ha molts senyals que s’estableixen en un determinat procés i que aquest senyal defineix un altre senyal en un altre bloc de procés.

Al final, les úniques entrades que pren el joc són el rellotge d’entrada del tauler Basys3 que funciona a 100 Mhz, set commutadors al tauler Basys3 i el botó de reinici. El que es produeix és l’ànode per a la pantalla de set segments, els set segments per a la pantalla i els LED.

Pas 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Aquest submòdul divisor de rellotge va crear un rellotge més lent segons el valor que hi vam assignar al nostre fitxer principal. Hem utilitzat aquest submòdul per determinar Clk400, PushClk i newlck. Aquest submòdul pren com a entrades un rellotge i un divisor de 32 bits. Es produeix un rellotge lent. Hi ha un bloc de procés per al divisor i el rellotge lent. En el procés hi ha una variable temporal, que anomenem recompte, que compta una cada vegada que es colpeja una vora ascendent del rellotge introduït. Un cop assoleix el nombre divisor, el rellotge alentit es commuta i es torna a zero.

Pas 5: Canvia el bloc del procés

Bloc de procés de canvi
Bloc de procés de canvi

El bloc de procés Shift controla el moviment i la velocitat alterns dels LED. A la llista de sensibilitat hi ha els senyals newclk i Stop. L'aturada provoca un breu retard quan l'usuari passa el nivell. Si Stop no és alt, els LED s’alternen de manera normal en funció de la velocitat de newclk. Aquest patró altern està controlat per dues variables: Seguiment i recompte. El recompte determina quin LED ha d’estar encès, mentre que la pista determina si el recompte ha de comptar cap amunt o cap avall. Hi ha un altre senyal, Final, que només s'aplica quan el nivell és "111", que indica que el jugador ha guanyat el joc. El final alterna entre 0 i 1 cada vora del rellotge per encendre i apagar els LED de manera contínua. Això és només un element visual per a la visualització final.

Aquest procés de canvi és el lloc perfecte per començar aquest projecte. Si podeu aconseguir que els vostres LED s’alternin de manera correcta i constant, a partir d’aquí només heu d’afegir el comportament en pujar de nivell.

Pas 6: màquina d'estats finits

Màquina d'estats finits
Màquina d'estats finits

Hem creat una màquina d'estats finits per dictar el comportament quan es prem l'interruptor d'entrada o el botó de restabliment. Cada estat és un "nivell" i si l'interruptor està activat en el moment equivocat o es prem el reinici, el nivell torna a "000". En cas contrari, si l'interruptor està activat correctament, el nivell es mou cap amunt fins que arriba a l'estat final, es mostra "111" i apareix la visualització final. El FSM es basa en els dos blocs de procés sync_proc i comb_proc. Sync_proc utilitza el rellotge que anomenem PushClk. Aquest rellotge controla la velocitat amb què el següent estat es converteix en l'estat actual. Aquest rellotge hauria de ser força ràpid; vam triar una velocitat aproximadament dues vegades més ràpida que la nostra velocitat LED més ràpida.

Hem implementat aquest codi utilitzant un FSM per als nivells; no obstant això, després d'aquest projecte ens vam adonar que un ús més eficient d'un FSM podria haver estat tenir un estat de recompte, un estat de reinici o un estat de permanència. Si no es prem res, es manté en estat. Si es prem el restabliment o el reproductor està desordenat, es troba en estat de reinici. Si es prem correctament, es troba en l'estat de recompte. També hi ha moltes altres maneres d’utilitzar un FSM en aquest joc.

Pas 7: Control del bloc de processos de visualització amb el nivell

Control del bloc de processos de visualització amb nivell
Control del bloc de processos de visualització amb nivell

Level controla el bloc del procés de visualització. Les variables de la llista de sensibilitat són Nivell, Restabliment i Clk400. La pantalla de 7 segments comença mostrant "1" per al primer nivell. Compta fins a 7 cada vegada que l'usuari passa un nivell per mostrar-li a quin nivell es troba. Un cop l'usuari ha passat el nivell 7, mostra "COOL" per indicar que el jugador ha guanyat el joc. Aquesta pantalla "COOL" funciona amb un rellotge de 400 Hz que anomenàvem Clk400. Si es prem Reinici, la pantalla torna a ser "1."

Pas 8: Control de la velocitat del LED amb el nivell

Control de la velocitat del LED amb el nivell
Control de la velocitat del LED amb el nivell

Finalment, Level controla la velocitat dels LED. El nivell és l'únic senyal de la llista de sensibilitat. D1 és el senyal que entra al procés Clock Divider per obtenir newclk. Cada vegada que es canvia el nivell o es canvia l'estat, el bloc de procés "Velocitat". Aquest procés determina el valor de D1. Hi ha 8 valors definits de D1 que hem triat en funció de la rapidesa amb què volíem que s'executés cada nivell. D1 es redueix cada vegada que augmenta el nivell de manera que el newclk s’executa més ràpidament.

Pas 9: Muntatge de maquinari

Muntatge de maquinari
Muntatge de maquinari

Hem connectat la taula de suport al Basys3 amb un dels connectors pmod. Sis dels ports pmod es van utilitzar per connectar un connector mascle a mascle, un per a terra i els altres cinc per als 5 LED. També hem col·locat una resistència per a cada LED. Aquestes resistències són de 220 Ω i impedeixen que els LED siguin curtcircuitats i cremats. Tot i que cada LED té certa resistència, la resistència no és suficient per impedir el voltatge de la font.

Pas 10: Diverteix-te

Aquest joc és molt fàcil de jugar. El jugador comença a l'interruptor 1 de la dreta del tauler, V17. Han de girar l'interruptor fins que el LED central està encès. A continuació, mouen un interruptor cap a l’esquerra i fan el mateix. Si el jugador arriba al final, acabarà al setè interruptor, W14. Si superen el joc, podran veure una exhibició final molt divertida.

Alguna cosa a destacar és que en crear aquest joc, les velocitats depenen totalment de vosaltres. Si les velocitats que hem escollit són massa lentes, no dubteu a accelerar-la i fer-ho encara més difícil. Tampoc hi ha un nombre fixat de nivells. Si voleu que tingui encara més nivells, cal fer modificacions a la FSM i als blocs de procés determinats per Level, però es tracta de canvis molt senzills.

També vam optar per utilitzar commutadors a la placa com a entrada de l'usuari, però això també és possible amb un botó a la placa Basys3; el botó eliminarà la necessitat de restablir els commutadors cada vegada que l'usuari comença de nou. Inicialment vam utilitzar un botó, però això va provocar errors en definir el nivell, ja que saltaria diversos nivells si es premessin dues vores ascendents de PushClk quan es mantenia premut el botó.

A continuació es mostra un vídeo que demostra com es juga, passant pels primers 4 nivells i la pantalla final final.

A continuació s’inclou el fitxer principal d’aquest projecte.

Fonts

Manual de referència Basys3

Inspiració per al projecte: el joc Arduino Stop It

Recomanat: