Road Fighter



= Integrantes =


 * Juan Hernandez ([mailto:js.hernandez129@uniandes.edu.co js.hernandez129@uniandes.edu.co ])
 * Jorge Jimenez ([mailto:jl.jimenez52@uniandes.edu.co jl.jimenez52@uniandes.edu.co ])
 * Cristian Gonzalez ([mailto:cd.gonzalez2248@uniandes.edu.co cd.gonzalez2248@uniandes.edu.co ])

= Descripción del producto =

 Especificaciones y restricciones del proyecto 
 * Especificaciones:
 * Con dos pulsadores (derecha e izquierda) el jugador debe ser capaz de desplazar su carro hacia los lados únicamente, para evitar que los carros que van bajando (que son los únicos que se mueven en dirección vertical) lo choquen.
 * Cuando pasen 10 filas de carros sin que el carro de la parte inferior choque con ninguna de ellas, el juego aumentará un nivel, lo que quiere decir que aparecerá un carro más en cada fila de carros.
 * El primer nivel tiene 3 carros bajando en cada una de las filas y el último nivel será el nivel 5, en el cual el jugador debe esquivar 7 carros en cada fila que baja.
 * Cuando el jugador pasa de nivel la matriz prende su primera y última columna al mismo tiempo (esto es lo que el jugador ve).
 * Cuando gana (pasa los 5 niveles) aparece letra por letra (una por “pantallazo”) el mensaje GANO.
 * Si pierde se encenderá toda la matriz por un momento y luego aparecera el punto del usuario en la posicion en que estaba al perder.
 * Restricciones:
 * Las filas de carros de un mismo nivel (las que bajan) no deben ser las mismas.
 * Las filas descendentes deben bajar a 1/3 de segundo por la matriz.
 * La distancia entre dos filas de carros que bajan será de un led solamente. Es decir, cuando el juego está en funcionamiento se debe ver caer una fila de carros y luego, una completamente apagada, después una nueva (y diferente a las anteriores) fila de carros y, siguiéndole, una completamente apagada y así sucesivamente.
 * Al presionar start debe aparecer la primera fila de carros del primer nivel en la parte superior y comenzar a descender a 1/3 de segundo.
 * Al presionar reset aparecerá en la pantalla únicamente la primera fila de carros que descendera al presionar start.
 * Cuando el carro del jugador esté en uno de los bordes y se presione el pulsador de ese mismo lado, el carro debe aparecer al otro lado de la matriz.
 * Si mantiene presionado uno de los dos pulsadores de los lados (izquierda o derecha) y al mismo tiempo presiona el otro, el carro del jugador no se mueve.
 * Durante el último “pantallazo” ocurre el cambio de nivel y en este tercio de segundo, el jugador no puede mover su carro.
 * Las filas de carros que bajan no se verán en la fila inferior donde se encuentra el carro del jugador sino que bajarán solamente hasta la séptima fila.
 * El usuario no debe moverse cuando esté cambiando de nivel, de lo contrario perderá el juego.
 * El usuario solo debe moverse en el momento en que está alineado con las filas de carros vacías, de lo contrario perderá.

Descripción de la solución:

La solución planteada consiste en un diseño secuencial que contiene contadores en anillo, un contador en anillo que puede contar tanto ascendentemente como descendentemente, prescaler y decodificador; los cuales son controlados por un bloque de control. Este diseño secuencial está complementado con una memoria EEPROM. El diseño se encarga de contar el número de pantallazos que se deben mostrar en cada nivel, el nivel actual del usuario, recorrer la matriz en un tiempo de 1 milisegundo, y controlar el movimiento del LED del usuario. Todo esto es enviado a la EEPROM, la cual convertirá el conjunto de estos contadores en las columnas que se deben mostrar en cada momento.

 Referencias de proyectos base, plataformas y/o tarjetas de desarrollo usados en la implementación:
 * La programación de realizó en una CPLD XC9572XL.
 * Lenguaje de descripción: VHDL.
 * Xilinx ISE Desing Suite 13.1

