Sunteți pe pagina 1din 25

GENERALIDADES SOBRE VHDL Y LA HERRAMIENTA XILINX

Realizado por: Ing. Johnymar L Herrera de Baron


Abril2012
PROGRAMA EN VHDL
VHDL es el acrnimo que representa la combinacin de VHSIC y HDL, donde VHSIC es el
acrnimo de Very High Speed Integrated Circuit y HDL es a su vez el acrnimo de Hardware
Descripcin Language, siendo un lenguaje definido por el IEEE (Institute of Electrical and
Electronics Engineers) (ANSI/IEEE 1076-1993) usado por ingenieros para describir circuitos
digitales; Aunque puede ser usado de forma general para describir cualquier circuito se usa
principalmente para desarrollar programas para PLDs (Programable Logic Device - Dispositivo
Lgico Programable), FPGAs (Field Programmable Gate Array) y similares.
Haciendo una comparacin con un lenguaje de programacin de alto nivel se puede decir que el
cdigo VHDL es similar en cuanto a las sentencias utilizadas, pero no es as en el flujo de ejecucin
de las instrucciones. Un cdigo de programacin en VHDL no es precisamente un "programa", ya
que un programa es un conjunto de instrucciones que se ejecutan paso a paso para llevar a cabo una
tarea determinada, y en este caso no se puede decir que las instrucciones se estn ejecutando de esta
manera en este lenguaje, porque esto no corresponde en la realidad al comportamiento de un
circuito. En VHDL las instrucciones se estn ejecutando en todo momento lo cual s se asemeja al
comportamiento real de un circuito, en este caso cuando cambie algn BIT de entrada cambiar
inmediatamente la salida y, por consiguiente, estamos describiendo cual es el verdadero
funcionamiento del circuito.
La forma en que se "programa" en VHDL al principio resultar un tanto extraa, pero si se asocia
ste cdigo con el circuito que se esta describiendo, podemos darnos cuenta que en l los
componentes siempre estn activos, y es esto es precisamente lo que describimos mediante VHDL
Asi mismo, la programacion en VHDL esta formada por mdulos cuya estructura contempla
entidades que tienen una arquitectura donde se describe el funcionamiento de la aplicacin, pudiendo
esta a su vez contener procesos. El cuerpo o estructura de un mdulo tpico de VHDL se muestra en
el siguiente esquema:
-----DESCRIPCION DEL PROYECTO---------------BIBLIOTECAS A UTILZAR--------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
------------DEFINICION DE LA ENTIDAD-------entity Nombre _de _la_entidad is
ports (Nombre_de_la_seal: modo tipo;)
end Nombre _de _la_entidad;
---DESCRIPCION DE LA ARQUITECTURA--architecture nombre_arquitectura of Nombre _de _la_entidad is
begin
end Behavioral;

En el listado anterior, se observan cuatro reas bsicas del programa: descripcin del
proyecto, libreras, definicin de la entidad y descripcin de la arquitectura, las cuales se
explican a continuacin.
rea 1
Descripcin del proyecto: rea donde se guarda la informacin relacionada con un diseo
determinado, la cual es generada automticamente por el sintetizador de programa.
rea 2
Bibliotecas: rea donde se pueden incluir archivos ya sintetizados llamados bibliotecas que permiten
utilizar las distintas funciones y modos de los datos este lenguaje. Algunos ejemplos de estas
libreras son:

ieee.std_logic_1164 (permite usar seales del tipo std_logic)


ieee.std_logic_arith (permite usar operaciones aritmticas)
ieee.std_logic_unsigned (permite usar operaciones binarias puras sin signo),
ieee.std_logic_signed (permite usar operaciones binarias puras con signo),
entre las ms importantes.

rea 3
Definicin de Identidad: Una entidad es la abstraccin de un circuito, ya sea desde un complejo
sistema electrnico hasta una simple compuerta lgica. La entidad nicamente describe la forma
externa del circuito, aqu se enumeran las entradas y salidas del diseo. Una entidad es anloga a un
smbolo esquemtico de los diagramas electrnicos, el cual describe las conexiones del dispositivo
hacia el resto del diseo, el cual describe las conexiones del dispositivo hacia el resto del diseo, en
esta se debe declarar:

Nombre_de_la_entidad: es un identificador seleccionado por el usuario para


seleccionar la entidad.
Ports: Incluye una lista de uno o ms identificadores seleccionados por el usuario
para identificar las seales externas de la interfaz, donde debe incluirse el modo y
tipo correspondiente a estos identificadores segn las palabras reservadas para ello.
(ver tabla 1y 2)
Tabla N1: Modos de las seales de Puerto en VHDL
Modo
Descripcin
En este modo las seales solo entran en la entidad
IN
OUT Las seales salen de la entidad
BUFFER

Este modo se utiliza para las seales que adems de salir de la


entidad pueden usarse como entradas realimentadas

Este modo se utiliza para seales bidireccionales. Se emplea


en salida con tres estados. Se puede asignar como sustituto de
INOUT
los tres modos anteriores, pero no se aconseja pues dificulta la
comprensin del programa.

Tabla N2: Tipos de las seales en VHDL


TIPO
Caractersticas
En este tipo las seales solo toman los valores de "1" y "0"
BIT
En este tipo las seales solo toman los valores de True y
Booleana
False
En este tipo las seales toman 9 valores, entre ellos tenemos:
Uninitialized (U), Forcing Unknown (X), Forcing 0 (0),
Std_logic
Forcing 1 (1), High Impedance (Z), Weak Unknown (W),
Weak 0 (L), Weak 1(H), Dont care (-).
En este tipo las seales toman valores enteros.
Integer
En este tipo los valores de las seales son una cadena de
BIT_Vector
unos y ceros. Ejemplo: 1000
En este tipo los valores de las seales son una cadena de los
Std_Logic_Vector
nueve valores permisibles para el tipo std_logic.
Contiene todos los caracteres ISO de 8 BITs, donde los
Character
primeros 128 son los caracteres ASCII.

Parte 4.
Descripcin de la arquitectura: En esta rea se distinguen dos partes para la inclusin de cdigo
con dos propsitos distintos:
1. La comprendida entre la cabecera y la palabra BEGIN est destinada a la declaracin de
objetos que se precisen para realizar la descripcin del funcionamiento del dispositivo.
2. Entre la palabra BEGIN y END se describe el funcionamiento del diseo.
Ahora bien, para definir la arquitectura de una entidad hay distintos niveles de abstraccin:

Por estilo de comportamiento (behevioral): Este estilo utiliza el lenguaje o los


comandos comunes usados en lenguajes de programacin, como IF, THEN, CASE,
sin necesidad que el programador se preocupe por la arquitectura del elemento
programable donde estar alojada la aplicacin.; siendo necesario para incluir este
tipo de comando la declaracin de procesos ya que los mimos son de naturaleza
secuencial.

