scieee AI-readable full text Open interactive document viewer

Desarrollo de un juego sobre FPGA mediante trabajo en equipo

Jiménez Fernández, Carlos Jesús; Baena Oliva, María del Carmen; Parra Fernández, María del Pilar; Gallardo Soto, Alejandro; Potestad Ordóñez, Francisco Eugenio; Valencia Barrero, Manuel

Abstract

El aprendizaje de diseño digital a nivel RT por los alumnos mejora con trabajos prácticos, desarrollables en equipo, que permitan tanto el avance gradual de complejidad conforme se avanza en el aprendizaje como que la propuesta sea atractiva para ellos como son la realización de sencillos juegos. Las FPGA y las placas de desarrollo ofrecen una plataforma muy adecuada para la implementación de esos diseños. En esta comunicación se presenta un trabajo en la asignatura Diseño Digital Avanzado (4º curso de Grado) consistente en la construcción de una versión ligeramente adaptada del juego “simon dice” en el que el jugador debe ir memorizando una secuencia que se hace más difícil a medida que van pasando niveles. El trabajo, que ocupa la segunda mitad del cuatrimestre, es realizado por equipos de tres alumnos y debe conseguir un demostrador implementado en una placa de Digilent Nexys4-DDR.

Full text

Desarrollo de un juego sobre FPGA mediante trabajo en equipo Carlos Jesús Jimenez-Fernández Dpto. Tecnología Electrónica Universidad de Sevilla Instituto Microlectrónica de Sevilla IMSE-CNM CSIC/US Sevilla, España [email protected] Alejandro Gallardo Soto Dpto. Tecnología Electrónica Universidad de Sevilla Sevilla, España [email protected] Carmen Baena Oliva Dpto. Tecnología Electrónica Universidad de Sevilla Instituto Microlectrónica de Sevilla IMSE-CNM CSIC/US Sevilla, España [email protected] Francisco Eugenio Potestad Ordóñez Instituto Microlectrónica de Sevilla IMSE-CNM CSIC/US Sevilla, España [email protected] Pilar Parra Fernández Dpto. Tecnología Electrónica Universidad de Sevilla Instituto Microlectrónica de Sevilla IMSE-CNM CSIC/US Sevilla, España [email protected] Manuel Valencia Barrero Dpto. Tecnología Electrónica Universidad de Sevilla Instituto Microlectrónica de Sevilla IMSE-CNM CSIC/US Sevilla, España [email protected] Abstract—El aprendizaje de diseño digital a nivel RT por los alumnos mejora con trabajos prácticos, desarrollables en equipo, que permitan tanto el avance gradual de complejidad conforme se avanza en el aprendizaje como que la propuesta sea atractiva para ellos como son la realización de sencillos juegos. Las FPGA y las placas de desarrollo ofrecen una plataforma muy adecuada para la implementación de esos diseños. En esta comunicación se presenta un trabajo en la asignatura Diseño Digital Avanzado (4º curso de Grado) consistente en la construcción de una versión ligeramente adaptada del juego “simon dice” en el que el jugador debe ir memorizando una secuencia que se hace más difícil a medida que van pasando niveles. El trabajo, que ocupa la segunda mitad del cuatrimestre, es realizado por equipos de tres alumnos y debe conseguir un demostrador implementado en una placa de Digilent Nexys4-DDR. Keywords—VHDL, diseño de sistemas digitales, juegos en VHDL, FPGA. I. INTRODUCCIÓN Las asignaturas de diseño digital en últimos cursos de Grado en titulaciones electrónicas permiten utilizar lenguajes de descripción de hardware y dispositivos FPGA como plataforma para probar de forma experimental los circuitos diseñados. Esta metodología tiene muchas ventajas. Una de ellas es la utilización de un único entorno de CAD para el diseño, la verificación y la programación de los dispositivos. Además este software es ofrecido de forma gratuita para uso docente por los fabricantes de FPGA. Otra ventaja es la disponibilidad de placas de desarrollo, que incluyen además de la FPGA elementos de visualización e interfaz que permiten introducir valores a las entradas y ver resultados en las salidas. Por todo esto la enseñanza de diseño digital con el tándem VHDL-FPGA es una alternativa con un coste aceptable y, sobre todo, muy práctica con un alto atractivo para los alumnos. En la asignatura Diseño Digital Avanzado del cuarto curso del Grado de Ingeniería Electrónica Industrial, impartida en la Escuela Politécnica Superior de la Universidad de Sevilla, se pretende que el alumno aprenda los conceptos más importantes del diseño digital. Se enseña cómo realizar la descripción de circuitos digitales usando el lenguaje de descripción de hardware VHDL y la forma de implementarlos sobre dispositivos FPGA (en nuestro caso de Xilinx). El alumno tiene que realizar un trabajo propuesto sobre una placa de desarrollo Nexys4-DDR de Digilent de las que se dispone en laboratorio. En esta comunicación presentamos una propuesta llevada a cabo como trabajo en equipo dentro de la asignatura. Se trata del desarrollo de un juego de habilidad y memoria similar al conocido “Simón dice”. Debido a que el diseño es bastante complejo se realiza como segundo trabajo de la asignatura y es desarrollado por equipos de tres alumnos. En cada equipo se propone un reparto de tareas entre los componentes tanto a nivel de diseño como de verificación, con lo que se entrenarán competencias de comunicación, liderazgo y trabajo colaborativo. La realización de este trabajo supone un aprendizaje en múltiples conceptos ya que, además de los propios diseños en VHDL, se necesita utilizar un módulo adicional consistente en una matriz de diodos LED que ha de conectarse con la placa de desarrollo para mostrar las imágenes en secuencia que forman parte del juego. La estructura de esta comunicación es como sigue: en el segundo apartado se explica el mecanismo del juego. En el apartado III se detalla el diseño a realizar por parte de los alumnos. En el IV, se presenta la implementación y los resultados experimentales. Finalmente, se resumen las conclusiones. II. ESPECIFICACIONES DEL JUEGO La tarea que se desarrolla en el trabajo, como se ha comentado previamente, consiste en emular el conocido juego “Simón dice”. El objetivo de este juego es recordar en orden una secuencia de eventos que se producen y ser capaz de reproducirla. La longitud de esta secuencia de eventos se va incrementando progresivamente conforme se avanza de nivel en el juego. En nuestro caso, los eventos a memorizar son cinco dibujos diferentes, concretamente: un círculo y cuatro flechas: arriba, abajo, derecha e izquierda que se visualizarán en una matriz de 8x8 leds. Dicha matriz está insertada en una placa (“Fig. 1”) que es el resultado de un XIV Congreso de Tecnologías Aplicadas a la Enseñanza de la Electrónica 279 trabajo previo que se conecta a la Nexys4 a través de los puertos PMODS. Las imágenes que se muestran en la matriz de LED se generan de forma (pseudo)aleatoria. Se empieza por una sola imagen que debe ser recordada y reproducida por el jugador. En el siguiente paso, que supone subir un nivel, se añade una nueva imagen que se muestra en secuencia con la anterior y así sucesivamente, añadiendo una imagen cada vez que se supere un nivel. El número de imágenes de la secuencia representa el nivel alcanzado, que se va mostrando en los visualizadores 7 segmentos de la Nexys4. En caso de fallo, se comienza un nuevo juego con una nueva y diferente secuencia. Cada imagen debe estar visible un cierto tiempo razonable, después se apaga, se muestra el siguiente evento, se vuelve a apagar y así todos los dibujos de ese nivel. Una vez mostradas todas las imágenes se esperará a que el jugador repita la secuencia. Para reproducir la secuencia el jugador debe presionar uno de los cinco pulsadores que tiene la placa Nexys4 (uno por evento). Los cinco pulsadores están dispuestos en la placa formando una cruz, lo que facilita la asociación de cada uno de los pulsadores de los extremos con la dirección de cada flecha y el pulsador central con el círculo. Si la secuencia es correcta se pasa al siguiente nivel, pero si es incorrecta se debe mostrar una X en la matriz de LED dándose por finalizado el juego. El estado del juego se indica con tres leds de colores incluidos en la Nexys4. Se encenderá un led de color azul cuando se pueda pulsar, verde cuando se pulse de forma correcta y rojo cuando se haya fallado. En el siguiente apartado describiremos el sistema a desarrollar. III. D ISEÑO DEL SISTEMA A continuación, se presentan los detalles más significativos del sistema que el equipo de alumnos ha de diseñar. El módulo principal llamado “simon_dice” (“Fig. 2”) consta de las siguientes entradas y salidas. Comenzando por las entradas, se tiene:  clk: señal de reloj, se usará el reloj de la placa Nexys4, que es de 100 MHz.  reset: señal de reset asíncrono activa en alta. Se conectará al conmutador SW0 de la placa.  btnu, btnd, btnr, btnl, btnc: que se conectarán a los pulsadores, de la placa.  inicio_juego: Se conectará al conmutador SW1 de la placa. Respecto a las salidas:  fila: 8 bits que indican la fila de la matriz de LED que se iluminará.  col: 8 bits que indican los leds que se iluminarán para una fila concreta de la matriz de LED.  led_r, led_b, led_g: señales que controlarán los leds rojo, azul y verde de la placa.  an: 8 bits que habilitan el encendido de cada uno de los visualizadores 7 segmentos de la placa.  ca, cb, cc, cd, ce, cf, cg: señales que controlan los segmentos de cada visualizador. Se recomienda que el diseño tenga una estructura jerárquica, con los siguientes módulos: rom_simon, ram_datos, lfsr_16, debounce_cod, bin2bcd, bcd7seg (“Fig. 3”). El módulo rom_simon consiste en una memoria ROM que almacenará la codificación de las imágenes que se mostrarán en la matriz de LED 8x8. Cada símbolo requiere 8 filas de 8 bits. Hay que almacenar al menos siete imágenes: las cinco que pueden formar parte de la secuencia del juego, la X para indicar fallo y otra para apagar toda la matriz. Por lo tanto, se va a generar una ROM de 64 palabras de 8 bits con bus de direcciones addr_fila y bus de datos data_fila. En la “Fig. 4” se muestran las siete imágenes referidas. Para generar el contenido de la ROM se puede utilizar un editor de matrices de LED [2]. Fig. 1. Placa que contiene matriz de LED 8x8. Fig. 2. Diagrama de bloque del módulo simon_dice. reset clk inicio_juego btnu btnd btnr btnl btnc fila<7:0> col<7:0> ledr,ledb,ledg ca,cb,…cg an<7:0> módulo principal simon_dice XIV Congreso de Tecnologías Aplicadas a la Enseñanza de la Electrónica 280 El módulo ram_datos es una memoria RAM con doble puerto, uno para escritura y otro para lectura. En esta memoria se almacenará la secuencia pseudo-aleatoria de dibujos a recordar. El número máximo de valores a recordar va a ser de 128 y como hay 5 posibles valores se necesitan 3 bits para codificarlos (códigos del 0 al 4). Por lo tanto esta memoria es una RAM de 128 palabras de 3 bits con buses de dirección addra y addrb y buses de datos dia para escritura y doa, dob para lectura. La secuencia de imágenes a recordar se genera de forma pseudo-aleatoria y se almacena en el módulo ram_datos. Para generar dicha secuencia se va a utilizar el módulo lfsr_16. Se trata de un registro de desplazamiento con realimentación lineal: con el reset se carga un valor inicial y en cada ciclo de reloj se hace un desplazamiento desde el bit menos significativo hacia el bit más significativo. En el bit menos significativo se introduce la operación XOR de varios bits del propio registro. En este diseño se introduce la operación XOR de los bits 10, 12, 13 y 15. El valor inicial que se cargue al hacer el reset no puede ser todos los bits a cero. Este módulo tiene como entradas el reloj y el reset y como salida los 16 bits del registro de desplazamiento de los cuales, los tres más significativos, se conectan al bus de datos de entrada (dia) de la RAM para su escritura. Para que el sistema funcione bien es esencial eliminar los rebotes que aparecen cuando se presiona y se suelta un pulsador porque en caso contrario el circuito lo interpretará como si se hubiera pulsado dos veces detectando por lo tanto una secuencia incorrecta. Se utilizan cinco circuitos filtradores de rebotes uno para cada pulsador que se nombran debounce_u, debounce_d, debounce_r, debounce_l y debounce_c. Los alumnos pueden elegir la forma concreta de realización aunque deben explicar cómo lo han diseñado. El módulo debounce_cod tiene dos funciones: en primer lugar, proporciona una señal de reloj dividida a los módulos debounce, de forma que consuman menos recursos. En segundo lugar, proporciona al diseño simon_dice una señal de 3 bits en la que se codifica el botón pulsado (5 códigos) y un código diferente que indique si se ha pulsado más de un botón a la vez. Ha de tenerse en cuenta que el código debe coincidir con el almacenado en la ram_datos y con la visualización en la matriz de LED 8x8. Por último, se usan convertidores de código para mostrar en los visualizadores 7 segmentos de la Nexys4 el nivel de juego según se avanza. Todo el sistema se realiza en código VHDL. Esto incluye, por una parte, la descripción de los módulos ya presentados, y por otra, la descripción del módulo principal simon_dice. En esta última, se realiza la conexión entre los módulos de la jerarquía y se incluye la definición de varios procesos. Tales son, la generación de la secuencia pseudoaleatoria, la escritura de la RAM con la secuencia aleatoria, y el control del juego: inicio del proceso de mostrado de imágenes, captación de pulsaciones del jugador, comprobación de coincidencias, almacenamiento de nivel conseguido, avance de nivel o detección de fallo y, en suma, todas las tareas necesarias para el funcionamiento del juego. En cuanto a la generación de la secuencia pseudoaleatoria se recomienda, para simplificar el proceso, que cada vez que se inicie un juego se generen los datos pseudoaleatorios de los 128 niveles y se escriban en la ram_datos. Para ello, en un proceso se van tomando los 3 bits más significativos de la salida del componente lfsr_16. Si el valor está comprendido entre 0 y 4 lo escribe en la memoria. En caso contrario, deja que pasen 8 ciclos de reloj y vuelve Fig. 4. Imágenes del juego sobre matriz LED 8x8. addr_fila rom_simon 6 8 data_fila wea ram_datos 7 3 7 3 3 ena enb addra addrb dia doa dob btnu btnd btnr btnl btnc ck debounce_cod 3 lsfr_16 ck reset 3_MSB dato_random 16 nivel_ de_juego conv bin/bcd conv bcd/7seg ca cb . . . cg Fig. 3. Bloques internos más significativos del modulo principal. XIV Congreso de Tecnologías Aplicadas a la Enseñanza de la Electrónica 281 a tomar otro dato. Cuando haya escrito los 128 valores pondrá una señal a ‘1’ indicando que puede empezar las distintas fases de juego. Se recomienda que todas las fases del juego se controlen en un proceso. Este proceso tendrá que hacer las siguientes tareas:  El proceso tendrá que iniciarse cuando no se esté jugando y la señal inicio_juego se ponga a ‘1’.  Una vez iniciado, hay que mostrar en la matriz de LED 8x8 la secuencia a recordar. Para ello, mantendrá un cierto tiempo la imagen correspondiente, después mantendrá un cierto tiempo la matriz apagada y a continuación mostrará la siguiente imagen, y así hasta que haya mostrado todas las imágenes correspondientes al nivel en el que se encuentre el jugador.  Después pasa a comprobar la secuencia de botones pulsados. Esta fase comienza con el encendido del led color azul. A continuación, cada vez que se pulse de forma correcta se enciende el led verde.  Si la secuencia es correcta, se aumenta el nivel y se muestra la misma secuencia anterior añadiendo una imagen más.  Si la secuencia es incorrecta se muestra en la matriz la indicación de fallo (X) y se enciende el led de color rojo.  Por último, se espera a que se ponga a ‘1’ la entrada inicio_juego para generar una nueva secuencia pseudo-aleatoria y comenzar de nuevo. Para mostrar las imágenes en la matriz de LED 8x8, se recomienda que se haga leyendo directamente la memoria rom_datos. Para ello, el proceso que controla el funcionamiento del juego fija los 3 bits más significativos del bus de dirección de la memoria rom_datos (información leída de la memoria ram_datos), para indicar la imagen que hay que mostrar en la matriz. Los tres bits menos significativos se cambian de forma secuencial y se usan para decodificar la fila de la matriz (salida fila). En cada momento, el valor de la columna de la matriz (salida col) será el valor almacenado en la dirección correspondiente de la memoria rom_datos. Por ejemplo, suponiendo que la flecha hacia la izquierda empieza en las direcciones más bajas de la memoria, tendríamos que sus 8 filas estarían en las direcciones binarias “000_000” a “000_111”. Si la flecha hacia la derecha es la siguiente sus direcciones serían “001_000” a “001_111”, y así sucesivamente. Por lo tanto, si se quiere visualizar la flecha hacia la izquierda, el proceso que controla la fase de juego fijaría los tres bits más significativos (“000”) y otro proceso generaría de forma cíclica los tres bits menos significativos (“000” a “111”), así se irían leyendo los valores de la memoria ROM y se mostrarían en la matriz. En el siguiente apartado, se detalla cómo se ha implementado el trabajo dentro de la asignatura. IV. IMPLEMENTACIÓN Y RESULTADOS Este trabajo se desarrolla como una tarea en equipo, a desarrollar como parte de los créditos no presenciales. El equipo, formado por tres estudiantes, recibe la documentación necesaria que incluye: objetivos del trabajo, descripción general del juego, descripción del diseño a realizar con indicaciones de cómo llevarlo a cabo e instrucciones para la verificación del sistema. Asimismo, se les anima a que realicen variaciones de juego y lo añadan como diseño complementario. Los alumnos disponen de un mes para la realización del trabajo, en el que pueden acudir a tutorías. El entorno de diseño que deben usar es lSE Design Suite 14.7 de Xilinx. Para usarlo, pueden acceder al laboratorio de la asignatura donde, además, se les suministra las placas de desarrollo y la placa con la matriz de LED (“Fig.1”). Como resultado del trabajo deben entregar:  Un fichero zip que contenga el diseño del proyecto completo. Este debe contener los ficheros de diseño y todos los ficheros de test_bench utilizados, también el fichero de restricciones de pines. Además, debe entregar el fichero “.bit” de programación de la placa.  Un documento que detalle de forma clara y concisa cómo se ha realizado cada uno de los diseños, detallando la estrategia seguida para realizar el circuito de debounce y explicando cómo se ha realizado el proceso de las fases de juego.  Una tabla con el trabajo realizado por cada alumno.  Una relación de las dificultades más significativas con las que se han encontrado y cómo han sido solventadas. Una vez entregado el trabajo, todos los equipos deben mantener reuniones con el profesor para defenderlo. La evaluación tiene en cuenta la contribución de cada alumno al proyecto y, aunque es un trabajo en equipo, la nota es individual. A continuación, se muestran algunas fotos obtenidas tras la implementación, donde puede apreciarse el sistema en funcionamiento en distintas etapas del juego. Concretamente, en la “Fig. 5”, se muestra la placa con la FPGA ya programada en el instante inmediatamente anterior al comienzo del juego. En las “Fig. 6-8” se observa la placa en tres niveles de juego diferentes y con la matriz mostrando alguno de los símbolos. Por último, en la “Fig. 9” aparece la placa en situación de fallo del jugador, lo que se identifica por el diodo rojo encendido y la cruz mostrada en matriz de LED. V. CONCLUSIONES Con esta propuesta de trabajo se consigue que el alumno se enfrente al desarrollo de un diseño suficientemente complejo a partir de unas indicaciones muy generales. Además, el estudiante realiza el proceso completo de diseño, es decir, la escritura del código VHDL, depuración de errores, escritura del fichero de estímulos (testbench) que permite la simulación funcional, la implementación en la placa y su comprobación experimental. XIV Congreso de Tecnologías Aplicadas a la Enseñanza de la Electrónica 282 Se pone énfasis en el trabajo en equipo, lo que incluye la capacidad de establecer un adecuado reparto de tareas y roles, así como el desarrollo de competencias de comunicación oral, tanto entre compañeros durante el transcurso de la actividad como con el profesor a la hora de la exposición de resultados. Como conclusión se puede añadir que los estudiantes realizan con éxito el trabajo llegando incluso a proponer modificaciones puntuales o ampliaciones en algunos casos. AGRADECIMIENTOS Este trabajo ha sido parcialmente soportado el proyecto INTERVALO (TEC2016-80549-R). REFERENCIAS [1] Puede consultarse el proyecto docente en el enlace: https://www.us.es/estudiar/que-estudiar/oferta-de-grados/grado-en- ingenieria-electronica-industrial/2010034 (accedido en marzo 2020). [2] Editor de matrices de LED: https://xantorohara.github.io/led-matrix- editor/ [3] Pueden consultarse las especificaciones de la placa de desarrollo Nexys4 en: https://reference.digilentinc.com/reference/programmablelogic/nexys-4-ddr/reference-manual Fig. 5. Placa en instante previo al comienzo del juego. Fig. 6. Placa en nivel 1 del juego. Fig. 7. Placa en nivel 2 del juego. Fig. 8. Placa en el nivel 3 del juego. Fig. 9. Placa en el instante de fallo del jugador. XIV Congreso de Tecnologías Aplicadas a la Enseñanza de la Electrónica 283