Curso VHDL – Diseño esquemático, parte 2

En la anterior entrega comentamos que en esta seguiríamos con la simulación y descarga del proyecto a una tarjeta Nexys 2 de Digilent. Por si alguien tenía la duda, si, también podemos simular los módulos esquemáticos :).
Empecemos, abrimos nuestro proyecto (SumadorEsquematico) en ISE Project Navigator, seleccionamos la vista Simulation, seleccionamos el módulo principal de nuestro proyecto sumador_4bits y en la ventana de procesos encontraremos la opción Simulate Behavioral Model:

Hacemos doble clic en ella, se abrirá ISim:

Podemos ver que tenemos todas las entradas y salidas de nuestro sumador de 4 bits, para no ocupar mucho espacio veremos la simulación de unos cuantos casos, empecemos por sumar 4 (entrada A) + 5 (entrada B), en la tabla siguiente representamos la suma y el resultado que esperamos:

Acarreo
de entrada
Entrada A Entrada B Acarreo
de salida
Suma
Cin A3 A2 A1 A0 B3 B2 B1 B0 Cout S3 S2 S1 S0
0 0 1 0 0 0 1 0 1 0 1 0 0 1


Bien, para realizar la simulación, debemos indicar los valores a las entradas, lo haremos con la instrucción Force Constant que ya habíamos utilizado cuando simulamos las compuertas que hicimos en nuestro primer proyecto. Empecemos por Cin, hacemos clic derecho sobre esta señal en la ventana de simulación, se mostrará este menú:

Seleccionamos la opción Force Constant, aparecerá la ventana Force Selected Signal donde indicaremos que la señal tendrá un valor de 0, esto lo hacemos en el campo Force to Value:

Hacemos clic en OK para aceptar y cerrar la ventana, podemos notar que en la ventana Console se indica el comando que acabamos de ejecutar:

Ahora, vamos con A3, que en nuestra tabla indicamos debe tener un valor de 0, hacemos clic derecho sobre ella en la ventana de simulación, elegimos la opción Force Constant, indicamos un valor de 0 en el campo Force to Value y hacemos clic en OK, debemos repetir este procedimiento para A2 (1), A1 (0), A0 (0), B3 (0), B2 (1), B1 (0) y B0 (1).
Una vez que hayamos terminado de indicar el valor deseado para cada entrada, podemos ejecutar la simulación con el comando Run for the time specified on the toolbar:

Hacemos clic sobre el botón indicado y comparamos los resultados de la simulación con los que indicamos en nuestra tabla, en donde esperamos que S3 y S0 sean 1, mientras el resto (Cout, S2 y S1) sean 0:

Ahora hagamos que el acarreo de entrada valga 1, hacemos clic derecho sobre cin, seleccionamos la opción Force Cosntant… y en la opción Force to Value colocamos un 1, nuestra tabla ahora sería:

Acarreo
de entrada
Entrada A Entrada B Acarreo
de salida
Suma
Cin A3 A2 A1 A0 B3 B2 B1 B0 Cout S3 S2 S1 S0
1 0 1 0 0 0 1 0 1 0 1 0 1 0


Nuevamente hacemos clic en el botón Run for the time specified on the toolbar y observamos si la simulación corresponde con los valores de salida que esperamos: S3 y S2 en 1 y el resto de salidas en 0:

Muy bien, hagamos un par de simulaciones más, en esta ocasión sumaremos 8 + 7, esta sería la tabla de valores de entrada y las salidas esperadas:

Acarreo
de entrada
Entrada A Entrada B Acarreo
de salida
Suma
Cin A3 A2 A1 A0 B3 B2 B1 B0 Cout S3 S2 S1 S0
0 1 0 0 0 0 1 1 1 0 1 1 1 1


Modificamos los valores de entrada con la opción Force Cosntant de acuerdo a nuestra tabla, después hacemos clic en Run for the time specified on the toolbar y comparamos:

Perfecto, 8 + 7 = 15.
Ahora, para probar el acarreo de salida, hagamos que Cin valga 1:

Acarreo
de entrada
Entrada A Entrada B Acarreo
de salida
Suma
Cin A3 A2 A1 A0 B3 B2 B1 B0 Cout S3 S2 S1 S0
1 1 0 0 0 0 1 1 1 1 0 0 0 0


Modificamos solamente Cin con la opción Force Constant… ahora con un valor de 1, ejecutamos la simulación y tenemos:

Muy bien, al parecer todo está correcto, pueden probar correr más simulaciones, ya sea indicando los valores uno a uno, o utilizando de alguna manera ingeniosa la opción Force Clock en lugar de Force Constant para probar una gran variedad de casos, pero nosotros nos quedaremos aquí para ahora continuar con la implementación en la tarjeta Nexys 2, así que cerramos ISim o simplemente volvemos a ISE Project Navigator.
Lo primero que necesitamos hacer, es definir a qué pin del FPGA conectaremos cada una de las entradas y salidas de nuestro sumador de 4 bits, aquí estamos usando una tarjeta Nexys 2, y pretendemos realizar las conexiones así:

