JuegoNIM G2

Imágenes de Logo y nombre del producto

Imágenes de Logo y nombre del producto

= INTEGRANTES =


 * by
 * by
 * by

= DESCRIPCIÓN GENERAL DEL PROYECTO =


 *  Especificaciones y restricciones del proyecto:

El proyecto consiste en la implementación del juego conocido como NIM en el que dos jugadores deben remover el numero de fichas que deseen de una misma fila siguiendo turnos de manera que gane el juego quien obtenga la ultima ficha. El juego es originario de china y tiene distintas variedades. El juego debe ser implementado en la FPGA Spartan 3 utilizando únicamente un mouse PS2/2 y un monitor VGA de 800 x 600. La solución debe estar basada en el uso de bloques simples como Datapath, registros, shift register, ALU entre otros.

En esta implementación solo habrá un jugador enfrentandose a la maquina, con el objetivo principal que sea esta la ganadora en todas las ocasiones. El proyecto se implementa en bloques simples con controles que se encargan de tareas particulares manejando únicamente al datapath para dicho fin. Un control general es el encargado de dirigir a todos los subcontroles en una secuencia de pasos que de como resultado el juego en su totalidad.

La interfaz permite al usuario conocer el estado actual del juego en todo momento. Permite realizar la jugada del usuario por medio del mouse y posteriormente la jugada de la maquina que es siempre ganadora. Ademas, el programa informa al usuario cuando es su turno y permite reiniciar el juego en cualquier momento. La selección del escenario inicial del juego es pseudoaleatorio de manera que la mayoría de los juegos son distinitos, esto permite confirmar que la jugada de la maquina sigue un algoritmo general que permite un resultado ganador para cualquier caso. La parte de interfaz con usuario tiene como base el proyecto del curso al que se le realizan modificaciones para cargar imágenes y obtener un comportamiento que permita conectarse con la parte lógica y así poder jugar.


 *  Referencias de proyectos base, plataformas y/o tarjetas de desarrollo usados en la implementación:

Snimpy esta basado en el funcionamiento del proyecto VGAPS2 disponible en la WIKI(2), este proyecto permite visualizar y controlar un cursor en un monitor VGA e interactuar por medio del click para cambiar el color de 2 franjas en la pantalla.

Vídeos y/o fotos de demostración del prototipo final
haZHxeXXmhI Video/Foto 1

Diagrama de estados
Imagen de diagrama de caja negra

Diagrama de Caja Negra

 * El sistema cuenta con 10 salidas, que corresponden a lo que se va a mostrar en el monitor VGA y algunos periféricos de la FPGA como los Led y los display de 7 segmentos

Imagen de diagrama de caja negra


 * Señales de Entrada del sistema (INPUT)
 * CLK_50:Señal de reloj del sistema a 50 MHz.
 * rst: Descripción señal 2.


 * Señales de Salida del sistema (OUTPUT)
 * HabSal: habilita los displays 7 segmentos.
 * Leds: Controla los leds de la FPGA.
 * Ordenes: informacion que se desea visualizar en el display 7 segmentos.
 * "Grn:" Salida al canal Verde de la interfaz VGA del monitor.
 * "Red:" Salida al canal Rojo de la interfaz VGA del monitor.
 * "Hs:" Señal de sincronización Horizontal con la interfaz VGA del monitor.
 * "Hs:" Señal de sincronización Vertical con la interfaz VGA del monitor.
 * "PS_c:" Señal de reloj a la interfaz PS/2 del mouse (INOUT).
 * "PS_d:" Señal de datos a la interfaz PS/2 del mouse (INOUT).

Macroalgoritmo general de solución
Imagen de macroalgoritmo general de solución

= DESCRIPCIÓN ESPECIFICA DEL PROYECTO =

Arquitectura del Sistema

 * El producto final es el resultado de la interconexión entre diferentes bloques de uso común entre los que se destacan la Alu, registros, datapath y algunos bloques de control que se encargan de la comunicación entre ellos.

Imagen de diagrama de bloques, señales e interconexiones

Bloque ALU

 * Unidad aritmético lógica, es el bloque encargado de realizar operaciones aritméticas como suma, resta, multiplicación entre otras y operaciones lógicas como si, y, o y no entre dos números.



Imagen de diagrama de caja negra bloque ALU

Imagen de diagrama de flujo/algoritmo
 *  Parrafo 2: Descripción de algoritmo
 * Entradas
 * BusA: Conexión con registro que contiene uno de los datos que se desea operar.
 * BusB: Conexión con registro que contiene el segundo dato que se desea operar.
 * Op: palabra de control que indica la operación a realizar.
 * Salidas
 * Salida :  Salida que contiene el resultado de la operación indicada por la palabra de control.
 * Cero :  Bandera que indica si la salida es un 0.

Bloque Registros

 * Este bloque consiste en un banco de 16 registros

Imagen de diagrama de caja negra bloque X


 *  Parrafo 2: Descripción de algoritmo

Imagen de diagrama de flujo/algoritmo


 * Entradas
 * Rd_index1:  Selecciona el registro que va a salir por el BusA.
 * Rd_index2:  Selecciona el registro que va a salir por el BusB.
 * Wr_data:  Dato que se desea guardar en un registro.
 * Wr_Index:  Dirección del registro que se desea escribir.
 * CLK:  Descripción salida 1.
 * Reset:  Descripción salida 1.
 * Wr_enable:  Habilitador que permite o prohibe la escritura de un registro.


 * Salidas
 * Rd_data1:  Información del registro indicado por Rd_index1.
 * Rd_data2:  Información del registro indicado por Rd_index2.

