The Synchronous

 The Synchronous

= Integrantes =


 * Felipe Viteri ([mailto:f.viteri964@uniandes.edu.co f.viteri964@uniandes.edu.co ])
 * Sebastian Amaya ([mailto:s.amaya396@uniandes.edu.co s.amaya396@uniandes.edu.co ])
 * Nicolas Sanchez Barrera ([mailto:n.sanchez1668@uniandes.edu.co n.sanchez1668@uniandes.edu.co ])

= Descripción del producto =

Especificaciones
El problema que se soluciono a lo largo de esta practica final fue creación del famoso juego de origen Indio llamado “Snake and Ladders”. Este consiste en mover una ficha a lo largo de un tablero en forma de zig-zag. Si el jugador se encuentra con una escalera entonces debe subir al final de la escalera y si se encuentra con una serpiente entonces debe bajar al final de esta. Según las especificaciones entregadas para la realización del juego tenemos un dado electrónico que es activado con un botón de inicio que genera un numero aleatorio y un botón de reinicio que pondrá el juego y el dado en la posición inicial conocida. El numero resultante del dado y la información del botón de reinicio son enviados a la tarjeta de desarrollo CPLD XC9572XL la cual realiza un proceso interno que fue programado, luego de procesar la información los datos son enviados a una matriz de leds la cual nos muestra visualmente la posición y los movimientos de la ficha del jugador (las escaleras y culebras del laberinto se visualizaran en un acetato colocado sobre la matriz), los datos también son enviados a un led que nos indica si el jugador a ganado el juego.

Restricciones

 * Para iniciar el sistema es necesario implementar una senal de entrada para este proposito
 * La posicion del jugador cambiara en el momento que el jugador suelte el boton del dado.
 * Se debe ver claramente el movimiento del jugador por cada posicion de la matriz.
 * El jugador gana cuando haya llegado al final de la matriz en un movimiento exacto en caso contrario se debe devolver los movimientos que hagan falta.
 * En el momento que algun jugador caiga sobre una escalera o una serpiente entonces su posicion ira al final de la misma.
 * El tablero se recorre en forma de zigzag
 * Deben existir como minimo 3 escaleras y 4 serpientes.
 * El diseño en vhdl se debe poder implementar en una cpld.

Contador de movimientos
Para contar los movimientos que el jugado debe hacer se creo un contador que va a iniciar en el momento que se suelte el botón de inicio. Este contador tiene un habilitador que se va a desactivar en el momento en el que el numero del dado y el numero que sale del contador sean iguales. Es en este momento en donde sabemos que el jugador ya se ha movido las posiciones que se tenia que mover y ahora es el turno del siguiente jugador.

Posición de jugador
El modulo que se implemento para guardar la posición de cada jugador fue un contador ascendente/descendente con precarga y habilitador. Estos jugadores se activan cada vez que el jugador suelta el botón de inicio Luego existen 3 casos en donde el contador va a para o a devolverse. En el caso que el jugador haya llegado al final entonces el contador se va a detener. En caso de que el jugador haya caído en una escalera o una serpiente entonces un modulo de comparación le va a mandar la nueva fila y columna que debe tomar el contador y se la va a cargar al contador. Por ultimo en caso que el jugador llegue a la penúltima posición y no haya sacado un uno entonces el contador debe contar descendentemente.

Visualización Dinámica
Seguramente fue uno de los módulos al que se le dedico mas tiempo. Este modulo nos permitió crear una solución que va mas allá de las especificaciones del problema. Lo que se decidió hacer fue un juego de escaleras y serpientes que permitiera a dos jugadores conocer en cualquier momento su posición y saber donde está el otro jugador. Para lograr esto se utilizaros las señales de los dos jugadores que salían de los contadores. Luego la señal de filas y columnas salia dependiendo de un reloj que va a una velocidad tal que el ojo no puede percibir el cambio entre un jugador y el otro. Para lograr esto se utilizo una matriz LED 8 x 8 rojo y verde. Puesto que la Tarjeta CPLD no contaba con los suficientes pines de salida se utilizaron 3 señales para la fila de los dos jugadores y 3 señales adicionales de salida para las columnas de cada jugador que iban conectadas al rojo o al verde.

Plataformas y tarjetas de desarrollo usados en la implementación
Como se dijo anteriormente en las restricciones del problema, se debía utilizar la tarjeta de desarrollo CPLD XC9572XL. Esta tarjeta fue programada en lenguaje VHDL. Y se crearon los módulos que se explicaron anteriormente. Ademas se creo un modulo de control que recibe las señales de los otros módulos y dependiendo de las entradas entonces activa o desactiva ciertos módulos.

Vídeos y fotos de demostración
EM8OSThOv-4

Diagrama de caja negra


Imagen de diagrama de caja negra


 * Señales de entrada del sistema (INPUT)
 * dNum(3:0): Esta señal viene del dado que se hizo para la primera practica. Se tomaron las salidas de los primeros cuatro LEDs
 * seleccionTablero(1:0): Es la señal que permite seleccionar el tablero de juego
 * "clkRapido(1:0):" Es el reloj que permita le visualización dinámica, también es el que ingresa al control. Su frecuencia debe ser mayor a 32Hz.
 * "inicio(1:0):" Es el botón que permite a los jugadores lanzar el dado e iniciar el sistema
 * "rst(1:0):" Es el botón que permite a los jugadores reiniciar el sistema completo
 * "Lento(1:0):" Es el reloj que permite al usuario ver los movimientos por las diferentes posiciones del tablero. Su frecuencia es menor a 20 Hz.


 * Señales de Salida (OUTPUT)
 * columnas(2:0): Esta señal indica que fila debe prenderse. Se debe decodificar (3 a 8) para la matriz de LEDs
 * filas(7:0): Esta señal indica que columna debe prenderse, esta señal no se decodifica.
 * "gano(1:0):" Esta señal va conectada a un LED que indica si alguno de los dos jugadores gano
 * "turno:(1:0)" Esta señal va conectada a un LED que indica si es el turno del jugador verde o rojo

Diagrama de Bloques


En el diagrama en bloques podemos encontrar los módulos de cada jugador. Ademas de estos módulos tenemos un contador de movimientos que recibe de entrada el numero del dado y nos avisa cuando los movimientos de los jugadores se acabaron. Ademas nuestera solución implementa un modulo de visualización dinámica que nos permite mostrarle a los usuarios las posiciones de los dos jugadores al mismo tiempo. Por ultimo esta la maquina de estados o control.

Imagen de diagrama de bloques

Bloque de jugador






Contador Up Down

 * Entradas
 * Cuenta: Es la cuenta que lleva el contador mod 7.
 * Direccion: Le indica a los contadores de los jugadores en que direccion deben contar.
 * Hab: Habilita los contadores de los jugadores, les indica cuando contar y cuando no.
 * Reset: Reinicia la cuenta de los contadores.
 * Carga: Es la precarga de los contadores de los jugadores.
 * Nuevo num: Es el numero de la posicion de la escalera.


 * Salidas
 * Posicion 1: Es la cuenta de el contador del jgador uno, este indica la posicion de el jugador 1.

Escalera

 * Entradas
 * Posicion 1: Es la cuenta de el contador del jgador uno, este indica la posicion de el jugador 1.
 * Posicion 2: Es la cuenta de el contador del jgador uno, este indica la posicion de el jugador 2.
 * Seleccion tablero: Es la entrada que indica Cual tablero se seleccona para la posicion de las escaleras y las serpientes.


 * Salidas
 * Escalera: indica en que posicicon hay esclera y si el jugador ha caido en ella.

Comparador Cuenta

 * Entrada
 * Posicion : Es la cuenta de el contador del jgador uno, este indica la posicion del jugador.


 * Salida
 * Ultima posicion: Indica si el jugador ha ganado el juego.

Visualizacion dinamica




Mux Jugador

 * Entrada
 * Posicion1 : Es la cuenta de el contador del jgador uno, este indica la posicion de el jugador1
 * Posicion 2: Es la cuenta de el contador del jgador uno, este indica la posicion de el jugador 2.
 * Selec jugador: Selecciona cual jugador se debe visualizar.


 * Salidas
 * Bin columnas: Es la Columna en la cual se encuentra el jugador que se este visualizando.
 * Bin flias: Es la fila en la cual se encuentra el jugador que se este visualizando.