Utilizaremos cinco leds para las salidas Cout (E17), S3 (K14), S2 (K15), S1 (J15) y S0 (J14), los ocho interruptores para las entradas A y B: A3 (K17), A2 (K18), A1 (H18), A0 (G18), B3 (R17), A2 (N17), B1 (L13) y B0 (L14), así como un botón para Cin (H13) (habría sido preferible un interruptor, pero solo hay ocho en la tarjeta).
Ahora, asociemos las entradas y salidas del sumador con los pines respectivos del FPGA, esto lo podemos hacer tanto con el programa PlanAhead tal y como lo hicimos en la entrega Curso VHDL – Configurar el dispositivo o editando directamente el archivo de texto .ucf como en Curso VHDL – Configurando una tarjeta Nexys 2.
Nosotros lo haremos de la segunda forma, para seguir practicando un poco la sintaxis del archivo .ucf.
Agregaremos un nuevo fuente al proyecto, en esta ocasión será de tipo Implementation Constraints File, como nombre utilizaremos Pines:

Una vez agregado el archivo al proyecto, hacemos doble clic sobre él para abrirlo en el editor:

Editamos el archivo de texto que se abrió en blanco tal que nos quede así (recordemos que esto es para indicar los pines de una tarjeta Nexys 2):

Seleccionamos el módulo principal sumador_4bits y hacemos doble clic en el proceso Generate Programming File, iniciarán todos los procesos requeridos (Synthesize, Implement Design) y finalmente, si no hubo problemas, tendremos:

Ahora si, es hora de conectar la tarjeta Nexys 2 mediante el cable USB, abrir el programa Adept y debe reconocer los dispositivos conectados, haremos clic en el botón Browse a la derecha del icono que representa el FPGA de la tarjeta:

Navegamos hasta el directorio de nuestro proyecto, donde encontraremos un archivo .bit con el nombre de nuestro módulo principal:

Hacemos clic en Abrir y, en nuestro caso, nos aparece una ventana de advertencia:

El error se debe a que no configuramos la opción Start-Up Clock a JTAG Clock al generar el archivo de programación como si lo hicimos en Curso VHDL – Configurar el dispositivo. Podemos ignorar la advertencia y continuar, hasta el momento realmente no hemos visto algún problema, pero mejor lo arreglamos. Regresamos a ISE Project Navigator, seleccionamos el módulo principal y hacemos clic con el botón derecho en el proceso Generate Programming File y seleccionamos la opción Process Properties:

En la ventana que aparece, vamos a la categoría Startup Options y modificamos la opción FPGA Start-Up Clock de CCLK a JTAG Clock, debe quedar así:

Hacemos clic en OK y ahora veremos que el icono al lado del proceso Generate Programming File ha cambiado a un signo de interrogación, indicando que han habido cambios desde la última vez que se ejecutó el proceso:

Ejecutamos nuevamente el proceso Generate Programing File haciendo doble clic sobre él, una vez que termine con éxito volvemos al software Adept y buscamos el archivo a descargar al FPGA, en esta ocasión ya no debe mostrar el mensaje de advertencia y ahora si podemos hacer clic en el botón Program para iniciar la descarga del archivo .bit al FPGA:


Ahora si, probemos nuestro diseño en el FPGA:

8 comentarios en “Curso VHDL – Diseño esquemático, parte 2”

  1. Saludos! excelentes tutoriales, tengo una duda en las restricciones aparte de los pines de la FPGA no sabes como se configuran para proyectos con flip-flop? ya que al tratar de implementar un diseño en una basys marca algunos problemas de ruteo con la señal de reloj, de antemano muchas gracias por la ayuda.

    1. No conozco las restricciones para trabajar con flip-flops, aunque estoy pensando que el problema pueda deberse a que se está ruteando una señal de reloj por un pin no dedicado para ello. Los FPGA tienen pins que especialmente se dedican para que se les conecten las señales de reloj, estos pines están conectados internamente de manera que reducen el tiempo de propagación de la señal a todos los bloques internos del FPGA.

  2. Muchas gracias!, mira el mensaje es algo largo “ERROR:Place:1018 – A clock IOB / clock component pair have been found that are not placed at an optimal clock IOB /” y se corrige añadiendo al archivo ucf la línea: NET “clk” CLOCK_DEDICATED_ROUTE = FALSE; pero aún sale un warning que te comenta sobre la pobre respuesta del diseño, lei en internet sobre esto, pero aún no me queda claro el asunto y me lo hace con ff en esquemático y con ff descritos en vhdl, me faltará configurar algo en el plan a head? o en los timing constrain?, gracias por tu amables respuesta a este problema.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *