Tabla de contenido:

Juego de asteroides FPGA: 7 pasos (con imágenes)
Juego de asteroides FPGA: 7 pasos (con imágenes)

Video: Juego de asteroides FPGA: 7 pasos (con imágenes)

Video: Juego de asteroides FPGA: 7 pasos (con imágenes)
Video: game maker studio 2- asteroides clase 1:intro a game maker y movimiento-san juan tec 2024, Octubre
Anonim
Juego de asteroides FPGA
Juego de asteroides FPGA

Para nuestro Proyecto Final CPE 133, decidimos crear un juego de asteroides en nuestra FPGA usando dos interruptores de botón y la pantalla de 7 segmentos. El juego funciona para que un asteroide se genere en una de las tres filas seleccionadas al azar y se precipite hacia la nave en el otro lado de la pantalla de 7 segmentos. El botón superior y el botón inferior se pueden usar para mover su nave fuera del camino del asteroide. Si no lo hace, la pantalla muestra "BAnG" por un momento y luego reinicia rápidamente el juego para que el usuario pueda volver a intentarlo. A continuación se presenta una breve descripción de cómo se realizó el proyecto para que cualquier usuario pueda replicar o mejorar nuestro diseño.

Paso 1: descripción general

Visión general
Visión general
Visión general
Visión general

El proyecto consiste principalmente en máquinas de estado finito (FSM), que utilizan la lógica para transferir la FPGA entre estados que almacenan y muestran diferentes valores de posiciones de barcos y rocas. Los dos módulos principales son los FSM del juego para la roca y el barco, y el decodificador de pantalla binario a 7 segmentos FSM, que se integran entre sí utilizando un modelo estructural muy simple en VHDL.

Los FSM se crearon para la posición del barco, la posición de la roca y para el decodificador de 7 segmentos. El propósito del FSM del barco es que el barco pueda moverse a la posición correcta cuando el jugador presiona un botón hacia arriba o hacia abajo. El FSM es necesario porque necesita recordar en qué posición estuvo la última vez para poder moverse a la posición correcta.

El propósito del FSM de la roca es mover la roca a la posición correcta en función de la fila en la que se encuentra y la última posición de esa fila. Además, realiza un seguimiento de la posición del módulo que lo mostrará y selecciona de forma pseudoaleatoria una nueva fila para que aparezca en la siguiente.

El FSM para el decodificador de pantalla de 7 segmentos se utilizó no solo para mostrar el barco y la roca, sino también para mostrar "BAnG" cuando la posición del barco y la posición de la roca son las mismas.

Paso 2: Materiales

Los materiales utilizados en el proyecto fueron:

  • Placa de desarrollo Basys3 de Digilent, Inc.
  • Suite Vivado Design
  • sseg_dec.vhd (Este archivo nos fue proporcionado en Polylearn y fue escrito por Bryan Mealy)
  • Clk_div.vhd (Este archivo nos lo proporcionó Polylearn y fue escrito por Bryan Mealy)
  • Tres máquinas de estados finitos (FSM)

Paso 3: hacer el juego

Haciendo el juego
Haciendo el juego
Haciendo el juego
Haciendo el juego
Haciendo el juego
Haciendo el juego
Haciendo el juego
Haciendo el juego

El módulo del juego se creó mediante el uso de modelos de comportamiento para describir los estados de la nave y la roca para sus propios FSM respectivos. La ventaja de esto es que es mucho más fácil modelar el circuito de manera conductual al describir lo que hace en lugar de averiguar todos los componentes necesarios para diseñar el hardware.

Los estados de la roca se realizaron utilizando un generador de números pseudoaleatorios para la primera posición de la roca. Para lograr esto, le dimos al generador su propio reloj que era extremadamente rápido en relación con la velocidad del juego. En cada flanco ascendente, se incrementa un número de tres bits y todos sus valores corresponden a uno de los tres estados de inicio del barco. Por lo tanto, tres valores corresponden a la posición 3 (la parte superior derecha), tres corresponden a la posición 7 (el centro) y dos corresponden a la posición 11 (la parte inferior derecha).

