Tabla de contenido:

Juego de reacción FPGA: 10 pasos
Juego de reacción FPGA: 10 pasos

Video: Juego de reacción FPGA: 10 pasos

Video: Juego de reacción FPGA: 10 pasos
Video: FPGA vs. emulador - LAG 2024, Mes de julio
Anonim
Juego de reacción FPGA
Juego de reacción FPGA

Por Summer Rutherford y Regita Soetandar

Paso 1: Introducción

Para nuestro proyecto final para CPE 133, diseñamos un juego de reacción en VHDL para una placa Basys3. Este juego se puede comparar más de cerca con el juego de arcade "Stacker", donde el jugador tiene que soltar los bloques en el momento adecuado. La placa Basys3 está conectada a una placa de pruebas, que tiene LED alternos. Estas luces LED se alternarán a una frecuencia específica, dependiendo del nivel. Este juego utiliza el divisor de reloj y la pantalla de 4 dígitos y 7 segmentos, así como una máquina de estados finitos. Cuando el jugador activa el interruptor correcto cuando se enciende el LED del medio, el jugador avanzará al siguiente nivel del juego, aumentando la frecuencia de los LED alternos. Esto hace que cada nivel sucesivo sea más difícil que el nivel anterior. Cuando el jugador supera con éxito el nivel 7, el nivel más alto, se mostrará un mensaje en la pantalla de segmento y todos los LED parpadearán simultáneamente.

Paso 2: Materiales

Materiales
Materiales
Materiales
Materiales
Materiales
Materiales

Los materiales que necesitarás son:

  • Placa Digilent Basys3 con cable micro USB
  • Tablero de circuitos
  • 5 LED
  • 5 resistencias (usamos 220 ohmios)
  • 11 cables de puente
  • Computadora con Vivado

Paso 3: Diseño de caja negra del diagrama de nivel superior

Diagrama de nivel superior Diseño de caja negra
Diagrama de nivel superior Diseño de caja negra
Diagrama de nivel superior Diseño de caja negra
Diagrama de nivel superior Diseño de caja negra

Como puede ver, nuestro diagrama de bloques de nivel superior comienza obteniendo los relojes requeridos de nuestro submódulo, ClkDivide. Estos relojes son entradas a los distintos bloques de proceso. Esencialmente, el juego tiene que reconocer que cuando un usuario enciende correctamente el interruptor, los LED deben comenzar a alternar más rápido y la pantalla debe subir un nivel. El diagrama de bloques puede parecer un poco loco, pero eso se debe a que hay muchas señales que se establecen en un determinado proceso y luego esa señal define otra señal en otro bloque de proceso.

Al final, las únicas entradas que toma el juego son el reloj de entrada en el tablero Basys3 que funciona a 100 Mhz, siete interruptores en el tablero Basys3 y el botón de reinicio. Lo que se emite es el ánodo para la pantalla de siete segmentos, los siete segmentos para la pantalla y los LED.

Paso 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Este submódulo divisor de reloj creó un reloj más lento dependiendo del valor que le asignamos en nuestro archivo principal. Usamos este submódulo para determinar Clk400, PushClk y newlck. Este submódulo toma un reloj y un divisor de 32 bits como entradas. Se emite un reloj ralentizado. Hay un bloque de proceso para el divisor y el reloj ralentizado. En el proceso hay una variable temporal, a la que llamamos contar, que cuenta uno cada vez que se golpea un flanco ascendente del reloj introducido. Una vez que alcanza el número del divisor, el reloj ralentizado cambia y la cuenta se reinicia a cero.

Paso 5: Bloque de proceso de cambio

Bloque de proceso de cambio
Bloque de proceso de cambio

El bloque de proceso Shift controla el movimiento alterno y la velocidad de los LED. En la lista de sensibilidad están las señales newclk y Stop. La parada provoca un breve retraso cuando el usuario pasa de nivel. Si Stop no es alto, los LED se alternan de forma normal en función de la velocidad de newclk. Este patrón alterno está controlado por dos variables: seguimiento y recuento. Count determina qué LED debe estar encendido, mientras que Track determina si el conteo debe contar hacia arriba o hacia abajo. Hay otra señal, Final, que se aplica solo cuando el Nivel es "111", lo que indica que el jugador ha ganado el juego. Final alterna entre 0 y 1 en cada flanco del reloj para encender y apagar los LED de forma continua. Este es solo un elemento visual para la exhibición final.

Este proceso de cambio es el lugar perfecto para comenzar este proyecto. Si puede hacer que sus LED se alternen de manera correcta y consistente, ¡desde aquí solo tiene que agregar el comportamiento al subir de nivel!

Paso 6: máquina de estados finitos

Máquina de estados finitos
Máquina de estados finitos

