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.

miércoles, 3 de noviembre de 2010

Funcionamiento de un motor de pasos controlado par la Spartan

Con la tarjeta Spartan-3 se pueden controlar varios dispositivos externos, en esta ocasión se controlará un motor a pasos, para poder dar la utilidad que se requiera.

Un motor a pasos es un dispositivo electromecánico que convierte una serie de impulsos eléctricos en desplazamientos angulares discretos, es decir, que es capaz de avanzar una serie de grados (pasos) dependiendo de las entradas de control que este tenga. El motor se comporta paso a paso de la misma manera que un convertidor analógico digital como lo estudiamos en el curso de digitales I y puede ser controlado por impulsos que provengan de sistemas lógicos.

Un motor de pasos se define por su voltaje ya que tienen una tensión eléctrica de trabajo. Este valor normalmente se encuentra en la carcasa o en una hoja de especificaciones. En algunas ocasiones según el uso que se le quiera dar al motor es necesario aplicar un voltaje superior para lograr el torque deseado.

Los motores tienen una resistencia en los bobinados, esta determinará la corriente que consumirá el motor, y su valor afecta la curva de torque y su velocidad máxima de operación.

Finalmente para describir este tipo de motores un factor importante son los grados que desplaza por paso, es decir, define la cantidad de grados que rotará el eje para cada paso completo o semi-paso. Los grados por paso se calculan dividiendo 360 por la cantidad de pasos que se contaron (resolución del motor).

En la tarjeta Spartan-3 existen tres conectores de expansión los cuales poseen una tierra y un voltaje de 3.3V (medidos en la práctica con el multímetro para corroborar el dato). Y es aquí donde se pueden conectar los diferentes dispositivos que se pueden controlar con la tarjeta Spartan-3.

Para que el motor pueda tener el voltaje suficiente para su correcto funcionamiento es necesario utilizar el integrado ULN2803 contiene ocho transistores con emisores comunes e integrales de diodos de supresión para cargas inductivas. Cada integrado cuenta con una capacidad da carga de corriente de 600mA y puede soportar hasta 50V en el estado apagado. Es importante mencionar que en la entrada de voltaje se debe de conectar el voltaje que necesitara el dispositivo que se va a conectar.

Transmisión de datos digitales por los conectores de expansión

Se implementó un código el cual llevará tres variables en el entity, una es la que manda el dato a los conectores de expansión (B), una que es la que manda el dato a los leds (A) y el reloj integrado a la tarjeta (clk).

Se declara la variable clk que es el reloj, que será el que va a hacer que se vaya llevando la secuencia de los pasos y que el cambio se efectúe en un tiempo determinado (esto se puede variar).

La palabra clk’event es la instrucción para que el reloj comience su proceso con un flanco de subida (‘1’), y va a irse sumando a move uno a uno hasta llegar al tiempo de 90000000.

En un diferente proceso se debe de tener la variable “otro” la cual va a ir llevando la secuencia de los pasos dentro de un case con 4 variables que es la secuencia que tiene el motor para los pasos. “A” va a llevar la secuencia en los leds para que se pueda observar y “B” es la que va a llevar la expansión donde va a estar conectado el integrado que a su vez va a estar conectado al motor para que reciba el voltaje necesario para su funcionamiento.

Los números de encendido y apagado es la secuencia que se encuentra en el datasheet del motor utilizado, algo importante es que hay que fijarse con los diferentes hilos que tiene el motor cual es el orden de los pasos. Es recomendable ir probando uno por uno hasta encontrar como va ser la secuencia de los pasos. Una tabla con los colores de los cables y el orden en que se deben conectar resultó ser eficaz para poder llevar de una buena manera el desarrollo de la práctica.

Funcionamiento de un teclado en la transmición de datos

En la tarjeta Spartan-3 existe un conector tipo PS/2 el cual sirve para conectar teclados o ratones y tener una mayor interacción con los diferentes programas realizados por el usuario.La comunicación del PS/2 fue creada por IBM en 1987. La interacción que se tiene es serial y controlada por la tarjeta. Las interfaces de teclado y ratón son eléctricamente similares, solamente se diferencian en que en la interfaz de teclado se requiere en ambos lados un colector abierto para permitir la comunicación bidireccional.

