Curso VHDL – Configurar el dispositivo

En esta entrega veremos cómo utilizar el diseño que hemos creado en nuestro primer proyecto para configurar un dispositivo, en concreto, un FPGA Spartan3.
Después de haber revisado que el código sea correcto y que los módulos funcionen como deseamos (mediante la simulación), el siguiente paso es indicar a qué pines de nuestro dispositivo programable corresponderán las entradas y salidas del módulo que hemos desarrollado. Como mencioné al inicio del curso, cuento con una tarjeta de desarrollo Spartan 3 Starter Kit de Digilent, así que será en el diseño de esta tarjeta en que me basaré para la asignación de pines del módulo que vamos a implementar.

Tarjeta de desarrollo Spartan 3 Starter Kit

Se trata de una tarjeta de desarrollo diseñada y comercializada por Digilent, basada en un FPGA Spartan 3 de Xilinx, actualmente ya no forma parte del catálogo principal de Digilent, pero por los documentos y apuntes de varias escuelas se que fue una tarjeta bastante popular. La tarjeta cuenta con varios elementos ya conectados al FPGA Spartan 3: 8 leds, 8 interruptores (switches), 4 botones (push buttons), 4 displays de siete segmentos (ánodo común), 1 conector PS-2, 1 conector DB9, 1 conector SUB-15, y, además de que ciertos pines del FPGA están ya conectados a estos elementos, tanto estos como los restantes sin conectar se encuentran disponibles en un par de conectores hembra de dos líneas, de forma que es posible conectar el FPGA con elementos adicionales a los que podemos encontrar en la tarjeta.

Si recordamos, el módulo sumador_completo cuenta con tres entradas: EntradaA, EntradaB y Cin, y dos salidas: Suma y Cout. Estas entradas y salidas deben ser asociadas con pines (o puertos) del dispositivo en el que deseamos implementar nuestro diseño, de manera que podamos conectar el módulo con el resto del circuito que estamos diseñando.
Para nuestro diseño, decidimos conectar las tres entradas con tres interruptores (switches), mientras que las dos salidas serán conectadas a sendos leds de la tarjeta de desarrollo, en esta imagen indicamos a qué elemento de la tarjeta conectaremos cada puerto del módulo sumador_completo.

Si observamos, debajo de cada señal a conectar se encuentra entre paréntesis una letra y un número, así es como se indican los pines del encapsulado del dispositivo que estamos configurando, en este caso un FPGA Spartan 3. Una vez que sabemos a qué pin del FGPA asociaremos los puertos de nuestro módulo, debemos indicarlo en nuestro proyecto en ISE Project Navigator, para ello en primera instancia haremos uso de la aplicación PlanAhead: seleccionamos el módulo sumador_completo en la ventana Design, asegurándonos de que esté seleccionada la opción Implementation, después, en la ventana Processes, expandimos la categoría User Constraints, y hacemos doble clic en el proceso I/O Pin Plannig (Plan Ahead) – Post-Synthesis:

Esperamos unos instantes y se abrirá el programa PlanAhead, probablemente antes de cargar PlanAhead se muestre un mensaje que indica que se agregará un archivo de restricciones de usuario (UCF), debemos indicar que si (Yes)

Ahora si, debemos tener en pantalla la ventana PlanAhead.