Vídeos y fotos de demostración
Video en el que el jugador pierde al estrellar su carro contra alguno de los que bajan:

ofJNvW2MyUY

Video en el que el jugador pasa de nivel hasta ganar el juego: KpiJ8qLkPu8

Diagrama de caja negra

 * Señales de entrada del sistema (INPUT)
 * clkCPLD: Señal de reloj que utiliza el CPLD internamente.
 * clkNE555: Señal que genera integrado NE555 que sera disminuida por medio de una resistencia variable.
 * DER: Señal generada por el pulsador que nosotros asignamos como pulsador derecho, este es activo alto.
 * IZQ: Señal generada por el pulsador que nosotros asignamos como pulsador izquierdo, este es activo alto.
 * STR: Señal generada por el pulsador que nosotros asignamos como pulsador de start, este es activo alto.
 * RST_N: Señal generada por el pulsador que nosotros asignamos como pulsador de reset, este es activo bajo.
 * perdio: Descripción señal 2.


 * Señales de Salida (OUTPUT)
 * filas: Señal generada por la CPLD, es un vector de 8 bits que representan las filas de la matriz.
 * EEPROM: Señal generada por el CPLD,es un vector de 14 bits que se conecta a la memoria EEPROM donde se decodifican estas entradas y se obtiene un vector de 8 bits que representa las columnas en la matriz en cada momento.
 * Prescaler Señal que hace que en la matriz se recorran las filas y las columnas.

Diagrama de Bloques
Descripción general del diagrama en bloques y de flujo de datos

Cuando la señal de reset está en ‘0’, el sistema lleva a los contadores a su estado inicial, el cual manda el código necesario a la EEPROM para que se muestre en la matriz la primera fila de carros que debe descender. En el momento que la señal de start sea ´1´ (siempre y cuando reset sea ‘1’), los contadores de “PuntoCae”, “ContadorPantallazos”, “CRecorridoMatriz” y “prescaler” empezaran a contar, al ser contadores en anillo seguirán su ciclo a menos que la señal de perdió sea ‘1’ o la de reset ‘0’. El bloque “ContadorNivel” solo contara cada vez que “ContadorPantallazos” termine un ciclo. Los clock que controlan los contadores en anillo “PuntoCae”, “ContadorPantallazos”, “CRecorridoMatriz”, “ContadorNivel” y “PuntoAbajo” son prescaler (1 kHertz), ne555 (3 Hertz), prescaler (1 kHertz), CPLD (3,3 MHertz) y CPLD (3,3 MHertz) respectivamente. El bloque “PuntoAbajo” es controlado por señales de “Control” que a su vez son determinadas por DER e IZQ, cuando el habilitador de derecha esta activado el contador cuenta ascendentemente, cuando esta activado el habilitador de izquierda el contador cuenta descendentemente, si ningún habilitador está conectado el contador se quedar en el estado en el que este. Por último, las salidas de los contadores “ContadorPantallazos”, “CRecorridoMatriz”, “ContadorNivel” y “PuntoAbajo” van conectadas a las entradas de la EEPROM la cual a su vez está conectada (salidas) a las columnas de la matriz; y el contador “PuntoCae” va conectado a un decodificador de 3 a 8 el cual se conecta directamente a las filas de la matriz.



PuntoAbajo (Bloque no convencional)
este bloque es el encargado de mover el punto de abajo (es decir, nuestro carro),este es un contador de cero(0) a siete (7) que tiene como salida un vector de tres (3) bits pero este bloque no es un contador convencional sino que con una señal de entrada DER cuenta de manera ascendente y con una señal de entrada IZQ cuenta de manera descendente y si no se realiza ninguna de las dos acciones, es decir, si no se activa ninguna de las dos señales el contador no hace nada.




 * Entradas
 * clkCPLD: señal de reloj que controla este bloque.
 * der: señal que permite que el contador cuente de manera ascendente.
 * izq: señal que permite que el contador cuente de manera descendente.
 * rstout: inicializa este bloque, esta iniciaizacion lo deja en tres (3) y no en cero (0)


 * Salidas
 * ColPtoAbajo: vector de 8 bits que representan las filas de la matriz.