La comunicación PS2 entre la computadora y teclado es una serie síncrona. Hay una señal de reloj y una de datos. La velocidad de comunicación se determina con la señal del reloj, puede ser unos 10Khz. La transmisión se da con 1 bit de comienzo, 8 bits de datos, 1 de paridad, 1 de stop y 1 ACK.

El teclado tras investigar sobre el código que maneja, observamos que no es el código ASCII, es un código único y este es el que se mostrara en la tarjeta, se presenta a continuación un diagrama de los diferentes comandos que tienen las teclas para mostrar al usuario.

El teclado utiliza controladores de colector abierto para que el teclado de la unidad pueda tener un bus de dos hilos. Si el host no envía datos al teclado, el usuario puede utilizar un código simple a la entrada. Un teclado PS/2 utiliza el escaneo de códigos para comunicar los datos. Cada tecla tiene un código único, también un único análisis que se envía cada vez que la tecla se presiona. Si la tecla se presiona y mantiene, el teclado envía repetidamente el código de la exploración cada 100 ms . Cuando se suelta una tecla envía un código llave, seguido por la espera de la siguiente tecla.

Transmisión de datos por el puerto PS/2 a través de un teclado.

El puerto PS/2 es importante ya que puede realizar la comunicación de la tarjeta con un teclado o ratón., en el caso de esta práctica se realizará con un teclado de computadora. Este puerto es transmisor de datos, se mostrara el código en los displays de siete segmentos y posteriormente se enlazara con el código del motor para lograr el objetivo establecido. Se implementó un código el cual llevará seis variables en el entity, el reloj (clk), el reset (rst), las entradas del puerto PS/2 (kd, kc), dos matrices que almacenen datos (an, sseg). Una es el ánodo y la otra el display de siete segmentos.

Se declara la variable clk que es el reloj, que será el que va a hacer que se almacenen los valores. La palabra clk’event es la instrucción para que el reloj comience su proceso con un flanco de subida (‘1’). Debemos tener en cuenta que el reloj de la tarjeta es de 50Mhz, se deben realizar los cálculos para saber cómo pasará la palabra de 8 bits más el bit de inicio y stop.

En diferentes procesos en el código implementado se irán agregando primeramente las condiciones de las señales que vienen desde el puerto PS/2.

Se multiplexan los datos que se obtuvieron en el proceso anterior y se mandan en dos partes a los displays de siete segmentos donde aparecerán los diferentes códigos de cada una de las teclas.

Finalmente se programa el ánodo para que puedan utilizarse solamente dos displays y no los cuatro, así mismo cada uno con datos diferentes, como ya se ha implementado en prácticas anteriores.

A continuación se mostrará un fotografía con el teclado conectado a la tarjeta y mostrando en los displays el código de algún botón.

Transmisión serial de la computadora a la tarjeta.

El puerto serial es una interfaz de comunicación que tiene la tarjeta spartan-3, donde la información que procesa la transmite bit a bit enviando un solo bit a la vez. Al establecer la comunicación se envía en primer lugar una señal inicial anterior a cada byte, al enviarse la palabra se detiene hasta esperar que exista otro bit de inicio, que sirve para preparar la recepción de la palabra mientras que el stop es para que se prepare para recibir una nueva palabra.
En el siguiente diagrama se muestra como es esta comunicación.

La transmisión más común que se realiza es por medio del código ASCII a través del puerto RS-232, en las computadoras este puerto aparece como COM más el número que se le asigne. La interfaz RS-232 está diseñada para distancias cortas, hasta 15 metros, y velocidades bajas de comunicación, hasta 20 kb/s. Esta práctica utiliza un canal simplex, es decir, los datos solo viajan en una dirección.