En la parte superior veremos dos gráficos que representan el dispositivo que estamos por configurar: la imagen de la izquierda despliega los pines del FPGA en un arreglo matricial (Package, mientras que la de la derecha representa el dispositivo en su totalidad (Device).
Debajo de esas imágenes, se encuentra una sección con dos pestañas: I/O Ports y Package Pins, si seleccionamos I/O Ports y expandimos las opciones All ports y Scalar ports veremos los puertos que forman parte del módulo sumador_completo, haciendo clic en uno de ellos podemos arrastrarlo hacia la imagen que representa los puertos de nuestro dispositivo, donde deberemos soltarlo estando ubicados en el pin al que queremos asociar el puerto.

Una vez que hemos asociado todos los puertos del módulo sumador_completo con pines del FPGA:

hacemos clic en el botón para guardar el diseño de Plan Ahead y lo cerramos para continuar en ISE Project Navigator. Aquí notaremos que un nuevo archivo se ha agregado al proyecto, el nombre de este archivo corresponde con el módulo que vamos a enviar al dispositivo reconfigurable y tendrá como extensión .ucf:

Ahora, seleccionamos el módulo sumador_completo en la ventana Hierarchy, después, en la ventana Processes hacemos clic con el botón derecho en Generate Programming File, seleccionamos la opción Process Properties:

Se abrirá un diálogo en el que debemos asegurarnos de dos cosas: que en la categoría General Options esté habilitada la opción Create Bit File, y que en la categoría Startup Options, la propiedad FPGA Start-Up Clock esté configurada a JTAG Clock.


Hacemos clic en el botón OK para cerrar el diálogo y ahora hacemos doble clic en el proceso Generate Programming File, iniciará la creación del archivo de configuración .bit que descargaremos al FPGA. Si el proceso termina con éxito, se habrá creado el archivo sumador_completo.bit dentro de la carpeta de nuestro proyecto.


Ahora procederemos a enviar este archivo al FPGA, para ello utilizaremos el software Adept de Digilent, junto con el cable de comunicación USB-JTAG de esta misma empresa, este cable lo encuentran en esta página: JTAG-USB Programming Cable, ese es el que tengo, pero ya hay una versión mejorada, la encuentran en el sitio de Digilent. Además, para las nuevas tarjetas de desarrollo como Basys2 y Nexys2, solamente se necesita un cable USB a mini USB común, ya que el sistema de programación se encuentra en la misma tarjeta :).

Bueno, continuemos, lo primero que debemos hacer antes de conectar el cable es descargar e instalar el software Adept, lo encontramos en esta página: Digilent Adept, la descarga es Adept 2.6.1 System, 32/64-bit Windows, también están disponibles otras herramientas y el SDK para quien desee integrarlas a sus aplicaciones, hasta versiones para Linux aunque por el momento no he podido probarlas. Una vez instalado el software, conectamos el cable JTAG-USB a un puerto disponible de nuestra computadora, Windows reconocerá que se ha conectado un nuevo dispositivo y procederá a asociarlo con el controlador adecuado. Ahora, conectamos la tarjeta a su fuente de alimentación, y después conectamos el extremo del cable JTAG-USB al conector que corresponde en la tarjeta Spartan 3 Starter Board. Abrimos el software Adept y, si la tarjeta se encuentra alimentada y el cable JTAG-USB correctamente conectado, deberíamos tener algo como esto:

Adept nos indica que ha encontrado dos dispositivos en la cadena JTAG, el primero lo reconoce como un FPGA XC3S200 y el segundo una memoria PROM XCF02S. Ambos se encuentran en nuestra tarjeta de desarrollo, el primero es el FPGA que deseamos configurar y el segundo una memoria que nos permitirá guardar la configuración del FPGA y con la correcta configuración, cargarla al encender la tarjeta, de manera que no necesitemos configurar el FPGA cada que energicemos la tarjeta de desarrollo (el FPGA es un dispositivo volátil que pierde su configuración al perder la alimentación). En caso de que en lugar de lo mostrado arriba, tengamos esto otro:

Significa que no teníamos conectado el cable JTAG-USB a la PC y a la tarjeta o que esta última no está encendida, o que por alguna otra razón no se pudo inicializar la cadena JTAG al iniciar Adept. Debemos revisar que todo esté bien conectado y entonces hacer clic en el botón Initialize chain para poder inicializar la cadena JTAG y que nos aparezcan en pantalla los dispositivos.
Ahora si, vamos a configurar nuestro FPGA: hacemos clic en el botón Browse… a la derecha de donde aparece nuestro dispositivo FPGA, se abre un diálogo de Windows en el que debemos indicar el archivo de configuración sumador_completo.bit que generamos antes en Project Navigator.


Ahora, hacemos clic en el botón Program a la derecha del botón Browse… e inicia el proceso de carga del archivo de configuración al FPGA:

Durante la programación, los LEDs de la tarjeta se encienden, una vez terminado el proceso se indica si ha sido exitoso en la ventana de mensajes de Adept, si no han habido problemas, el FPGA ha sido configurado y podemos probar si funciona como deseamos :).
Aquí dejo un video rápido que tomé, muestra los LEDs encendidos al momento de descargar y después pruebo todas las combinaciones posibles para las tres entradas:




