Sommario:

Gioco di reazione FPGA: 10 passaggi
Gioco di reazione FPGA: 10 passaggi

Video: Gioco di reazione FPGA: 10 passaggi

Video: Gioco di reazione FPGA: 10 passaggi
Video: Maranza cerca di prendermi la moto 2024, Luglio
Anonim
Gioco di reazione FPGA
Gioco di reazione FPGA

Di Summer Rutherford e Regita Soetandar

Passaggio 1: Introduzione

Per il nostro progetto finale per CPE 133, abbiamo progettato un gioco di reazione in VHDL per una scheda Basys3. Questo gioco può essere paragonato più da vicino al gioco arcade "Stacker" in cui il giocatore deve far cadere i blocchi al momento giusto. La scheda Basys3 è collegata a una breadboard, che ha i LED alternati. Queste luci a LED si alterneranno a una frequenza specifica, a seconda del livello. Questo gioco utilizza il divisore dell'orologio e il display a 7 segmenti a 4 cifre, oltre a una macchina a stati finiti. Quando il giocatore attiva l'interruttore corretto quando il LED centrale si illumina, il giocatore avanzerà al livello successivo del gioco, aumentando la frequenza dei LED alternati. Questo rende ogni livello successivo più difficile del livello precedente. Quando il giocatore supera con successo il livello 7, il livello più alto, verrà visualizzato un messaggio sul display a segmenti e tutti i LED si accenderanno e si spegneranno contemporaneamente.

Passaggio 2: materiali

Materiali
Materiali
Materiali
Materiali
Materiali
Materiali

I materiali di cui avrai bisogno sono:

  • Scheda Digilent Basys3 con cavo micro USB
  • tagliere
  • 5 LED
  • 5 resistenze (abbiamo usato 220 ohm)
  • 11 ponticelli
  • Computer con Vivado

Passaggio 3: progettazione della scatola nera del diagramma di livello superiore

Diagramma di livello superiore Design scatola nera
Diagramma di livello superiore Design scatola nera
Diagramma di livello superiore Design scatola nera
Diagramma di livello superiore Design scatola nera

Come puoi vedere, il nostro diagramma a blocchi di primo livello inizia ottenendo i clock richiesti dal nostro sottomodulo, ClkDivide. Questi clock sono ingressi nei vari blocchi di processo. In sostanza, il gioco deve riconoscere che quando un utente accende correttamente l'interruttore, i LED devono iniziare ad alternarsi più velocemente e il display deve salire di un livello. Il diagramma a blocchi potrebbe sembrare un po' folle, ma questo è dovuto al fatto che ci sono molti segnali che vengono stabiliti in un determinato processo e quindi quel segnale definisce un altro segnale in un altro blocco di processo.

Alla fine, gli unici input che il gioco accetta sono l'orologio in ingresso sulla scheda Basys3 che funziona a 100 Mhz, sette interruttori sulla scheda Basys3 e il pulsante di ripristino. Ciò che viene emesso è l'anodo per il display a sette segmenti, i sette segmenti per il display e i LED.

Passaggio 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Questo sottomodulo divisore di clock ha creato un clock più lento a seconda del valore che gli abbiamo mappato nel nostro file principale. Abbiamo usato questo sottomodulo per determinare Clk400, PushClk e newlck. Questo sottomodulo accetta un clock e un divisore a 32 bit come input. Viene emesso un clock rallentato. C'è un blocco di processo per il divisore e l'orologio rallentato. Nel processo c'è una variabile temporanea, che abbiamo chiamato conteggio, che conta uno ogni volta che viene colpito un fronte di salita del clock immesso. Una volta raggiunto il numero del divisore, l'orologio rallentato si è attivato e il conteggio si è azzerato.

Passaggio 5: blocco del processo di spostamento

Blocco processo di spostamento
Blocco processo di spostamento

Il blocco del processo Shift controlla il movimento alternato e la velocità dei LED. Nella lista della sensibilità ci sono i segnali newclk e stop. Stop provoca un breve ritardo quando l'utente supera il livello. Se Stop non è alto, i LED si alternano normalmente in base alla velocità di newclk. Questo schema alternato è controllato da due variabili: Track e count. Count determina quale LED deve essere acceso, mentre Track determina se il conteggio deve aumentare o diminuire. C'è un altro segnale, Finale, che si applica solo quando il Livello è "111", che indica che il giocatore ha battuto il gioco. Final alterna tra 0 e 1 ogni fronte di clock per accendere e spegnere continuamente i LED. Questo è solo un elemento visivo per il display finale.

Questo processo di spostamento è il punto di partenza perfetto per questo progetto. Se riesci a far alternare i tuoi LED in modo corretto e coerente, da qui devi solo aggiungere il comportamento quando sali di livello!

Passaggio 6: macchina a stati finiti

Macchina a stati finiti
Macchina a stati finiti