Una vez que se ha producido la generación aleatoria y se le ha dado al asteroide un estado inicial, fluye horizontalmente hacia la nave sin interrupción.

0 ← 1 ← 2 ← 3

4 ← 5 ← 6 ← 7

11 ← 10 ← 9 ← 8

El reloj utilizado para la siguiente lógica de estado de la roca controla la velocidad del juego; Descubrimos a través de prueba y error que 9999999 es un buen valor para su recuento máximo.

La lógica del barco funciona inicializándose en la posición central (posición 4) en el extremo izquierdo. Si se presiona el botón superior o el botón inferior, el barco se moverá hacia arriba y hacia abajo hasta las posiciones 0 y 11 correspondientes al botón que se ha presionado.

Para que el movimiento de la nave se sienta bien para el usuario, no hicimos que su movimiento fuera asincrónico. Usamos un reloj para sus cambios de estado y usamos un conteo máximo de 5555555.

Paso 4: Visualización del resultado

El decodificador binario a 7 segmentos toma las variables de posición de 4 bits para la nave y el asteroide y muestra la imagen apropiada (ya sea la nave y la roca o el mensaje "BAnG").

Para lograrlo, primero verifica si los dos son iguales y luego muestra el mensaje "BAnG" si la verificación devuelve verdadero.

Si no devuelve verdadero, el decodificador mostrará el barco y la roca cambiando entre ellos a una frecuencia de reloj muy alta y engañando al ojo para que los vea como si se estuvieran mostrando al mismo tiempo.

Paso 5: Poniéndolo todo junto

Poniendolo todo junto
Poniendolo todo junto

Incluimos el FSM de la nave y la roca en un FSM grande que conectamos a la pantalla FSM. Las entradas al juego son el botón arriba y el botón abajo en la placa BASYS3 y el reloj del sistema. Las salidas son el segmento y los vectores de ánodo de visualización de siete segmentos.

Estas entradas y salidas se verán en el archivo de restricciones donde se asignan los puertos.

Paso 6: modificaciones futuras

En el futuro, agregar más funciones de movimiento de barcos al proyecto sería una mejora. Esto se puede lograr simplemente dando 2 entradas de botón más y permitiendo que la nave tome posiciones (estados) diferentes a 0, 4 y 8. Otra posible modificación podría ser controlar la sincronización del siguiente estado del asteroide para que comience lentamente y aumente la velocidad al 1.5x cada vez que falla la nave hasta que recibe un impacto, donde se reinicia y se vuelve lento nuevamente. Esto aumentaría la dificultad del juego y lo haría más divertido para el usuario si se implementara, y podría hacerse creando una variable para el conteo máximo del siguiente reloj de estado de la roca, multiplicando esa variable por 1.5 cada vez que el asteroide no lo haga. 't golpea, y lo restablece a su valor inicial cada vez que golpea la roca.

Paso 7: Conclusión

Este proyecto nos ha ayudado a comprender mejor las máquinas de estados finitos, los relojes y la visualización interactiva en las pantallas de siete segmentos.

Lo más importante de las máquinas de estados finitos es que es importante saber (recordar) en qué estado se encuentra actualmente para pasar al siguiente estado deseado. Irónicamente, buenos consejos de vida; debe saber dónde está para saber a dónde se dirige.

Al manipular diferentes instancias de relojes, pudimos generar números aleatoriamente, mover la piedra a la siguiente posición y gestionar la visualización de la nave, la piedra y el mensaje de fin de juego.

Aprendimos que no se puede mostrar más de un ánodo al mismo tiempo. El módulo que nos dieron aprovechó que el ojo humano solo puede ver la diferencia hasta una cierta frecuencia. Entonces se eligió una frecuencia más alta de ánodos de conmutación. El barco y la roca que se ven al mismo tiempo es en realidad una alusión, ya que cada uno se muestra por separado, pero muy rápidamente. Ese concepto se aplicó para mostrar el movimiento del barco, la roca y el mensaje "BAnG".

Recomendado: