Professional Documents
Culture Documents
CIRCUITOS DIGITALES
UTILIZANDO VHDL
2001
SINTESIS Y DESCRIPCIÓN DE CIRCUITOS DIGITALES UTILIZANDO VHDL
A N T E C E D E N T E S
El presente trabajo considera los dispositivos
En los últimos diez años la industria lógicos programables, enfocándonos en los PLDs,
electrónica ha tenido una gran evolución en el CPLDs y FPGAs. Ya que el principal motivo por
desarrollo de sistemas digitales; desde el que debemos aprender a utilizar VHDL es el de
computadoras personales, sistemas de audio y diseñar circuitos lógicos utilizando este tipo de
vídeo hasta dispositivos de alta velocidad para las dispositivos. Se expondrán los estilos elementales
comunicaciones. Productos hechos con una alta de codificación, exponiendo las principales
tecnología que permite aumentar la funcionalidad, características de VHDL como lenguaje para
disminuir costos, mejorar el aprovechamiento de síntesis de circuitos. Finalmente se desarrolla la
la energía, así como una marcada tendencia hacia implementación de filtros digitales utilizando
la miniaturización. Esto ha sido posible gracias a FPGAs.
la implementación de herramientas de diseño
asistidos por computadora, conocidas como
herramientas CAD (Computer Aided Design),
aunque específicamente se hace uso de
herramientas EDA (Electronic Design
Automation), que es el nombre que se le da a
todas las herramientas CAD para el diseño de
sistemas electrónicos. Este software de diseño
electrónico que facilita a los ingenieros el
desarrollo de circuitos es cada vez mas sofisticado
y, además, contamos con computadoras cada vez
más veloces y de mayor capacidad de
procesamiento. Ambos, hardware y software,
constituyen actualmente herramientas muy
importantes que simplifican el trabajo de diseño
electrónico. Además de facilitar el trabajo, el uso
de herramientas EDA también aceleró los
procesos de diseño. Esta situación condujo a
adoptar nuevas metodologías para el diseño y
evaluación de los circuitos electrónicos. El uso de
las herramientas EDA junto con los dispositivos
lógicos programables, que pueden ser utilizados
en diferentes aplicaciones e inclusive
reprogramados, cambiaron bastante el concepto
de diseño de circuitos digitales.
VHDL es un lenguaje que se creó para el
diseño, modelado y documentación de circuitos
complejos. Actualmente se le utiliza para la
síntesis de circuitos digitales utilizando
dispositivos lógicos programables. Es así como
los dispositivos lógicos programables y VHDL,
Very High Speed Integrated Circuit (VHSIC)
Hardware Description Language, constituyen los
elementos fundamentales para estas nuevas
metodologías de diseño.
Í N D I C E
ANTECEDENTES i
3.3.2. VARIABLES 22
3.3.3. SEÑALES 22
3.3.4. ALIAS 22
3.4. TIPOS DE DATOS 22
3.4.1. TIPOS ESCALARES 22
3.4.2. TIPOS COMPUESTOS 25
3.4.3. SUBTIPOS 27
3.4.4. TIPOS PREDEFINIDOS EN VHDL 27
3.4.5. TIPOS NO SOPORTADOS EN VHDL PARA SÍNTESIS 27
3.5. OPERADORES 28
3.5.1. OPERADORES LÓGICOS 28
3.5.2. OPERADORES DE COMPARACIÓN 28
3.5.3. OPERADORES DE ADICIÓN 28
3.5.4. OPERADORES DE MULTIPLICACIÓN 29
3.5.5. OPERADORES MISCELÁNEOS 29
3.5.6. OPERADORES DE ASIGNACIÓN 29
3.5.7. OPERADORES DE ASOCIACIÓN 30
3.5.8. OPERADORES DE CORRIMIENTO 31
3.5.9. OPERACIONES CON VECTORES 31
3.6. ATRIBUTOS 32
3.7. ENTIDADES 32
3.7.1. GENÉRICOS 33
3.7.2. PUERTOS 33
3.7.3. MODOS 33
3.8. ARQUITECTURAS 34
3.9. DESCRIPCIONES DE FLUJO DE DATOS 34
3.9.1. INSTRUCCIONES CONCURRENTES 35
3.9.2. ESTRUCTURAS DE EJECUCIÓN CONCURRENTE 35
3.9.3. ALU 35
3.10. DESCRIPCIONES COMPORTAMENTALES 38
3.10.1. INSTRUCCIONES SECUENCIALES 38
3.10.2. PROCESOS 38
3.10.3. DIFERENCIAS ENTRE SEÑALES Y VARIABLES 39
3.10.4. ESTRUCTURAS DE EJECUCIÓN SECUENCIAL 40
3.11. DESCRIPCIONES ESTRUCTURALES 42
3.11.1. COMPONENTES 42
3.11.2. INSTANCIACIÓN DE COMPONENTES 43
3.11.3. SENTENCIAS DE GENERACIÓN 44
3.12. SUBPROGRAMAS 47
3.12.1. PROCEDIMIENTOS 47
3.12.2. FUNCIONES 47
3.12.3. LLAMADO A SUBPROGRAMAS 48
3.12.4. SOBRECARGA DE OPERADORES 50
3.13. LIBRERÍAS 50
3.13.1. SÍNTESIS DE LIBRERÍAS EN WARP 50
3.13.2. PAQUETES 52
CONCLUSIONES 95
BIBLIOGRAFÍA 97
I LENGUAJES DE
DESCRIPCIÓN DE
HARDWARE
PROGRAMACIÓN
V. Simulación funcional.
DEL
DISPOSITIVO Bajando al nivel de compuertas digitales se
no puede realizar una simulación funcional de las
mismas. Este tipo de simulación comprueba la
ELABORACIÓN
¿FUNCIONA? PRUEBAS AL DISEÑO
DEL PROTOTIPO operación de circuitos digitales a partir del
comportamiento lógico de sus elementos con el fin
si
de comprobar el funcionamiento en conjunto del
FINALIZA EL circuito mediante unos estímulos dados. Similar a
PROCESO DE
DISEÑO lo que se realiza en un laboratorio.
con estos lenguajes no eran siempre las más • Un circuito hecho mediante una descripción
optimas. en un HDL puede ser utilizado en cualquier
tipo de dispositivo programable capaz de
Además, los lenguajes de descripción de
soportar la densidad del diseño. Es decir, no es
hardware al formar parte de las herramientas EDA
necesario adecuar el circuito a cada
permiten el trabajo en equipo. Así, al estructurar el
dispositivo porque las herramientas de síntesis
desarrollo del proyecto, cada integrante del equipo
se encargan de ello.
de diseño puede trabajar en subproyectos antes de
integrar todas las partes del sistema. • Una descripción realizada en un HDL es más
fácil de leer y comprender que los netlist o
1.3.1 VENTAJAS DE LOS HDLS circuitos esquemáticos.
definiendo a este mediante un nombre y sus Una señal posee una fuente (driver) y uno más
conexiones que vienen siendo las entradas y destinos (receptores) y un tipo de dato que le
salidas del circuito. En tanto que la arquitectura, proporciona características de interconexión. Por
que es la vista interna, define el funcionamiento ejemplo, una señal que se define como tipo bit
del circuito. Después de definir las interfaces de la puede manejar los valores binarios ‘0’ y ‘1’
entidad, otras entidades pueden utilizar a la solamente, en tanto que una señal que se define
primera como un subcircuito, al mismo tiempo que como bit_vector puede manejar mas de una
todas están siendo desarrolladas, es decir, están posición binaria.
siendo detalladas en su funcionamiento. Este
La forma de diseñar circuitos en VHDL se
concepto de vistas externas e internas es propio de
divide en tres categorías de acuerdo a su
VHDL y permite segmentar un sistema en bloques.
complejidad: flujo de datos, comportamental, y
Así, una entidad es relativa a otras entidades a
estructural. Estos tres estilos de diseño se detallan
través de sus conexiones y comportamiento. Por lo
a continuación.
que es posible experimentar cada entidad con
diferentes arquitecturas sin necesidad de cambiar • FLUJO DE DATOS
el resto del diseño. Y obviamente cada entidad
puede ser reutilizada en otros sistemas aunque no En este estilo el diseño del circuito no es
hayan sido diseñadas específicamente para estos. complicado por lo que basta con describir como
fluyen los datos través de la entidad, de las
Un modelo de hardware de VHDL es mostrado entradas hacia las salidas. La operación del sistema
en la siguiente figura. está definida en términos de un conjunto de
transformaciones de datos expresadas como
instrucciones concurrentes.
• COMPORTAMENTAL
El diseño es un poco más complicado ya que
requiere de varias decisiones antes de definir los
datos de salida correctos. Por lo que se requiere de
una descripción algorítmica del funcionamiento
del circuito para facilitar el diseño del sistema. En
VHDL esto se obtiene expresando el
funcionamiento del diseño mediante una estructura
PROCESS la cual se compone de instrucciones
secuénciales.
Figura 1.2 Modelo de Hardware de VHDL
• ESTRUCTURAL
Una entidad en VHDL, que ya es todo un Una descripción estructural se utiliza en
diseño, posee una o más conexiones hacia los circuitos que requieren de más de una función,
sistemas que la rodean. Una entidad puede estar hablando en términos de hardware, para realizar la
compuesta de otras entidades, de procesos y por finalidad del sistema. Para ello segmentamos el
componentes, todos ellos trabajando sistema en subcircuitos o componentes para
concurrentemente. Cada entidad está definida por facilitar el diseño. Cada componente es
su arquitectura la cual se forma de instrucciones en caracterizado en particular ya sea utilizando una
VHDL, ya sean aritméticas, asignaciones a señales descripción de flujo de datos o comportamental. Y
o de simples instanciaciones de componentes. a la entidad donde se describen las interconexiones
Los PROCESS en VHDL son utilizados para de estos componentes recibe el nombre de
modelar tanto circuitos secuénciales como descripción estructural.
combinacionales utilizando un estilo de Lo que ha hecho que VHDL sea en un tiempo
descripción secuencial. Para interconectar procesos tan corto el lenguaje de descripción de hardware
distintos se utilizan SIGNALS que no son otra más utilizado por la industria electrónica, es su
cosa que simples cables. independencia con la metodología utilizada por
cada diseñador, su capacidad de descripción a
diferentes niveles de abstracción, y en definitiva la
una OR, o inclusive toda una función booleana que que son descritas en el mismo código, como por
involucra diferentes tipos de compuertas. Por lo ejemplo forzar a que un nodo no sea simplificado o
que el proceso de síntesis depende del dispositivo eliminado y pueda ser retenido a la salida de una
utilizado. Generalmente una misma función es macrocelda. Cuando se sintetiza para maximizar la
implementada de diferentes formas de acuerdo al frecuencia generalmente quedan funciones con
dispositivo que estemos utilizando y esto no varios términos e incluso hay términos que se
cambia la funcionalidad del diseño y será la repiten en las ecuaciones de los nodos de salida,
misma si se selecciona el componente adecuado a pero esto se hace para evitar la retroalimentación.
la complejidad del diseño. El proceso utilizado
para sintetizar un código en un CPLD es conocido V. Simulación del código sintetizado
como Fitting o ajuste y consiste en adaptar las Aún y cuando la simulación funcional se haya
ecuaciones booleanas en los diferentes bloques realizado con éxito, debemos volver a evaluar el
lógicos del dispositivo. Cuando se utiliza un FPGA circuito que realmente quedó sintetizado en el
el proceso empleado se le llama Place And Route dispositivo. Ya que las sustituciones de funciones,
y consiste en adecuar las ecuaciones a través de como el caso de la compuerta XOR, dependerán de
varias celdas lógicas. Aunque la finalidad es la las características del dispositivo utilizado. Y es
misma, la manera en que se sintetiza un código en posible que ciertas funciones se ejecuten en más
un CPLD es totalmente distinta a la síntesis de tiempo de los esperado y esto altere el
circuitos utilizando FPGAs. funcionamiento del resto del diseño. Simular el
Por otro lado la optimización en la conversión código sintetizado en el circuito permite verificar
del código VHDL a ecuaciones booleanas depende los retrasos de tiempo de un nodo a otro, evaluar la
de tres factores: máxima frecuencia de operación del circuito y
verificar que éste funcione adecuadamente. En
I. La descripción del circuito. dado caso que el código no pudiera ser sintetizado
II. Los recursos disponibles en el dispositivo podemos tratar de mejorar la descripción, es decir,
seleccionado. mejorar el diseño tratando de eliminar registros,
compuertas, buffers, etc., encontrar algún error en
III. Las directivas de síntesis seleccionadas por el la descripción, cambiar las directivas de síntesis o
diseñador. definitivamente seleccionar otro dispositivo.
La descripción es el punto más importante
VI. Programación del dispositivo
porque de esto dependen los otros dos. En la
descripción no solamente tenemos que “decir” Después de completar la descripción, la síntesis
como funciona el circuito, además, tenemos que y la simulación del circuito con éxito, el siguiente
describir en que “forma” debe de hacerlo. No es lo paso es generar el archivo que nos permite
mismo describir el diseño de un sumador de cuatro implementar físicamente nuestro diseño en un
bits utilizando cuatro módulos que realizan la dispositivo programable. Todos los programas de
suma basándose en propagación de bits de acarreo VHDL para síntesis generan un archivo con el que
entre estos, a describir un circuito que realice la podemos programar el dispositivo. Ya sea JEDEC,
suma de manera paralela sin utilizar JTAG, BITSTREAM, etc. de acuerdo al tipo
retroalimentaciones. Finalmente suman pero no lo dispositivo y fabricante.
hacen igual. Los recursos afectan la forma en que
son implementadas las ecuaciones lógicas en el
dispositivo. Por ejemplo, un contador de 4 bits con
borrado asíncrono no puede ser implementado en
un 16V8, porque el registro de la macrocelda de
salida del dispositivo no cuenta con esta
característica. Finalmente las directivas de
síntesis influyen directamente en el proceso de
cálculo de las ecuaciones que son implementadas
en el dispositivo. Algunas de estas directivas son:
asignación de pines, sintetizar para maximizar
velocidad, sintetizar para optimizar área, y algunas
II DISPOSITIVOS LÓGICOS
PROGRAMABLES
productos en las diferentes macroceldas del boque. familia MAX se colocan 4 productos por
El tamaño del bloque lógico es una medida de la macrocelda los cuales pueden ser compartidos con
capacidad del CPLD, ya que de esto depende el otras macroceldas. Cuando un producto puede ser
tamaño de la función booleana que pueda ser únicamente utilizado por una macrocelda se le
implementada dentro del bloque. Los bloques conoce como termino - producto dirigido, y
lógicos usualmente tienen de cuatro a veinte cuando estos pueden ser utilizados por otras
macroceldas. La cantidad de bloques lógicos que macroceldas se le llama termino - producto
puede poseer un CPLD depende de la familia y compartido. Mediante estos productos
fabricante del dispositivo. compartidos se mejora la utilización del
dispositivo, sin embargo, esto produce un retardo
adicional al tener que retroalimentar un producto
hacia otra macrocelda y con esto disminuye la
velocidad de trabajo del circuito. La forma en que
son distribuidos los productos repercute en la
flexibilidad que proporciona el dispositivo para el
diseñador. Además, que estos esquemas
proporcionan también flexibilidad para los
algoritmos del programa de síntesis que es el que
finalmente selecciona la mejor forma en que deben
ser distribuidas las ecuaciones lógicas en el
componente.
2.4 FPGA
La arquitectura de un FPGA (Field
Figura 2.8 Macrocelda de entrada en dispositivos Programmable Gate Array) consiste en arreglos de
de la familia FLASH 370 varias celdas lógicas las cuales se comunican unas
con otras mediante canales de conexión verticales
implementar funciones lógicas de varios términos las compuertas de la celda, por lo que este tipo de
con pocas celdas lógicas. El que el tamaño de la celdas no son precisamente las más indicadas para
celda sea grande no afecta la frecuencia máxima de desempeñar pequeñas funciones. La tecnología
trabajo porque estamos hablando de que existe un SRAM es utilizada por Altera, Lucent
gran numero de compuertas que pueden ser usadas Technologies, Atmel, Xilinx y otros. La tecnología
en la función paralelamente, siendo el mismo ANTIFUSE es utilizada por Cypress, Actel,
tiempo de retardo para todas. Sin embargo, cuando QuickLogic, y Xilinx. A continuación se muestran
las funciones son pequeñas en comparación con el algunas celdas lógicas de distintos fabricantes.
tamaño de la celda no es necesario utilizar todas
3.1 INTRODUCCIÓN A LA 1 1 1 1
DESCRIPCIÓN EN VHDL DE Utilizando cualquier técnica de simplificación
CIRCUITOS DIGITALES de ecuaciones obtenemos: z0 = s0’·x0+s0·x1. Y el
circuito quedaría como se muestra en la figura
En este capítulo se discutirán los elementos
3.2.
fundamentales de VHDL que son comúnmente
utilizados en síntesis de circuitos. Primero se
exponen el diseño de multiplexores y
comparadores con VHDL para hacer una
analogía con la metodología convencional de
diseño. Ya que es muy importante comprender
porque VHDL es un lenguaje para describir y no
para programar. Posteriormente se expondrán los
elementos básicos del lenguaje, tales como:
identificadores, objetos de datos, tipos de datos,
operadores y tipos de instrucciones.
Figura 3.2 Circuito del Multiplexor 2 a 1
3.1.1 MULTIPLEXORES
En VHDL podemos describir el circuito ya sea
Antes de examinar la descripción en VHDL de mediante la descripción completa de todas las
multiplexores, analizaremos el funcionamiento combinaciones de las entradas, utilizando la tabla
interno y la metodología tradicional de diseño simplificada de funcionamiento o si lo deseamos
utilizada en este tipo de circuitos para después es posible realizar la descripción compuerta por
realizar la descripción del circuito en VHDL. En compuerta del circuito. Al primer estilo se le
la figura 3.1 se describe externamente a un conoce como de flujo de datos y en este debemos
multiplexor y la tabla resume su funcionalidad. describir como fluyen los datos de entrada hacia
la salida. A continuación se muestra la
ENTRADA SALIDA descripción de flujo de datos del multiplexor con
x0 z0 VHDL utilizando la tabla completa de
x1 s0 z0
funcionamiento del mismo. Las palabras en
s0 0 x0 negritas son palabras reservadas en VHDL y los
comentarios comienzan con dos guiones (--).
1 x1
ENTITY multiplexor IS
Figura 3.1 Multiplexor 2 a 1 PORT (s0, x0, x1: IN bit;
z0: OUT bit);
La tabla de verdad completa sería la siguiente. END multiplexor;
ENTITY multiplexor IS
PORT (s0, x0, x1: IN bit;
z0: OUT bit);
END multiplexor;
3er_Modulo -- un identificador no
3.2 IDENTIFICADORES -- puede iniciar con un
-- dígito
Un identificador se define como un conjunto de
caracteres con el cual podemos representar _salida_x -- o con el carácter de
-- subrayado
diferentes elementos dentro de una descripción.
En VHDL un identificador está compuesto por M__24xmax -- no se permiten dos
una secuencia de uno o más caracteres -- caracteres de
alfabéticos, numéricos, o del carácter de -- subrayado seguidos
subrayado. Las condiciones que debe de seguir un My_design_ -- un identificador no
identificador son las siguientes: -- debe terminar con un
-- carácter de subrayado
• VHDL permite la utilización de las letras
mayúsculas (A.. Z), minúsculas (a.... z), Unidad& -- el caracter "&", no
-- es un carácter válido
dígitos (0...9), y el carácter de subrayado (_).
SIGNAL -- palabra reservada
• El primer carácter de un identificador debe
ser una letra.
3.3 OBJETOS DE DATOS
• El ultimo carácter de identificador no puede
ser el carácter de subrayado. Además, el Un objeto de datos en VHDL es un elemento
carácter de subrayado no puede aparecer dos que toma un valor de algún tipo de dato
o más veces consecutivas. determinado. Según sea este tipo de dato, el
objeto poseerá un conjunto de propiedades que se
• Mayúsculas y minúsculas son consideradas
le podrán aplicar, como las operaciones en las que
idénticas. Así, Signal_A, signal_a, y
el objeto puede ser usado. En VHDL los objetos
SIGNAL_A se refieren al mismo
de datos son generalmente de una de tres clases:
identificador.
constantes, variables o señales.
• Los comentarios en VHDL comienzan con
dos guiones consecutivos (--), y se extienden 3.3.1 CONSTANTES
hasta el final de la línea. Los comentarios
pueden aparecer en cualquier lugar dentro de Una constante es un elemento que puede tomar
una descripción en VHDL. un único valor de un tipo dado. A las constantes
se les debe asignar un valor en el momento de la
• VHDL define un grupo de palabras
declaración. Una vez que se le ha asignado algún
reservadas, llamadas "palabras clave"
valor, éste no puede ser cambiado dentro de la
(keywords), las cuales no pueden ser usadas
descripción del diseño. Las constantes pueden ser
como identificadores.
DECLARACIÓN DE SEÑALES
EJEMPLO
SIGNAL identificador: tipo [:=valor];
CONSTANT byte: integer := 8;
EJEMPLOS
3.3.2 VARIABLES
SIGNAL A, B: bit := '0'; -- el valor
Los objetos de datos de la clase variable son -- inicial es
similares a las constantes, con la diferencia que su -- opcional
valor puede ser modificado cuando sea necesario.
SIGNAL dato: bit_vector (7 DOWNTO 0);
Las variables en VHDL son similares a cualquier
tipo de variable de un lenguaje de programación
de alto nivel. A las variables también se les puede 3.3.4 ALIAS
asignar un valor inicial al momento de ser
Un ALIAS no es precisamente un objeto de
declaradas. Se utilizan únicamente en los
datos. La instrucción ALIAS permite que
procesos y subprogramas (funciones y
utilicemos un identificador diferente para hacer
procedimientos). Las variables generalmente se
referencia a un objeto de datos, o a parte de él, ya
utilizan como índices, principalmente en
existente. Este no es un objeto de datos nuevo,
instrucciones de bucle, o para tomar valores que
sino que nos permite manipular fragmentos del
permitan modelar componentes. Las variables no
objeto de datos original para facilitar la
representan conexiones o estados de memoria.
programación. Al modificar el ALIAS se
modifica el objeto de datos al que señala.
DECLARACIÓN DE VARIABLES
dato, los objetos de datos no pueden tomar o no se TYPE nombre IS ( valor [,valor...] );
les puede asignar un objeto de datos de otro tipo,
y no todas las operaciones se pueden utilizar con El orden en el que los valores son listados en la
los diferentes tipos de datos a menos que se declaración del tipo enumerado define el orden
utilicen las librerías adecuadas en las que estén léxico para ese tipo.
definidas funciones para la conversión de tipos.
Además, es posible que el usuario defina subtipos EJEMPLOS
y tipos compuestos, modificando los tipos
básicos, así como definir tipos particulares con a) En este ejemplo se define un tipo enumerado
combinaciones de los diferentes tipos. A llamado “arith”, y los posibles valores son add,
continuación se discutirán las dos categorías de sub, mul, y div.
tipos de datos más utilizadas en síntesis: escalares
TYPE arith IS (add, sub, mul, div);
y compuestos.
b) Ahora se define un tipo enumerado llamado
3.4.1 TIPOS ESCALARES “estados”, con 4 posibles valores: estado0,
estado1, estado2 y estado3.
Los tipos escalares tienen un orden especifico
lo cual permite que sean usados con diferentes TYPE estados IS ( estado0, estado1,
operadores. Existen cuatro clases de tipos estado2, estado3 );
escalares: enteros, reales o de punto flotante, Existen varios tipos de datos enumerados,
enumerados, y físicos. algunos predefinidos en los programas de síntesis,
• ENTERO para el lenguaje pero generalmente los siguientes
tipos enumerados son los más comúnmente
VHDL permite especificar la gama del entero utilizados para síntesis de circuitos.
(integer) de manera diferente. Sin embargo, la
gama debe extender desde por lo menos -(2^31-1) BOOLEAN
a +(2^31-1), o - 2147483648 a +2147483647. El tipo BOLEAN es un tipo enumerado con
Una señal o variable declarada como tipo entero y dos valores, FALSE y TRUE, donde FALSE <
que tenga que ser sintetizada en elementos TRUE. Las funciones lógicas y de comparación
lógicos, debe ser limitada con un rango. retornan siempre un valor booleano.
Cuando en una operación lógica o de
EJEMPLO comparación se utilza un tipo de dato no
VARIABLE n: integer RANGE -15 TO 15;
booleano, el bit por ejemplo, existen funciones de
conversión que permiten realizar dichas
operaciones con distintos tipos de datos. En el
• REAL
caso del bit se utiliza la siguiente función.
El rango de valores que puede tomar este tipo boolean_var := (bit_var = '1');
de dato se encuentra entre -1.038E38 a BIT
+1.038E38. El Real rara vez es usado en síntesis y
en la gran mayoría de las herramientas de El bit es un tipo enumerado que representa
software de VHDL para síntesis no es posible valores binarios: '0' y '1'. Las operaciones lógicas
utilizar este tipo de dato. en las participa este tipo de dato regresan valores
binarios mediante las siguiente función.
• ENUMERADOS IF (boolean_var) THEN
bit_var := '1';
Un tipo enumerado es un tipo de dato con un ELSE
grupo de posibles valores asignados por el bit_var := '0';
usuario. Los tipos enumerados se utilizan END IF;
principalmente en el diseño de maquinas de
estado.
DECLARACIÓN DE UN TIPO ENUMERADO
CHARACTER
TYPE color is (red, green, yellow, blue,
El tipo character es un tipo enumerado que violet);
TYPE primary_color IS (red, yellow, blue);
contiene el conjunto de los símbolos contenido
en el ASCII. . . .
SIGNAL A: color;
STD_LOGIC SIGNAL B: primary_color;
SIGNAL C: bit;
El tipo std_logic es similar al tipo bit pero con SINAL D: std_logic;
la excepción que éste no esta definido dentro del
lenguaje. El paquete std_logic_1164 de la IEEE . . .
define al std_logic como un tipo de dato el cual
A <= color'(red); -- Se indica a que
puede tomar los valores 'U', 'X', '0', '1', 'Z', 'W', 'L', -- tipo estamos
'H', '-'. Para poder utilizar este tipo de dato es -- haciendo
necesario incluir el paquete dentro de la -- referencia
descripción utilizando las siguientes dos líneas B <= blue; -- Posiblemente el
antes de la declaración de la entidad. -- programa de síntesis
-- marque error en este
LIBRARY ieee; -- caso
USE ieee.std_logic_1164.ALL;
C <= '1'; -- En estas dos
-- asignaciones el
El significado de los valores del std_logic se D <= '1'; -- programa de síntesis
muestra en la siguiente tabla. -- identifica de que
-- tipo se trata
UNITS
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
END UNITS;
Los únicos subtipos predefinidos son el natural 3.4.5 TIPOS NO SOPORTADOS EN VHDL
y el positive. PARA SÍNTESIS
3.4.4 TIPOS PREDEFINIDOS EN VHDL Algunos tipos no son muy utilizados aunque
existen dentro del lenguaje, como el characer o el
Dentro del estándar VHDL de la IEEE se string, y hay otros que no son soportados por las
describen dos paquetes en los que se especifica el herramientas de síntesis. Los tipos no soportados
conjunto de tipos de datos y operaciones en las son ignorados y por lo tanto no pueden ser
que dichos tipos de datos pueden ser utilizados, sintetizados. Cada herramienta de síntesis define
estos paquetes son: STANDARD y TEXTIO. cuales son los tipos, objetos o estructuras de
lenguaje que son o no soportados por la misma, a
El paquete STANDAR de tipos de datos esta continuación se muestran lo tipos y objetos no
incluido en todos archivos fuente de VHDL, es soportados por el FOUNDATION.
decir, que no es necesario declararlo dentro de
código para poder utilizarlo. El paquete TEXTIO - Tipos físicos
define tipos de datos y operaciones para estos - Tipos reales o flotantes.
tipos para la comunicación con el software de
síntesis que se este utilizando. Este no es - Objetos de datos ACCESS. Un ACCESS
necesario para la síntesis de circuitos y algunos equivale a un apuntador y no es soportado por que
programas de síntesis no lo soportan. De hecho, el no tiene ningún sentido en hardware.
FOR n IN 0 TO 5 LOOP
SIGNAL conteo: integer RANGE 0 TO 255; i := i + r**n;
SIGNAL x, y, z: signed( 7 downto 0); END LOOP;
SIGNAL r, m: signed( 8 downto 0);
DESPLAZAMIENTOS ARITMÉTICOS SLA Y SRA Además del paquete que es el más utilizado por
la mayoría de los paquetes de síntesis.
También desplazan los bits de un vector n
veces a la izquierda (SLA) o a la derecha (SRA), - std_logic_1164
introduciendo ceros en los lugares que quedan Todos estos paquetes son los más conocidos y
libres, pero conservan el signo. utilizados para síntesis de circuitos, por lo que
para poder utilizarlos primero debemos de incluir
ROTACIONES ROL Y ROR la librería en que fueron compilados para
posteriormente hacer referencia al paquete que
Se desplazan los bits de un vector n veces a la deseamos utilizar (una librería puede tener más de
izquierda (ROL) o a la derecha (ROR), un paquete) como se muestra a continuación.
introduciendo los bits que son desplazados en los
lugares que van quedando libres.
EJEMPLO
EJEMPLO
EJEMPLOS
IF ( clk'event and clk = '1' ) THEN
A <= '1' ; TYPE secuencia IS integer RANGE 0 TO 10;
END IF; SIGNAL conteo: secuencia;
· · ·
conteo'left = 0
En el ejemplo anterior se utiliza el atributo conteo'rigth = 10
'event, indicado en color verde, para detectar una conteo'lenght = 11
conteo'high = 10
transición en la señal clk, y al mismo tiempo conteo'low = 0
comprobamos si esta transición fue positiva. Si
ambas condiciones se cumplen entonces se asigna
un '1' lógico a "A". El atributo 'event se utiliza 3.7 ENTIDADES
solo para señales de clk ya que de otra manera no
es posible sintetizar una transición en un Una entidad es la abstracción de un circuito, ya
dispositivo lógico programable, por lo que sea desde un complejo sistema electrónico hasta
también debemos indicar que tipo de transición una simple compuerta lógica. La entidad
estamos utilizando. únicamente describe la forma externa del circuito,
Existen más atributos y a continuación se aquí se enumeran las entradas y salidas del
mencionan algunos que son útiles en diseño. Una entidad es análoga a un símbolo
descripciones para síntesis. esquemático de los diagramas electrónicos, el
cual describe las conexiones del dispositivo hacia
el resto del diseño.
3.8 ARQUITECTURAS
EJEMPLO
Los pares de entidades y arquitecturas se
utilizan para representar la descripción completa ENTITY mux_4_1 IS
de un diseño. Una arquitectura, describe el PORT ( a, b, c, d: IN bit;
mux_signal: IN bit_vector(1 DOWNTO 0);
funcionamiento de la entidad a la que hace x: OUT bit );
referencia. Si una entidad la asociamos con una END mux_4_1;
"caja" en la que se enumeran las interfaces de
ARCHITECTURE a_mux_4_1 OF mux_4_1 IS
conexión hacia el exterior, entonces la BEGIN
arquitectura representa la estructura interna de esa x <= a WHEN mux_signal = "00" ELSE
caja. Por ejemplo, el símbolo esquemático de un b WHEN mux_signal = "01" ELSE
74LS04 representaría la entidad del diseño, y la c WHEN mux_signal = "10" ELSE
d WHEN mux_signal = "11";
forma en que las compuertas son conectadas END a_mux_4_1;
internamente corresponden a la arquitectura del
circuito, y así ambos describen completamente el Una arquitectura describe el comportamiento,
circuito. estructura o flujo de datos de la entidad a la que
hace referencia. Una entidad puede tener más de
una arquitectura, pero cuando se compile se
indica cual es la arquitectura que queremos
utilizar. Para describir el funcionamiento de la
entidad se puede hacer uso de cualquiera de los
tres estilos siguientes:
DECLARACIÓN DE ARQUITECTURA
3.9 DESCRIPCIONES DE FLUJO
ARCHITECTURE identificador OF entidad IS DE DATOS
-- declaraciones de la arquitectura
BEGIN Una descripción de flujo de datos consiste en
-- Código de Descripción
-- instrucciones concurrentes especificar como los datos son transferidos de las
-- ecuaciones booleanas entradas a las salidas. Cabe mencionar que
-- PROCESS algunos autores distinguen las descripciones de
-- instrucciones secuenciales flujo de datos de las comportamentales, en tanto
END identificador_arquitectura;
que para otros ambos estilos son del tipo
comportamental. La principal diferencia entre
Antes del BEGIN se escriben todas las
estas es el tipo de instrucciones que utilizan,
declaraciones que se necesiten dentro de la
además que en un estilo comportamental se utiliza
descripción, tales como: señales, constantes,
el bloque PROCESS en tanto que en el estilo en
funciones, alias, componentes, tipos de datos etc.
cuestión no se utiliza.
Después del BEGIN es donde se realiza todo el
código de descripción del circuito.
or_op <= x OR y;
Completed Successfully
------------------------------------------
------------------------------------------
PIN – OUT
------------------------------------------
Messages:
Information: Checking for duplicate NODE
logic.
None.
3.10 DESCRIPCIONES
COMPORTAMENTALES La lista sensible define cuales señales provocan
que las instrucciones dentro del bloque comiencen
Las descripciones comportamentales son a ser ejecutadas. Los cambios en alguna de las
similares a un lenguaje de programación de alto señales provocan que el proceso sea llamado. Un
nivel, por su alto nivel de abstracción. Mas que proceso que no tenga lista sensible debe utilizar
especificar la estructura o la forma en que se una instrucción WAIT para especificar cuando
deben conectar los componentes de un diseño, nos deben ser ejecutadas las instrucciones dentro del
limitamos a describir su comportamiento. Una bloque. La mayoría de las herramientas de síntesis
descripción comportamental consiste de una serie tienen problemas si las lista sensible no está
de instrucciones, que ejecutadas secuencialmente, completamente especificada. Estas consideran
modelan el comportamiento del circuito. La que mediante el proceso estamos modelando
ventaja de una descripción comportamental es que lógica combinacional o secuencial. La lista
no necesitamos enfocarnos a un nivel de sensible es parcialmente declarada cuando alguna
compuerta para implementar un diseño. En de las señales que intervienen en lado derecho de
VHDL una descripción comportamental una ecuación o de alguna instrucción secuencial
necesariamente implica el uso de por lo menos un no es mencionada dentro de la lista. El que la lista
bloque PROCESS. no este completa generalmente produce que no
sea posible modelar totalmente la funcionalidad
3.10.1 INSTRUCCIONES SECUENCIALES del diseño y por lo tanto no es posible obtener las
ecuaciones durante el proceso de síntesis.
Las instrucciones secuenciales son aquellas que
son ejecutadas serialmente, una después de otra. El funcionamiento del proceso es similar a un
La mayoría de los lenguajes de programación, microprocesador que funciona únicamente con
como C o Pascal, utilizan este tipo de interrupciones. La señales dentro de la lista
instrucciones. En VHDL las instrucciones sensible hacen a su vez de entradas de
secuenciales son implementadas únicamente interrupción y las instrucciones secuenciales se
dentro del bloque PROCESS encuentran dentro de una rutina única de servicio
de interrupción. Cuando alguna de las señales de
la lista sensible cambia, provoca que el proceso
3.10.2 PROCESOS comience a funcionar y a ejecutar toda esta rutina
de ejecución secuencial con la particularidad de
Un proceso es el bloque básico concurrente de
que los que resulte de este procesamiento se
codificación secuencial. Contiene una serie de
asigne únicamente al final de la estructura. Por lo
instrucciones secuenciales que permiten modelar
que podemos manipular los valores de las señales
el comportamiento del circuito, sin embargo, el
y esto no implica que cambien con cada
bloque PROCESS equivale a una sola instrucción
asignación sino solamente hasta que se termina de
concurrente. Un proceso puede ser utilizado
ejecutar todo el proceso. Y como las asignaciones
dentro de cualquier arquitectura definiendo para si
a los nodos del circuito se hacen al final, entonces
mismo una región de declaraciones y otra para la
todo la estructura del proceso es similar a un
codificación secuencial, similar a una
dispositivo de ejecución secuencial, como un
arquitectura. La región de codificación puede
microprocesador, que forma parte del diseño. Esta
contener únicamente instrucciones secuenciales
comparación con un microprocesador no implica
(IF, CASE, FOR, etc.) en tanto que la región de
que siempre debamos especificar una señal de
declaraciones permite designar constantes,
reloj para el funcionamiento de la estructura, o
señales, tipos de datos o algún alias.
que únicamente nos permita modelar circuitos
secuenciales. De hecho, si suponemos que la
SINTAXIS frecuencia de trabajo de este "microprocesador"
es muy grande, entonces las instrucciones dentro
PROCESS ( lista sensible )
de la estructura se ejecutan tan rápido que
-- declaraciones
BEGIN prácticamente lo podríamos considerar
-- instrucciones secuenciales combinacional. Si alguna señal de reloj es
END PROCESS; especificada, entonces estamos limitando a que
las instrucciones dentro del proceso sean estado de las salidas depende únicamente de las
ejecutadas únicamente dentro de alguna transición entradas.
de esta señal, lo cual no permite describir
Cada instrucción será ejecutada en orden
circuitos secuenciales.
secuencial y cuando todas hallan sido ejecutadas,
EJEMPLO entonces se asigna el valor procesado a los nodos
que se vieron afectados durante el proceso. Una
A continuación se muestra el código de
vez que se terminó de ejecutar el proceso, éste se
descripción comportamental del comparador de la
mantendrá inactivo hasta que alguno dos
figura 3.10.
elementos de la lista sensible cambie.
ENTITY comparador IS Cuando se utilicen procesos se debe tener
PORT( x: IN bit_vector(3 DOWNTO 0);
y: IN bit_vector(3 DOWNTO 0);
cuidado de no olvidar alguna combinación posible
equals: OUT bit; de entradas y/o salidas retroalimentadas que tal
x_may_y: OUT bit; vez no estemos considerando o que no
x_men_y: OUT bit); necesitamos. En estos casos es recomendable
END comparador;
utilizar el tipo std_logic o, si son vectores, algún
ARCHITECTURE comparador OF comparador IS tipo que se base en este. Los valores '-' y 'Z' del
BEGIN std_logic son permitidos en síntesis siempre y
PROCESS(x, y) cuando se utilicen correctamente.
BEGIN
equals <= '0'; EJEMPLO
x_may_y <= '0';
x_men_y <= '0';
IF x = y THEN ARCHITECTURE simplifica OF entidad_x IS
equals <= '1'; SIGNAL y_tmp:std_logic_vector(1 DOWNTO 0);
END IF; BEGIN
IF x > y THEN PROCESS(s)
x_may_y <= '1', BEGIN
END IF; IF (s = 0) OR (s = 3) THEN
IF x < y THEN -- s es un vector del tipo unsigned
x_men_y <= '1'; y_tmp <= '1';
END IF; ELSIF s = 1 THEN
END PROCESS; y_tmp <= '0';
END comparador; ELSE
y_tmp <= '-';
END IF;
END PROCESS;
y <= y_tmp WHEN enable = '0' ELSE 'Z';
-- "y" y "y_tmp" son tipo std_logic
END simplifica;
3.11.1 COMPONENTES
Un componente representa a una entidad
declarada en un diseño o librería, la utilización de
componentes es útil en diseños jerárquicos como
se mostró en el ejemplo anterior. Para poder
utilizar una entidad que está dentro de otro
diseño, es necesario llamar la librería y el paquete
dentro del cual se encuentra esta entidad.
Figura 3.11 Descripciones Estructurales
LIBRARY mi_librería; DECLARACIÓN DE COMPONENTES
USE mi_libreria.compuertas.ALL;
La declaración de componentes se realiza
ENTITY structural IS dentro de paquetes o en la región declarativa de
PORT ( x, y: IN bit;
z: OUT bit); una arquitectura. Es preferible declarar
END structural; componentes dentro de los paquetes ya que estos
son reutilizables, y por esta razón sólo se verán
ARCHITECTURE estructural OF structural IS
SIGNAL nodo1: bit;
declaración de componentes dentro de paquetes y
SIGNAL nodo2: bit; no en arquitecturas, aunque también sea posible.
SIGNAL nodo3: bit; A continuación se muestra la sintaxis de
SIGNAL nodo4: bit; declaración de componentes.
SIGNAL nodo5: bit;
BEGIN
U1: not_gate PORT MAP(x, nodo1); SINTAXIS
-- (entrada, salida)
COMPONENT identificador
U2: not_gate PORT MAP(y, nodo2) ;
PORT( senial { , senial}: modo tipo;
-- (entrada, salida)
senial { , senial}: modo tipo;
U3: and_gate PORT MAP(nodo1, y, nodo3); senial: { , senial}: modo tipo
);
-- (entrada, entrada, salida)
END COMPONENT;
U4: and_gate PORT MAP(nodo3, nodo2,
nodo4 ); EJEMPLO
U5: and_gate PORT MAP(nodo2, x, nodo5);
COMPONENT add
PORT ( a, b, ci: IN std_logic;
U6: or_gate PORT MAP(nodo4, nodo5, z);
suma, co: OUT std_logic);
-- (entrada, entrada, salida)
END COMPONENT;
END estructural;
DECLARACIÓN DE COMPONENTES CON
Esta descripción utiliza entidades descritas y GENÉRICOS
compiladas previamente dentro del paquete
COMPONENT identificador
"compuertas" de la librería "mi_librería". Una GENERICS( generico{ , generico }:
descripción estructural es similar a un netlist de [ modo ] tipo [ := valor ];
PSPICE. Se declaran los componentes que se · · ·
utilizan y después, mediante los nombres de los generico{ , generico }:
[ modo ] tipo [ := valor ]
nodos, se realizan las conexiones entre );
compuertas. PORT( senial { , senial}: modo tipo;
· · · DOWNTO 0);
senial: { , senial}: modo tipo SIGNAL data_out: std_logic_vector(7
); DOWNTO 0);
END COMPONENT; BEGIN
EJEMPLO reg_1: register8 PORT MAP (
clk => clock,
COMPONENT add_n rst => reset,
GENERICS(w: integer := 8); en => enable,
PORT(a, b: IN bit_vector(w-1 DOWNTO 0); data => data_in,
ci: IN bit; q => data_out
suma: OUT bit_vector(w-1 OWNTO 0 ); );
co: OUT std_logic
) ; END a_reg8 ;
END COMPONENT;
ASOCIACIÓN POR IDENTIFICADORES CON
GENÉRICOS
3.11.2 INSTANCIACIÓN DE COMPONENTES
etiqueta: identificador GENERIC MAP (
La instanciación de componentes es una identificador_generico => señal,
instrucción concurrente que especifica la identificador_generico => variable,
interconexión de las señales del componente identificador_generico => expresión,
identificador_generico => OPEN
dentro del diseño en el que está siendo utilizado. · · ·
Existen dos formas de hacer la instanciación de identificador_generico => señal
componentes: por asociación de identificadores o );
asociación por posición. PORT MAP(
puerto_componente => señal,
puerto_componente => variable,
ASOCIACIÓN POR IDENTIFICADORES puerto_componente => expresion,
puerto_componente => OPEN,
En este tipo de instanciación es necesario
utilizar el operador de asociación "=>" para · · ·
puerto_componente => señal
indicar como se conectan los puerto del );
componente con lo puertos o señales de la
arquitectura en la que está siendo utilizado dicho ASOCIACIÓN POR POSICIÓN
componente. Observe que en la asociación " a =>
b ", "a" pertenece al componente y "b" es una En la asociación por posición no es necesario
señal, variable o incluso una ecuación booleana nombrar los puertos del componente. Sólo se
en la que intervienen objetos de datos que colocan las señales, variables, o expresiones en el
pertenecen de la arquitectura donde se usa el lugar donde deseamos que sean conectadas. Es
componente. importante considerar el orden en el que fueron
declarados los puertos del componente porque
etiqueta: identificador PORT MAP( este orden es el debemos utilizar cuando se haga
puerto_componente => señal, la instanciación del componente.
puerto_componente => variable,
puerto_componente => expresion,
etiqueta: identificador PORT MAP (
puerto_componente => OPEN,
señal, variable, OPEN, señal,
variable, OPEN, ..., señal );
· · ·
puerto_componente => señal
); EJEMPLO
END a_reg8;
EJEMPLO
ENTITY converter IS
GENERIC(n: integer := 8);
PORT(clk, data: IN bit;
convert: BUFFER bit_vector(n-1
DOWNTO 0));
END converter;
ser señales o constantes. Además, cualquier que pueden utilizar los modos: IN, INOUT, o
variable declarada dentro de la función OUT. Los procedimientos son usados cuando se
existe solamente dentro de la función. desea actualizar o modificar algún dato. Un
ejemplo puede ser un procedimiento con un
DECLARACIÓN DE FUNCIONES
parámetro INOUT tipo bit_vector el cual invierte
FUNCTION identificador (lista de
los bits del vector.
parámetros) RETURN tipo;
Si por el contrario el subprograma es una
función, esta puede tener múltiples parámetros,
CUERPO DE LA FUNCIÓN todos del modo IN. Una vez que se ejecuta la
función, esta retorna un único valor. Este valor
FUNCTION identificador (lista de
parámetros) RETURN tipo IS debe ser especificado con un tipo determinado. Un
-- declaraciones ejemplo es la función ABS que regresa el valor
BEGIN absoluto del parámetro.
-- instrucciones secuenciales
END identificador ;
LLAMADO A PROCEDIMIENTOS
EJEMPLO El llamado a un procedimiento se invoca por su
nombre, y este utiliza los parámetros que le son
FUNCTION cuenta_unos(
vec1: std_logic_vector) listados.
RETURN integer IS
VARIABLE temp: integer := 0; SINTAXIS
BEGIN
FOR i IN vec1'low TO vec1'high LOOP identificador_procedimiento(
IF vec1 (i) = '1' THEN [ identificador => ] expresión
temp := temp + 1; { , [ identificador => ] expresión})
END IF; };
END LOOP;
RETURN temp; Cada expresión puede ser el identificador de una
END cuenta_unos;
señal, variable, o alguna operación. Al igual que en
la instanciación de componentes, la asociación de
3.12.3 LLAMADO A SUBPROGRAMAS los parámetros puede ser por el nombre o por
Como ya mencionamos un subprograma puede posiciones.
tener o no tener parámetro. Además, en la
declaración de un subprograma se define el EJEMPLO
nombre, modo, y tipo de dato para cada parámetro.
Cuando el subprograma es llamado, cada ENTITY proc_ejemplo IS
PORT(entA: INOUT bit_vector(1 DOWNTO 0);
parámetro recibe un valor. El valor que recibe el entB: INOUT bit_vector(1 DOWNTO 0);
parámetro (con su tipo correspondiente) puede ser entC: INOUT bit_vector(1 DOWNTO 0);
el resultado de una expresión, el valor de un sal0: INOUT bit_vector(1 DOWNTO 0);
variable, o de una señal. El modo en el que es sal1: INOUT bit_vector(1 DOWNTO 0));
END proc_ejemplo;
declarado el parámetro especifica la forma en que
puede ser utilizado, similar a los puertos en una ARCHITECTURE ejemplo OF proc_ejemplo IS
entidad. PROCEDURE procedimiento(
a: IN bit_vector(1 DOWNTO 0);
- IN: lectura. b: IN bit_vector(1 DOWNTO 0);
c: INOUT bit_vector(1 DOWNTO 0)) IS
- OUT: escritura. BEGIN
c := a AND b ; -- al no especificarse
- INOUT: lectura y escritura. -- como señales los parámetros INOUT
-- son variables por omisión
Un parámetro que es declarado en el modo OUT END;
o INOUT debe ser una variable o una señal, ya sea BEGIN
procedimiento(a =>( entA AND entC ),
para tipos simples como el bit, o arreglos como el
b => entB,
bit_vector. Cuando el subprograma es un c => sal0);
procedimiento, puede tener múltiples parámetros procedimiento(entA, entC, sal1) ;
END ejemplo;
EJEMPLO
El siguiente ejemplo muestra un procedimiento
local (declarado dentro de un proceso) llamado FUNCTION invert ( a : bit ) RETURN bit IS
BEGIN
SWAP el cual compara y ordena dos elementos de RETURN ( not a ) ;
un arreglo. El procedimiento es llamado varias END;
veces para acomodar todos los elementos del . . .
arreglo. PROCESS
VARIABLE v1, v2, v3: bit ;
BEGIN
PACKAGE data_types IS v1 := '1';
TYPE dat_element IS integer RANGE 0 TO 3; v2 := INVERT (v1) XOR 1 ;
TYPE data_array IS ARRAY (1 TO 3) OF v3 := INVERT ('0') ;
dat_element; END PROCESS;
END data_types;
INSTRUCCIÓN RETURN
USE work.data_types.ALL;
ENTITY sort IS La instrucción RETURN termina un
PORT(in_array: IN data_array; subprograma. Si el subprograma es una función es
out_array: OUT data_array); necesario utilizar la instrucción RETURN, en el
END sort;
ARCHITECTURE example OF sort IS caso de los procedimientos es opcional. La sintaxis
BEGIN es la siguiente.
PROCESS(in_array)
PROCEDURE swap(data: INOUT data_array; RETURN expresión; -- Funciones
low, high: IN integer) RETURN; -- Procedimientos
IS
VARIABLE temp: data_element;
BEGIN En una función la expresión proporciona el
IF (data(low) > data(high)) THEN valor de retorno de la función. Cada función debe
temp := data(low); de tener al menos una instrucción de retorno. El
data(low) := data(high);
data(high) := temp; tipo de datos que maneja la expresión de retorno
END IF; debe coincidir con el tipo de dato de retorno
END swap; declarado en la función.
VARIABLE my_array: data_array;
BEGIN
my_array := in_array; EJEMPLO
swap(my_array, 1, 2);
swap(my_array, 2, 3); PACKAGE ejemplo_return IS
swap(my_array, 1, 2); FUNCTION ejemplo_func (a, b, c: bit)
out_array <= my_array; RETURN bit;
END PROCESS;
END ejemplo_return;
END example;
PACKAGE BODY ejemplo_return IS
LLAMADO A FUNCIONES FUNCTION ejemplo_func (a, b, c: bit)
RETURN bit IS
Una función es llamada por su nombre y utiliza BEGIN
los parámetros que le son dados. Las funciones IF (c = '1') THEN
RETURN(a XOR b);
regresan un único valor. ELSE
RETURN NOT(a XOR b);
SINTAXIS END IF;
END ejemplo_func;
identificador_función ( END ejemplo_return;
[ identificador => ] expresión
{ , [ identificador => ] expresión}) LIBRARY ieee;
}; USE ieee.std_logic_1164.ALL;
USE work.ejemplo_return.ALL;
Al igual que en los procedimientos es posible -- la librería "work" es la librería del
-- presente proyecto
especificar los parámetros mediante asociación de
nombres, o asociación por posiciones ENTITY uso_funcion IS
PORT ( SIGNAL in1, in2, in3: IN bit;
SIGNAL valor_de_retorno: OUT bit);
END uso_funcion;
LIBRARY identificador_librería;
EJEMPLO
TYPE mi_bit IS ('0', '1', 'x') ;
-- tipo de datos definido por el usuario
RETURN tempo ;
END;
END swap ;
ENTITY swap_ent IS
PORT (x:IN bit_vector(3 DOWNTO 0);
y: OUT bit_vector(3 DOWNTO 0));
END swap_ent;
3.13.2 PAQUETES
4. – Después que agregaste la librería, para
incluirla basta con que escribas lo siguiente: Un paquete en VHDL es una colección de
declaraciones que pueden ser utilizadas por otras
descripciones en VHDL. Un paquete en VHDL
LIBRARY mi_libreria;
consiste de dos secciones: la declaración del
Una vez declarada en la descripción podrás paquete y el cuerpo del paquete.
utilizar todas las unidades de diseño que se hayan
compilado en la librería. Para incluir un paquete en otra descripción se
sigue la siguiente sintaxis:
El nombre de la librería de todo proyecto que
estés realizando es "work". Por lo que si deseas USE libreria.identificador_paquete.ALL ;
crear un paquete en particular en el proyecto
puedes incluirlo en cualquier unidad de diseño de De esta manera el paquete indicado es visible
la siguiente manera. para la unidad de diseño en la cual está siendo
utilizado. Mediante "ALL" indicamos que
USE work.identificador_paquete.ALL; deseamos incluir todas las declaraciones de
funciones, componentes, tipos de datos, subtipos
Donde identificador_paquete es el nombre del de datos, procedimientos, etc. que encuentren en
paquete que creaste en el mismo proyecto. dicho paquete.
IV DESCRIPCIÓN DE
CIRCUITOS
DIGITALES
PROCEDIMIENTO
1. Una vez en Windows haz click en el botón de
inicio, selecciona Programas > Warp R5.0 >
Galaxy.
Figura 4.1
Figura 4.3
library ieee;
Figura 4.6
en color azul porque es una palabra reservada. Esto 1. Una vez que se ha creado un nuevo proyecto
demuestra que haz hecho correctamente el en Galaxy, dentro del menú Project selecciona
procedimiento. Compiler Options.
Figura 4.7
Figura 4.10
VALOR
Con este tipo de estimulador asignamos un valor
constante a la señal especificada.
HOTKEY
Con este estimulador podemos estar cambiando
el valor de la señal presionando una tecla. Cuando
asignamos este tipo de estimulador es conveniente
asignar una lista de valores. Cada que presionemos
la tecla asignada, estaremos cambiando entre los
valores de esta lista.
Para una descripción más completa de las
Figura 4.12 características del simulador consulta la ayuda del
programa.
CLOCK
5. - CORRIENDO LA SIMULACIÓN
Sirve para definir señales de reloj definidas con
los siguientes parámetros: frecuencia, valor inicial, Para correr la simulación selecciona Simulation
ciclo de trabajo y tiempo de inicio. > Run. La simulación se detendrá después que la
duración especificada haya sido terminada. En este
CUSTOM
momento las señales de estimulación para los
Un estimulador personalizado se crea editando puertos de entrada pueden ser alterados y
los valores deseados en la ventana de simulación. producirán efectos sobre la simulación cuando esta
Estado en el modo de edición, al estimulador de continué. Para volver a iniciar la simulación
entrada se le puede asignar un estado bajo o un selecciona Simulation > Restart Simulation.
estado alto presionando '1' o '0' respectivamente.
6. - OBSERVANDO LA SIMULACIÓN
FORMULA
Varias propiedades pueden ser manipuladas
Un estimulador del tipo formula produce una para mejorar la apariencia de la simulación. A
señal definida por una simple sintaxis. La señal es continuación se describen brevemente algunas de
definida con secuencias pares de valor - tiempo. estas propiedades.
Con la componente tiempo indicamos el momento
BUS
en el que la señal asume el valor especificado. La
unidad del tiempo es en picosegundos. Para repetir La líneas individuales que forman un bus
durante un periodo especificado, se agrega el pueden ser mostradas y editadas. Para mostrarlas
modificador -r. La sintaxis del estimulador tipo haz clic sobre "+" que se encuentra a junto al
formula se muestra a continuación. nombre el bus. Las señales de estimulación pueden
ser asignadas a cada línea del bus o al bus
<valor> <tiempo> [,<valor> <tiempo>, completo.
<valor> <tiempo>, ...] [ -r <periodo>]
COLOR
EJEMPLO Las señales de la simulación pueden ser de
'0000' 0 ps, '1111' 100000 ps, '0011'
diferentes colores para una mejor claridad cuando
200000 ps -r 300000 varias señales son desplegadas. Para agregar color
a todas las señales visibles, selecciona Waveform >
PREDEFINIDOS Colorize Waveforms, esto asignará diferentes
colores, arbitrariamente a cada señal dentro de la
Los estimuladores predefinidos son una serie de ventana de simulación. Para asignar color a cada
señales tipo clock con diferentes frecuencias o señal, haz clic con el boton derecho sobre el
señales del tipo formula que pueden ser asignados nombre de la señal y selecciona la opción
a las señales. Para agregar un nuevo estimulador a Properties..
esta lista, lo puedes hacer en la misma ventana
dentro del cuadro Predefined.
descripción de flujo de datos, que es el mismo que a agregarlo al presente proyecto. Para agregarlo lo
se utilizó cuando se expuso el ejemplo en el tema hacemos desde el menú Project y dentro de éste
3.1.2. hacemos clic en Add Files... (Project > Add
Files...). Una vez que aparece la ventana para
TABLA DE FUNCIONAMIENTO agregar archivos al proyecto, seleccionamos el
archivo comprador_1.vhd y presionamos el botón
"Add".
ENTRADAS SALIDAS
Si por error hacemos clic en la opción Add All
x<y x_men_y '1' Files, todos los archivos .vhd dentro de la carpeta
x<y equals '0' del proyecto se agregaran al mismo. En este caso
el único archivo .vhd que debería estar dentro de la
x<y x_may_y '0'
carpeta del proyecto es comparador_1.vhd, lo cual
x=y x_men_y '0' en esta ocasión no nos afectará. En caso de que
hubiera más de un archivo .vhd y no deseamos
x=y equals '1'
tenerlo dentro del proyecto basta con seleccionarlo
x=y x_may_y '0' en la ventana de proyecto y presionar la tecla
suprimir, o también desde Project > Remove
x>y x_men_y '0'
Selected Source File(s). Si la ventana de proyecto
x>y equals '0' no está visible entonces seleccionamos View >
x>y x_may_y '1' Reset Docking Windows.
ENTITY comparador IS
PORT ( x: IN bit_vector(3 DOWNTO 0);
y: IN bit_vector(3 DOWNTO 0);
x_may_y: OUT bit;
equals: OUT bit;
x_men_y: OUT bit
);
END comparador;
muestra una lista completa de los errores así como las ecuaciones que resultaron durante el proceso de
una descripción de cada error. Para acceder síntesis, la asignación de pines, y un informe de
rápidamente a la línea en la cual ocurrió el error, utilización del dispositivo. En ocasiones es
basta con hacer doble clic sobre el error e complicado realizar algunas descripciones y,
inmediatamente el programa se colocará sobre la aunque el código se sintetiza, durante la
línea en donde se encuentra dicho error. Los simulación hace algo diferente a lo que
errores pueden ser algunos de los siguientes: omitir esperábamos. La función del sintetizador, en este
algún punto y coma, no escribir correctamente caso WARP, es la de interpretar nuestra
algún identificador, sintaxis incorrecta de las descripción en VHDL para generar la lógica de
instrucciones utilizadas, o uso incorrecto de los salida. En estos casos posiblemente la descripción
operadores. Recordemos que VHDL es un no corresponde exactamente a lo que queremos.
lenguaje en el que los tipos de datos son Para corregir la descripción es útil consultar las
sumamente importantes y no se pueden mezclar a ecuaciones, ya que en estas nos podemos dar
menos que se utilicen las librerías adecuadas. cuenta que es lo que estamos describiendo
realmente. En temas posteriores se presentan
8. La ventana de proyecto tiene 3 modos o
algunos ejemplos en los que se exponen con más
vistas: "Source Files View", "Hierarchy View", y
detalle este tipo de problemas.
"Output Files View". En la primera se muestran los
archivos que se han agregado al proyecto. La SIMULACIÓN
"Vista de Jerarquía" es útil cuando se hacen
9. Ahora que ya hemos logrado sintetizar el
diseños jerárquicos, ya que en esta se muestra cual
código y obtenido los archivos .jed y .vhd de
es el orden de importancia que hay entre ellos.
postsíntesis procedemos a simular la descripción.
Dentro de la "Vista de Archivos de Salida"
Las simulaciones las haremos en Active-HDL Sim
aparecen los archivos que se generaron durante la
como se explicó en tema 4.2. Podemos abrir el
compilación, los cuales fueron creados dentro de la
programa desde Galaxy desde Tools > Active-HDL
carpeta del proyecto. Tales archivos de salida son:
Sim.
.jed, .rpt y un .vhd que se encuentra dentro de la
carpeta "vhd" que está en la misma carpeta del
proyecto (ver tema 4.2).
Figura 4.17
Figura 4.16
Figura 4.21
Figura 4.20 Si deseas utilizar Run For cerciórate que el
tiempo de "paso" sea de 1 us. Ya que cuando
Ahora seleccionamos los puertos como se asignamos los estimuladores el valor de los buses
explicó en el tema 4.2. En este ejercicio de entrada cambia cada 1 us. Si deseas utilizar Run
seleccionaremos solamente los puertos declarados Until... bastara con especificar un tiempo de 32 us
en la entidad, tal y como se muestra en la figura para observar como se comporta el ciclo de
4.22 asignaciones que especificamos mediante la
12. Lo siguiente es asignar señales de estimulo a formula, el tiempo mínimo para comprobar todos
los puertos de entrada. Al bus "x" le asignaremos los valores (por lo menos un ciclo) es de 16 us.
un estimulador tipo formula usando la siguiente 15. A continuación en la figura 4.23 se muestran
formula. los resultados de la simulación. Si seguiste
correctamente todos los pasos deberías obtener
0000 0 ns, 0001 1 us, 0010 2 us, 0011 3
us, 0100 4 us, 0101 5 us, 0110 6 us, 0111
algo similar a lo mostrado en la siguiente figura.
Figura 4.22
Figura 4.23
Figura 4.24
SIMULACIÓN
4.4.1 DESCRIPCIÓN DE FLUJO DE DATOS Para la simulación se sugiere que asignes un
estimulador tipo formula a los vectores de entrada,
LIBRARY ieee; y al vector "selec" le asignes un estimulador tipo
USE ieee.std_logic_1164.ALL;
"HOTKEY". Una vez que agregaste las señales a
LIBRARY cypress; la simulación, selecciona con el puntero el vector
USE cypress.std_arith.ALL ; "selec", después seleccionas Waveform >
ENTITY multiplexor IS
Stimulators..., cuando aparezca el cuadro de
PORT(a, b, c, d: IN std_logic_vector estimuladores selecciona "HOTKEY" dentro de
(3 DOWNTO 0); "Stimulator type", y en "Press new hotkey" escribe
selec: IN std_logic_vector la letra "s" o cualquier otra.
(1 DOWNTO 0);
salida: OUT std_logic_vector
(3 DOWNTO 0));
END multiplexor;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;
ENTITY multiplexor IS
Figura 4.26 PORT(a: std_logic_vector
(3 DOWNTO 0);
Ahora puedes correr la simulación poco a poco b: std_logic_vector
(3 DOWNTO 0);
utilizando Simulation > Run For, o presionando la
c: std_logic_vector
tecla "F5". Y cada que lo desees presionas la tecla (3 DOWNTO 0);
"s" para cambiar el valor del vector "selec". En la d: std_logic_vector
figura 4.24 se muestran los resultados de la (3 DOWNTO 0);
selec: std_logic_vector
simulación. (1 DOWNTO 0);
salida: OUT std_logic_vector
(3 DOWNTO 0));
A continuación se muestran las ecuaciones END multiplexor;
obtenidas utilizando el estilo de descripción de
flujo de datos. Estas ecuaciones deben ser las ARCHITECTURE behavorial OF multiplexor IS
mismas para cualquier estilo que utilicemos, ya BEGIN
PROCESS(selec, a, b, c, d)
que estamos describiendo el mismo multiplexor VARIABLE selec_int: integer;
sólo que de manera diferente y esto no implica que BEGIN
las ecuaciones vayan a ser distintas. Cuando selec_int := to_integer(selec);
compiles este multiplexor, en cualquiera de los tres CASE selec_int IS
WHEN 0 =>
estilos, consulta las ecuaciones dentro del archivo salida <= a ;
.rpt y verifica que sean iguales. WHEN 1 =>
salida <= b ;
WHEN 2 =>
salida <= c ;
WHEN 3 =>
salida <= d ;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END behavorial;
ENTITY full_adder IS
PORT(ci: IN std_logic;
a, b: IN std_logic;
sum: OUT std_logic;
co: OUT std_logic);
END full_adder;
que intervienen en las ecuaciones de "x" para que Esta directiva sólo puede ser aplicada a señales,
después el valor de "x" se incorpore a las para una explicación más detallada de esta y otras
ecuaciones del puerto "y". Por lo que el tiempo de directivas de síntesis consulta la ayuda del
retardo para el puerto "y" sería mayor. Sin programa (Help > Help Topics). Para diseño de
embargo, aunque lo mejor es que nuestro circuito circuitos aritméticos y no aritméticos que sean
funcione a mayor velocidad, en ocasiones grandes o complejos, lo mejor es hacer
necesitamos que el nodo quede en una macrocelda descripciones estructurales y utilizar las directivas
para que después se retroalimente hacia otras de síntesis cuando sea necesario.
ecuaciones. Ya sea por que lo necesitamos en el
diseño del circuito o por las limitaciones del
dispositivo programable. Es aquí donde las
4.6 REGISTROS
directivas de síntesis nos permiten controlar el Existen dos métodos para implementar lógica
proceso de síntesis. Observa el siguiente ejemplo registrada en VHDL: mediante instanciación de
en el que se muestra como utilizar la directiva registros (utilizando librerías de componentes) o
synthesis_off. utilizando procesos para realizar la descripción
ENTITY synthesis_off IS comportamental del registro.
PORT ( a, b, c: IN bit;
y: OUT bit); Por ejemplo, si se desea utilizar un registro D y
END synthesis_off;
un contador de 4 bits, basta con realizar la
ARCHITECTURE no_simplifica_nodo OF instanciación de dichos componentes después de
synthesis_off IS incluir los paquetes apropiados.
SIGNAL x: bit;
ATTRIBUTE synthesis_off OF x: SIGNAL IS
true; EJEMPLO
BEGIN
x <= a AND b; USE work.rtlpkg.ALL; -- paquetes de WARP
y <= x OR c; USE work.lpmpkg.ALL;
END no_simplifica_nodo; . . .
-- DSRFF: definido en rtlpkg
Las ecuaciones que resultan del proceso de d1: dsrff PORT MAP(d, s, r, clk, q ;
síntesis son las siguientes. -- Mcounter: definido en lpmpkg
c1: Mcounter GENERIC MAP (4)
/y = /c * /x PORT MAP (data, clk, one,
x = a * b one, one, count, zero, rst,
zero, zero, zero, zero zero,
zero, OPEN);
Ahora las ecuaciones tienen menos términos y
obligamos a que el nodo "x" quede en una
terminal, obligándolo a quedar en una macrocelda Otra forma de registrar elementos es incluir un
para que después se retroalimente. Para el circuito proceso que sea sensible a las transiciones de una
sumador de cuatro bits podemos utilizar esta señal de reloj o que espere una transición de reloj
directiva de la siguiente forma. utilizando la instrucción WAIT, de esta manera el
compilador asigna un registro a las señales
ARCHITECTURE structural OF sumador IS afectadas dentro del proceso. Existen 4 formas
SIGNAL c1, c2, c3: std_logic; básicas para describir registros, cada una de ellas
ATTRIBUTE synthesis_off OF c1, c2, c3: se explica a continuación.
SIGNAL IS true;
BEGIN
u1: full_adder PORT MAP (ci, a(0), b(0), PROCESS
sum(0), c1 ) ; BEGIN
u2: full_adder PORT MAP (c1, a(1), b(1), WAIT UNTIL clk = '1';
sum(1), c2 ) ; . . .
u3: full_adder PORT MAP (c2, a(2), b(2), END PROCESS;
sum(2), c3);
u4: full_adder PORT MAP (c3, a(3), b(3), Este proceso no tiene lista sensible, por lo que
sum(3), co);
END structural;
comienza con una instrucción WAIT. Las
instrucciones dentro del proceso se comenzarán a
ejecutar cuando exista una transición positiva de la
PROCESS(rst, clk)
A continuación se muestra una forma de realizar
BEGIN la descripción de un registro de 32 bits con "reset"
IF rst = '1' THEN asíncrono.
. . .
ELSIF(clk'event AND clk='1') THEN PROCESS(r, clk2)
. . . BEGIN
END IF; IF (r = '1') THEN
END PROCESS; q <= x"123DEABC" ;
ELSIF (clk2'event AND clk2='1') THEN
Este proceso es sensible a los cambios en la q <= d;
END IF;
señal de reloj "clk" y la señal de reinicio "rst", END PROCESS;
como es indicado en la lista sensible. Mediante
este método de descripción comportamental es Asumiendo que "q" y "d" son declarados como
posible registrar señales y además tener un "reset" señales o puertos de 32 bits, entonces este código
asíncrono. La primera instrucción checa primero el ejemplifica la implementación de un registro de 32
estado de la señal "rst". Las señales que son bits con d(i) como entrada, q(i) como salida, "clk2"
asignadas dentro de esta porción de la estructura como la señal de reloj, y "r" como la señal de
IF... THEN... ELSIF, se asume que son registradas "reset" asíncrono para algunos registros y también
asíncronamente con la señal de "reset" asignada, y como señal de "preset" asíncrono para otros. Esto
serán sintetizadas en registros con capacidad para significa que cuando se cumple la condición: r =
realizar dicha acción. Si la condición de "reset" no '1', la asignación q <= x"ABC123DE" provocará
se cumple, el resto de la instrucción IF... THEN... que algunos registros sean puestos en alto mientras
ELSIF, funciona como el proceso explicado que otros van a quedar en un estado de cero lógico.
anteriormente.
REGISTRO NO. 1
ARCHITECTURE areg2 OF reg2 IS
Elabore la descripción del registro utilizando un BEGIN
PROCESS(clk, reset, d)
22V10 y posteriormente trate de implementar la BEGIN
descripción en un 16V8, simule la descripción y IF clk'event AND clk = '1' THEN
obtenga sus conclusiones. IF reset = '0' THEN
q <= '0';
TABLA DE FUNCIONAMIENTO ELSE
q <= d;
END IF;
ENTRADAS SALIDAS END IF;
END PROCESS;
reset d clk q END areg2;
1 0 transición positiva 0
REGISTRO NO. 3
1 1 transición positiva 1
Elabore la descripción del siguiente registro
0 - - 0 utilizando un 22V10, simule la descripción y
obtenga sus conclusiones.
ENTITY reg1 IS
PORT(reset: IN bit; TABLA DE FUNCIONAMIENTO
d: IN bit;
clk: IN bit;
q: OUT bit); ENTRADAS SALIDAS
END reg1;
enable d clk q
ARCHITECTURE areg OF reg1 IS
BEGIN 1 0 transición positiva 0
PROCESS(clk, reset, d)
BEGIN 1 1 transición positiva 1
IF reset = '0' THEN
q <= '0'; 0 - - Z
ELSIF clk'event AND clk = '1' THEN
q <= d; LIBRARY ieee;
END IF; USE ieee.std_logic_1164.ALL;
END PROCESS;
END areg; ENTITY reg2 IS
PORT(enable: IN std_logic;
d: IN std_logic;
REGISTRO NO. 2 clk: IN std_logic;
q: OUT std_logic);
Elabore la descripción del registro utilizando un END reg2;
22V10 y posteriormente utilice un 16V8, simule la
descripción en ambos casos y obtenga sus ARCHITECTURE areg2 OF reg2 IS
conclusiones. SIGNAL q_tmp: std_logic;
BEGIN
TABLA DE FUNCIONAMIENTO
-- lógica registrada
ENTRADAS SALIDAS PROCESS(clk, reset, d)
BEGIN
reset d clk q IF clk'event AND clk = '1' THEN
q_tmp <= d;
1 0 transición positiva 0 END IF;
END IF;
1 1 transición positiva 1 END PROCESS;
END ldcnt;
1 0 transición positiva descendente
ARCHITECTURE arch_cnt_oe OF cnt_oe IS
SIGNAL count: std_logic_vector 0 - - 0
(7 DOWNTO 0);
BEGIN
PROCESS(clk, reset, count) ENITTY counter IS
BEGIN PORT(reset: IN bit;
IF reset = '0' THEN ud: IN bit;
count <= (OTHERS => '0'); clk: IN bit;
ELSIIF ( clk’event AND clk=’1’ ) THEN conteo: INOUT integer RANGE 0 TO 15
count <= count + 1; );
END IF; END counter;
END PROCESS;
count_io <= count WHEN oe = ’1’ ELSE ARCHITECTURE counter OF counter IS
(OTHERS => 'Z'); BEGIN
END arch_cnt_oe; PROCESS(reset,ud,clk)
BEGIN
IF reset = '1' THEN
Este diseño desempeña un contador ascendente conteo <= 0;
con reset asíncrono. Cuando se cumple la ELSIF (clk'event AND clk = '1') THEN
condición: reset = '0', se produce un reset IF ud = '1' THEN
asíncrono en el contador. Cuando esta condición conteo <= conteo + 1;
ELSE
no se satisface, la operación de conteo funciona conteo <= conteo - 1;
síncronamente con la señal de reloj "clk". Además, END IF;
independientemente de las señal de reset, el uso de END IF;
END counter;
los buffers de tres estados en los pines de I/O es
posible mediante el uso del puerto de entrada "oe".
Así, cuando se satisface la condición oe = '1', el CONTADOR NO. 2
conteo es conducido hacia los pines de salida. De
lo contrario presentarán alta impedancia en los ENTRADAS SALIDAS
pines del circuito. Conceptualmente, el código en
VHDL del contador se implementa de la siguiente reset up_down clk conteo
manera. 1 1 transición positiva ascendente
1 0 transición positiva descendente
0 - transición positiva 0
ENITTY counter IS
PORT(reset: IN bit;
ud: IN bit;
clk: IN bit;
Figura 4.32 conteo: INOUT integer RANGE 0 TO 15
);
A continuación se elabore la descripción en END counter;
VHDL para los siguientes contadores de cuatro ARCHITECTURE counter OF counter IS
bits de acuerdo a su tabla de funcionamiento y BEGIN
posteriormente realice las simulaciones. Elija el PROCESS(reset,ud,clk)
BEGIN
dispositivo que más convenga. IF (clk'event AND clk = '1') THEN
IF reset = '1' THEN
CONTADOR NO. 1 conteo <= 0;
ELSIF ud = '1' THEN
conteo <= conteo + 1;
ENTRADAS SALIDAS ELSE
conteo <= conteo - 1;
reset up_down clk conteo END IF;
END IF;
1 1 transición positiva ascendente END counter;
transición ascendente
1 1 1
positiva 0-9
El uso del reset garantiza un comportamiento funcionar. Por lo que el reset siempre debe ser
seguro del circuito. Esto asegura que la máquina implementado en una máquina de estados para
siempre comience en un estado conocido y válido asegurar un correcto funcionamiento. Se prefiere el
antes de la primera transición de reloj. Si no se uso de reset asíncrono sobre el síncrono porque un
utiliza el reset, no existe una forma de predecir el reset asíncrono no requiere ser implementado
valor inicial de los flip-flops del registro de estado mediante ecuaciones, minimizando la lógica
durante el encendido del dispositivo en el que se combinacional del circuito. A continuación se
implementa la máquina de estados. Además existe muestran las tres formas más comunes de codificar
la posibilidad de que la máquina comience en un los estados en una máquina, suponiendo que utiliza
estado no válido y entonces nunca comenzaría a ocho estados:
Cuando se implementa una máquina de estados eficiente y las herramientas de síntesis generan
en un FPGA se prefiere la codificación ONE circuitos con área optimizada y mejor desempeño.
HOT ENCODING porque estos dispositivos Aunque también es posible que el usuario asigne
cuentan con bastantes flip-flops y una máquina de los valores de los estado como mejor convenga.
estados codificada de esta manera es más
EJEMPLO
-- REGISTRO DE ESTADO
PROCESS(clk, inicio, next_state)
BEJÍN
IF inicio = '0' THEN
state <= S10; -- todo apagado
Figura 4.36 ELSIF clk'event AND clk = '1' THEN
state <= next_state;
END IF;
El ciclo de lavado es de la siguiente manera: END PROCES;
-- SIGUIENTE ESTADO
END state_machine;
V IMPLEMENTACIÓN DE
FILTROS DIGITALES
EN FPGA'S
5.4 METODOLOGÍA DE DISEÑO (retraso de una unidad), z -2 (dos unidades), etc. Por
PARA FILTROS DIGITALES lo que los filtros digitales pueden realizarse usando
los elementos correspondientes a las operaciones
El proceso de diseño de un filtro digital requiere de multiplicación, adición y almacenaje de datos
de los siguientes pasos. en el FPGA, utilizando alguna de las estructuras
para la realización de sistemas LTI. Una correcta
1) Establecer las especificaciones del filtro, elección de la estructura a implementar puede
como lo son: ancho de banda, atenuaciones, optimizar significativamente la eficacia del
ganancias, etc. sistema.
2) Determinar la función de transferencia que
cumpla las especificaciones. 5.6 DISEÑO DE UN FILTRO
PASA-BAJAS
3) Elaborar un diagrama a bloques con las
operaciones a realizar, el cual especifica en Un filtro pasa - bajas ideal es aquel que permite
hardware los elementos del circuito y sus pasar todas aquellas frecuencias que se encuentran
interconexiones. por debajo de una frecuencia de corte especificada
(fc), atenuando las que se encuentran por encima
5.5 IMPLEMENTACIÓN EN de esta. La siguiente ecuación en diferencias
FPGA'S corresponde a un filtro IIR pasa - bajas tipo
butteworth de orden 5, frecuencia de muestreo de
El almacenaje de un dato significa retrasar su 48.8 kHz y con una frecuencia de corte a 5 kHz:
uso una cantidad normalmente igual al periodo de
muestreo. Este retraso se representa mediante z -1
F U N C I Ó N D E T R A N SF E R E N C I A
1 .2
0 .8
|H(F)|
0 .6
0 .4
0 .2
0
1 2 3 4 5
10 10 10 10 10
F
1
<) H(F)
-1
-2
-3
1 2 3 4 5
10 10 10 10 10
F
La gráfica anterior sería la función de 0010, 0011, 0100, 0100, 0011, 0010, 0001, 1111,
transferencia ideal del filtro a implementar, pero 1111, 1111 )
en un sistema digital todo se trabaja en el sistema El diseño de la estructura FIR se realizo con
binario por lo que debemos convertir los VHDL para lo cual se describieron utilizando
coeficientes obtenidos a dicho sistema. Dicha once registros en una configuración FIFO para
conversión implica una cantidad considerable de realizar los retardos z-1 y cuyas salidas se
bits si es que se desea obtener la misma calidad. multiplican por el coeficiente respectivo. EL
Pero el utilizar más bits implica la utilización de dispositivo convertidor analógico - digital
mayor cantidad de recursos del FPGA, el cual en utilizado es el AK4520A el cual tiene una
el presente trabajo es un XC4010XLPC84. De longitud de palabra de 20 bits con salida en
hecho un multiplicador de 20 bits requiere del complemento a dos. Por lo que el filtrado se
65% de los recursos de este dispositivo, por lo realizo con once multiplicaciones de 20x4 y un
que se opto por implementar el filtro utilizando la acumulador de dichas operaciones. La
función de transferencia H(ω) del filtro anterior cuantización de los coeficientes afecta la
con las primeras once muestras de la respuesta al respuesta en frecuencia del sistema, a
impulso del sistema LTI y realizar el diseño del continuación se muestra la respuesta en
filtro utilizando la estructura FIR. Los frecuencia en magnitud del filtro con lo
coeficientes utilizados son los siguientes: b(n) = ( coeficientes cuantizados
1, 2, 3, 4, 4, 3, 2, 1, -1, -1, -1 ), los cuales cuando
se digitalizan utilizando el formato complemento
a dos quedan de la siguiente manera: bk = ( 0001,
.
FU N C IÓ N D E T R A N SFE R E N C IA
20
18
16
14
12
|H(F)|
10
0
1 2 3 4
10 10 10 10
F
Figura 5.4 Respuesta del filtro en magnitud utilizando los coeficientes cuantizados
end a_fir;
A continuación se muestra las salidas obtenidas de filtro se debe obtener aprox. 0.5 Vpp lo
la implementación del diseño, como señales de cual es necesario para poder decidir si el filtro está
prueba se utilizaron senoidales de 1 Vpp aprox. a bien diseñado.
diferentes frecuencias. A la frecuencia de corte del
V o (d b )
5
0
1 .0 0 E + 0 0 1 .0 0 E + 0 1 1 .0 0 E + 0 2 1 .0 0 E + 0 3 1 .0 0 E + 0 4
-5
-1 0
-1 5
-2 0
db
-2 5
-3 0
-3 5
-4 0
-4 5
F r e c u e n c ia (H z )
Frecuencia Vo (Volts) Vo
(Hertz) (db)
1.00E-00 1 0
1.03E+03 1.044 0.374009
2.02E+03 0.981 -0.166619
3.02E+03 0.818 -1.744933
5.00E+03 0.475 -6.466127
6.06E+03 0.281 -11.02587
7.09E+03 0.168 -15.49381
1.00E+04 0.01 -40
CONCLUSIONES
CONCLUSIONES
• Es posible verificar el funcionamiento del • FUNCIONALIDAD COMPLETA
sistema dentro del proceso de diseño sin La cual se apoya en el hecho de que
necesidad de implementar el circuito. cualquier función lógica se puede realizar
• Las simulaciones del diseño, antes de que éste mediante una suma de productos.
sea implementado mediante compuertas, • CELDAS DE FUNCIONES UNIVERSALES.
permiten probar la arquitectura del sistema
para tomar decisiones en cuanto a cambios en También denominadas generadores de
el diseño. funciones, son bloques lógicos configurados
para procesar cualquier función lógica,
• Las herramientas de síntesis tienen la similares en su funcionamiento a una
capacidad de convertir una descripción hecha memoria. En estas celdas se almacenan los
VHDL a compuertas lógicas y, además, datos de salida del circuito combinacional en
optimizar dicha descripción de acuerdo a la vez de implementar físicamente la ecuación
tecnología utilizada. booleana.
• Esta metodología elimina el antiguo método • En la descripción de circuitos con VHDL el
tedioso de diseño mediante compuertas, dispositivo utilizado es de vital importancia,
reduce el tiempo de diseño y la cantidad de ya que de este depende el proceso de síntesis
errores producidos por el armado del circuito. mediante el cual se obtiene la funcionalidad
• Las herramientas de síntesis pueden lógica implementada en el mismo.
transformar automáticamente un circuito • Lo que ha hecho que VHDL sea en un tiempo
obtenido mediante la síntesis de un código en tan corto el lenguaje de descripción de
VHDL, a un circuito pequeño y rápido. hardware más utilizado por la industria
Además, es posible aplicar ciertas electrónica, es su independencia con la
características al circuito dentro de la metodología utilizada por cada diseñador, su
descripción para afinar detalles (retardos, capacidad de descripción a diferentes niveles
simplificación de compuertas, etc.) en la de abstracción, y en definitiva la posibilidad
arquitectura del circuito y que estas de poder reutilizar en diferentes aplicaciones
características se obtengan en la síntesis de la un mismo código.
descripción.
• La clave para describir y sintetizar fácilmente
• Las descripciones en VHDL proporcionan circuitos digitales con VHDL es pensar en
documentación de la funcionalidad de un términos de compuertas y registros y no en
diseño independientemente de la tecnología función de variables y subrutinas.
utilizada.
• WARP y Foundation son herramientas de
• Un circuito hecho mediante una descripción síntesis que utilizan VHDL como su lenguaje
en VHDL puede ser utilizado en cualquier tipo de descripción de circuitos, cada uno con sus
de dispositivo programable capaz de soportar propias restricciones del lenguaje. Por lo que
la densidad del diseño. Es decir, no es es necesario consultar el manual de referencia
necesario adecuar el circuito a cada de cada herramienta para conocer dichas
dispositivo porque las herramientas de síntesis restricciones.
se encargan de ello.
• Al utilizar dispositivos programables, como
• Una descripción realizada en VHDL es más un FPGA, la función de transferencia de un
fácil de leer y comprender que los netlist o filtro puede ser transformada sin más
circuitos esquemáticos. modificaciones que la reprogramación del
• La fabricación de dispositivos de lógica dispositivo. Por lo que un simple diseño en
programable se basa en los siguientes dos hardware de un filtro digital puede
conceptos. implementar una gran variedad de filtros, sin
que esto implique modificaciones en el
circuito.
BIBLIOGRAFÍA
ADDISON WESLEY
1996 CYPRESS PROGRAMMABLE LOGIC DATA
BOOK
MCGRAW HILL
2ª EDICIÓN DIGITAL SIGNAL PROCCESING
JOHN G. PROAKIS,
EDITORIAL RA-MA
1999 DISCRETE-TIME SIGNAL PROCCESING
A. V. OPPENHEIM
1999 1989
1999 http://bugs.uv.es/dpt/atc/asignat
uras/ti/curso/curso.html
http://cseg.inaoep.mx/~ariasm/arqcomp/v
hdlweb/indexiz.htm
INTECTRA INC.
http://www.intectra.com/