Corrector Columna

 * Entrada
 * Bin columnas: Es la Columna en la cual se encuentra el jugador que se este visualizando.


 * Salida
 * Bin columnas corregido: Es la posicicon de la columna corregida (hacia que lado es el movimiento.

Deco Dado

 * Entrada
 * Bin filas: Es la fila en la cual se encuentra el jugador que se este visualizando.


 * Salida
 * Final filas: Es la posicion de la fila en donde el jugador se debe encontrar ya fisicamente en la matriz.

Deco Dado

 * Entradas
 * Num dado: es el numero que el jugador saca en el dado.


 * Salidas:
 * Bin Dado: El numero de el dado en binario.

Comparador dado

 * Entradas
 * Bin Dado: El numero de el dado en binario.


 * Salidas
 * Bin dado comp: Indica cuando el contador ha llegado al numero de el dado.

Contador Modulo 7

 * Entradas
 * CLKL: Es la entrada de reloj con la frecuencia mas baja.


 * Salidas
 * Cuenta: Es la cuenta que lleva el contador mod 7.

Maquina de estados (Control)


Imagen de diagrama de caja negra bloque de control


 * Entradas
 * clk(1:0):  señal del reloj rapido
 * escalera1(1:0):  señal que indica si el jugador 1 cayo en escalera
 * escalera2(1:0):  señal que indica si el jugador 2 cayo en escalera
 * inicio(1:0):  señal que indica si se presiono el boton de inicio
 * rst(1:0):  D señal del boton de rst
 * termino(1:0):  señal que indica si se termino el numero de movimientos
 * ultimaPosicion1(1:0):  señal que indica si el jugador 1 llego a la ultima posicion
 * ultimaPosicion2(1:0): señal que indica si el jugador 2 llego a la ultima posicion


 * Salidas
 * activarMovimientos(1:0):  señal que activa el contador de movimientos
 * activarPosicion1(1:0): señal que activa el movimiento de posicion del jugador 1
 * activarPosicion2(1:0):  señal que activa el movimiento de posicion del jugador 2
 * carga1(1:0):  señal que indica si el jugador 1 llego a la ultima posicion
 * carga2(1:0):  señal que indica si el jugador 1 llego a la ultima posicion
 * direccion1(1:0):  señal que indica la direccion en la que debe ir el jugador 2
 * direccion2(1:0):  señal que indica la dirección en la que debe ir el jugador 2
 * gano(1:0):  señal que indica si alguno de los dos jugadores gano
 * rstMovimientos(1:0):  señal para reiniciar el modulo de contador de movimientos
 * rstPosicion(1:0):  señal para reiniciar la posición de los jugadores
 * turno(1:0):  señal que indica que jugador tiene el turno




 * Descripción de estados
 * Estado S00: A este estado se llega en el momento en el que se presiona el botón de reinicio
 * Estado S0: A este estado se llega luego de que el jugador suelta el botón de reinicio o el turno del jugador 2 termino
 * Estado S1: A este estado se llega en el momento que el jugador 1 presiona el botón de inicio
 * Estado S2: A este estado se llega en el momento que el jugador 1 suelta el botón de inicio
 * Estado S4: A este estado se llega en el momento que el jugador 1 ha llegado a la ultima posición y los movimientos no se han terminado
 * Estado S5: A este estado se llega en el momento que el jugador 1 ha completado el numero de movimientos que le dio el dado
 * Estado S7: A este estado se llega en el momento que el jugador 2 ha llegado al final del tablero luego de haber completado el numero de movimientos que le dio el dado
 * Estado S8: A este estado se llega en el momento que el jugador 1 ha llegado al final del tablero luego de haber completado el numero de movimientos que le dio el dado
 * Estado S9: A este estado se llega en el momento que el jugador 2 presiona el botón de inicio
 * Estado S10: A este estadio se llega luego de que el jugador 2 suelta el botón de inicio.
 * Estado S11: A este estado se llega en el momento que el jugador 2 ha llegado a la ultima posicion y los movimientos no se han terminado
 * Estado S12: A este estado se llega en el momento que el jugador 2 cayo en una escalera o una serpiente
 * Estado S15: A este estado se llega en el momento que jugador 1 cayo en una escalera o una serpiente

Resultados
Los resultados de la practica fueron satisfactorios. Logramos crear la solución al problema y ademas mejoramos un aspecto en la jugabilidad. Aunque todavía y los errores son mínimos, podemos concluir que la solución es eficiente y cumple los requerimientos

Pruebas y test sobre el producto ( Simulaciones )

 * Contador Up Down con Precarga:



En este caso al inicio se reseteo el contador para posteriormente habilitarlo y que empezara la cuenta ascendentemente, para en el momento en el que la señal de habilitación es 0.



En este caso sea la señal de habilitación que la de devolver están en 1 y por lo tanto se empezara la cuenta pero acá al estar devolver en 1 se contara descendentemente. El numero inicial es 10 y al momento de contar descendentemente el que le sigue es 9 seguirá de esta forma hasta que se deshabilite hab.



En este caso la señal de hab y de devolver están ambas en 1 mientras que cuando se activa cargar el nuevo numero que se desea entra al contador y en el momento en que esta señal se vuelve 0 empieza la cuenta y en este caso descendentemente. El numero que se ingreso fu 000111 (7) y al bajarse cargar la cuenta es: 000110(6), 000101(5) y así sucesivamente hasta que hab se vuelva 0.


 * ContadorModulo7:



En la simulación puede verse claramente que el modulo a sido reseteado, dejando el valor inicial en 0 y en el momento en el que se habilito empezó la cuenta de forma ascendente, hasta el momento en el que la señal de habilitación se vuelve cero y el valor se queda así hasta que se vuelve a resetear el sistema y el valor vuelve a 0.


 * Comparador Dado:

En esta simulación hay tres marcadores de tres colores distintos, en el caso del color amarillo se puede visualizar que los dos números entrantes son iguales, pero es imposible que suceda esto ya que el dado electrónico no es capaz de lanzar un 0, aun así ya que los dos números son iguales la señal de comparación es igual a ‘1’. En el segundo marcador de color blanco los dos números que entran son idénticos ( 6=6) y acá comparación esta en ‘1’. El caso que sigue por el contrario muestra que al ser a diferente a B comparación será ‘0’.


 * Deco Dado:

En la simulación puede observarse que cada numero que entra del dado a sido transformado a decimal de forma correcta.


 * Comparador Cuenta:

Este modulo se encarga de activar la señal comparación en el momento en el que la entrada es igual a “111111”. En la simulación es posible visualizar que en los tres primeros marcadores el numero no corresponde a lo deseado y por lo tanto la señal comparación es ‘0’ mientras que en el cuarto marcador la entrada e igual a lo deseado y por lo tanto comparación se eleva a ‘1’.


 * Separador:

Este modulo lo que realiza es la división de los 6 bits entrantes, en dos partes iguales. En el marcador amarillo la entrada corresponde a 000001 dividiéndolo, primero se puede observar las filas que son 000 y después están las columnas que serian 001. En el segundo marcador la entrada es 000011 dividiéndolo quedaría: 000 para las filas y 011 para las columnas. En el último marcador, de color blanco, la entrada corresponde a 000100, dividiéndolo quedaría 000 para columna y 100 para fila.


 * Deco 3 a 8:

En esta simulación lo que se puede observar es que la transformación que se esta realizando respeta la siguiente tabla, en donde la segunda columna es el numero que entra y la primera es la decodificación que ira a la matriz de leds y hará que se encienda el punto deseado.




 * Corrector columna:

Este modulo debería de corregir la columna en el momento en el que la fila es impar. En el primer marcador la fila en la que se encuentra se sabe que es impar porque el último bit a la derecha es un 1, por tal motivo se invierten todos los bits de la columna y resulta 000. En el segundo marcador la fila es impar y por ende el resultado no se invierte y es igual a la entrada 000. El marcador amarillo muestra otro caso en el que la fila es impar, por lo tanto la entrada que era 110 se invierte a 001. En el último marcador hay otro caso de impar, la entrada era 101 y la salida convertida es 010. Todos los casos descritos han sido transformados correctamente.


 * Mux Jugador:

En esta simulacion de el mux del jugador podemos ver como al modulo le llegan dos posiciones una para el jugador uno y una para el jugador dos, este mux controla la salida de los jugadores para la visualizacion por lo tanto cuando la entrada conel nombre selección es uno se selecciona el jugador dos y cuando es cero se elije al jugador uno, la entrada selección es un reloge que hace que los jugadores se intercambien rapidamente para lograr una visualizacion dinamica con la cual podemos ver a los dos jugadores simultaneamente en el tablero.


 * Tablero

En esta simulacion vemos parte de la organización del primer tablero, aquí el jugador se encuentra en una posicion inicial 000000 y luego avanza a la posicion 000010 en donde se encuentra con una escalera que lo sube a la posicion 011100, luego el jugador se encuentra en una posicion 010111 la cual es una casilla con escalera por lo tanto sube a la posicion 101001 y finalmente en la posicion 111101 se encuentra una culebra por lo tanto el jugador debe bajar a la posicion 011111.


 * Comp Escalera:

En esta simulacion el tableo se encuentr se leccionado, por lo tanto si el jugador cae en la casilla 000010 se encuentra con una escalera que lo sube  a la posicion 011100 y luego el tablero 01 se encuentra selecionado y el jugador cae en la posicion 011000 en donde se encuentra con una escalera y por consiguiente sube a la posicion 110111.


 * Maquina de estados:

En esta simulacion vemos como funciona el control, este esta hecho con una maquina de estados de la cual podemos ver su funcionameiento en la simulacion, en esta podemos ver como los dos jugadores estan jugando, cada vez que precionan el boton de inicio quiere decir que han sacado un nuevo numero en el dado, los jugadores avanzan de esta manera hasta que el jugador uno gana el juego, por lo tanto la maquina de estados pasa a el estado s7 el cual bloquea el juego hasta que se es espichado el boton de reset que para a el estado s0 luego s00 y de nuevo s00, luego los jugadores inician nuevamente el juego solo que esta vez el jugador dos gana y se actualiza la posicion al estado s8 el cual bloquea el juego hasta que el boton de reset es espichado nuevamente ( cada ves que un jugador gana la senal de gano es activada).


 * Top:

En esta simulacion el juego se inicia, y luego el jugador uno saca en el dado en numero dos y luego cae en una escalera que le hace subir y luego el jugador dos saca en el dado el numero cinco con el cual sigue derecho por la escalera por lo tanto no la sube y cae en la posicion correspondiente.



En esta simulacion se puede ver el caso en el que el jugador ha caido en una serpiente y estando en la fila 00000100 ha bajjado hasta la primera fila y sobre la misma columna, el numero con el que el jugador cayo en esta posicion fue el “0100” que convertido es un 3.



En esta imagen se puede observar que la señal de gano al lado izquierdo esta en ‘1’, esto significa que el jugador 2 ha ganado, se puede observar que la fila esta en 10000000, que corresponde a la ultima y la columna esta en 11111110 que tambien es el ultimo punto, por lo tanto la simulacion esta correcta y ademas el estado en el que esta es el s7, que corresponde al ganar del segundo jugador.

Análisis de resultados
Podemos concluir que se cumplieron los objetivos deseados satisfactoriamente. Seguramente la causa de éxito fue la perseverancia y paciencia que se tuvo durante la implementación de la solución. Se tuvo dificultades para encontrar las frecuencias correctas de cada reloj pero al final se logro.

Trabajos futuros
Para nosotros fue muy difícil estar cambiando constantemente de tarjeta CPLD. Esto hacia que cada vez que queríamos probar algo que habíamos programado en la casa debíamos usar una tarjeta nueva. No habríamos tenido ningún problema si todas las tarjetas funcionaran perfecto. Pero lastimosamente muchas presentan problemas en las conexiones con los cables. También tuvimos problemas al programar las tarjetas pues en muy pocos computadores Xilinx no nos daba error. Esto hacia que perdiéramos bastante tiempo encontrando una CPLD que funcionara y un computador que la pudiera programar

= Materiales = 4 protoboards, 1 matriz de leds bicolor, 2 decodificadores 74138, 1 negador 7404, 2 pulsadores, 1 pal22vv10, 1 buzzer, 9 leds, 9 resistencias, 2 ne555, 1 trimmer 1 k, 2 resistencias 10 k, 1 condensador 0.22 uF, 1 condensador 0.1 uF, 2 resistencias 1 k, 1 dip switch, 1 condensador 0.01 uF, 7 resistencias 220 K, 1 cpld

Dispositivos Hardware

 * CPLD XC9572XL
 * Hoja de datos Descargar...
 * HD74LS138P
 * Hoja de datos Descargar...
 * NE555
 * Hoja de datos Descargar...
 * SN74HCO4N
 * Hoja de datos Descargar...
 * PAL 22V10
 * Hoja de datos Descargar...

Codigo Fuente

 * Codigo Programación


 * [[Media:programaFinalConSimulaciones.rar|Download]]

Herramientas Software

 * Xilinx ISE Design Suite 13.1_1
 * Enlace fabricante/distribuidos/Descarga Descargar.../ir...