Creamos una máquina de estados finitos para dictar el comportamiento cuando se presiona el interruptor de entrada o el botón de reinicio. Cada estado es un "nivel" y si el interruptor se enciende en el momento incorrecto o se presiona el reinicio, el nivel vuelve a "000". De lo contrario, si el interruptor se enciende correctamente, entonces el nivel se mueve hacia arriba hasta que alcanza el estado final, "111" y aparece la pantalla final. El FSM se basa en los dos bloques de proceso sync_proc y comb_proc. Sync_proc usa el reloj que llamamos PushClk. Este reloj controla qué tan rápido el siguiente estado se convierte en el estado actual. Este reloj debería ser bastante rápido; Elegimos una velocidad que era aproximadamente dos veces más rápida que nuestra velocidad LED más rápida.

Implementamos este código usando un FSM para los niveles; sin embargo, después de este proyecto, nos dimos cuenta de que un uso más eficiente de un FSM podría haber sido tener un estado de conteo ascendente, un estado de reinicio o un estado de suspensión. Si no se presiona nada, está en estado de suspensión. Si se presiona reiniciar o el reproductor se estropea, está en estado de reinicio. Si se presiona correctamente, está en el estado de conteo ascendente. ¡También hay muchas otras formas de usar un FSM en este juego!

Paso 7: Control del bloque de proceso de visualización con nivel

Control de bloque de proceso de visualización con nivel
Control de bloque de proceso de visualización con nivel

El nivel controla el bloque de proceso de visualización. Las variables en la lista de sensibilidad son Level, Reset y Clk400. La pantalla de 7 segmentos comienza mostrando "1" para el primer nivel. Cuenta hasta 7 cada vez que el usuario pasa de un nivel para mostrarle en qué nivel se encuentra. Una vez que el usuario ha pasado el nivel 7, muestra "COOL" para significar que el jugador ha ganado el juego. Esta pantalla "COOL" funciona con un reloj de 400 Hz que llamamos Clk400. Si se presiona Reset, la pantalla vuelve a "1".

Paso 8: Control de la velocidad del LED con nivel

Control de la velocidad del LED con nivel
Control de la velocidad del LED con nivel

Finalmente, Level controla la velocidad de los LED. El nivel es la única señal en la lista de sensibilidad. D1 es la señal que entra en el proceso Clock Divider para obtener newclk. Cada vez que se cambia el nivel, o cambia el estado, el bloque de proceso "Velocidad". Este proceso determina el valor de D1. Hay 8 valores definidos de D1 que elegimos en función de la rapidez con la que queríamos que se ejecutara cada nivel. D1 se vuelve más pequeño cada vez que aumenta el nivel para que newclk se ejecute más rápido.

Paso 9: Montaje de hardware

Ensamblaje de hardware
Ensamblaje de hardware

Conectamos la placa de pruebas al Basys3 con uno de los conectores pmod. Se utilizaron seis de los puertos pmod para enchufar un conector macho a macho, uno para tierra y los otros cinco para los 5 LED. También colocamos una resistencia para cada LED. Estas resistencias son de 220 Ω y evitan que los LED se cortocircuiten y se quemen. Aunque cada LED tiene cierta resistencia, la resistencia no es suficiente para impedir el voltaje de la fuente.

Paso 10: ¡Diviértete

Este juego es muy fácil de jugar. El jugador comienza en el interruptor 1 del extremo derecho del tablero, V17. Deben mover el interruptor hacia arriba cuando el LED del medio está encendido. Luego mueven un interruptor hacia la izquierda y hacen lo mismo. Si el jugador llega al final, terminará en el séptimo cambio, W14. ¡Si ganan el juego, pueden ver una pantalla final realmente divertida!

¡Algo a tener en cuenta es que al crear este juego, las velocidades dependen totalmente de ti! Si las velocidades que hemos elegido son demasiado lentas, ¡siéntete libre de acelerarlas y hacerlo aún más desafiante! Tampoco hay un número fijo de niveles. Si desea que tenga aún más niveles, hay modificaciones que deben realizarse en el FSM y los bloques de proceso determinados por Level, pero estos son cambios muy simples.

También elegimos usar interruptores en la placa como entrada del usuario, pero esto también es posible con un botón en la placa Basys3; el botón eliminará la necesidad de restablecer los interruptores cada vez que el usuario comience de nuevo. Inicialmente usamos un botón, sin embargo, esto causó errores al definir el nivel porque saltaría varios niveles si se presionan dos bordes ascendentes de PushClk cuando se mantiene presionado el botón.

A continuación se muestra un video que demuestra cómo jugar, pasando por los primeros 4 niveles y la pantalla final final.

El archivo principal de este proyecto se incluye a continuación.

Fuentes

Manual de referencia de Basys3

Inspiración para el proyecto: juego Arduino Stop It

Recomendado: