Curso VHDL – Primer proyecto

En esta tercera entrega del tutorial veremos el manejo de ISE Project Navigator, que es el software con el que desarrollaremos nuestros proyectos, empezaremos creando algunas compuertas básicas, las simularemos para comprobar su funcionamiento y después las utilizaremos para construir un componente más complejo. Veremos además la diferencia entre los dos tipos de descripción que se pueden utilizar en VHDL: el diseño estructural y el diseño por comportamiento.

Iniciemos, para abrir ISE Project Navigator vamos al menú Inicio -> Todos los programas -> Xilinx ISE Design Suite 12.1 -> ISE Design Tools y ejecutamos la aplicación Project Navigator. Al iniciar el programa, carga automáticamente el último proyecto con el cual se trabajó. Vamos a crear un nuevo proyecto, para ello seleccionamos el menú File y después New Project…, con esto se iniciará el asistente de creación de nuevo proyecto, en la primera ventana que nos muestra habrá que indicar el nombre del proyecto, la carpeta de trabajo del proyecto (al introducir el nombre del proyecto se indicará automáticamente una carpeta con el mismo nombre), una descripción del proyecto (opcional) y en la parte inferior debemos indicar el tipo de archivo fuente que será el módulo principal del proyecto, en este momento lo dejaremos en HDL:

Hacemos clic en el botón Next y se mostrará la ventana Project Settings, donde debemos indicar el modelo de dispositivo para el que estará destinado nuestro proyecto, además de las herramientas a utilizar para las diferentes etapas del diseño. Para el caso de la tarjeta Spartan 3 Starter Kit, las opciones quedarían como sigue:
.
En caso de contar con otra tarjeta, debemos modificar las opciones Family, Device y Package, de la siguiente forma:

  • CMOD
    • Family: XC9500XL CPLDs
    • Device: XC9572XL
    • Package: VQ44
  • Basys 2
    • Family: Spartan3E
    • Device: XC3S100E
    • Package: CP132
  • Nexys 2
    • Family: Spartan3E
    • Device: XC3S500E
    • Package: FG320

Una vez indicadas las opciones adecuadas, hacemos clic en el botón Next, se mostrará un resumen del proyecto, finalmente hacemos clic en el botónFinish y se creará el proyecto, todavía sin ningún archivo fuente agregado, solamente veremos el nombre del archivo de proyecto en la parte superior y en la ventana Hierarchy dentro del panel Design el dispositivo seleccionado en la configuración en la ventana.
Ahora agregaremos un nuevo archivo fuente al proyecto, esto lo podemos hacer utilizando el menú Project -> New Source…, aparece una ventana donde debemos indicar el tipo de módulo que deseamos agregar al proyecto, seleccionaremos VHDL Module y como nombre le asignaremos compuerta_and:

Después hacemos clic en el botón Next y pasaremos a la ventana Define Module, aquí indicamos las características de nuestro módulo, como el nombre de entidad y de arquitectura (más adelante veremos qué es esto), y las entradas y salidas con que contará, hagamos la edición necesaria para que tengamos algo como esto:

Ahora hacemos clic en el botón Next, se mostrará un resumen del nuevo archivo fuente que estamos agregando al proyecto:

Hacemos clic en el botón Finish para que se agregue el nuevo fuente al proyecto, se abrirá la ventana del editor donde se cargará el contenido del nuevo archivo compuerta_and.vhd (el nombre que indicamos para el nuevo archivo fuente con la extensión .vhd que corresponde a un módulo VHDL):

----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    12:13:53 11/15/2010 
-- Design Name: 
-- Module Name:    compuerta_and - comportamiento 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity compuerta_and is
    Port ( a : in  STD_LOGIC;
           b : in  STD_LOGIC;
           s : out  STD_LOGIC);
end compuerta_and;

architecture comportamiento of compuerta_and is

begin


end comportamiento;

Vamos a analizar el código que tenemos desde el inicio, la primera sección que se aprecia con texto de color verde, es código predefinido que ISE Project Navigator inserta al inicio de cada módulo que se agrega a un proyecto, si notamos, todas las líneas en esta primera sección inician con un par de guiones “–“: al igual que en los lenguajes de programación de software, VHDL permite insertar comentarios en el código, los cuales se indican mediante esos dos guiones, todo el texto que siga a estos guiones se toma como un comentario. Es buena idea proporcionar de esta forma información sobre el módulo que estamos creando, aunque nosotros vamos a borrar la mayor parte de esa primera sección de comentarios para dejar solamente:

----------------------------------------------------------------------------------
-- Compuerta AND de dos entradas
-- Mexchip - Tutorial VHDL
-- Noviembre 2010
----------------------------------------------------------------------------------

A continuación en el código, tenemos:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

La instrucción library nos permite indicar una biblioteca externa (o librería, como se ha hecho común llamarles), de la que deseamos utilizar sus tipos de datos, operadores y algunas otras declaraciones, sería equiparable a la instrucción #include de los lenguajes C y C++. Y también, de manera similar a estos lenguajes, VHDL termina cada instrucción con punto y coma: “;”.
Después tenemos una instrucción use, que nos permite indicar qué paquete vamos a utilizar de la biblioteca que antes habíamos declarado con library. En este caso, se indica que vamos a hacer uso de la biblioteca IEEE, que es una biblioteca estándar definida por IEEE, que de esa biblioteca utilizaremos el paquete STD_LOGIC_1164, y que de dicho paquete utilizaremos todas sus declaraciones (instrucción ALL).
Podemos encontrar un poco más de información sobre este paquete en el siguiente enlace: VHDL Online Help – Std_Logic_1164 Package.
Aprovecharemos ahora para mencionar que VHDL es un lenguaje que no distingue minúsculas de mayúsculas, por lo que la declaración de la biblioteca IEEE podría hacerse también de esta forma:

LIBRARY ieee
USE ieee.std_logic_1164.all;

A continuación en el código de nuestro módulo, tenemos otra sección de comentarios que también agrega ISE Project Navigator por defecto en nuevos módulos:

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

Se trata de paquetes adicionales que podríamos utilizar en nuestro módulo VHDL, el primer paquete, IEEE.NUMERIC_STD.ALL cuenta con funciones aritméticas para valores con y sin signo, el otro paquete pertenece a la biblioteca UNISIM de Xilinx, por ahora no necesitamos ninguno de estos paquetes y, de hecho, no los usaremos durante este tutorial, así que podemos eliminar toda esa sección.

Entidad y arquitectura

En VHDL, cada módulo está compuesto por dos partes: la entidad y la arquitectura. La entidad es la sección donde se indican las conexiones (señales) del módulo con el resto de componentes, indicamos el número de entradas y salidas, además del tipo de cada una de ellas. La sintaxis de declaración de entidad y de sus conexiones es la siguiente:

entity NOMBRE_ENTIDAD is
  port (
    NOMBRE_SEÑAL1 : MODO TIPO;
    NOMBRE_SEÑAL2 : MODO TIPO
  );
end NOMBRE_ENTIDAD;

En primer lugar se indica el nombre de la entidad, utilizando la palabra reservada entity, y después de la instrucción is se inicia la descripción de la entidad, en este caso de las señales (o puertos) mediante las que se comunicará con el exterior; para cada señal se indica su nombre, el modo que puede ser de entrada, salida o ambos y el tipo. Notemos que las declaraciones de puertos finalizan con punto y coma, excepto la última antes del paréntesis que culmina la instrucción port.
Así, continuando con nuestro módulo, donde ISE Project Navigator ha insertado este código:

entity compuerta_and is
    Port ( a : in  STD_LOGIC;
           b : in  STD_LOGIC;
           s : out  STD_LOGIC);
end compuerta_and;

Se declara una entidad cuyo nombre es compuerta_and, tiene tres puertos, todos de tipo std_logic, los dos primeros denominados a y b, son entradas (in), mientras que el tercero, denominado s, es una salida, se puede representar en la siguiente figura:

De cierta forma, se considera la declaración de entidad como una “caja negra”, para la cual se conocen sus entradas y salidas, pero no su funcionamiento interno, que es lo que se describe en la arquitectura.
La arquitectura es la sección de un módulo VHDL en la que se describe el funcionamiento de la entidad, y puede hacerse de dos maneras diferentes: describiendo su estructura interna mediante interconexiones entre compuertas y componentes que constituyen al módulo, lo que se denomina una descripción estructural, o con una descripción de lo que hace el módulo, ya sea mediante funciones booleanas o mediante una descripción algorítmica, lo que se conoce como una descripción de comportamiento. La sintaxis para declarar una arquitectura es:

architecture NOMBRE_ARQUITECTURA of NOMBRE_ENTIDAD is

-- Aquí se declaran elementos auxiliares para usar en la descripción

begin

-- Aquí se realiza la descripción de la arquitectura,
-- mediante la utilización de sentencias secuenciales,
-- combinacionales o subprogramas.
end NOMBRE_ARQUITECTURA;

Utilizamos la instrucción architecture para iniciar la declaración de la arquitectura, después indicamos su nombre y el nombre de la entidad a la cual corresponde la descripción que se realizará, continuamos con la instrucción begin para indicar el inicio del código que describe el funcionamiento de la arquitectura, y finalizamos con la instrucción end y el nombre de la arquitectura. Entre las instrucciones is y begin, es posible declarar señales, componentes o elementos auxiliares para la descripción de la arquitectura, algunos de estos elementos los veremos más adelante en este curso.
Por el momento, regresemos al módulo que hemos creado en ISE Project Navigator, donde tenemos la declaración de la arquitectura comportamiento asociada a la entidad compuerta_and:

architecture comportamiento of compuerta_and is
begin

end comportamiento;

Vamos a agregar una línea de código después de la instrucción begin, así:

architecture comportamiento of compuerta_and is
begin
  s <= a and b;
end comportamiento;

Con esto, estamos asignando el resultado de la operación and entre las señales de entrada a y b a la señal de salida s. Como vemos, la pareja de caracteres "<=" son el operador de asignación de señales en VHDL, también, estamos haciendo uso del operador and, que realiza la operación lógica AND entre sus dos operandos. Además del operador and, en VHDL se tienen definidos los siguientes operadores lógicos: or, nand, nor, xor y xnor. Finalmente, culminamos la instrucción con un punto y coma.
Una vez que hemos adicionado este código a nuestro módulo, procedemos a guardar los cambios realizados usando el comando Save dentro del menú File o pulsando en el botón con icono de un disco flexible en la barra de herramientas. Para comprobar que no hemos cometido errores en el código de nuestro módulo, debemos realizar una revisión de sintaxis, para ello, en la ventana Hierarchy, hacemos clic en el nombre del módulo (compuerta_and), después, en la ventana Processes, expandimos la sección Synthesize - XST, de manera que podamos ver el proceso Check Syntax:

Para iniciar la revisión de sitanxis de nuestro código, hacemos doble clic sobre el nombre del proceso o con un clic derecho y luego seleccionando el comando Run del menú contextual.
Podemos ver el resultado del proceso de revisión de sintaxis en la parte inferior del programa ISE Project Navigator, en la ventana Console, al terminar el proceso, un icono con una palomita blanca nos indica que la revisión de sintaxis ha concluido exitosamente pues no se encontraron errores en nuestro código, tanto para este caso como el de tener otro icono (de advertencia o de error), podemos revisar a detalle viendo los mensajes en la ventana Console ubicada en la parte inferior de ISE Project Navigator.

Ya hemos revisado el código de nuestro módulo, nos resta comprobar que funcione correctamente, para ello podemos realizar una simulación antes de proceder a implementarlo en un dispositivo reconfigurable, pero eso lo dejaremos para la próxima entrega del tutorial, en la que realizaremos la simulación del módulo compuerta_and y añadiremos algunos módulos más a nuestro proyecto, hasta entonces :).

9 comentarios

  1. gran pagina MEXCHIP. la verdad soy muy novato en esto del vhdl y las fpga, apenas me estoy instruyendo por internet y me has sido de gran ayuda. la vdd es que el problema que tengo es que todo lo que he aprendido no lo he podido implementar debido a que no encuentro un programa facil de usar en el cual compilar y simular y por supuesto gratis. si sabes de alguno quisiera que dieras el link de descarga. tengo un buen de ganas de aprender, ayudenme. GRACIAS

    • Qué tal, no conozco de dónde se pueda descargar, imagino que es para manejar displays LCD ¿verdad? Si llego a toparme con algo pongo un enlace, y si no, cuando pueda conseguirme algún display me pongo con algo :).

  2. Hola oye tengo una duda, lo qe pasa esqe yo tengo el programa el ISE Design Suite 14.4 y al crear nuevo proyecto y luego nueva fuente no me crea la nueva fuente, qe debo hacer?

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*