Finalmente, llegamos a la conclusión de la primera entrega del tutorial en 2011 :), en la última noticia comenté que ahora tengo en mis manos una tarjeta Nexys2, para la próxima entrega del curso mostraré las pequeñas modificaciones que debemos hacer a nuestro diseño para poder descargarlo a esta otra tarjeta, mientras tanto, espero tengan tiempo para probar sus tarjetas y continúen siguiéndonos, hasta la próxima.

8 comentarios en “Curso VHDL – Configurar el dispositivo”

  1. Hola mexchip,
    antes que nada, gracias por como lo has trabajado el curso.
    tengo un problema, cerca del final. En el apartado de Generate Programming File, para el .bit que cargaremos en la FPGA, no me lo crea. Me aparece en console un warning, WARNING:Bitgen:26 – Bitgen only supports DRC but not bitstream generation on this device. This condition can occur if there are problems obtaining a license to run bitgen or if the design targets a device which is Early Access. El cual si lees, me parece bastante absurdo y ademas, es un warning. Pero termina con el mensaje Process “Programming File Generation Report” failed.

    He seguido todos tus pasos y funciona toda la simulacion correctamente. Lo unico es que mi tarjeta es una Virtex 6. ¿puede que necesite otras opciones para generar el archivo a cargar?aun no he relacionado mi tarjeta con el proyecto (lo he hecho todo con “tu” spartan3), asi que no creo. ¿alguna idea?

    1. Qué tal farero, gracias por los comentarios, estamos a la espera de más para evaluar con qué temas continuar :).

      ¿Has comprobado que en efecto no se genere el archivo .bit? Según el mensaje, tiene que ver con el dispositivo “objetivo”, verifica que hayas seleccionado el mismo FPGA que los de los ejemplos. Por el momento no se me ocurre alguna otra cosa, si continúas con problemas puedes enviarme un enlace con el proyecto para que lo pruebe por aquí.

  2. Saludos, pues aun no compro mi fpga pero me han prestado un cpld es un Xboard cool runner 2(tarjeta en froma de “X”), pero resulta que no he podido progrmarla ya que en el disco dice que debo de configurar con impact pero no he encontrado la forma de hacer eso ya que me da el siguiente error:

    Cable autodetection failed.
    WARNING:iMPACT:923 – Can not find cable, check cable setup !

    esta conectada y si reconoce el dipositivo e inicializa la cadena pero no me dejo programarlo pero si borrarlo tampoco he podido usando el adept ni el export, no se que pueda estar pasando, no se si me pudieras ayudar que no he podido programar ni una sola compuerta and y no se por que pueda estar pasando esto.Gracias

  3. Tal parece que el error lo genera por no programar el dispositivo y me parece que tene su origen en que no he seleccionado el reloj con el que se va a manejar el dispositivo, por que ya che que en un warning y da errores con tiempos y no genera los timming constrains, haber si me pudieras ayudar en esa parte que no se como se generan, Gracias

  4. Hola amigo, excelentes tutoriales, soy novato absoluto y los estoy siguiendo uno a uno con un Spartan 3A starter kit recien adquirido. Pero se me trancó la seguidilla en este tutorial, porque yo no tengo USB-JTAG cable, solo USB A-B para conectar el board a la PC, ¿me puedes guiar por favor para encontrar información sobre programar este board directamente con el cable USB? ¿ O la programación es obligada con el JTAG?

    Gracias y saludos desde Venezuela

    1. Qué tal, no he tenido oportunidad de probar la tarjeta que mencionas, pero debes poder programarla con el cable que tienes, ya que tu tarjeta cuenta con una interfaz JTAG-USB, según se indica en la guía de usuario: http://www.xilinx.com/support/documentation/boards_and_kits/ug334.pdf

      Lo que desconozco es si será compatible con el software Adept de Digilent (yo creo que si) que he utilizado durante el curso, puedes checar la configuración de una tarjeta Nexys 2 que también tiene una interfaz JTAG-USB aquí mismo en Mexchip: Curso VHDL – Configurando una tarjeta Nexys 2.

  5. Hola:
    Debo hacer un decodificador de binario a hexadecimal, ya tengo mis ecuaciones y el programa pero no se como utilizar el display de la Nexys, podrias darme algun tip, gracias

Deja un comentario