Los datos mandados por la computadora se pueden comprobar con diversos programas para observar que información es la que se está recibiendo. A su vez con otros lenguajes de programación se podrán mandar estos datos y hacer que la tarjeta lleve a cabo ciertos procesos ya programados en el fpga.

Transmisión de datos por el puerto serial.

La comunicación con la interface serial, que recibe y transmite datos es llamada UART (Universal Asynchronous Receiver-Transmitter). RxD es para recibir datos por serial (usada en esta práctica) y TxD es para transmitir los datos.

Se implementó un código el cual llevará tres variables en el entity, una es la que manda el dato al puerto serial (rxd), el reloj (clk) y en una matiz el número que se va a mostrar (shownumber).

Se declara la variable clk que es el reloj, que será el que va a hacer que se almacenen los valores.

La palabra clk’event es la instrucción para que el reloj comience su proceso con un flanco de subida (‘1’).

Debemos tener en cuenta que el reloj de la tarjeta es de 50Mhz, se deben realizar los cálculos para saber cómo pasará la palabra de 8 bits más el bit de inicio y stop.

En el mismo proceso se deben de tener dos variables que van a llevar el conteo del reloj (una de las que se están generando y otras las que se van almacenando), a su vez se guardara en una variable temporal tipo matriz, que al completarse el ciclo del reloj va a enviarla a los leds de la tarjeta. Al mandarla se va a refrescar los bits anteriores para esperar la nueva palabra generada por la computadora.

El bit queda almacenado en la variable temp y al completarse la matriz se mostrará al usuario a través de los les el número que se está mandando de la computadora a la tarjeta (shownumber).

En el último paso del proceso se da la instrucción para que se limpien las variables anteriores, el reloj se reinicia y está en espera del siguiente dato que arroje la computadora.

Una vez que el código ha sido compilado de manera correcta, mediante el uso de un programa llamado Terminal podemos seleccionar el COM Port por donde está ingresando la información al equipo junto con la velocidad y podemos observar en pantalla en código ASCII, hexadecimal, octal y binario cual es el dato que está saliendo de la spartan-3 y entrando a la computadora.

Finalmente la tarjeta se observa al terminar la programación de esta manera:

miércoles, 8 de septiembre de 2010

Funcionamiento de los displays de siete segmentos

