lunes, 6 de diciembre de 2010

Ping Pong utilizando la tarjeta Spartan-3

Con la tarjeta Spartan-3 se pueden controlar varios dispositivos externos, en esta ocasión se conectará una pantalla en el puerto VGA y se hará uso de algunos de los conocimientos adquiridos a lo largo del semestre para poder realizar un juego de video.

Un conector VGA como se le conoce comúnmente (otros nombres incluyen conector RGBHV, D-sub 15, sub mini mini D15 y D15), de tres hileras de 15 pines El conector común de 15 pines se encuentra en la mayoría de las tarjetas de vídeo, monitores de computadoras, y otros dispositivos, es casi universalmente llamado "HD-15". Los conectores VGA y su correspondiente cableado casi siempre son utilizados exclusivamente para transportar componentes analógicos RGBHV (rojo - verde - azul sincronización horizontal - sincronización vertical), junto con señales de vídeo DDC2 reloj digital y datos.

El sistema de color VGA es compatible con los adaptadores EGA y CGA, y añade otro nivel de configuración en la parte superior. CGA fue capaz de mostrar hasta 16 colores, y EGA amplió éste permitiendo cada uno de los 16 colores que se elijan de una paleta de colores de 64 (estos 64 colores se componen de dos bits para el rojo, verde y azul: dos bits × tres canales = seis bits = 64 valores diferentes). VGA extiende aún más las posibilidades de este sistema mediante el aumento de la paleta EGA de 64 entradas a 256 entradas.

Se implementó un código el cual llevará algunas variables en el entity, tres son las que sacan el color de la pantalla (red, green, blue), también existen dos que son las que realizan el refrescamiento (hs y vs), la última de entrada es el reloj integrado a la tarjeta (clk50).

Se declara la variable clk que es el reloj, que será el que va a hacer que se vaya llevando la secuencia de los movimientos y que el cambio de la pelotita se realice en un tiempo determinado (esto se puede variar, puede ser más lento o rápido).

El código esta divido en 3 bloques o procesos principales: el que pinta los datos y los manda a la pantalla, la lógica de los movimientos de los jugadores/barras y finalmente la lógica de la bolita para que se mueva en X y Y.

Las variables más importantes son los límites superiores, inferiores y en el caso de la bolita también los límites de izquierda y derecha. Estos son inicializados en el centro de la pantalla y conforme el juego avanza van cambiando (Figura 1). En el caso de las barras que los jugadores controlaran, sólo se manejan las variables de los límites de izquierda (Lbarrita, L de left) y los de la derecha (Rbarrita, R de right). Se manejan como variables pues al momento de presionar los botones de derecha e izquierda esos valores se van incrementando y decrementando respectivamente. Hay que delimitar estas operaciones a los límites de la pantalla para que las barras no puedan moverse más allá de los mismos.

El siguiente proceso es el que maneja el movimiento de la pelota además de verificar si hubo colisión de la misma con la barra. Para ello hicimos uso de una variable de un bit llamada dBolitaY con la que controlamos la dirección en Y de la pelota.”0” significa que sube mientras que “1” que baja.

Cuando la pelota sube los valores de sus límites superior e inferior (Ubolita y Dbolita, U de up y D de down) se decrementan en una posición. Al llegar al límite superior donde la barra del jugador de arriba se encuentra, verifica que la pelota realmente haya colisionado con esta. Revisa que Rbolita sea mayor que Lbarrita y que Lbolita sea menor que Rbarrita, siendo cualquiera de los dos casos.

Para controlar la dirección en X que la pelota tendrá hay que revisar en el momento de la colisión, en que rango de la barra fue. Para esto dividimos nuestra barra en 3 partes para saber la dirección que tendrá. Dependiendo de donde pegué, asignamos a una variable dBolitaX (dirección de la bolita en X) tres posibles casos: 00, 01 y 10, que representan un movimiento recto, a la izquierda y a la derecha respectivamente. Estas variables son revisadas más adelante (dentro del mismo proceso) por medio de unos if y son las que hacen el incremento o decremento a los valores Rbolita y Lbolita para moverla hacia la derecha o izquierda respectivamente.
En caso de que no haya colisión, significa que ese jugador perdió y le da un punto al otro contrincante. Además activa una bandera de RESET para que la pelota y las barras vuelvan a su posición inicial.


El último proceso es el que pinta las posiciones tanto de jugadores y pelota en la pantalla. Para esto hay dos contadores de 10 bits para ir refrescando las coordenadas horizontales y verticales de la pantalla y así ir haciendo la actualización de las posiciones. Por medio de un if y delimitando los rangos de izquierda, derecha, superior e inferior de cada parte le indicamos que color imprimir.