Bloque de Control (Control)



 * Entradas
 * STR: Señal de start que inicializa el juego.
 * IZQ: Mueve el punto de abajo un punto hacia la izquierda.
 * DER: Mueve el punto de abajo un punto a la derecha.
 * RST_N: Lleva el sistema a un estado conocido.
 * clkCPLD: Ayuda a que el control coordine todo lo que tiene que hacer.


 * Salidas
 * Reset General, Reset prescaler, habilitador, habilitador pantallazo, habilitador nivel, izquierda, derecha.


 * Explicación de como funcionan las salidas:
 * Se inicia en el estado reset. Cuando se pulsa “start” empieza el juego, empiezan a bajar las filas de carros a esquivar.
 * Si se oprime “Der/Izq” se irá al estado derecha/izquierda el cual enviara un pulso para moverse a la derecha/izquierda, luego irá a un estado intermedio VolverD/VolverI en el cual esperara a que deje de oprimirse el pulsador “der/izq” para volver al estado play.
 * Si avanza de nivel, se mostrara un pantallazo para informar al usuario, durante este último pantallazo el jugador no podrá moverse y control espera a que pase el ultimo pantallazo para reiniciar el conteo del juego pero en un nivel superior.
 * Nuevo nivel, aumenta el nivel en 1 y reinicia los contadores que imprimen el juego en la matriz.
 * Si la señal de ganar se active, control ira al estado de gano, que informa al usuario que gano.
 * Si la señal de perder se active, control ira al estado de pedio, que informa al usuario que perdió.




 * Descripción de estados
 * Estado RESET: Este estado no permite que se active ninguna señal de las de control.
 * Estado PLAY: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador, habilitador pantallazo.
 * Estado ULTIMO PANTALLAZO: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador, habilitador pantallazo.
 * Estado nUEVO NIVEL: Este estado permite que solo se active la señal de habilitador nivel.
 * Estado GANO: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador, habilitador pantallazo.
 * Estado PERDIO: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador.
 * Estado IZQUIERDA: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador, habilitador pantallazo, izquierda.
 * Estado VOLVERI: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador, habilitador pantallazo.
 * Estado DERECHA: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador, habilitador pantallazo, derecha.
 * Estado vOLVERD: Este estado permite que se activen las señales de Reset General, Reset prescaler, habilitador, habilitador pantallazo.



= Resultados =

el producto logra todo lo que teniamos esperado para el, para poder lograr que hiciera todo esto usamos 57 de las 72 macroceldas de la CPLD que equivalen aproximadamente al 80 por ciento de estas, esto debido a que la mayor parte del circuito era solo recordar los niveles por lo cual se encuentra en la EEPROM.