En el display ánodo común son con los que cuenta la tarjeta, todos los ánodos de los diodos LED unidos y conectados entre si, existe la posibilidad de que cada display se programe y solamente se pueda visualizar los resultados en uno, pero en esta ocasión trabajaremos con todos y observaremos como es su programación y funcionamiento.
Primeramente para programarlos necesitamos tener un arreglo de entrada de 4 bits (estos serán los switches para poder ir ingresando los números y otro arreglo de salida de 7 bits los cuales serán los leds de cada display. A continuación se muestra la manera de como están numerados para que cuando se desee programar el número que encenderá conozcas los leds que debes encender.
Es importante mencionar que encienden en bajo, y el código se realizará en un proceso y dentro de este un "case" con "when" y la salida se realizara con con los bits agregados comenzado como se muestra en el ejemplo de código:

case entrada is
when "0000" => salida <= "1000000"; --(N16)(F13)(R16)(P15)(N15)(G13)(E14) es el orden
when "0001" => salida <= "1111001";
........
end case;
end process;
Una vez que se ha introducido el código y compilado de una manera correcta, se escribirán las salidas y entradas y se generará el archivo .bit para poder cargar a la tarjeta y funcione.

Implementar un sumador, decodificador y multiplexor.

Lo primero que tenemos que entender es la forma binaria de hacer las sumatorias, para ello se muestra el siguiente diagrama:

Se muestran tres diferentes variables X, Y y Z, las compuertas OR servirán para hacer las sumas, mientras que en la AND se llevará el carry, el diagrama es una sumatoria completa.
El sumador consiste en ir sumando bit por bit (el menos significativo con el menos significativo) e ir guardando el carry que pueda producir para sumarlo al resultado de la suma de los bits siguientes. El resultado se va guardando en variables de salida diferentes, mientras que el carry se va arrastrando en una variable temporal hasta que se asigna a un carry de salida final al termino de la suma. Como se muestra el la siguiente figura:

En el lenguaje VHDL para poder programar en la tarjeta Spartan3 necesitaremos asignar las diferentes entradas, proponemos (A, B, C, D, W, X, Y, ), y salidadas (S1,S2,S3,S4). Posteriormente comenzaremos la sumatoria de los bits, primeramente (D xor Z) y se realizará después de 10ns, si existiese un carry agregaremos una variable adicional que irá acumulando los distintos carry´s. para sumar S2 se agrega (C xor Y xor variable del primer carry) después de 10ns, para el segundo carry se agregará la variable igualada a ((C and Y) or (C and variable 1er. carry) or (Y and varible 1er. carry)) después de 10 segundos. Y con esta metodología se relizarán las siguientes sumatorias (B xor X) y (A xor W). De esta manera se podrán obtener los resultados a la suma, recomendamos que se muestren en los led´s de la tarjeta y que la entrada de datos sea por medio de los switches.

Un decodificador es un circuito lógico que acepta un conjunto de entradas que representan números binarios y que activan solamente la salida que corresponde a dicho dato de entrada. En otras palabras, un decodificador mira a sus entradas, determina qué número binario está presente y activa la salida correspondiente a dicho número. Todas las otras salidas permanecerán inactivas. Un decodificador modelo tiene N entradas y M salidas. Debido a que cada una de las N entradas puede ser 0 o 1, hay 2N posibles combinaciones o códigos de entrada. Para cada una de estas combinaciones de entrada sólo una de las M salidas estará activa, y todas las otras estarán inactivas.

En este caso aplicaremos uno de 3x8 declarando tres entradas y 8 salidas, se realizará un "process" en el código y dentro de este un "case". Con un "when" pondremos la entrada y con signos de igualación, menor y mayor que mostraremos el número binario que saldrá del decodificador. Como se muestra en el siguiente ejemplo:

case entrada is

when "000" => salida <= "10000000";

(siguen los diferentes casos)...

end case;

end process;

Finalmente los datos de entrada se entregarán por medio de los switches y las salidas se observaran en los leds de la tarjeta Spartan 3.

Un multiplexor tiene de 4 a 1 tiene cuatro entradas y dos entradas de selección que son las que eligen cual de los cuatros bits de entrada salen en la única salida. Utiliza una estructura muy similar en código a la del decodificador, a base de "case". El valor de la variable tomaba un caso específico y la salida el valor de bit de entrada en esa posición, por ejemplo:

case selec is

when "00" => salida <= a;

(se sigue en los diferentes casos)....

Los datos se entregarán por medio de los switches y la salida por led.

lunes, 6 de septiembre de 2010

Realización de una ALU de 2 bits

Una Unidad Aritmética Lógica es un circuito digital que realiza operaciones aritméticas (suma, resta, multiplicación, división) y operaciones lógicas (AND, OR, NOT) así como muchos otros tipos de operaciones.
Para que la ALU funcione de una manera eficaz sugerimos agregar un decodificador con el cual se seleccionaran las operaciones que desea realizar el usuario en la ALU. Los datos ingresados se procesan de tal manera que pueda obtener el resultado de la operación asignada, incluyendo carry´s.
Uno de los primeros programas de prueba que podemos realizar es la configuración de una ALU en la tarjeta, para lo cual necesitaremos asignar variables, nosotros recomendamos las siguientes: para los datos de entrada X1, X2, Y1, y Y2, además de un arreglo de 3bits que serán la selección de operación; para los datos de salida un arreglo de cuatro bits (ya que habrá operaciones que utilizarán todos).
En un "case" se recibirá la variable de selección, para el not solo se negará la entrada, para las demás operaciones lógicas se utlizará el bit número de uno de la variable X y Y.
Para la suma se utiliza tal cual el código como se explica en este blog en la publicación de "Implementar un sumador...", la multiplicación la realizamos siguiendo el siguiente esquema a base de and´s y sumas.
La operación AND de X1 con Y1 se pone tal cual como una salida cero, después se suma el AND de X2 con Y2 junto con el AND de X2 con Y1, si existe un carry se agrega a la siguiente suma y de esta manera se va realizando la multiplicación, básicamente son AND´s y Sumas.
Para agregar los corrimientos de bits ya sea a la izquierda o a la derecha, solamente es una sustitución de valores.

when "101" => salida <= "0000"; --x>>y
salida(0) <= x(1);
salida(1) <= y(0);

Al tener todo el programa escrito en un "case" con los diversos "when" se podrá cumplir el objetivo que tiene una ALU y se podrán hacer las operaciones aritméticas de dos bits.

miércoles, 1 de septiembre de 2010

¿Cómo compilo y hago que funcione el código en la tarjeta?

Una vez que hemos escrito el programa, tenemos que asegurar que no exista ningún tipo de error, para ello sirve la compilación. Esta se realiza dando clic al icono de play en color verde arriba del código.
Al dar clic empezará a correr todos los procesos de verificación y armado de código, todo se estará detallando en la barra que se encuentra en la parte inferior de la pantalla.
Una vez completada la verificación del código si no existe ningún tipo de error debemos dar clic en "I/O Pin Planning (PlanAhead)-Pre-synthesis" que se localiza en el menú processes en la parte izquierda de la pantalla en medio.
Al dar clic en este diálogo se abrirá una nueva ventana (tarda un poco en cargar, no dar varias veces clic), aquí escribiremos el nombre de los puertos de entrada y salida según estas escritos en letra blanca y entre paréntesis en la tarjeta (son una letra y dos dígitos).
En esta pantalla damos clic en IO/Ports y se desplegara la lista de todos los que utilizaremos (según fue nuestra programación) y en la pantalla inferior "IO/Ports properties" escribiremos en la caja de texto "site" el número y letra asignada, al terminar con cada una daremos clic en "apply", y al terminar todas clic en Finish, para terminar guardamos lo cambios realizados.
Al terminar con esta pantalla damos clic en la anterior "Implement Design" y "Generate programming file" para que guarde en la misma dirección que dimos en un principio un archivo .bit y este es que que cargamos a nuestra tarjeta utilizando el controlador del cable Adept (se explica en el primer block).

lunes, 30 de agosto de 2010

Utilización del software para escribir el código.

Una vez que ya tenemos instalado el programa ISE Proyect Navigator en nuestra computadora, lo abriremos y crearemos un nuevo proyecto, dando clic en file--New Project, posteriormente se abrirá una ventana donde escribiremos el nombre que queramos darle y la ubicación para guardarlo en memoria. (Recomendamos utilizar la que nos proporciona dentro de una carpeta llamada Xilinx).
Al dar clic en Next abrirá otra ventana en la cual debemos ingresar los datos de la tarjeta que vamos a programar y el lenguaje que utilizaremos. En family agregaremos Spartan-3, en divice XC3S200, en package FT256, en preferred lenguage VHDL y todo lo demás se dajá igual, damos clic a Next y nos aparecerá un repote del programa que creamos.
Al terminar pulsaremos el botón finish y aparecerá una pantalla con fondo gris mayormente, tenemos que ir al icono que aparece del lado izquierdo de la pantalla, que parece como una hoja con un Sol en la orilla (New Source) y al darle clic se abrirá una pantalla que se llama "Select source type" aquí debemos dar clic en VHDL Module y pondremos el mismo nombre que tiene el programa.
Al dar clic en Next tendremos otra ventana donde ingresaremos los nombres de los puertos que utilizaremos en la tarjeta y seleccionaremos si son de entrada, salida o entrada/salida. Al dar clic en Next aparecerá un pequeño reporte de lo que vamos a utilizar como entradas y salidas.
Después de todos los procedimientos que realizamos anteriormente ahora si aparecerá en pantalla el lugar para que podamos escribir el código del programa que queremos hacer.
Y de esta manera ya podrás escribir el código para hacer cualquier cosa con tu tarjeta Spartan-3.

lunes, 23 de agosto de 2010

¿Cómo hago funcionar una Spartan-3?

La empresa Digilent es la que se encarga de fabricar estas tarjetas con FPGA´s, las cuales sirven para poder realizar varios proyectos. Existe toda una gama de tarjetas con estas características, se pueden consultar en http://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,400&Cat=1 y los modelos spartan son los que se utilizan con mas frecuencia.
La tarjeta que explicada será la spartan-3, el precio aproximado es de $109 dolares americanos más gastos de envío, preguntando con la empresa si eres estudiante y llenas el formato puedes obtener un descuento al comprar tu material.
Antes de comenzar a utilizar la tarjeta es importante realizar algunas adecuaciones al equipo donde la vayas a instalar; primeramente te recomendamos particionar el disco duro de la computadora donde instalaras los controladores y el software con el que se programara, ya que ocupan varios gigas de memoria.
Una vez que este listo el equipo deberás entrar a la pagina de XILINX, una empresa que realiza FPGA´s con programadores para la industria de los semiconductores. En esta pagina buscaremos el programa con el que haremos funcionar nuestra tarjeta.
Al ingresar a la página deberás registrarte para poder bajar los programas, la liga es https://secure.xilinx.com/webreg/createUser.do?, una vez que te hayas registrado te llegara a tu correo electrónico un mail para confirmar tu suscripción. Cuando estés registrado irás al apartado que dice "downloads" y bajaras el Sofware ISE Design Suite-12-2 Full Product Instalation el cual incluye el programa ISE WebPACK (esta disponible solamente para Windows y Linux, MAC no es compatible con el programa). El tamaño del archivo comprimido es casi 3GB, si no tienes Winzip es importante que lo bajes para poder descomprimir el archivo, la velocidad de descarga depende mucho que tal sea tu conexión a la red.
Una vez que el archivo esta almacenado y descomprimido en tu computadora debes abrir la carpeta que dice "xsetup" y automáticamente comenzará la descarga del software. Llegara un momento donde se te abre una ventana que dice "Xilinx License Configuration" aquí deberás dar clic en "Get Free ISE WebPack License" y después "next", entrarás a la pagina de Xilinx, te pedirá tu usuario y contraseña para poder mandar a tu mail un archivo con la licencia.

Llegará a tu mail un archivo .lic, lo guardaras en tu equipo y en la ventana de Xilinx License que esta abierta iras a la pestaña que dice "Manage Xilinix Licences", en el botón set buscaras el archivo .lic y al cargar oprime el botón aceptar. Con este paso terminará la instalación del software para poder escribir tus códigos.
Por último necesitas ir a la página http://www.digilentinc.com/ y en la opción de "Cables & conectors" que se encuentra a la izquierda darás clic, y buscaras el cable: JTAG-USB Programming Cable (no es necesario que lo compres ya viene incluido con la tarjeta), pero es necesario baja el controlador y esto lo haces dando clic en "more info" y de allí en la parte derecha hay un dialogo que dice "Digilent Adept Suite" allí darás clic y se abrirá otra página, donde esta el texto "Download" dar clic y se instalara el controlador automáticamente en tu equipo (no se necesita licencia).
Al terminar la instalación ya podrás hacer uso de la tarjeta Spartan-3, te recomendamos hacer una prueba para ver el funcionamiento de tu tarjeta. Esta la haces visitando la página de Digilent, y en las opciones de la derecha das clic en FPGA Boards, seleccionas "more info" de la spartan-3 y bajas el archivo .zip llamado S3BOARD-DEMO.ZIP.
Al descomprimir la carpeta encontraras un archivo .bit (este es el que se descargará en la tarjeta). Para hace la descarga tienes que abrir el programa ADEPT, conectaras la tarjeta para que la reconozca y en la parte de arriba cargas el archivo .bit que descomprimiste anteriormente, das clic en el botón de la derecha y después en el de abajo para cargar el código y listo tu tarjeta esta funcionando!!!!