Por estilo de flujo de datos (data flow"): En este se describe como la informacin es
transmitida de una seal a otra, de una entrada a una salida, sin el uso de condiciones
secuenciales.

Por estilo estructural (stuctural): En este estilo se describe un netlist de VHDL en


donde se interconectan varios mdulos, identificando cuales mdulos son usados y de
que manera estn interconectados.
Por estilo mixto: En este se combinan uno o varios estilos anteriores.

Especficamente antes del Begin de la descripcin de la arquitectura, se pueden declarar las


constantes, variables o seales que se requieran para lograr la operacin programada, teniendo
que:

Una constante: es un elemento que puede tomar un nico valor de un tipo dado. A
las constantes se les debe asignar un valor en el momento de la declaracin. Una vez
que se le ha asignado algn valor, ste no puede ser cambiado dentro de la
descripcin del diseo. Los objetos de esta clase tienen un valor inicial que es
asignado de forma previa a la simulacin y que no puede ser modificado durante sta.
Su sintaxis: constant identificador: tipo[:= valor];
Ejemplo: constant x: BIT:=1;

Una Variable: Es similar a las constantes, con la diferencia que su valor puede ser
modificado cuando sea necesario. Las variables en VHDL son similares a cualquier
tipo de variable de un lenguaje de programacin de alto nivel. A las variables tambin
se les puede asignar un valor inicial al momento de ser declaradas. Se
utilizan nicamente en los procesos y subprogramas (funciones y procedimientos).
Las variables generalmente se utilizan como ndices, principalmente en instrucciones
de bucle, o para tomar valores que permitan modelar componentes. Las variables no
representan conexiones o estados de memoria.
Su sintaxis: variable identificador: tipo [:= valor]; La asignacin posterior de valores
a los objetos de este tipo se realiza con el operador
:=.
Ejemplo: variable i :integer :=10;

Una Seal (signal): Es similar a un objeto de la clase variable, con una importante
diferencia: las seales si pueden almacenar o pasar valores lgicos, mientras que una
variable no lo puede hacer. Las seales, por lo tanto, representan elementos de
memoria o conexiones y si pueden ser sintetizadas. Los puertos de una entidad son
implcitamente declarados como seales en el momento de la declaracin, ya que
estos representan conexiones. Tambin pueden ser declaradas en las arquitecturas
antes del BEGIN, lo cual nos permite realizar conexiones entre diferentes estructuras
de programacin.
Su sintaxis: signal identificador: tipo; La asignacin posterior de valores a los objetos
de este tipo se realiza con el operador <=
Ejemplo: signal A: std:logic;
Para desarrollar la estructura de funcionamiento se usan operadores entre las seales de VHDL
que permiten construir diferentes tipos de expresiones mediante los cuales se puede describir la
funcin deseada; un operador nos permite construir diferentes tipos de expresiones mediante los
cuales podemos calcular datos utilizando los diferentes objetos de datos con el tipo de dato que
maneja dicho objeto, existiendo distintos operadores de asignacin con lo que se transfieren
valores de un objeto de datos a otro, y operadores de asociacin que relacionan un objeto de
datos con otro, lo cual no existe en ningn lenguaje de programacin de alto nivel. Dentro los
operadores que se pueden utilizar se encuentran:
a. Operadores Lgicos: Los operadores lgicos AND, OR, NAND, NOR, XOR, XNOR,
y NOT estn definidos para ser usados con los tipos, std_logic, BIT y boolean. Para
utilizar estos operadores, excepto el operador NOT, los operandos deben ser del mismo

tamao. Los operadores lgicos no tiene orden de precedencia por lo que para
expresiones en las que se utilice ms de un operador lgico es necesario indicar mediante
parntesis cual es el orden en que se debe realizar el clculo.
b. Operadores de Comparacin: Estos tipos de operadores se utilizan para ejecutar
pruebas de igualdad, desigualdad, o de magnitud entre dos objetos de datos. Los
operandos que participen en la prueba deben ser del mismo tipo y el resultado de la
operacin es del tipo boolean. Los operadores de igualdad y desigualdad (= y /=) pueden
ser utilizados para todos los tipos de datos predefinidos en el lenguaje Los operadores de
magnitud ("<" menor que, ">" mayor que, "<=" menor o igual que, y ">=" mayor o igual
que) estn definidos para ser utilizados con tipos escalares.
c. Operadores de Adicin: Los operadores + y - son frecuentemente utilizados para
describir sumas y restas adems de signos positivo y negativo. Estn definidos para ser
utilizados con el tipo entero y tambin para el tipo BIT. El operador "&" permite
concatenar cadenas de BITS obteniendo una de mayor tamao. Los tres operadores
tienen la misma precedencia, por lo que para instrucciones en la que se utiliza ms de un
operador de este tipo es recomendable indicar mediante parntesis el orden de las
operaciones. No es posible realizar sumas entre BIT_vectors de diferente tamao, y
tampoco podremos asignar el resultado de una suma o resta entre dos BIT_vectors a un
BIT_vector de diferente longitud. Si se desea obtener el acarreo de la suma del
resultado de una operacin aritmtica entre dos BIT_vectors de la misma longitud, a un
BIT_vector que sea de mayor longitud en un BIT, se permite utilizar el operador de
concatenacin para incrementar el tamao solamente en el primer BIT_vector que
participa en la operacin, con lo cual se indica que deseamos obtener el acarreo de la
suma. (Y <= 0 & X + B; indica que se quiere obtener Y como un vector de un BIT
mas de longitud, X y B son de longitud n-1 que Y, siendo Y de longitud n)
d. Operadores de Multiplicacin: Son los operandos "*" y el "/" que se utilizan para la
multiplicacin y para la divisin respectivamente. Los dos operandos tienen el mismo
orden de precedencia al igual que los operandos MOD y REM. Todos los operandos de
multiplicacin estn definidos para ser utilizados con operandos del mismo tipo, siendo
estos del tipo entero o BIT_vector. El resultado es entonces del mismo tipo que los
operandos por lo que tambin el objeto de datos que recibe el resultado de la operacin
deber ser del mismo tipo que los operandos.
e. Operadores Miscelneos: En esta categora se encuentran los operadores "abs" y "**".
El operador "abs" devuelve el valor absoluto de un operando del tipo entero. El operador
"**" se utiliza para elevar el primer operador a una potencia definida por el segundo
operando, ambos deben ser del tipo entero.
f. Operadores de Asignacin: En VHDL existen dos tipos de operadores de asignacin los
cuales son: "<=" y ":=". El operador ":=" se utiliza para asignar un valor inicial a
constantes, variables y seales en el momento de la declaracin, pero para el resto de la
descripcin nicamente utilizaremos ":=" para ser usado con variables y "<=" para ser
usado con seales.

g. Operadores de Asociacin: En diseos que utilicen sentencias concurrentes del tipo


Case When, es necesario utilizar el operador de asociacin "=>", que permite asignar el
valor a una seal o variable segn el caso.
h. Operadores de Corrimiento: Incluidos en los paquetes numeric_std y
numeric_BIT, estos operadores realizan operaciones de desplazamiento o de rotacin
con los elementos de un vector, teniendo los desplazamientos lgicos SLL y SRL, donde
se desplazan los BITS de un vector n veces a la izquierda (SLL) o a la derecha (SRL),
introduciendo ceros en los lugares que quedan libres, los desplazamientos aritmticos
SLA y SR, que tambin desplazan los BITS de un vector n veces a la izquierda (SLA)
o a la derecha (SRA), introduciendo ceros en los lugares que quedan libres, pero
conservan el signo y los de rotacin ROL y ROR que desplazan los BITS de un
vector n veces a la izquierda (ROL) o a la derecha (ROR), introduciendo los BITS que
son desplazados en los lugares que van quedando libres.

Sentencias concurrentes
Las instrucciones concurrentes o secuenciales son aquellas que son ejecutadas serialmente, una
despus de otra. La mayora de los lenguajes de programacin, como C o Pascal, utilizan este tipo de
instrucciones. En VHDL las instrucciones secuenciales son implementadas nicamente dentro del
bloque PROCESS.
Un proceso es el bloque bsico concurrente de codificacin secuencial. Contiene una serie de
instrucciones secuenciales que permiten modelar el comportamiento del circuito, sin embargo, el
bloque PROCESS equivale a una sola instruccin concurrente. Un proceso puede ser utilizado
dentro de cualquier arquitectura definiendo para si mismo una regin de declaraciones y otra para la
codificacin secuencial, similar a una arquitectura. La regin de codificacin puede contener
nicamente instrucciones secuenciales, su sintaxis es:
PROCESS ( lista sensible )
-- declaraciones
BEGIN
-- instrucciones secuenciales
END PROCESS

Para desarrollar arquitecturas de manera ms simple usando la estructura process existen un conjunto
de sentencias concurrentes que permiten relacionar las seales involucradas y obtener un resultado,
teniendo entre las ms usadas:
WHEN ELSE: En esta sentencia siempre se modifica el valor de una misma seal, pero las
condiciones pueden ser independientes (actuar sobre distintas seales cada una), dnde la
colocacin de las condiciones indica la preferencia de unas sobre otras, es decir, la condicin
1 tiene preferencia sobre el resto, la condicin 2 sobre todas menos la 1 y as sucesivamente,
y su sintaxis es:

Process (lista de sensibilidad)


Begin
seal_a_modificar <= valor_1 when condicin_1 else
valor_2 when condicin_2 else
...
valor_n when condicin_n else
valor_por defecto;
End process;
Ejemplo:
---------------------------------------------- Ejemplos when-else
--------------------------------------------C <= 00 when A = B else
01 when A < B else 10
--------------------------------------------C <= 00 when A = B else
01 when D = 00 else 10
---------------------------------------------

IF-THEN-ELSE: En este caso se modificar el valor de una seal dependiendo de los


valores de una seal condicin, incluyendo el valor que tendr en el caso que fuera falsa la
seal condicin; es decir asocia el valor si es cierto y de lo contrario el valor si es falso
siendo su sintaxis:
IF THEN ELSE
process ()
Begin
if condicin then
.....
elseif condicion then
.....
Else
...
end if;
end process;

Ejemplo:
-- asignaciones
elsif otra_condicin then
-- asignaciones
Else
-- asignaciones
end if;
end process;
Un ejemplo de esta sentencia seria:
---------------------------------------------- Ejemplo
--------------------------------------------process (control, A, B)
Begin

If control = 00 then
resultado <= A + B;
elsif control = 11 then
resultado <= A B;
Else
resultado <= A;
end if;
end process;
----------------------------------------------

CASE-WHEN: En esta sentencia se cambia el valor de una seal dependiendo de un valor


preestablecido cuando es cierta y el valor cuando la condicin toma cualquier otro valor; su
sintaxis es:
process (lista de sensibilidad)
Begin
case seal_condicin is
when valor_condicin_l =>
-- asignaciones
when valor_condicin_n =>
-- asignaciones
when others =>
-- asignaciones
end case;
end process;
Ejemplo:
---------------------------------------------- Ejemplo
--------------------------------------------process (control, A, B)
Begin
case control is
when 00 =>
resultado <= A+B;
when 11 =>
resultado <= A-B;
when others =>
resultado <= A;
end case;
end process;
----------------------------------------------

Instruccin WAIT y Atributos en VHDL


La instruccin WAIT es utilizada en procesos que no tienen una lista sensible, ya que esta
instruccin define implcitamente la lista sensible del proceso, y define que hasta no presentarse la
condicin por la cual se est esperando no se ejecuta ninguna de las sentencias del proceso.

Ejemplo:
PROCESS
BEGIN
WAIT UNTIL rising_edge( clk ) ;
IF reset = '1' THEN
y <= ( OTHERS => '0' )
ELSE
y <= y + 1 ;
END IF ;
END PROCESS ;

Un atributo es una propiedad que es asociada a seales, entidades o arquitecturas. Estos atributos
proporcionan informacin que nos puede ser til dentro de una descripcin en VHDL. Los atributos
se utilizan mediante la comilla simple, por ejemplo el atributo 'event, que probablemente sea el
ms utilizado, nos permite detectar cuando sucede una transicin de estado en una seal, por lo que
es muy til en descripciones de circuitos secuenciales.
Ejemplo:
Process
Begin
IF ( clk 'event and clk = '1' ) THEN
A <= '1' ;
end if;
end process;
Existen ms atributos y a continuacin mencionaremos algunos que son tiles en descripciones para
sntesis, como son:

'rising_edge indica la transicin positiva de una seal de 1 BIT.


'left obtiene el valor que se encuentra a la izquierda de un objeto de datos.
right regresa el dato que se encuentra a la derecha del objeto.
high permite obtener el mayor elemento de un objeto de datos.
low proporciona el valor ms pequeo.

PROGRAMA .BIT PARA DISPOSITIVOS PROGRAMABLES


Como el VHDL es un lenguaje basado en texto, se puede utilizar cualquier editor para esta tarea,
aunque el entorno de los programas de VHDL incluye su propio editor de texto, as despus que se
ha escrito algn cdigo se hace necesario compilarlo, siendo el compilador de VHDL el encargado
de analizar este cdigo, determinar los errores de sintaxis y chequear la compatibilidad entre las
entidades , creando toda la informacin necesaria antes de continuar con el proceso de generacin
del archivo de programacin que ira al dispositivo programable, se ejecuta la implementacin donde
se hace el mapeo y ruteo de los bloques internos del componente ajustados a la descripcin realizada
y traducida por el proceso de sntesis y finalmente general el archivo de programacin de extensin
.BIT que ha de ser descargado en el dispositivo programable y que contiene el diseo final.
En funcin de lo anterior a continuacin se presenta un breve tutorial de como describir un circuito
programable del tipo FPGA, hasta su puesta en marcha y verificacin en una tarjeta de desarrollo

llamada Basys 2 de Digilent, la cual contiene un FPGA Spartan 3E XC3S250E de Xilinx,


desarrollando para ello un ejemplo bastante simple, usando como herramientas de Software:
o ISE Webpack 13.1 SP1 de Xilinx: Ambiente integrado de desarrollo desde el que se
invocan diferentes herramientas, conforme se van requiriendo. Se utilizar para la
sntesis, implementacin y creacin del archivo de descarga.
o Adept de Digilent: Es una utilera que permite programar a los FPGAs en algunas
tarjetas desarrolladas por Digilent, a travs del puerto USB. (diligent adept suite)
Lo primero que se debe hacer es instalar el Xilinx ISE Webpack versin 13.1 SP1, para ello se puede
accesar a la pgina de Xilinx, en la direccin http://www.xilinx.com/support/download/index.htm y
descargar al PC e instalar, hecho esto, se debern seguir los siguientes pasos:
PASO 1: Cargar el programa para generar un nuevo proyecto, abriendo el Project Navigator en su
Escritorio a travs del acceso directo o buscando como:
Start > Programs > Xilinx ISE Design Suite 13.1 > ISE > Project Navigator

Figura N1: Pantalla Inicial de Xilinx Web Pack

PASO 2: Abierto seleccione nuevo proyecto del men Getting Started o seleccione:
File > New Project

Este procedimiento abre la caja de dialogo para colocar el nombre que deseamos asignar el proyecto
as como para escoger donde ser guardado; tal como se observa en la figura:

Figura N2: Pantalla Nuevo Proyecto de Xilinx Web Pack

Se recomienda que escoja un nombre asociado con la aplicacin que desea crear para localizarlo mas
fcilmente, en este caso se escogi ejemplo1, como nombre del proyecto y se va alojar en el
directorio asociado con la carpeta .xilinx del disco C.
PASO 3: Luego de asignado el nombre y directorio al proyecto se debe seleccionar correctamente la
Familia, Dispositivo y empaque del dispositivo programable a su proyecto, considerando de que esto
depender del elemento programable que se va utilizar, en nuestro caso la configuracin se realizar
de acuerdo a las caractersticas de los de los mdulos BASYS2 ubicados en los laboratorios de
Lgica Digital de la Universidad de Carabobo, siendo la misma la siguiente:

Figura N3: Pantalla Configuracin de Nuevo Proyecto de Xilinx Web Pack

Se observa que la configuracin del BASYS2 se corresponde con una FPGA de la familia
Spartan3E, especficamente el modelo XCS3S250E, cuyo empaque es del tipo CP132 y con
velocidad -4. El resto de los campos adicionales solicitados en la caja de dialogo pueden dejarse por
defecto, verificando que el lenguaje preferido (preferred language) que se va utilizar es VHDL;
Una vez completada la configuracin hacer clic en next, y se visualizara el resumen del la
configuracin del proyecto creado (Project Sumary)

Figura N4: Resumen de Configuracin de proyecto


Si todo se ajusta a la configuracin indicada hacer clic en finish, de lo contrario si se visualiza
un error hacer clic en back para corregirlo.
PASO 4: Creado el proyecto se abre el navegador (Project navigator), debiendo habilitar la el
botn de Design y el botn de Consola.

Figura N5: rea de programacin de Xilinx Web Pack

El panel de Design (1) contiene 2 ventanas, una ventana donde se muestran todos los archivos
fuentes (source) asociados al diseo (hierachy) y una ventana de process donde se observan que
se pueden ejecutar para la fuente (source) seleccionada en el archivo. En el panel de la consola (2)
se visualizan los mensaje de estatus, incluyendo los mensajes de error y precaucin. Finalmente en la
ventana de edicin del HDL (3) se visualiza el cdigo fuente de los archivos seleccionados
(sources) del panel de Desing.
PASO 5: Para adicionar una nueva fuente (source), o crear una source file una vez que se crea
el proyecto se puede visualizar que 2 fuentes se listan entre los archivos del panel Desing, una es
el Project file name (archivo de nombre del proyecto), en nuestro caso ejemplo1 y otra es el
Device Targeted for design (dispositivo programable a ser usado en el proyecto) en nuestro caso
xc3s250e-4cp132.
Para crear una nueva fuente hacer clic en botn derecho del mouse en el archivo de Device
Targeted for design y seleccione una de las tres opciones, ya sea nueva fuente (new source),
adicionar fuente (add source) o adicionar una copia de una fuente (add copy of source), tal como
lo muestra la figura:

Figura N6: Adicin de nueva fuente en Xilinx Web Pack


En nuestro caso seleccione adicionar nueva fuente (new source file) y esto da inicio al sistema de
gua de New source que lo dirige a seleccionar el tipo de fuente que desea seleccionar, en nuestro
caso el tipo de fuente o source es VHDL module, debiendo colocarle un nombre a la fuente que se
est creando, igualmente asignando el directorio donde se va alojar.

Figura N7: Adicin de nuevo Mdulo de VHDL al Proyecto de Xilinx Web Pack

En nuestro caso el file name escogido fue, ejemplo1 y la direccin la misma carpeta donde se
encuentra alojado el proyecto es decir .xilinx del disco C.
Habiendo asignado el nombre de la nueva fuente y su directorio se debe dar clic a next, y la gua de
creacin nos llevar a una tabla donde se pueden definir las entradas y salidas del mdulo que se va
a programar, para el ejemplo que se va a programar, se deben definir A,B,C y D como entradas del
sistemas en este caso del tipo Std_logic ya que son entradas lgicas de un solo BIT y la una
salida X de tipo Std_logic ya que independientemente de la compuerta la salida ser de un solo
BIT.

Figura N8: Configuracin de seales de puerto de mdulo VHDL

Utilizada esta tabla de asignacin se presiona Next y se podr observar el archivo resumen de las
entradas y salidas configuradas.

Figura N9: Resumen de Mdulo VHDL adicionado


Presionando el botn de finish se abrir la venta de edicin de HDL donde deber colocarse el
cdigo de la funcin que se desea programar, observando en esta ventana varios cuerpos del
programa, tal como se muestra en la figura:

Figura N10: Estructura de Mdulo Generada automticamente por el compilador

De manera ms especfica se puede observar el cuerpo de la cabecera, espacio dedicado a


comentarios sobre el contenido del programa, la compaa que lo realiz, el ingeniero programador,
el da de creacin, etc., tal como la figura:

Figura N11: rea 1 Descripcin del Proyecto

Cuerpo de libreras donde se adicionan todos los mdulos con los cuales va operar nuestro programa.

Figura N12: rea 2 Libreras


Cuerpo del programa donde se establecen las entradas y salidas as como el comportamiento
funcional de nuestro programa:

Figura N13: rea 3 y 4 Descripcin de la Entidad y arquitectura

Para el ejemplo en cuestin se utilizo la tabla de asignaciones para las entradas y salidas ya en la
descripcin de la identidad compuertas ya se adicionaron A, B, C y D como entradas del tipo
Std_logic y X como salida del tipo Std_logic, faltando solo el establecimiento de la sintaxis de
estas entradas para obtener la funcion de X como AND, OR, XOR Y XNOR de las entradas A y B
en funcin de las entradas C y D.

El programa requerido es:


process (A,B,C,D)
Begin
If (C='0' and D='0') then
X <= A and B;
elsif (C='0' and D='1') then
X <= A or B;
elsif (C='1' and D='0') then
X <= A xor B;
Else
X <= A xnor B;
end if;
end process;

PASO 6: Una vez determinada las lneas de cdigo del mdulo que se esta desarrollando, en nuestro
caso compuertas, introducir las mismas en la cuerpo de programa destinado al comportamiento de la
arquitectura o arquitecture behavior, tal como se muestra en la figura:

Figura N14: Descripcin del comportamiento del mdulo


PASO 7: Para poder usar este programa en la tarjeta Basys2 es necesario asociar las entradas y
salidas del sistema a los pines fsicos del dispositivo programable que en l se encuentra (FPGA)
para poder interactuar con los interruptores, botones, leds y displays que se encuentran en la tarjeta
tal como se muestra:
Figura N15: Partes de la tarjeta Basys2 de Diligent
Figura N11: rea 1 Descripcin del Proyecto

Como se observa en la figura anterior en la tarjeta Basys2 hay diferentes elementos para
entrada/salida o almacenamiento de datos. Para la implementacin del programa en curso es de
esperarse que las entradas A, B, C y D se obtengan de los interruptores, y la salida X se muestre en

un LED, por lo tanto el esquema anterior no es suficiente, se requiere conocer a que terminales del
FPGA estn conectados estos elementos; en la figura siguiente se muestra a que terminales del
FPGA estn conectados los dispositivos bsicos de entrada/salida.

Figura N15: Conexin de la FPGA Spartan 3E de la tarjeta Basys2


En funcin del diagrama de conexiones anterior, cada elemento es asociado con una etiqueta (Ej.
SW0) y un pin fsico de la Fpga (Ej. P11), es requerido asociar al diseo programado el
direccionamiento fsico de las entradas y salidas. A nivel de software esto se realiza agregando un
archivo con extensin UCF al mdulo VHDL programado.
Para agregar este archivo al diseo se debe dar un clic derecho y en el men contextual seleccionar
la opcin New Source y escoger el tipo de source Implementation Constraint File, en este caso se
puede dar como nombre pines y pulsar next, abrindose una ventana tipo editor de texto donde es
requerido escribir las conexiones fsicas de nuestro circuito, utilizando para ello la siguiente sintaxis:
NET nombre de la seal LOC = terminal ; donde NET y LOC son palabras reservadas. Para
nuestro diseo el contenido del archivo es:
De modo genrico a continuacin se incluye una lista de todas las entradas y salidas preconectadas
en la FPGA del Basys2, de inters para nuestros posibles diseos, en esta lista se omiten algunas
seales relacionadas con la alimentacin, memorias y trasmisin de datos:
# Asignaciones de pines del bloque de Displays

# Connected to Basys2 onBoard 7seg display


NET "seg<0>" LOC = "L14"; Signal name = CA
NET "seg<1>" LOC = "H12"; Signal name = CB
NET "seg<2>" LOC = "N14"; Signal name = CC
NET "seg<3>" LOC = "N11"; Signal name = CD
NET "seg<4>" LOC = "P12"; Signal name = CE
NET "seg<5>" LOC = "L13"; Signal name = CF
NET "seg<6>" LOC = "M12";Signal name = CG
NET "dp" LOC = "N13"; Signal name = DP
NET "an<3>" LOC = "K14"; Signal name = AN3
NET "an<2>" LOC = "M13"; Signal name = AN2
NET "an<1>" LOC = "J12"; Signal name = AN1
NET "an<0>" LOC = "F12"; Signal name = AN0
# Asignaciones de pines del bloque de leds
NET "Led<7>" LOC = "G1" ;Signal name = LD7
NET "Led<6>" LOC = "P4" ; Signal name = LD6
NET "Led<5>" LOC = "N4" ;Signal name = LD5
NET "Led<4>" LOC = "N5" ;Signal name = LD4
NET "Led<3>" LOC = "P6" ;Signal name = LD3
NET "Led<2>" LOC = "P7" ;Signal name = LD2
NET "Led<1>" LOC = "M11"; Signal name = LD1
NET "Led<0>" LOC = "M5" ; Signal name = LD0
# Asignaciones de pines del bloque de dipswuitches y pulsadores
NET "sw<7>" LOC = "N3"; Signal name = SW7
NET "sw<6>" LOC = "E2"; Signal name = SW6
NET "sw<5>" LOC = "F3"; Signal name = SW5
NET "sw<4>" LOC = "G3"; Signal name = SW4
NET "sw<3>" LOC = "B4"; Signal name = SW3
NET "sw<2>" LOC = "K3"; Signal name = SW2
NET "sw<1>" LOC = "L3"; Signal name = SW1
NET "sw<0>" LOC = "P11";Signal name = SW0
NET "btn<3>" LOC = "A7"; Signal name = BTN3
NET "btn<2>" LOC = "M4"; Signal name = BTN2
NET "btn<1>" LOC = "C11";Signal name = BTN1
NET "btn<0>" LOC = "G12";Signal name = BTN0
# Asignacin de pin del reloj de la tarjeta
NET "mclk" LOC = "B8"; # Bank = 0, Signal name = MCLK
Con la informacin anterior es requerido crear una nueva fuente del tipo implementation constraint
file, asignando un nombre a este archivo y la ubicacin o directorio del PC donde se va a guardar,
seleccionando para ello create new source en el men de proyecto y luego seleccionando la opcin
Implementation Constrain File, tal como se muestra:

Figura N17: Adicin de nueva fuente Implementation Constraint file

En nuestro ejemplo este archivo se denominara pines, para luego de pulsado next visualizar que se
apertura el resumen del archivo generado pines.ucf, pulsar finish.

Figura N18: Resumen de la adicin de la fuente implementation constraint file

Al realizar esto se abrir una ventana de edicin de texto donde se deben asociar las entradas y
salidas de nuestro programa A, B, C, D y X a las entradas y salidas fsicas respectivas, siguiendo la
siguiente sintaxis:
net "A" loc = "p11"; donde A es una entrada del programa ya realizado y p11 es un
pin fsico de la fpga en este caso sw0

net "B" loc = "l3"; donde A es una entrada del programa ya realizado y p11 es un
pin fsico de la fpga en este caso sw1
net "C" loc = "k3"; donde A es una entrada del programa ya realizado y p11 es un
pin fsico de la fpga en este caso sw2
net "D" loc = "b4"; donde A es una entrada del programa ya realizado y p11 es un
pin fsico de la fpga en este caso sw3
net "X" loc = "m5"; donde A es una entrada del programa ya realizado y p11 es un
pin fsico de la fpga en este caso led0
Paso 8: Para programar la tarjeta, puede programarse desde dos diferentes puertos, el puerto JTAG o
un puerto mini-USB, el programa puede enviarse directamente al FPGA o a una FLASH, para que el
FPGA cargue el programa automticamente, despus de que es alimentada la tarjeta. En la figura
siguiente se observa como en realidad es slo por el puerto JTAG por el que se tiene acceso al
FPGA y a la Flash. La salida del manejador USB va dirigida hacia el puerto JTAG.

Figura N19: Conexin de programacin de la FPGA Spartan 3E


En este caso se utilizar un cable USB, para ello se utilizar una suite de descarga denominada
Adept, proporcionada por Digilent. Para utilizarlo ubicar el adept en los archivos de programas y
ejecutarlo:

Figura N20: Ubicacin del programa Diligent Suit Adept


Una vez conectado el sistema Basys2 en el puerto USB de la PC, al ejecutar la utilidad Adept se
deber desplegar la siguiente pantalla, donde se observa que el sistema reconoci el dispositivo
conectado y se encuentra en lnea, sin esto no ocurre no se puede continuar con el proceso de
grabacin de la FPGA; tal como se observa en la figura:

Figura N21: Pantalla de Inicio del programa Adept de diligent


Una vez que se encuentra conectado el dispositivo FPGA y en lnea debe escogerse con el navegador
del programa a descargar en el mismo, para ello haciendo clic en este accesamos a la direccin de
trabajo del proyecto generado y buscamos el archivo ejemplo1.BIT generado en el paso 7.
Realizado lo anterior hacer clic en grabar y se visualizara el desplazamiento de una barra de carga de
programa al dispositivo en la parte baja de la pantalla del Adept, finalizada la grabacin el sistema
Basys2 esta listo para ser probado. Tal como se observa:

Figura N22: rea 1 Pantalla de programacin de archivo .BIT


Paso 9: Para probar el sistema Basys2 con la aplicacin cargada, se acta sobre los switches del
mismo cambiando sus posiciones (asignado valor 0 o 1 en funcin de la posicin a las entradas
A,B,C y D), y observando en el led0 lo que ocurre para cada caso, para ello se colocan una figuras
que indican en funcin de la seleccin (valor de C y D) y en funcin de los valores de las entradas A
y B la salida X en el led0 conforme al comportamiento de la compuerta a la cual representa, sea and,
or, exor o exnor, respectivamente:

Finalmente probando el diseo, especficamente la opcin C=0 y D=0, que relaciona las seales A y
B a travs de una funcin lgica AND, tenemos:

Para D=0,C=0;A=0;B=0

Para D=0,C=0;A=1;B=0

Se observa X=0 o led0 apagado


Para D=0,C=0;A=0;B=0

Se observa X=0 o led0 apagado


Para D=0,C=0;A=0;B=0

Se observa X=0 o led0 apagado


Se observa X=1 o led0 Encendido
Figura N23: Imgenes de la comprobacin

EJERCICIOS
1. Liste un programa que permita generar un mdulo de VHDL como la figura donde se
comparen dos nmeros de 4 BITS y coloque en la salida C el mayor:

---------------------------------------------------------------------------------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity componente1 is
Port ( A : in STD_LOGIC_VECTOR (3 downto 0);
B : in STD_LOGIC_VECTOR (3 downto 0);
C : OUT STD_LOGIC_VECTOR (3 downto 0));
end componente1;
---------------------------------------------------------------------------------architecture Behavioral of componente1 is
Begin
process (A,B)
Begin
if A>B then
C <= A;
Else
C <= B;
end if;
end process;
end Behavioral;

2. Liste un programa que permita generar un mdulo de VHDL como la figura donde se
sumen las magnitudes de dos nmeros de 4 BITS Ay B de entrada

---------------------------------------------------------------------------------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
entity componente1 is
Port ( A : in STD_LOGIC_VECTOR (4 downto 0);
B : in STD_LOGIC_VECTOR (4 downto 0);
C : OUT STD_LOGIC_VECTOR (4 downto 0));
end componente1;
---------------------------------------------------------------------------------architecture Behavioral of componente1 is
Begin
C <= A + B;
end Behavioral;

S-ar putea să vă placă și