Bloque Datapath

 * 'El datapath es el control encargado de manejar los registros y la alu para que en estos se realicen y almacenen diferentes operaciones indicadas por el control del juego.

Imagen de diagrama de caja negra bloque X


 *  Parrafo 2: Descripción de algoritmo

Imagen de diagrama de flujo/algoritmo


 * Entradas
 * Op:  Señal que indica la operación a realizar.
 * Rd_index1:  Dirección del primer registro que se desea operar.
 * Rd_index2:  Dirección del segundo registro que se desea operar.
 * Wr_data:  Dato que se desea guardar en un registro.
 * Wr_index:  Dirección del registro que se desea escribir.
 * CLK:  Descripción entrada 1.
 * Op_shift:  Descripción entrada 1.
 * RST:  Señal de reset para reiniciar el bloque.
 * Sel:  Selector que indica si el dato que se debe guardar en los registros es el que viene de la alu o es otro.
 * Wr_enable:  habilita la escritura de un registro.


 * Salidas
 * Salida :  Resultado de la operación indicada por el control.
 * cero:  Bandera que indica si el resultado de la operación es 0.

Simulaciones de respaldo y material de apoyo
Imagen de simulaciones
 *  Simulacion ALU:
 * Cuando la operacion es 00 la salida es equivalente al busA
 * Cuando op es 01 la salida es el busB
 * Cuando op es 10 la salida es busA+busB
 * Cuando op es 11 la salida es BusA-BusB

Imagen de simulaciones
 *  Simulacion registros:

Imagen de simulaciones
 *  Simulacion datapath:

Imagen de simulaciones
 *  Simulacion Jugada del pc:

en azul el registro que cambia como lo indica la XOR y el bit acabo que se muestra en la parte de arriba
 * En rojo esta el registro donde esta la XOR que es la que dice cuales bits cambiar (1) y cuales dejar (0)

Imagen de simulaciones
 *  Simulacion control jugada ganadora o perdedora:

= MEMORIAS DE CÁLCULO =


 * Generador de números aleatorios:  los números aleatorios se generaron a partir de un bloque contador de 8 bits que se detiene cuando el usuario realiza el primer click indicando que desea iniciar el juego, los diferentes bits de este contador se combinan formando números entre el 0 y el 15, todos números superiores a 10 se dejan en 10 y todas las casillas que sean 0 se dejan en 1, el único caso en que una fila no tiene fichas es cuando el computador inicia con las condiciones perdedoras en cuyo caso el pc realiza su jugada pudiendo dejar una fila sin fichas.

Para 10 juegos diferentes se obtuvieron los siguientes resultados



= RESULTADOS =


 * Se obtuvo un funcionamiento total del proyecto gracias a la metodología utilizada. Las tareas simples se distribuyeron equitativamente realizando pruebas y simulaciones después de cada avance. Para la integración de los bloques sencillos y para la realización de los controles, hubo un trabajo conjunto dado que se evidencio atrasos al hacerlo por separado, debido a que ciertos problemas del trabajo de una persona podía causar atrasos en todo el proyecto. Uno de los problemas principales que generaron atrasos, fue la implementación separada de la parte lógica y la parte de interfaz. Aunque los bloques en dicha implementación presentaban un comportamiento deseado, al integrarlos mostraron bugs y errores en su ejecución. Dado que dichos bloques se realizaron completamente por separado, fue mas difícil encontrar los fuente de error una vez estaban unidos.


 * El conocimiento de uno de los integrantes en programación en Java, permitió facilitar el manejo de imágenes al implementar un programa que realizara una traducción de la imagen a un mapa de bits de 3 bits como lo requería el problema. Esto ayudo darle un valor agregado importante al proyecto, al poder presentar imágenes completas a color lo que le daba mas vida al juego. Esto sin embargo fue un reto, dado que la implementación de imágenes provoco que el código fuera muy lento para sintetizar ( al rededor


 * Se invitaron diferentes personas a probar el producto final, cada una tenia dos intentos para ganarle a snimty. De las diez diferentes personas ninguna llego a ganar y solo en 4 oportunidades el juego no pudo llegar al final lo que muestra una eficiencia del 100% en las jugadas realizadas por snimty

Trabajos futuros

 * El siguiente paso consiste en agregar funcionalidad tales como un selector de niveles de manera que el usuario tenga la oportunidad de ganar, ademas de diferentes tipos de imágenes para que el usuario pueda elegir cual desea que represente las piedritas

= MATERIALES =

Dispositivos Hardware

 * Tarjetas de desarrollo FGPA Spartan3
 * Monitor LCD 4:3 con puerto VGA
 * Cable VGA
 * Cable Paralelo
 * Mouse de puerto PS/2

Herramientas Software

 * Xilinx ISE 13.1  Visitar


 * Xilinx iMPACT    Descargar guía de usuario


 * ISim Simulator Visitar

= CÓDIGO FUENTE =


 * Archivos de VHDL completos (Descargar...)
 * Ejecutables java para tratamiento de imágenes (Descargar)

Publicidad

 * Archivos LOGO (Descargar...)
 * Archivos POSTER

= BIBLIOGRAFIA =


 * http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_VHDL