Simulaciones
Control


 * Simulación de movimiento completo a la derecha. Se ve como pasa a estado derecha, y luego a volverd, del cual no sale hasta que la señal der se vuelve cero.


 * Representacion en la matriz:


 * Simulacion un solo pulso de mov. Se ve como pasa al estado derecha cuando la señal der cambia a 1, en el siguiente clk cambiara a volverd para que solo se mueva 1 vez.


 * Simulación de movimiento completo a la izquierda. Se ve como pasa a estado izquierda, y luego a volveri, del cual no sale hasta que la señal der se vuelve cero.


 * Representación en la matriz:


 * Simulacion un solo pulso de mov. Se ve como pasa al estado derecha cuando la señal der cambia a 1, en el siguiente clk cambiara a volverd para que solo se mueva 1 vez.


 * Simulación en la que se muestra que cuando la entrada de perdio es 1, a pesar de que el clock del Prescaler sigue funcionando, las salidas a la EEPROM no cambian, lo que hace que la memoria muestre constantemente la matriz completamente prendida que significa que el usuario perdio.


 * Simulación que muestra que cuando está en el quinto nivel y “pasa al siguiente”, pasa a un sexto nivel que no es de juego, sino que simplemente muestra que el jugador ganó.


 * Simulación del control. Muestra Una secuencia completa de los diferentes estados que puede tomar el control. Primero se presiona y suelta el reset. Luego se presiona start, esto pone el estado en play (está jugando). Después se presiona el pulsador derecho, cosa que activa el estado de derecha y en el siguiente flanco de reloj pasa a volverd hasta que se suelte el pulsador. En ese momento vuelve a play. El mismo procedimiento se repite para izquierda. Después se hace un cambio de nivel, que habilita el estado de último pantallazo y luego nuevo nivel. Esto para que no aumente más de un nivel por señal. Finalmente se demuestra que se puede llegar al estado ganó/perdió con las señales de entrada de ganar/perder.

PuntoAbajo


 * Simulación de punto de abajo. Se ve que mientras el pulsador esté presionado, el contador aumentará. Es el control el que se encarga de hacer que al presionarlo una vez, solo aumente uno el contador. (Pulsador derecho).


 * Simulación de punto de abajo. Se ve que mientras el pulsador esté presionado, el contador aumentará. Es el control el que se encarga de hacer que al presionarlo una vez, solo aumente uno el contador. (Pulsador izquierdo).

Análisis de resultados
Las causas por las cuales el proyecto tuvo éxito fueron: empezamos a realizarlo con bastante anticipación, es decir desde que publicaron la guía en el portal de la universidad sicuaplus, nos esforzamos mucho y dedicamos la mayor parte de nuestro tiempo a la elaboración del mismo, adelantándonos a las fechas de entrega. También hubo inconvenientes que no permitieron que pudiéramos aprovechar todo el tiempo que teníamos disponible para este proyecto como el hecho de que la CPLD que nos prestaron desde el principio estaba dañada y después de que la devolvimos para ser arreglada, se le fue entregada otro grupo al que no le correspondia el uso de dicha CPLD y por tanto, nuevamente nos dieron una dañada, con lo cual tuvimos que dedicar bastante tiempo para arreglarla nosotros mismos, cuando pudimos haber aprovechado este tiempo para realizar las correcciones pertinentes a nuestro proyecto. Esta fue una de las causas por las cuales no pudimos corregir todos los mínimos errores que presentó nuestro producto. Por último, está pérdida de tiempo ocasiono que no tuviéramos suficiente tiempo para realizar la carcasa del producto como estaba planeada.

No fue posible imprimir el aviso de "gano" en la matriz cuando se gana.

= Materiales =

Dispositivos Hardware

 * CPLD XC9572XL
 * Hoja de datos Descargar
 * EEPROM 27512
 * Hoja de datos Descargar
 * Integrado 7421
 * Hoja de datos Descargar
 * Integrado 555
 * Hoja de datos Descargar
 * Integrado 2803
 * Hoja de datos Descargar
 * Integrado 2981
 * Hoja de datos Descargar

Herramientas Software

 * Xilinx ISE Design Suite 12.1
 * Enlace de descarga Descargar
 * superPRO
 * Enlace de descarga Descargar

= Código fuente =

Diseño Secuencial (VHDL)

 * Archivos Programación (.jed) (Descargar)
 * Archivos Fuente (descripción y simulación) (.vhd) (Descargar)

EEPROM

 * Archivos Programación (.text) (Descargar)

= Bibliografía =


 * Lo único que se uso en el desarrollo de este proyecto fueron nuestros apuntes de clase, diapositivas enviados por nuestros respectivos profesores donde nos explicaban las bases de la programación en xilinx usando lenguaje de descripción vhdl y por supuesto la información que encontramos en esta página sobra las CPLDs en la parte de Tarjetas de desarrollo>CPLD XC9572XL.