Abbiamo creato una macchina a stati finiti per dettare il comportamento quando viene premuto l'interruttore di input o il pulsante di ripristino. Ogni stato è un "livello" e se l'interruttore viene acceso al momento sbagliato o viene premuto il ripristino, il livello torna a "000". Altrimenti, se l'interruttore è correttamente acceso, il livello sale fino a raggiungere lo stato finale, "111" e si verifica la visualizzazione finale. L'FSM si basa sui due blocchi di processo sync_proc e comb_proc. Sync_proc utilizza l'orologio che abbiamo chiamato PushClk. Questo orologio controlla la velocità con cui lo stato successivo diventa lo stato attuale. Questo orologio dovrebbe essere abbastanza veloce; abbiamo scelto una velocità che era circa due volte più veloce della nostra velocità LED più veloce.

Abbiamo implementato questo codice utilizzando un FSM per i livelli; tuttavia, dopo questo progetto ci siamo resi conto che un uso più efficiente di un FSM avrebbe potuto essere uno stato di conteggio in avanti, uno stato di ripristino o uno stato di permanenza. Se non viene premuto nulla, è in stato di permanenza. Se viene premuto reset o il lettore è incasinato, è in stato di reset. Se premuto correttamente, è nello stato di conteggio in avanti. Ci sono molti altri modi per usare un FSM anche in questo gioco!

Passaggio 7: controllo del blocco del processo di visualizzazione con il livello

Controllo del blocco del processo di visualizzazione con il livello
Controllo del blocco del processo di visualizzazione con il livello

Livello controlla il blocco del processo Visualizza. Le variabili nell'elenco di sensibilità sono Level, Reset e Clk400. Il display a 7 segmenti inizia visualizzando "1" per il primo livello. Conta fino a 7 ogni volta che l'utente supera un livello per mostrare all'utente a quale livello si trova. Una volta che l'utente ha superato il livello 7, visualizza "COOL" per indicare che il giocatore ha battuto il gioco. Questo display "COOL" funziona con un clock a 400 Hz che abbiamo chiamato Clk400. Se si preme Reset, il display torna a "1".

Passaggio 8: controllo della velocità del LED con il livello

Controllo della velocità del LED con il livello
Controllo della velocità del LED con il livello

Infine, Level controlla la velocità dei LED. Il livello è l'unico segnale nell'elenco delle sensibilità. D1 è il segnale che va nel processo Clock Divider per ottenere newclk. Ogni volta che il livello viene modificato o lo stato cambia, il processo blocca "Velocità". Questo processo determina il valore di D1. Ci sono 8 valori definiti di D1 che abbiamo scelto in base alla velocità con cui volevamo che ogni livello fosse eseguito. D1 diventa più piccolo ogni volta che il livello aumenta in modo che il newclk funzioni più velocemente.

Passaggio 9: assemblaggio dell'hardware

Assemblaggio hardware
Assemblaggio hardware

Abbiamo collegato la breadboard al Basys3 con uno dei connettori pmod. Sei delle porte pmod sono state utilizzate per collegare un connettore maschio a maschio, una per la terra e le altre cinque per i 5 LED. Abbiamo anche posizionato una resistenza per ogni LED. Questi resistori sono da 220 e impediscono che i LED vengano cortocircuitati e bruciati. Sebbene ogni LED abbia una certa resistenza, la resistenza non è sufficiente per impedire la tensione dalla sorgente.

Passaggio 10: divertiti

Questo gioco è molto facile da giocare. Il giocatore inizia dall'interruttore 1 all'estrema destra del tabellone, V17. Devono alzare l'interruttore quando il LED centrale è acceso. Quindi spostano un interruttore a sinistra e fanno la stessa cosa! Se il giocatore arriva alla fine, finirà al settimo interruttore, V14. Se battono il gioco, possono vedere un finale davvero divertente!

Qualcosa da notare è che quando crei questo gioco le velocità dipendono totalmente da te! Se le velocità che abbiamo scelto sono troppo lente, sentiti libero di accelerarlo e renderlo ancora più impegnativo! Inoltre, non esiste un numero fisso di livelli. Se vuoi che abbia ancora più livelli, ci sono modifiche che devono essere apportate all'FSM e ai blocchi di processo determinati da Livello, ma si tratta di modifiche molto semplici.

Abbiamo anche scelto di utilizzare gli interruttori sulla scheda come input dell'utente, ma questo è possibile anche con un pulsante sulla scheda Basys3; il pulsante eliminerà la necessità di ripristinare gli interruttori ogni volta che l'utente ricomincia. Inizialmente abbiamo utilizzato un pulsante, tuttavia ciò ha causato errori nella definizione del livello perché salterebbe più livelli se due fronti di salita di PushClk venivano colpiti quando il pulsante veniva tenuto premuto.

Di seguito è riportato un video che mostra come giocare, passando attraverso i primi 4 livelli e il display finale.

Il file principale per questo progetto è incluso di seguito.

Fonti

Manuale di riferimento Basys3

Ispirazione per il progetto - Arduino Stop It game

Consigliato: