Está en la página 1de 113

SÍNTESIS Y DESCRIPCIÓN DE

CIRCUITOS DIGITALES
UTILIZANDO VHDL

IEC FRANCISCO JAVIER TORRES VALLE

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.

IEC FRANCISCO JAVIER TORRES VALLE i


SINTESIS Y DESCRIPCIÓN DE CIRCUITOS DIGITALES UTILIZANDO VHDL

Í N D I C E

ANTECEDENTES i

1. LENGUAJES DE DESCRIPCIÓN DE HARDWARE 1


1.1. INTRODUCCIÓN. 2
1.2. EL CONCEPTO DE HERRAMIENTAS CAD-EDA. 2
1.3. LENGUAJES DE DESCRIPCIÓN DE HARDWARE. 4
1.3.1. VENTAJAS DE LOS HDLS 5
1.4. VHDL 5
1.5. METODOLOGÍA DE DISEÑO UTILIZANDO VHDL 6

2. DISPOSITIVOS LÓGICOS PROGRAMABLES 9


2.1. CONCEPTOS FUNDAMENTALES 10
2.2. DISPOSITIVOS LÓGICOS PROGRAMABLES 10
2.2.1. MATRIZ GENÉRICA PROGRAMABLE 10
2.3. COMPLEX PROGRAMMABLE LOGIC DEVICES 11
2.3.1. MATRIZ DE INTERCONEXIONES PROGRAMABLES 11
2.3.2. BLOQUES LÓGICOS 11
2.3.3. DISTRIBUCIÓN DE PRODUCTOS 12
2.3.4. MACROCELDAS 12
2.3.5. CELDA DE ENTRADA/SALIDA 13
2.4. FIELD PROGRAMMABLE LOGIC DEVICES 13
2.4.1. CELDAS LÓGICAS 14

3. SINTAXIS DEL LENGUAJE 17


3.1. INTRODUCCIÓN A LA DESCRIPCIÓN EN VHDL DE CIRCUITOS 18
DIGITALES
3.1.1. MULTIPLEXORES 18
3.1.2. COMPARADORES 19
3.1.3. EL ESTILO DE “PROGRAMACIÓN” EN VHDL 20
3.2. IDENTIFICADORES 21
3.3. OBJETOS DE DATOS 21
3.3.1. CONSTANTES 21

IEC FRANCISCO JAVIER TORRES VALLE ii


SINTESIS Y DESCRIPCIÓN DE CIRCUITOS DIGITALES UTILIZANDO VHDL

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

IEC FRANCISCO JAVIER TORRES VALLE iii


SINTESIS Y DESCRIPCIÓN DE CIRCUITOS DIGITALES UTILIZANDO VHDL

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

4. DESCRIPCIÓN DE CIRCUITOS DIGITALES 54


4.1. PROYECTOS EN WARP 5.0 55
4.2. SIMULACIÓN DE PROYECTOS 57
4.2.1. PROCESO DE SIMULACIÓN 57
4.3. COMPARADORES 60
4.4. MULTIPLEXORES 65
4.4.1. DESCRIPCIÓN DE FLUJO DE DATOS 65
4.4.2. DESCRIPCIÓN COMPORTAMENTAL 66
4.4.3. DESCRIPCIÓN ESTRUCTURAL 67
4.5. SUMADORES 68
4.5.1. SUMADOR TOTAL 68
4.5.2. SUMADOR DE CUATRO BITS 69
4.5.3. SYNTHESIS OFF 70
4.6. REGISTROS 71
4.7. CONTADORES 73
4.8. ALU DE CUATRO BITS 76
4.8.1. DESCRIPCIÓN ESTRUCTURAL 77
4.8.2. DESCRIPCIÓN COMPORTAMENTAL 78
4.9. MÁQUINAS DE ESTADO 79

5. IMPLEMENTACIÓN DE FILTROS DIGITALES EN FPGA'S 83


5.1. INTRODUCCIÓN 84
5.2. ANTECEDENTES 84

IEC FRANCISCO JAVIER TORRES VALLE iv


SINTESIS Y DESCRIPCIÓN DE CIRCUITOS DIGITALES UTILIZANDO VHDL

5.3. MARCO TEÓRICO 84


5.3.1. FILTROS FIR 84
5.3.2. FILTROS IIR 85
5.3.3. METODOLOGÍA DE DISEÑO PARA FILTROS DIGITALES 86
5.4. IMPLEMENTACIÓN EN FPGA'S 86
5.5. DISEÑO DE UN FILTRO PASA-BAJAS 86
5.6. RESULTADOS 93

CONCLUSIONES 95
BIBLIOGRAFÍA 97

IEC FRANCISCO JAVIER TORRES VALLE v


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

I LENGUAJES DE
DESCRIPCIÓN DE
HARDWARE

IEC FRANCISCO JAVIER TORRES VALLE 1


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

1.1 INTRODUCCIÓN perecieron por no disponer de soporte ni


mantenimiento adecuado.
A mediados de los años setenta se produce una
fuerte evolución en los procesos de fabricación de
los circuitos integrados, promoviendo el desarrollo
1.2 EL CONCEPTO DE
de circuitos digitales hasta la primera mitad de los HERRAMIENTAS CAD-EDA
años ochenta. En aquellas épocas el esfuerzo de
CAD son las siglas de Computer Aided Design,
diseño se concentraba en los niveles eléctricos para
o diseño asistido por computadora el cual
establecer características e interconexiones entre
constituye todo un proceso de trabajo utilizando
los componentes básicos al nivel de transistor. El
técnicas de análisis apoyadas en gráficos mediante
proceso de diseño era altamente manual y tan sólo
sofisticadas herramientas de software las cuales
se empleaban herramientas como PSPICE para
facilitan el estudio de los problemas asociados con
simular esquemas eléctricos con modelos
el diseño en cuestión. El concepto CAD se
previamente caracterizados a cada una de las
relaciona con el dibujo como parte importante en
distintas tecnologías. A medida que pasaban los
el proceso de diseño pero, además, el diseño de un
años, los procesos tecnológicos se hacían más y
circuito debe cumplir con los requerimientos
más complejos. Los problemas de integración iban
especificados por el equipo de diseño, por las
en aumento y los diseños eran cada vez más
normas de calidad existentes, los costos, etc. por lo
difíciles de depurar y de dar mantenimiento.
que las herramientas CAD intervienen en todas las
Inicialmente los circuitos MSI (Medium Scale
fases del diseño. Ya que no sólo son importantes
Integration) y LSI (Low Scale Integration) se
por acelerar el desarrollo del sistema al permitir
diseñaron mediante el desarrollo de prototipos
que varias personas puedan trabajar
basados en módulos simples. Cada uno de estos
simultáneamente en distintas etapas del diseño
módulos estaba formado por compuertas ya
sino que, además, es posible verificar el
probadas, pero este método poco a poco iba
funcionamiento del circuito mediante la
quedándose obsoleto conforme aumentaba la
simulación del sistema. Todo esto simplifica la
complejidad y tamaño de los circuitos. A finales de
tarea del equipo de diseño y conduce a la
los años setenta se constata el enorme desfase que
conclusión del prototipo en menos tiempo. EDA,
existía entre tecnología y diseño.
Electronic Design Automation, es el nombre que
La considerable dificultad que puede llegar a se le da a todas las herramientas de hardware y
tomar el fabricar un circuito de alta escala de software en el diseño de sistemas electrónicos.
integración, involucra riesgos y costos de diseño Porque no sólo el software es importante, también
desmesurados e imposibles de asumir por las lo es el hecho de que las computadoras cada día
empresas. Es entonces, cuando diversos grupos de son más veloces y de mayor capacidad de
investigadores empiezan a crear y desarrollar los procesamiento, lo cual influye en el proceso de
llamados “lenguajes de descripción de hardware”, diseño de circuitos electrónicos.
lenguajes en los que no fuera necesario
El diseño de hardware tiene un problema
caracterizar eléctricamente cada componente del
fundamental, que no existe en desarrollo de
circuito al nivel de transistor para así enfocarse
software. Este problema es el alto costo del ciclo
solamente en el funcionamiento lógico del sistema.
diseño desarrollo del prototipo pruebas
Empresas tales como IBM con su IDL, el TI-HDL
reinicio del ciclo, ya que el costo del prototipo
de Texas Instruments, ZEUS de General Electric,
generalmente suele ser bastante elevado. Se
etc., así como los primeros prototipos empleados
impone la necesidad de reducir este ciclo de diseño
en las universidades, empezaron a desarrollarse
para no incluir la fase de desarrollo del prototipo
buscando una solución a los problemas que
más que al final del proceso, evitando la repetición
presentaba el diseño de sistemas complejos. Sin
de varios prototipos que es lo que encarece el
embargo, estos lenguajes nunca alcanzaron el nivel
ciclo. Para ello se introduce la fase de simulación y
de difusión y consolidación necesarios por motivos
verificación de circuitos utilizando herramientas
distintos. Unos, los industriales, por ser propiedad
EDA, de tal forma que no sea necesario
de la empresa permanecieron encerrados en ellas y
implementar físicamente un prototipo para
no estuvieron disponibles para su estandarización y
comprobar el funcionamiento del circuito.
mayor difusión, en tanto que los universitarios

IEC FRANCISCO JAVIER TORRES VALLE 2


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

En el ciclo de diseño de circuitos, las A continuación se mencionan las principales


herramientas EDA están presentes en todas las características y finalidad de algunas herramientas
fases. Primero en la fase de generación del sistema EDA que intervienen en el diseño de circuitos.
que puede representarse mediante un diagrama
esquemático, a bloques o de flujo. I. Lenguajes de descripción de circuitos.
Se encuentran también en la fase de simulación Son lenguajes mediante los cuales es posible
y comprobación de circuitos, donde diferentes describir el funcionamiento y estructura de un
herramientas permiten verificar el funcionamiento circuito eléctrico o digital. La descripción puede
del sistema. Estas simulaciones pueden ser de ser mediante bloques donde se muestra la
eventos, funcionales, digitales o eléctricas, de arquitectura del diseño, o de comportamiento, es
acuerdo al nivel de simulación requerido. Después decir, se describe el funcionamiento del circuito en
están las herramientas EDA utilizadas en la vez de especificar los elementos de los que está
síntesis y programación de circuitos digitales en compuesto.
dispositivos lógicos programables. Existen,
además, las herramientas EDA orientadas a la II. Diagramas esquemáticos.
fabricación de circuitos. En el caso del diseño de Es la forma clásica de describir un diseño
hardware estas herramientas sirven para la electrónico y la más extendida ya que era la única
realización de PCBs (Printed Circuit Boards o usada antes de la aparición de las herramientas de
placas de circuito impreso), o para desarrollar EDA. La descripción está basada en un “plano”
circuitos integrados de aplicación especifica donde se muestran los diferentes componentes
conocidos como ASICs (Application Specific utilizados en el circuito.
Integrated Circuits). Este ciclo de diseño de
hardware se muestra en la figura 1.1. III. Grafos y diagramas de flujo.
Es posible describir un circuito o sistema
IDEA mediante diagramas de flujo, redes de Petri,
máquinas de estados, etc. En este caso sería una
descripción gráfica y además sería
DESCRIPCIÓN
comportamental, porque no es una descripción
SÍNTESIS
DEL CIRCUITO mediante componentes.

IV. Simulación de eventos.


SIMULACIÓN ANÁLISIS
FUNCIONAL TEMPORAL Estas herramientas se usan para la simulación de
circuitos a grandes rasgos. En esta simulación, los
componentes más importantes son elementos de
no
¿FUNCIONA? ¿FUNCIONA?
no alto nivel como discos duros, buses de
comunicaciones, memorias RAM etc.
si si

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.

VI. Simulación digital.


Figura 1.1 Flujo de diseño en el desarrollo de
sistemas electrónicos Esta simulación, también exclusiva de los
circuitos digitales, es como la anterior con la
diferencia de que se tienen en cuenta los retardos

IEC FRANCISCO JAVIER TORRES VALLE 3


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

de propagación de cada compuerta. Es una que el programa de síntesis genere (ensamble) un


simulación muy cercana al comportamiento real circuito que pueda ser implementado físicamente.
del circuito y prácticamente garantiza el
La forma más común de describir un circuito es
funcionamiento correcto del circuito en cuestión.
mediante la utilización de esquemas que son una
En las herramientas EDA este tipo de simulación
representación gráfica de lo que se pretende
se conoce como análisis temporal o timing.
realizar. Con la aparición de herramientas EDA
VII. Simulación eléctrica. cada vez más complejas, que integran en el mismo
marco de trabajo las herramientas de descripción,
Es la simulación de más bajo nivel donde las síntesis, simulación y realización; apareció la
respuestas del sistema se verifican al nivel de necesidad de disponer de un método de
transistor. Sirven tanto para circuitos analógicos descripción de circuitos que permitiera el
como digitales y su respuesta es prácticamente intercambio de información entre las diferentes
idéntica a la realidad ya que se prueban retardos de herramientas que componen el ciclo de diseño. En
tiempo, niveles de voltaje, disipación de potencia, principio se utilizó un lenguaje de descripción que
etc. permitía, mediante sentencias simples, describir
completamente un circuito. A estos lenguajes se
VIII. Diseño de PCBs les llamó Netlist puesto que eran simplemente eso,
Con estas herramientas es posible realizar el un conjunto de instrucciones que indicaban las
trazado de pistas para la fabricación de placas de interconexiones entre los componentes de un
circuitos impresos. diseño. A partir de estos lenguajes simples, que ya
eran auténticos lenguajes de descripción hardware,
IX. Diseño de circuitos integrados se descubrió el interés que podría tener el describir
Son herramientas EDA que sirven para la circuitos utilizando un lenguaje en vez de usar
realización de circuitos integrados. Las esquemas. Sin embargo, se siguieron utilizando
capacidades gráficas de estas herramientas esquemas puesto que desde el punto de vista del
permiten la realización de las diferentes máscaras ser humano son mucho más sencillos de entender,
que intervienen en la realización de éstos. aunque un lenguaje siempre permite una edición
más rápida y sencilla.
X. Diseño con dispositivos programables. Conforme las herramientas de diseño se
Estas herramientas facilitan la programación de volvieron más sofisticadas, y la posibilidad de
dispositivos, ya sean PALs, PLDs, CPLDs o desarrollar circuitos digitales mediante dispositivos
FPGAs. programables era más viable, apareció la necesidad
de poder describir los circuitos mediante un
lenguaje de alto nivel de abstracción. No desde un
1.3 LENGUAJES DE punto de vista estructural, sino desde el punto de
DESCRIPCIÓN DE vista funcional. Este nivel de abstracción se había
HARDWARE alcanzado ya con las herramientas de simulación,
ya que para poder simular partes de un sistema era
Los lenguajes de descripción de hardware necesario disponer de modelos que describieran el
(HDLs) son utilizados para describir la funcionamiento de bloques del circuito o de cada
arquitectura y comportamiento de un sistema componente si fuera necesario. Estos lenguajes
electrónico los cuales fueron desarrollados para estaban sobre todo orientados a la simulación, por
trabajar con diseños complejos. lo que poco importaba que el nivel de abstracción
Comparando un HDL con los lenguajes para el fuera tan alto que no fuera sencillo una realización
desarrollo de software vemos que en un lenguaje o síntesis a partir de dicho modelo. Con la
de este tipo un programa que se encuentra en un aparición de técnicas para la síntesis de circuitos a
lenguaje de alto nivel (VHDL) necesita ser partir de lenguajes de alto nivel de abstracción, se
ensamblado a código máquina (compuertas y comenzaron a utilizar los lenguajes de simulación
conexiones) para poder ser interpretado por el para sintetizar circuitos. Que si bien alcanzan un
procesador. De igual manera, el objetivo de un altísimo nivel de abstracción, su orientación era
HDL es describir un circuito mediante un conjunto básicamente la de simular, por lo que los
de instrucciones de alto nivel de abstracción para resultados de una síntesis a partir de descripciones

IEC FRANCISCO JAVIER TORRES VALLE 4


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

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.

Una metodología de diseño que utiliza un HDL


1.4 VHDL
posee varias ventajas sobre la metodología
tradicional de diseño a nivel compuerta. Algunas VHDL es un lenguaje de descripción de
de estas ventajas son listadas a continuación. hardware utilizado para describir circuitos en un
• Es posible verificar el funcionamiento del alto nivel de abstracción el cual está siendo
sistema dentro del proceso de diseño sin rápidamente aceptado como un medio estándar de
necesidad de implementar el circuito. diseño. VHDL es producto del programa Very
High Speed Integrated Circuit (VHSIC)
• Las simulaciones del diseño, antes de que éste desarrollado por el Departamento de Defensa de
sea implementado mediante compuertas, los Estados Unidos a finales de la década de los
permiten probar la arquitectura del sistema 70's. El propósito era hacer un estándar para
para tomar decisiones en cuanto a cambios en diseñar, modelar, y documentar circuitos
el diseño. complejos de tal manera que un diseño
desarrollado por una empresa pudiera ser
• Las herramientas de síntesis tienen la
entendido por otra y, además, pudiera ser
capacidad de convertir una descripción hecha
procesado por software con propósitos de
en un HDL, VHDL por ejemplo, a
simulación.
compuertas lógicas y, además, optimizar dicha
descripción de acuerdo a la tecnología VHDL es reconocido como un estándar de los
utilizada. lenguajes HDL por el Instituto de Ingenieros en
Electricidad y Electrónica – IEEE – como su
• Esta metodología elimina el antiguo método
estándar 1076 el cual fue ratificado en 1987, y por
tedioso de diseño mediante compuertas,
parte del Departamento de Defensa de los Estados
reduce el tiempo de diseño y la cantidad de
Unidos como el estándar MIL-STD-454L En 1993
errores producidos por el armado del circuito.
el estándar IEEE-1076 se actualizó y un estándar
• Las herramientas de síntesis pueden adicional, el IEEE-1164, fue adoptado. Para 1996
transformar automáticamente un circuito el estándar IEEE-1076.3 se convirtió en un
obtenido mediante la síntesis de un código en estándar de VHDL para síntesis siendo éste el que
algún HDL, a un circuito pequeño y rápido. se utiliza en el diseño de sistemas digitales. Los
Además, es posible aplicar ciertas estándares más utilizados en síntesis de circuitos
características al circuito dentro de la por la mayoría de las herramientas de diseño son el
descripción para afinar detalles (retardos, IEEE-1164 y el IEEE-1076.3. En la actualidad
simplificación de compuertas, etc.) en la VHDL es un estándar de la industria para la
arquitectura del circuito y que estas descripción, modelado y síntesis de circuitos
características se obtengan en la síntesis de la digitales. Por esto, los ingenieros de la mayoría de
descripción. las áreas de electrónica, si no es que todas, deben
aprender a programar en VHDL para incrementar
• Las descripciones en un HDL proporcionan su eficiencia.
documentación de la funcionalidad de un
diseño independientemente de la tecnología VHDL divide los circuitos en dos “vistas”
utilizada. entidades y arquitecturas. La entidad modela al
circuito, componente o sistema externamente

IEC FRANCISCO JAVIER TORRES VALLE 5


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

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

IEC FRANCISCO JAVIER TORRES VALLE 6


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

posibilidad de poder reutilizar en diferentes diagrama a bloques con la descripción del


aplicaciones un mismo código. funcionamiento de cada bloque, diagramas de
estado, o usar alguna tabla de funcionamiento
donde se resumen las funciones de cada bloque en
1.5 METODOLOGÍA DE DISEÑO particular. Obviamente existe la posibilidad de
UTILIZANDO VHDL cometer errores en VHDL, pero generalmente
estos son de son de sintaxis, como ";" al final de
I. Definición de los requerimientos del cada instrucción, o simplemente por no utilizar
sistema. adecuadamente alguna instrucción. Algunas
Antes de comenzar a realizar la descripción del ocasiones se podrán tener problemas al tratar de
diseño, es muy importante que se tenga una idea sintetizar el código y esto se debe a que se comete
clara de los objetivos y requerimientos. Tales el error de pensar en términos de programación en
como: funciones del circuito, máxima frecuencia vez de enfocarnos en la descripción del circuito.
de operación, y los puntos críticos del sistema. Cuando se utiliza VHDL el objetivo principal es
Esto servirá para poder definir a grandes rasgos el diseño de hardware y para ello debemos de
cual será la arquitectura del circuito y así comenzar utilizar técnicas de síntesis apropiadas al lenguaje,
a realizar la descripción. ya que se suele cometer el error de comenzar a
programar en vez de describir y esto provoca que
II. Descripción del circuito en VHDL.
nos olvidemos del objetivo que es el hardware.
Antes de comenzar a escribir el código es
recomendable seleccionar alguna metodología de LA CLAVE PARA DESCRIBIR Y SINTETIZAR
diseño como: Top-Down, Bottom-Up, o Flat. Los FÁCILMENTE CIRCUITOS DIGITALES CON
dos primeros involucran la creación de diseños VHDL ES PENSAR EN TÉRMINOS DE
jerárquicos que generalmente son grandes, y el COMPUERTAS Y REGISTROS Y NO EN
último es utilizado normalmente en el diseño de FUNCIÓN DE VARIABLES Y SUBRUTINAS
circuitos pequeños.
III. Simulación de la descripción en VHDL.
La metodología Top-Down consiste en dividir
el sistema en varios bloques de tal manera que se La simulación del código, o simulación
puedan resolver los problemas por separado, funcional, nos permite detectar y corregir errores
además, cada bloque a su vez se puede dividir en antes que se implemente en el dispositivo. La
otros bloques si es necesario. El objetivo es que modularidad implementada facilita la evaluación
cada bloque tenga una función especifica del circuito, porque al describir el circuito por
representada mediante un componente que bloques podemos analizar cada uno por separado
desempeñe dicha función. Bottom-Up es todo lo antes de unirlos. Esta simulación equivale a la
contrario, comenzamos por caracterizar los depuración de programas en los lenguajes de
componentes básicos del circuito y con estos computación.
formamos bloques de mayor tamaño que IV. Síntesis
representen un circuito más complejo que sus
partes individuales. La metodología Flat es Síntesis consiste en reducir una descripción
comúnmente utilizada para diseños pequeños, realizada en un lenguaje de alto nivel de
donde los requerimientos son pocos y no muy abstracción a un nivel de compuerta que pueda ser
complejos por lo que no nos distraen y no implementada en un circuito. Dicho de otra
perdemos de vista la funcionalidad del circuito. manera, síntesis es el proceso mediante el cual una
Este método de diseño es el que utilizamos descripción es convertida en un listado de
cotidianamente en el diseño de circuitos digitales, conexiones (netlist) entre las compuertas, registros,
y se le llama Flat por que no es necesario multiplexores, etc. de un dispositivo lógico
seccionar el circuito para poder diseñarlo. programable.
Después de decidir cual será la metodología que Por ejemplo, una compuerta XOR puede ser
debemos implementar entonces comenzamos a sustituido por su equivalente: A XOR B =
describir el circuito de acuerdo con lo que se había A'B+AB', o una instrucción IF puede ser en
establecido. Es recomendable utilizar algún tipo de algunas ocasiones una compuerta AND, en otras

IEC FRANCISCO JAVIER TORRES VALLE 7


CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE

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

IEC FRANCISCO JAVIER TORRES VALLE 8


CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES

II DISPOSITIVOS LÓGICOS
PROGRAMABLES

IEC FRANCISCO JAVIER TORRES VALLE 9


CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES

2.1 CONCEPTOS muestran los circuitos básicos para la mayoría de


FUNDAMENTALES los PLDs.

La fabricación de dispositivos de lógica


programable se basa en los siguientes dos
conceptos.
• FUNCIONALIDAD COMPLETA
La cual se fundamenta en el hecho de que
cualquier función lógica se puede realizar
mediante una suma de productos.
• CELDAS DE FUNCIONES UNIVERSALES.
También denominadas generadores de
funciones, son bloques lógicos configurados para
procesar cualquier función lógica, similares en su
funcionamiento a una memoria. En estas celdas se Figura 2.1 Estructuras comúnmente utilizadas en
almacenan los datos de salida del circuito PLDs
combinacional en vez de implementar físicamente
la ecuación booleana.
2.2.1 MATRIZ GENÉRICA PROGRAMABLE
2.2 DISPOSITIVOS LÓGICOS Una Matriz Genérica Programable, GAL
PROGRAMABLES (Generic Array Logic), es una denominación que
utilizaba originalmente Lattice Semiconductor y
Un dispositivo lógico programable, o PLD que más tarde se licenció a otros fabricantes. Un
(Programmable Logic Device), es un dispositivo GAL en su forma básica es un PLD con una matriz
cuyas características pueden ser modificadas y AND reprogramable, una matriz OR fija y una
almacenadas mediante programación. El lógica de salida programable mediante una
dispositivo programable más simple es el PAL macrocelda. Esta estructura permite implementar
(Programmable Array Logic). El circuito interno cualquier función lógica en forma de suma de
de un PAL consiste en una matriz de conexiones, productos con un numero de términos definido. En
un matriz de compuertas AND y un arreglo de los PLDs no reprogramables la síntesis de las
compuertas OR. Una matriz de conexiones es una ecuaciones lógicas se realiza mediante la quema de
red de conductores distribuidos en filas y columnas fusibles en cada punto de intersección de los pines
con un fusible en cada punto de intersección, de entrada con las compuertas. En un GAL el
mediante la cual se seleccionan cuales entradas del fusible se reemplaza por una celda CMOS
dispositivo serán conectadas al arreglo AND cuyas eléctricamente borrable (EECMOS) y mediante
salidas son conectadas al arreglo OR y de esta programación se activa o desactiva cada celda
manera obtener una función lógica en forma de EECMOS. Una celda activada conecta su
suma de productos. correspondiente intersección de fila y columna, y
La mayoría de los PLDs están formados por una una celda desactivada desconecta dicha
matriz de conexiones, una matriz de compuertas intersección. Con esta estructura se puede aplicar
AND, y una matriz de compuertas OR y algunos, cualquier combinación de variables de entrada, o
además, con registros. Las matrices pueden ser sus complementos, a una compuerta AND para
fijas o programables. Con estos recursos se generar cualquier operación producto que se desee.
implementan las funciones lógicas deseadas A continuación se muestran las estructuras típicas
mediante un software especial y un programador de un dispositivo GAL y la macrocelda de salida
de dispositivos. El tipo más sencillo de matriz del GAL22V10.
programable, que data de los años 60, era una
matriz de diodos con un fusible en cada punto de
intersección de la misma. En la figura 2.1 se

IEC FRANCISCO JAVIER TORRES VALLE 10


CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES

multiplexores. La primera se basa en una matriz


de filas y columnas con una celda EECMOS en
cada intersección. Al igual que en el GAL esta
celda puede ser activada para conectar/desconectar
la correspondiente fila y columna. Esta
configuración permite una total interconexión
Figura 2.2 Estructura típica de un GAL entre las entradas y salidas de los bloques lógicos.
Sin embargo, estas ventajas provocan que
disminuya el desempeño del dispositivo además de
aumentar el consumo de energía y el tamaño del
componente. En la interconexión mediante
multiplexores, existe un multiplexor por cada
entrada al bloque lógico. Las vías de interconexión
programables son conectadas a las entradas de un
numero fijo de multiplexores por cada bloque
lógico. Las entradas de selección de estos
multiplexores son programadas para permitir que
sea seleccionada únicamente una vía de la matriz
de interconexiones por cada multiplexor, la cual se
propaga hacia el bloque lógico. Cabe mencionar
que estos multiplexores no tienen acceso a todas
FIGURA 2.3 Macrocelda de un GAL22V10 las vías de la matriz por lo que la rutabilidad se
incrementa usando multiplexores de mayor
tamaño, permitiendo así que cualquier
2.3 CPLD combinación de señales de la matriz de
Un CPLD (Complex Programmable Logic interconexión pueda ser enlazada hacia cualquier
Device) extiende el concepto de un PLD a un bloque lógico. Sin embargo, el uso de grandes
mayor nivel de integración ya que permite multiplexores incrementa el tamaño de dispositivo
implementar sistemas más eficientes porque y reduce su desempeño.
utilizan menos espacio, mejoran la confiabilidad
en el circuito, y reducen costos. Un CPLD se
forma con múltiples bloques lógicos, cada uno
similar a un PLD. Los bloques lógicos se
comunican entre sí utilizando una matriz
programable de interconexiones lo cual hace más
eficiente el uso del silicio y conduce a un mejor
desempeño. A continuación se explican
brevemente las principales características de la
arquitectura de un CPLD.

2.3.1 MATRIZ DE INTERCONEXIONES


PROGRAMABLES
La matriz de interconexiones programables,
PIM Programmable Interconect Matrix (véase la Figura 2.4 Arquitectura Básica de un CPLD
figura 2.4), permite unir los pines de entrada/salida
a las entradas del bloque lógico, o las salidas del
bloque lógico a las entradas de otro bloque lógico, 2.3.2 BLOQUES LÓGICOS
o inclusive a las entradas del mismo bloque. La Un bloque lógico es muy similar a un PLD, cada
mayoría de los CPLDs usan una de dos uno de ellos poseen generalmente una matriz de
configuraciones para esta matriz: interconexión compuertas AND, una matriz de compuertas OR y
mediante arreglo o interconexión mediante una configuración para la distribución de los

IEC FRANCISCO JAVIER TORRES VALLE 11


CAPÍTULO 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.

Figura 2.5 Estructura de un Bloque Lógico en


dispositivos de las familias MAX340 y MAX5000

2.3.3 DISTRIBUCIÓN DE PRODUCTOS


Existen pequeñas diferencias en cuanto a la
distribución de los productos en un CPLD, esto
Figura 2.6 Distribución de Productos en
dependerá de la familia del dispositivo y del
dispositivos de las familias MAX340 y MAX5000
fabricante. Obviamente el tamaño de las sumas
sigue siendo el factor más importante para la
implementación de funciones lógicas. Pero cada 2.3.4 MACROCELDAS
fabricante distribuye los productos de diferente
forma. Las macroceldas de un CPLD son similares a las
de un PLD. Estas también están provistas con
La familia MAX de CPLDs que fue registros, control de polaridad, y buffers para
desarrollada por Cypress Semiconductor utilizar salidas con alta impedancia. Por lo general
conjuntamente con Altera Corporation, siendo un CPLD tiene macroceldas de entrada/salida,
los primeros en sacar al mercado unan familia de macroceldas de entrada y macroceldas internas
CPLDs, Altera la llamó MAX5000 y Cypress por u ocultas (buried macrocells), en tanto que un
su parte la clasificó como MAX340, la 22V10 tiene solamente macroceldas de
distribución de productos no es igual a la de un entrada/salida. Una macrocelda interna es similar a
PLD. En un dispositivo como el 22V10 tenemos una macrocelda de entrada/salida, sólo que esta no
que la suma de productos es fija por cada puede ser conectada directamente a una terminal
macrocelda -8, 10, 12, 14 o 16 productos-, en la del dispositivo. La salida de una macrocelda
IEC FRANCISCO JAVIER TORRES VALLE 12
CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES

interna va conectada directamente a la matriz de En la figura 2.7 se muestran la arquitectura


interconexiones programable. Por lo que es posible interna de un CPLD de la familia FLASH 370 de
manejar ecuaciones y almacenar el valor de salida Cypress Semiconductors. En esta podemos
de estas internamente utilizando los registros de apreciar las macroceldas de entrada/salida,
estas macroceldas. macroceldas ocultas y celdas de entrada/salida con
las que cuenta el dispositivo.

Figura 2.7 Macroceldas de entrada/salida, macroceldas ocultas y celdas de entrada/saliad en dispositivos


de la familia FLASH 370

Las macroceldas de entrada, como la que se


muestra en la figura 2.8, son utilizadas para 2.3.5 CELDA DE ENTRADA/SALIDA
proporcionar entradas adicionales para las
funciones lógicas. En el diagrama se muestra la En la figura 2.7 se puede apreciar una celda de
macrocelda de entrada de la familia FLASH 370. entrada/salida, que bien podría considerarse parte
En general las macroceldas de entrada incrementan del bloque lógico, pero no necesariamente tienen
la eficiencia del dispositivo al ofrecer algunos que estar a la salida de un bloque lógico. La
registros adicionales con los que se pueden función de una celda de entrada/salida es permitir
almacenar el valor de la terminal de entrada. el paso de una señal hacia dentro o hacia el
exterior del dispositivo. Dependiendo del
fabricante y de la arquitectura del CPLD estas
celdas son pueden ser consideradas o no parte del
bloque lógico.

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

IEC FRANCISCO JAVIER TORRES VALLE 13


CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES

y horizontales tal y como se muestra en la figura éste es programado ya no se puede recuperar. La


2.9. diferencia radica en que en un fusible normal se
desactiva deshabilitando la conexión, en tanto que
en estos anti - fusibles cuando son programados se
produce una conexión por lo que normalmente se
encuentran abiertos. La desventaja obvia es que no
son reutilizables, pero por el contrario disminuyen
considerablemente el tamaño y costo de los
dispositivos.
• SRAM
Las celdas SRAM son implementadas como
generadores de funciones para remplazar la lógica
combinacional mediante compuertas y, además,
Figura 2.9 Arquitectura básica de un FPGA son usadas para controlar multiplexores e
interconectar las celdas lógicas entre ellas. En estas
2.4.1 CELDAS LÓGICAS el contenido se almacena mediante un proceso de
Cada celda lógica es funcionalmente similar a configuración en el momento de encendido del
los bloques lógicos de un CPLD. La diferencia circuito que contiene al FPGA. Ya que al ser
está en que un FPGA normalmente utiliza SRAM, el contenido de estos bloques de memoria
generadores de funciones en vez de compuertas. se pierde cuando se deja de suministrar la energía.
Cada uno de estos generadores es como una La información binaria de las celdas SRAM
memoria en donde en vez de implementar la generalmente se almacena en memorias seriales
función lógica mediante compuertas, se precalcula EEPROM conocidas como memorias de
el resultado y se almacena en el generador. Las configuración. En el momento de encendido del
entradas al generador funcionan como un bus de circuito toda la información binaria es transferida a
direcciones, y mediante las diferentes las celdas del FPGA mediante el proceso de
combinaciones de las entradas al generador se configuración el cual es generalmente automático
selecciona el resultado correcto. Esto le da una y el propio FPGA contiene un circuito interno que
gran densidad al dispositivo ya que se maneja un se encarga de hacer todo el proceso.
gran número de generadores, pero el tiempo de Un FPGA que tiene una gran cantidad de
propagación al implementar una función lógica en canales de interconexión tiende a tener pequeñas
estos generadores es menor al que se necesitaría si celdas lógicas con muchas entradas y salidas en
utilizáramos compuertas. La estructura de las comparación con el número de compuertas que
celdas lógicas y las formas en que estas pueden ser tiene la celda, este tipo de FPGAs generalmente
interconectadas, tanto salidas como entradas de la utilizan tecnología ANTIFUSE. Un FPGA que
celda, varían de acuerdo al fabricante. En general tiene una estructura pequeña en canales de
una celda lógica tiene menos funcionalidad que la interconexión tiende a tener grandes celdas lógicas
combinación de sumas de productos y macroceldas con pocas entradas y salidas en comparación con el
de un CPLD, pero como cada FPGA tienen una número de compuertas que hay en la celda. Este
gran cantidad de celdas lógicas es posible tipo de FPGA generalmente está fabricado con
implementar grandes funciones utilizando varias tecnología SRAM. Una arquitectura con celdas
celdas lógicas en cascada. Además de las celdas lógicas pequeñas permite utilizar todos los
lógicas también es importante la tecnología recursos del dispositivo. Sin embargo, si las celdas
utilizada para crear las conexiones entre los lógicas son muy pequeñas entonces tendremos que
canales, las más importantes son las siguientes. utilizar un gran número de estas para poder
• ANTIFUSE implementar funciones lógicas de varios términos,
lo cual agrega un tiempo de retardo por cada celda
Al igual que la tecnología PROM, un FPGA que lógica implementada. Cuando el tamaño de la
utiliza este tipo de tecnología sólo se puede celda lógica es grande sucede lo contrario, en este
programar una sola vez y utilizan algo similar a un tipo de celdas lógicas es posible utilizar un gran
fusible para realizar las conexiones. Una vez que número de compuertas por lo que podemos

IEC FRANCISCO JAVIER TORRES VALLE 14


CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES

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

Figura 2.10 Bloque Lógico Configurable de la familia XC4000 de Xilinx, Inc.

IEC FRANCISCO JAVIER TORRES VALLE 15


CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES

Figura 2.11 Elemento Lógico de la familia APEX20K de Altera Corporation

Figura 2.12Modulo Lógico de la familia ACT3 de Actel Corporation

IEC FRANCISCO JAVIER TORRES VALLE 16


CAPÍTULO III: SINTAXIS DEL LENGUAJE

III SINTAXIS DEL


LENGUAJE

IEC FRANCISCO JAVIER TORRES VALLE 17


CAPÍTULO III: SINTAXIS DEL LENGUAJE

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;

ARCHITECTURE data_flow OF multiplexor IS


ENTRADAS SALIDA SIGNAL temp: bit_vector (2 DOWNTO 0);
BEGIN
s0 x0 x1 z0 z0 <= '0' WHEN temp = "000" ELSE
'0' WHEN temp = "001" ELSE
0 0 0 0 '1' WHEN temp = "010" ELSE
'1' WHEN temp = "011" ELSE
0 0 1 0 '0' WHEN temp = "100" ELSE
'1' WHEN temp = "101" ELSE
0 1 0 1 '0' WHEN temp = "110" ELSE
'1';
0 1 1 1 temp <= s0 & x0 & x1; -- Concatenación
-- de las entradas en un
1 0 0 0 -- solo bus.
END data_flow;
1 0 1 1
1 1 0 0 Las descripciones en VHDL son creadas a
partir de dos estructuras que son fundamentales

IEC FRANCISCO JAVIER TORRES VALLE 18


CAPÍTULO III: SINTAXIS DEL LENGUAJE

para el lenguaje: la entidad y la arquitectura. not_s0 <= NOT s0;


and2 <= s0 AND x1;
Básicamente la entidad es la estructura en la que END data_flow;
se define cuales son las entradas y salidas del
circuito que deseamos representar, la cual La descripción anterior también es de flujo de
podemos asociar con una “caja” en la que se que datos y no sigue ningún orden en particular en el
precisan cuales son las interfaces de uso de las instrucciones y esto se ha hecho para
comunicación con el exterior, siendo la destacar el comportamiento paralelo o
arquitectura donde se detalla el comportamiento concurrente de VHDL. Observe que cada
interno de esa “caja”. Observe que en la ecuación describe a cada una de las compuertas
descripción anterior se utilizó un objeto de datos que se muestran en la figura 3.2, por lo cual no
llamado SIGNAL para crear el bus “temp” y hubiera importado el orden que hayamos seguido
concatenar “s0”, “x0” y “x1” en un solo objeto y siempre y cuando se realicen las conexiones
así facilitar la descripción. A continuación correctamente.
utilizaremos la tabla simplificada para diseñar el
multiplexor, ya que si observamos la salida Pensemos en el circuito implementado
depende fundamentalmente de la entrada de físicamente en el laboratorio. Cada una de estas
selección “s0”, por lo que atendiendo a esta compuertas posee características eléctricas que les
característica la descripción de flujo de datos asignan un funcionamiento definido. Estas
quedaría tal y como se muestra a continuación. particularidades eléctricas cumplen con leyes
físicas que se están cumpliendo todo momento y,
ENTITY multiplexor IS entonces, no importa como se hayan ordenado
PORT (s0, x0, x1: IN bit; los circuitos entre sí lo importante es realizar
z0: OUT bit);
END multiplexor; correctamente las conexiones para obtener la
función deseada. En VHDL se trata de emular ese
ARCHITECTURE data_flow OF multiplexor IS comportamiento, por lo tanto el orden que se haya
BEGIN
z0 <= x0 WHEN s0 = '0' ELSE x1;
seguido en cada una de las instrucciones
END data_flow; anteriores no es importante, ya que hicimos
correctamente la interconexión entre las
En ambas descripciones hemos definido el compuertas.
funcionamiento de la salida apoyándonos en las
entradas. Note que existe cierto “paralelismo” de 3.1.2 COMPARADORES
las entradas hacia las salidas, es decir, no importa
cual combinación de entradas se dé, sólo una La figura 3.3 representa a un comparador y la
opción será asignada a la salida. Por lo que no siguiente tabla resume su funcionalidad.
importa cual orden se haya seguido en la
descripción del circuito. Y esta es una de las
principales características de VHDL, es decir, no ENTRADAS SALIDAS
importa tanto el orden de las instrucciones, lo cual x_may_y equals x_men_y
no es así en lenguaje de programación de
software. Tal vez este “paralelismo” se perciba x>y 1 0 0
con mayor detalle realizando la descripción del
x=y 0 1 0
circuito compuerta por compuerta utilizando la
ecuación simplificada del circuito obtenida x<y 0 0 1
anteriormente.

ENTITY multiplexor IS
PORT (s0, x0, x1: IN bit;
z0: OUT bit);
END multiplexor;

ARCHITECTURE data_flow OF multiplexor IS


SIGNAL not_s0, and1, and2: bit;
BEGIN
z0 <= and1 OR and2;
and1 <= not_s0 AND x0;

IEC FRANCISCO JAVIER TORRES VALLE 19


CAPÍTULO III: SINTAXIS DEL LENGUAJE

Figura 3.3 Comparador “programa”, ya que un programa es un conjunto


de instrucciones que se ejecutan paso a paso para
En el diseño convencional de un comparador llevar a cabo una tarea determinada, y en este
tendríamos que realizar una tabla de todos los caso no podemos decir que las instrucciones se
posibles valores lógicos de las salidas respecto a estén ejecutando de esta manera, porque esto no
las entradas. Lo cual en este caso sería de 256 corresponde en la realidad al comportamiento de
combinaciones, dado que tenemos ocho bits de un circuito. En VHDL las instrucciones se están
entrada para obtener las tres ecuaciones de salida. ejecutando en todo momento lo cual sí se asemeja
En VHDL basta con describir de una forma al comportamiento real de un circuito. Así cuando
general el funcionamiento del hardware y el cambie alguna señal de entrada cambiará
sintetizador se encargará de generar toda esta inmediatamente la salida y, por consiguiente,
tabla de 256 combinaciones y obtener las estamos describiendo cual es el verdadero
ecuaciones lógicas de las tres salidas. El código funcionamiento del circuito. La forma en que se
mostrado a continuación corresponde al “programa” en VHDL al principio resultará un
comparador mostrado en la figura 3.3. tanto extraña, pero si asociamos éste código con
el circuito que estamos describiendo, podemos
ENTITY comparador IS
PORT ( x: IN bit_vector (3 DOWNTO 0);
darnos cuenta que en él los componentes siempre
y: IN bit_vector (3 DOWNTO 0); están activos, y es esto es precisamente lo que
equals: OUT bit; describimos mediante VHDL. Tal vez alguna vez
x_may_y: OUT bit; ha utilizado PSPICE o algún programa de
x_men_y: OUT bit);
END comparador; entrada esquemática de diseño para modelar y
simular circuitos, estos también son para la
ARCHITECTURE data_flow OF comparador IS descripción de circuitos. En PSPICE la
BEGIN descripción se realiza mediante un listado de
equals <= '1' WHEN x = y ELSE '0';
x_may_y <= '1' WHEN x > y ELSE '0'; conexiones (netlist) entre los componentes, en
x_men_y <= '1' WHEN x < y ELSE '0'; tanto que en los otros lo hacemos de manera
END data_flow; gráfica y en ambos se considera que todos los
componentes siempre están funcionando para que
Nótese que en la primera declaración de la simulación o modelado del diseño sea de
puertos, dentro de la entidad del comparador, se acuerdo a la realidad. Por esto en VHDL el orden
definen dos bus de entrada de cuatro bits de de las instrucciones no es tan importante como en
magnitud (x, y), en cambio las salidas son de el caso de un lenguaje de programación de
solamente un bit. En la entidad lo único que software, porque las instrucciones se están
hacemos es describir como es el circuito, o ejecutando al mismo tiempo y así sí se modela
aquello del circuito que permite a la entidad adecuadamente un circuito. Posteriormente se
comunicarse hacia otras entidades, sin mencionar explicarán los tipos de instrucciones y sus
para nada su comportamiento interno. Y es en la diferencias, ya que VHDL si permite la
arquitectura, después del BEGIN, es donde se “descripción secuencial” utilizando instrucciones
realiza la descripción del comportamiento del de esta naturaleza dentro de una estructura
circuito atendiendo únicamente a la funcionalidad llamada PROCESS. En esta estructura las
del mismo, es decir, no es necesario analizar cada instrucciones se ejecutan “paso a paso” como en
caso en particular de las 256 posibles los lenguajes de programación de software. Pero
combinaciones. de cualquier manera esta estructura siempre esta
activa, como si fuera un componente o subcircuito
3.1.3 EL ESTILO DE “PROGRAMACIÓN” del diseño, por lo que todo lo que se obtenga
EN VHDL dentro del proceso se ejecutará paralelamente con
el resto de las instrucciones que están fuera de
Haciendo una comparación con un lenguaje de esta estructura.
programación de alto nivel podemos ver que el Otro punto importante es el dispositivo lógico
código es similar en cuanto a las sentencias programable que estemos utilizando, ya que si
utilizadas, sin embargo, no es así en el flujo de éste no tiene la capacidad para realizar lo que
ejecución de las instrucciones. Un código de “dice” nuestra descripción nunca podremos
programación en VHDL no es precisamente un

IEC FRANCISCO JAVIER TORRES VALLE 20


CAPÍTULO III: SINTAXIS DEL LENGUAJE

sintetizar el código. Por ejemplo, si en el


dispositivo que usemos no es posible que las EJEMPLOS
salidas puedan ser programadas para que trabajen
con alta impedancia, aún y cuando la descripción -- Este es un comentario.
sea correcta nunca podremos sintetizarla en el
ENTITY contador IS -- comentario al final
dispositivo. -- de una línea
Al principio generalmente se comete el error de Los siguientes ejemplos son de identificadores
tratar de “programar” como si fuera C++, Pascal, válidos en VHDL.
Visual Basic o cualquier otro lenguaje de
programación de software, además de olvidar que Mi_entidad
el PLD, CPLD, o FPGA que utilicemos tiene Mux4a2
características propias que deben ser consideradas
cuando se hace la descripción. Pero basta con TTL_7490
recordar que estamos diseñando hardware y que
por lo tanto no se trata de un lenguaje secuencial A continuación se muestran ejemplos de
de programación para software. identificadores no válidos en VHDL.

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.

IEC FRANCISCO JAVIER TORRES VALLE 21


CAPÍTULO III: SINTAXIS DEL LENGUAJE

declaradas dentro de las entidades, arquitecturas, representan elementos de memoria o conexiones y


procesos o paquetes. Las constantes que se si pueden ser sintetizadas.
declaren en un paquete pueden ser utilizadas en
Los puertos de una entidad son implícitamente
cualquier descripción en la que se este utilizando
declarados como señales en el momento de la
dicho paquete. Por otra parte las constantes
declaración, ya que estos representan conexiones.
declaradas dentro de una entidad pueden ser
También pueden ser declaradas en las
utilizadas por la o las arquitecturas en las que se
arquitecturas antes del BEGIN, lo cual nos
este haciendo la descripción de dicha entidad, y
permite realizar conexiones entre diferentes
aquellas constantes que sean declaradas dentro de
estructuras de programación. La asignación de
una arquitectura o proceso, son válidas
valores a un objeto de datos del tipo señal no es
únicamente dentro de la estructura
inmediata como en el caso de las variables, esto
correspondiente.
se explicará más detalladamente cuando se
DECLARACIÓN DE CONSTANTES exponga la estructura PROCESS y los tipos de
instrucciones.
CONSTANT identificador: tipo := valor;

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

VARIABLE identificador: tipo [:=valor];


DECLARACIÓN DE ALIAS

ALIAS identif: tipo IS identif2 <rango>;


EJEMPLO

VARIABLE aux1, aux2: bit;


EJEMPLO

ALIAS instr: bit_vector (3 DOWNTO 0) IS


3.3.3 SEÑALES dato (7 DOWNTO 4);

Un objeto de la clase señal es similar a un


objeto de la clase variable, con una importante
3.4 TIPOS DE DATOS
diferencia: las señales si pueden almacenar o Un tipo de dato especifica el grupo de valores
pasar valores lógicos, mientras que una variable que un objeto de datos puede tomar así como las
no lo puede hacer. Las señales, por lo tanto, operaciones que son permitidas con esos valores.
En VHDL es sumamente importante el tipo de
IEC FRANCISCO JAVIER TORRES VALLE 22
CAPÍTULO III: SINTAXIS DEL LENGUAJE

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

IEC FRANCISCO JAVIER TORRES VALLE 23


CAPÍTULO III: SINTAXIS DEL LENGUAJE

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

'U' -- Uninitialized 'W' -- Weak Unknow


CODIFICACIÓN DE LOS TIPOS ENUMERADOS
'X' -- Forcing 'L' -- Weak 0
Los tipos enumerados se ordenan de acuerdo a
'0' -- Forcing 0 'H' -- Weak 1 sus valores. Los programas de síntesis
automáticamente codifican binariamente los
'1' -- Forcing 1 '-' -- Don't care valores del tipo enumerado para que estos puedan
'Z' -- High Impedance ser sintetizados. Algunos programas los hacen
mediante una secuencia binaria ascendente, otros
Los valores '0', '1', 'L' y 'H', se utilizan en buscan cual es la codificación que mejor conviene
síntesis de circuitos, los valores 'Z' y '-' tienen para tratar de minimizar el circuito o para
restricciones sobre como y donde pueden ser incrementar la velocidad del mismo una vez que
usados. Los valores 'U', 'W' y 'X' se utilizan la descripción es sintetizada. También es posible
únicamente para simulación y evaluación de asignar el tipo de codificación mediante directivas
diseños mas no para síntesis. Para la mayoría de de síntesis.
los diseños se utiliza este tipo de dato ya que es
más completo que el tipo bit por proporcionar los El siguiente ejemplo muestra la forma en que el
valores 'Z' y '-'. programa de síntesis Foundation de Xilinx, Inc.
codifica un tipo enumerado de cinco posibles
SOBRECARGA DE UN TIPO ENUMERADO valores.
Es posible cargar el valor de algún tipo
TYPE color IS (red, green, yellow, blue,
enumerado incluyendo dicho valor en la violet);
definición de dos o más tipos enumerados.
Cuando se utilice en una descripción dos o más La codificación sería la siguiente: red="000",
tipos que usen el mismo valor generalmente el green="001", yellow="010", blue="011",
programa de síntesis identifica de cual tipo violet="100".
proviene, pero bajo ciertas condiciones esta
determinación es imposible. En estos casos es Para realizar la codificación manualmente se
necesario indicar explícitamente de cual tipo se deben utilizar directivas de síntesis que son
trata. En el siguiente ejemplo se muestra como propias de cada programa. Para ver ejemplo de
realizar esta indicación explicita. cómo se utilizan consulte la ayuda del programa y

IEC FRANCISCO JAVIER TORRES VALLE 24


CAPÍTULO III: SINTAXIS DEL LENGUAJE

busque la sección de "directivas de síntesis" o


"codificación de tipos enumerados".
• FÍSICOS
Los tipos físicos son usados para especificar
unidades de medida, ya sea de tiempo o para
determinar medidas eléctricas. El único tipo
predefinido es el “time”, mediante el cual se
pueden establecer medidas para simular los
retardos de tiempo o para generar diferentes
señales que nos permitan simular nuestro diseño.
La unidad básica del tipo time es el
femtosegundo, y de éste se forman diferente
múltiplos.

TYPE time IS RANGE -2147483647 TO


2147483647

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 tipos físicos no tienen ningún significado


en síntesis, sólo son utilizados para simulación de
circuitos.

IEC FRANCISCO JAVIER TORRES VALLE 25


CAPÍTULO III: SINTAXIS DEL LENGUAJE

VARIABLE valor_actual: valores;


3.4.2 TIPOS COMPUESTOS
Algunas posibles maneras de asignar valores a
Un tipo compuesto es un tipo de dato formado elementos de estos objetos son:
con elementos de otros tipos. Existen dos formas
de tipos compuestos: ARRAYS y RECORDS.
mensaje1(0) <= '1'; -- asignación de valor
-- al elemento '0' de
-- mensaje1
DECLARACIÓN DEL TIPO ARRAY
mensaje(5) <= '0'; -- asignación de valor
TYPE nombre IS ARRAY ( rango ) OF tipo;
-- al quinto elemento de
-- mensaje1
DECLARACION DEL TIPO RECORD
mensaje2 <= mensaje1; -- hace mensaje1
TYPE nombre IS RECORD
-- igual a mensaje2,
elemento: tipo_de_dato;
-- esto es permitido
[;elemento: tipo_de_dato...];
-- ya que se trata de
END RECORD;
-- dos objetos de datos
-- del mismo tipo
Un ARRAY es un objeto de datos que consiste
en una “colección” de elementos del mismo tipo. mensaje2 (63) <= arreglo_matriz (5, 13);
-- transfiere el valor
Los arreglos pueden ser de una o más -- de un elemento de
dimensiones. Los elementos individuales de un -- arreglo_matriz a un
arreglo pueden ser utilizados especificando un -- elemento de mensaje2,
valor dentro del arreglo. Elementos múltiples de -- noté que ambos son
-- arreglos del tipo
un arreglo pueden ser utilizados especificando -- std_logic_vector
más valores.
Un RECORD es un objeto de datos que A continuación se muestra un ejemplo de una
consiste en una “colección” de elementos de declaración del tipo RECORD.
diferentes tipos. La estructura RECORD en
TYPE operacion IS (add, sub, mul, div);
VHDL es análoga a los RECORDS utilizados en
Pascal o a las estructuras en C. Los campos TYPE instruccion IS RECORD
individuales de un RECORD pueden ser operador: operacion;
utilizados usando los nombres de los elementos. op1: integer;
op2: integer;
También se puede utilizar más de un campo. END RECORD;

EJEMPLOS Aquí está la declaración de dos objetos usando


la declaración del tipo RECORD anterior.
Las siguientes líneas corresponden a la
declaraciones de un tipo ARRAY. VARIABLE inst1, inst2: instruccion;

TYPE word IS ARRAY (0 TO 15) OF std_logic;


A continuación se muestran algunas posibles
TYPE matriz IS ARRAY (0 TO 13, 0 TO 18) OF maneras de asignar valores a elementos de estos
std_logic; objetos de datos.
TYPE valores IS ARRAY (0 TO 127) OF
integer; inst1.operador := add; -- asigna un valor
-- a "operador"del
-- RECORD inst1
A continuación se muestra como declarar
objetos de datos utilizando estos tipos. inst2.operador := sub; -- asigna un valor
-- a "operador" de
-- inst2
SIGNAL mensaje1, mensaje2: word;
inst1.op1 := inst2.op2;
SIGNAL arreglo_matriz: matriz;

IEC FRANCISCO JAVIER TORRES VALLE 26


CAPÍTULO III: SINTAXIS DEL LENGUAJE

inst2 := inst1; y1 <= B"1011";


x2 <= x"A";
y2 <= x"7";
ARREGLOS RESTRINGIDOS z_octal <= o"2";
un_bit <= '1';
Un arreglo restringido (Constrained Array) es
aquel que está explícitamente definido mediante STD_LOGIC_VECTOR
rango entero especifico de un tipo de datos ya El tipo std_logic_vector al igual que el
existente. Cuando se declara un objeto de datos bit_vector es simplemente un arreglo de
con arreglo restringido, el objeto posee el mismo elementos del tipo std_logic. La forma de
rango. utilizarlo es similar a la del bit_vector.
EJEMPLO: SIGNED & UNSIGNED
TYPE byte IS ARRAY (7 DOWNTO 0) OF bit; El estándar 1076.3 de la IEEE es un paquete
-- Este es un arreglo restringido cuyo para VHDL en el cual se definen nuevos tipos de
-- rango es: (7, 6, 5, 4, 3, 2, 1, 0)
datos además de funciones aritméticas y lógicas
para ser utilizadas por herramientas de síntesis.
ARREGLOS INDEFINIDOS Éste define dos paquetes: el numeric_std y el
Un arreglo indefinido o sin restricciones numeric_bit en los que se define dos nuevos tipos
(Unconstrained Array) es aquel que no está de datos: signed y unsigned. Estos tipos son
delimitado mediante un rango entero especifico. parecidos a los tipos std_logic_vector o bit_vector
Un objeto de datos declarado con arreglo y son parte de una norma emergente (IEEE
indefinido deberá ser delimitado o de lo contrario 1076.3) para desempeñar operaciones numéricas
no podrá ser sintetizado. sobre señales vectorizadas. El paquete
numeric_bit define a estos tipos (unsigned y
EJEMPLO signed) como un vector cuyos elementos son del
tipo bit y el paquete numeric_std define los
TYPE bit_vector IS ARRAY
(integer RANGE <>) OF bit; mismos pero con elementos del tipo std_logic.

VARIABLE v: bit_vector(5 DOWNTO -5); El propósito de estos dos tipos es el de


representar números enteros positivos y negativos
A continuación se exponen algunos tipos
en forma binaria. Para ambos tipos, el bit más
compuestos comúnmente utilizados en síntesis de
significativo está a la izquierda. El tipo signed se
circuitos utilizando VHDL.
utiliza para representar un número entero con
signo en forma binaria con complemento a dos, y
BIT_VECTOR el unsigned es solamente un número entero sin
Los valores asignados al tipo bit_vector deben signo en forma binaria. El paquete numeric_std
ser especificados con comillas dobles (" ") y los define funciones y operadores aritméticos,
valores asignados al tipo bit simple son asignados relacionales, lógicos y de asignación para ser
con comillas simples (' '). El prefijo 'X' o 'x' utilizados con estos tipos de datos. Signed,
denota un valor hexadecimal; los prefijos 'O' y 'o' unsigned y std_logic_vector son tipos diferentes
denotan un valor octal; el prefijo 'B' o 'b' denota por lo que no se pueden mezclar. Sin embargo,
un valor binario. Si ningún prefijo es varias funciones de conversión, tales como
especificado, se asume el prefijo binario. Las to_unsigned, son definidas para la conversión
asignaciones en hexadecimal y octal deben usarse entre los tipos.
únicamente si el valor puede combinarse
directamente con el tamaño del vector. Por
ejemplo, sí 'a' es un bit_vector ( 0 TO 6 ),
entonces la asignación a <= x"B", no podrá
hacerse porque el numero hexadecimal 'B' usa
cuatro de bits y no equipara el tamaño del vector
al que está siendo asignado.
EJEMPLOS
x1 <= "0001";

IEC FRANCISCO JAVIER TORRES VALLE 27


CAPÍTULO III: SINTAXIS DEL LENGUAJE

3.4.3 SUBTIPOS paquete STANDAR, que es utilizado por la


mayoría de las herramientas de síntesis, no es
Un subtipo es un “subgrupo” de un tipo utilizado por completo. A continuación se
predefinido. Los subtipos son útiles para crear muestra una parte del paquete STANDAR donde
tipos de datos con limitaciones sobre tipos se encuentran los tipos y subtipos predefinidos
mayores. más utilizados.
DECLARACIÓN DE SUBTIPOS PACKAGE standard IS
TYPE boolean IS (FALSE, TRUE);
SUBTYPE identif IS tipobase RANGE <rango>; TYPE bit IS ('0', '1');
TYPE character IS (
EJEMPLOS NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL,
BS, HT, LF, VT, FF, CR, SO, SI,
DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB,
SUBTYPE byte IS bit_vector (7 DOWNTO 0); CAN, EM, SUB, ESC, FSP, GSP, RSP, USP,
SUBTYPE digito IS integer RANGE (0 TO 9); ' ', '!', '"', '#', '$', '%', '&', ''',
'(', ')', '*', '+', ',', '-', '.', '/',
Estos ejemplos definen dos subtipos llamados '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?',
byte y digito. Las señales o variables que son '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
declaradas como byte son del tipo 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
std_logic_vector de 8 bits en orden descendente. 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
Las señales o variables que sean declaradas como 'X', 'Y', 'Z', '[', '\', ']', '^', '_',
''', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
tipo digito serán del tipo entero, consistiendo de 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
los posibles valores de los enteros del 0 al 9, 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
inclusive. 'x', 'y', 'z', '{', '|', '}', '~', DEL);
TYPE integer IS RANGE -2147483647 TO
En el siguiente ejemplo se muestra como se 2147483647;
pueden crear subtipos de datos a partir de aquellos SUBTYPE natural IS integer RANGE 0 TO
2147483647;
tipos que sean definidos por el usuario. SUBTYPE positive IS integer RANGE 1 TO
2147483647;
TYPE string IS ARRAY (positive RANGE <>)
EJEMPLOS OF character;
TYPE bit_vector IS ARRAY (natural RANGE
TYPE arith IS (add, sub, mul, div); <>) OF bit;
SUBTYPE add IS arith RANGE add TO sub; END standard;
SUBTYPE mul IS arith RANGE mul TO div;

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.

IEC FRANCISCO JAVIER TORRES VALLE 28


CAPÍTULO III: SINTAXIS DEL LENGUAJE

- Objetos de datos FILE. Estos se utilizan para


almacenar datos en RAM o ROM de la
computadora.

IEC FRANCISCO JAVIER TORRES VALLE 29


CAPÍTULO III: SINTAXIS DEL LENGUAJE

3.5 OPERADORES Los operadores lógicos no tiene orden de


precedencia por lo que para expresiones en las
Un operador nos permite construir diferentes que se utilice más de un operador lógico es
tipos de expresiones mediante los cuales podemos necesario indicar mediante paréntesis cual es el
calcular datos utilizando los diferentes objetos de orden en que se debe realizar el cálculo.
datos con el tipo de dato que maneja dicho objeto.
En VHDL existen distintos operadores de EJEMPLOS
asignación con lo que se transfieren valores de un
objeto de datos a otro, y operadores de asociación x <= y AND z OR w
que relacionan un objeto de datos con otro, lo cual -- esta forma de utilizar los
no existe en ningún lenguaje de programación de -- op. lógicos, es incorrecta y
-- producirá un error cuando sea
alto nivel. -- compilado el código
El uso de los operadores que aquí son
expuestos dependerá del software utilizado, ya x <= y AND ( z OR w )
que no es regla que los utilicen todos. Para -- forma correcta de utilizar los
conocer las operaciones que pueden ser utilizadas -- op.lógicos
así como los paquetes incluidos en el software, es
recomendable revisar las librerías del programa. 3.5.2 OPERADORES DE COMPARACIÓN
De no encontrarse algún operador especial para
ser utilizado con algún tipo de dato especifico, es Estos tipos de operadores se utilizan para
necesario sobrecargar los operadores o en ejecutar pruebas de igualdad, desigualdad, o de
ocasiones crearlo. Como sobrecargar operadores y magnitud entre dos objetos de datos. Los
como crear funciones se expone dentro del tema operandos que participen en la prueba deben ser
de subprogramas. Para poder utilizar la mayoría del mismo tipo y el resultado de la operación es
de estos operadores con los tipos signed, unsigned del tipo boolean. Los operadores de igualdad y
y std_logic_vector, basta con utilizar el paquete desigualdad (= y /=) pueden ser utilizados para
donde se encuentran declarados estos tipos, todos los tipos de datos predefinidos en el
porque dentro de los mismos paquetes ya se lenguaje Los operadores de magnitud (“<” menor
encuentran sobrecargada varias funciones que, “>” mayor que, “<=” menor o igual que, y
aritméticas y lógicas para que sean utilizadas con “>=” mayor o igual que) están definidos para ser
estos tipos, en temas posteriores se incluyen las utilizados con tipos escalares.
funciones que se encuentran en los paquetes
std_logic_1164, numeric_std y numeric_bit. EJEMPLO

SIGNAL x, y: bit_vector ( 3 DOWNTO 0)


TIPOS DE OPERADORES
SIGNAL z : bit;
LÓGICOS AND, OR, NAND, NOR, XOR,
XNOR, NOT z <= '1' WHEN x >= z ELSE '0';
COMPARACIÓN =, /=, <, >, <=, >=
ADICIÓN +, -, &
MULTIPLICACIÓN *, /, MOD, REM
MISCELÁNEOS ABS, **
3.5.3 OPERADORES DE ADICIÓN
ASIGNACIÓN <=, :=
ASOCIACIÓN => Los operadores + y - son frecuentemente
CORRIMIENTO SLL, SRL, SLA, SRA, ROL, ROR utilizados para describir sumas y restas además de
signos positivo y negativo. Están definidos para
3.5.1 OPERADORES LÓGICOS ser utilizados con el tipo entero. El operador “&”
permite concatenar cadenas de bits obteniendo
Los operadores lógicos AND, OR, NAND, una de mayor tamaño. Los tres operadores tienen
NOR XOR, XNOR, y NOT están definidos para la misma precedencia, por lo que para
ser usados con los tipos bit y boolean. Para instrucciones en la que se utiliza más de un
utilizar estos operadores, excepto el operador operador de este tipo es recomendable indicar
NOT, los operandos deben ser del mismo tamaño. mediante paréntesis el orden de las operaciones.

IEC FRANCISCO JAVIER TORRES VALLE 30


CAPÍTULO III: SINTAXIS DEL LENGUAJE

Para poder realizar operaciones de suma o resta A REM B = A-(A/B)*B


entre un entero y un objeto de datos que
represente una cadena de bits, lo mejor es declarar La división es entera, por lo que los operandos
este objeto de datos como signed o unsigned e deben ser del tipo entero. El resultado toma el
incluir el paquete numeric_std o el numeric_bit, signo de A. MOD calcula el módulo de dos
ya que en estos se sobrecargaron los operadores números. Se define como:
“+” y “-” para que pudieran ser utilizados de esta A MOD B = A-B*N
manera. De lo contrario resultaría en un error de
compilación al realizar dichas operaciones. Por Donde N es un entero. El resultado toma el
otra parte no es posible realizar sumas entre signo de B.
bit_vectors de diferente tamaño, y tampoco
podremos asignar el resultado de una suma o resta 3.5.5 OPERADORES MISCELÁNEOS
entre dos bit_vectors a un bit_vector de diferente
longitud. Si se desea obtener el acarreo de la suma En esta categoría se encuentran los operadores
del resultado de una operación aritmética entre “abs” y “**”. El operador “abs” devuelve el valor
dos bit_vectors de la misma longitud, a un absoluto de un operando del tipo entero. El
bit_vector que sea de mayor longitud en un bit, se operador ** se utiliza para elevar el primer
permite utilizar el operador de concatenación para operador a una potencia definida por el segundo
incrementar el tamaño solamente en el primer operando, ambos deben ser del tipo entero.
bit_vector que participa en la operación, con lo
cual se indica que deseamos obtener el acarreo de
EJEMPLO
la suma.
CONSTANT r: integer := 2;
EJEMPLOS VARIABLE i: integer;

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);

conteo <= conteo + 1;


x <= y + z + 5; 3.5.6 OPERADORES DE ASIGNACIÓN
r <= '0'z + x; -- de esta manera se
-- obtiene el acarreo de En VHDL existen dos tipos de operadores de
-- la suma
m <= r +1; asignación los cuales son: "<=" y ":=". El
operador ":=" se utiliza para asignar un valor
inicial a constantes, variables y señales en el
3.5.4 OPERADORES DE MULTIPLICACIÓN
momento de la declaración, pero para el resto de
Son los operandos “*” y el “/” que se utilizan la descripción únicamente utilizaremos ":=" para
para la multiplicación y para la división ser usado con variables y "<=" para ser usado con
respectivamente. Los dos operandos tienen el señales.
mismo orden de precedencia al igual que los
operandos MOD y REM. ASIGNACIÓN A VARIABLES

Todos los operandos de multiplicación están nombre_variable := expresión;


definidos para ser utilizados con operandos del
mismo tipo, siendo estos del tipo entero o
ASIGNACIÓN A SEÑALES
bit_vector. El resultado es entonces del mismo
tipo que los operandos por lo que también el nombre_señal <= expresión;
objeto de datos que recibe el resultado de la
operación deberá ser del mismo tipo que los Las asignaciones a variables solamente pueden
operandos. ocurrir dentro de los procesos o subrutinas, las
La operación REM se define como se muestra asignaciones a señales pueden ocurrir en
a continuación: cualquier lugar dentro de la descripción.

IEC FRANCISCO JAVIER TORRES VALLE 31


CAPÍTULO III: SINTAXIS DEL LENGUAJE

Para realizar asignaciones a objetos de datos de EJEMPLO


tipos compuesto, se pueden realizar utilizando
agregados. Los agregados son una lista de varios LIBRARY mi_libreria;
USE mi_libreria.sumadores.ALL;
valores encerrados entre paréntesis y separados
mediante comas de tal forma que el primer ENTITY sumador IS
elemento de la lista es asignado al primer PORT ( ci: IN bit;
elemento del objeto, el segundo elemento de la x: IN bit_vector(3 DOWNTO 0);
y: IN bit_vector(3 DOWNTO 0);
lista es asignado al segundo elemento del objeto z: OUT bit_vector(3 DOWNTO 0);
de datos etc. Así mediante una sola instrucción se co: OUT bit);
asignan varios valores al objeto de datos. END sumador;
ARCHITECTURE a_sumador OF sumador IS
SIGNAL carry1: bit;
EJEMPLOS SIGNAL carry2: bit;
SIGNAL carry3: bit;
TYPE op IS (suma, resta, mult, div); BEGIN
TYPE reg_datos IS RECORD u0: add PORT MAP ( ci => ci,
operador: op; x0 => x(0),
x: integer; y0 => y(0),
y: bit; z0 => z(0),
END RECORD; co => carry1 );
. . . u1: add PORT MAP ( ci => carry1,
VARIABLE registro: reg_datos; x0 => x(1),
SIGNAL vec1, vec2: bit_vector(0 TO 3); y0 => y(1),
. . . z0 => z(1),
vec1 <= ('0', '1', '1', '0'); co => carry2 );
-- asignación mediante agregados u2: add PORT MAP ( carry2, x(2), y(2),
z(2), carry3 );
vec2 <= vec1; u3: add PORT MAP ( carry3, x(3), y(3),
-- también esta es una asignación z(3), co );
-- mediante agregados END a_sumador;

registro := ( resta, 13, '1' );


-- asignación a variable del tipo El componente “add” esta declarado dentro del
-- record mediante agregados paquete “sumadores” de la librería “mi_libreria”,
vec2 <= ( '1', OTHERS => '0' ); y esta declarado de la siguiente manera.
-- en esta asignación se hace '1'
-- el elemento 0 de vector2 y el resto ------------------------------------------
-- se hacen cero -- SUMADORES
------------------------------------------
-- paquete compilado en la librería
-- "mi_librería"
3.5.7 OPERADORES DE ASOCIACIÓN
PACKAGE sumadores IS
En diseños jerárquicos generalmente se hace · · ·
uso de varios componentes, los cuales son COMPONENT add
PORT ( ci: IN bit;
entidades que realizan ciertas funciones x0: IN bit;
especificas. Para poder especificar las conexiones y0: IN bit;
de puertos entre dichos componentes y con los z0: OUT bit;
puertos de la entidad principal es necesario co: OUT bit );
END COMPONENT;
utilizar el operador de asociación "=>". El orden · · ·
con el que se asocian dichas conexiones depende END PACKAGE;
del orden en el que fueron declarados los puertos
del componente, además, deben ser del mismo Observe como los puertos de la entidad
tipo y del mismo modo. Diseños jerárquicos y “sumador”y las conexiones entre los bloques u0,
componentes se explicaran detalladamente en u1, u2 y u3, se hicieron de acuerdo al orden en
temas posteriores. A continuación se muestra un que los puertos están declarados en el
ejemplo de cómo utilizar este operador de componente. En el bloque u0 primero se hace la
asociación. conexión del puerto "ci" del componente con el
puerto “ci”de la entidad mediante le operador de

IEC FRANCISCO JAVIER TORRES VALLE 32


CAPÍTULO III: SINTAXIS DEL LENGUAJE

asociación "=>", después se hace la conexión del ROL ROR


puerto x0 del componente con el elemento 0
(LSB) del vector x de la entidad, y así Figura 3.4 Instrucciones ROR y ROL
sucesivamente hasta realizar todas las conexiones
del componente “add”utilizado en el bloque u0.
Lo mismo se hace con el bloque u1. En los 3.5.9 OPERACIONES CON VECTORES
bloques u2 y u3, las conexiones se realizaron con
Todas las herramientas de síntesis
una notación equivalente pero simplificada. Los
proporcionan algún tipo de paquete en el que se
nombres no tienen que ser necesariamente los
encuentre definidas funciones que facilitan la
mismos e inclusive pueden ser diferentes, ya que
descripción del diseño. Dentro de estos paquetes
cada puerto es un objeto de datos local para la
se encuentran funciones que están hechas
entidad en la que fue declarado. Es importante
específicamente para ser utilizadas con vectores y
mencionar que dentro del paquete “sumadores” se
como por lo general es preferible utilizar vectores
encuentra la entidad y la arquitectura
estos paquetes son de gran ayuda.
correspondiente al componente “add”, en los que
se describe el mismo. Synopsys desarrolló paquetes basados en el
paquete std_logic_1164, que son utilizados por
3.5.8 OPERADORES DE CORRIMIENTO varias herramientas de síntesis existentes en el
mercado, como por ejemplo FOUNDATION de
Incluidos en los paquetes numeric_std y Xilinx, Inc. y MAX+PLUS II de Altera
numeric_bit, estos operadores realizan Corporation. Estos paquetes son:
operaciones de desplazamiento o de rotación con - std_logic_arith
los elementos de un vector del tipo signed o
unsigned. - std_logic_signed
- std_logic_unsigned
DESPLAZAMIENTOS LÓGICOS SLL Y SRL
La compañía Actel también desarrolló su
Desplazan los bits de un vector n veces a la propio paquete de síntesis:
izquierda (SLL) o a la derecha (SRL),
introduciendo ceros en los lugares que quedan - asyl.arith
libres. Y los paquetes que fueron desarrollados por la
IEEE específicamente para síntesis de circuitos
EJEMPLO digitales.
- numeric_bit
x SRL 3 -- desplaza 3 lugares a la
-- derecha los bits del vector "x" - numeric_std

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

LYBRARY ieee; -- llamado a la librería

USE ieee.std_logic_1164.ALL; -- referencia

IEC FRANCISCO JAVIER TORRES VALLE 33


CAPÍTULO III: SINTAXIS DEL LENGUAJE

-- o carga del paquete


-- std_logic_1164
-- "ALL" es para ATRIBUTOS PARA ARREGLOS
-- indicar que
-- deseamos utilizar
-- todos los tipos de 'left Obtiene el valor que se encuentra a la
-- datos y funciones izquierda de un arreglo.
-- incluidas en el
-- paquete ´right Regresa el dato que se encuentra a la
USE ieee.numeric_std.ALL; -- referencia derecha del arreglo.
-- al paquete
-- numeric_std ´high Permite obtener el mayor elemento de
un objeto de arreglo.
´low Proporciona el valor más pequeño del
3.6 ATRIBUTOS arreglo.
Un atributo es una propiedad que es asociada a 'lenght Con este atributo se obtiene el número
señales, entidades o arquitecturas. Estos atributos de elementos de un arreglo.
proporcionan información que nos puede ser útil
dentro de una descripción en VHDL. Los Un arreglo es un objeto de datos que esta
atributos se utilizan mediante la comilla simple, compuesto por varios elementos de un tipo
por ejemplo el atributo 'event, que probablemente sencillo, como lo son los bit_vector y
sea el más utilizado, nos permite detectar cuando std_logic_vector.
sucede una transición de estado en una señal, por
lo que es muy útil en descripciones de circuitos ATRIBUTOS DE SEÑALES
secuenciales.
'event El atributo event es del tipo boolean y
REFERENCIA A ATRIBUTOS retorna un valor verdadero cuando
ocurre una transición en la señal a la
nombre_objeto'nombre_atributo que hace referencia.

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.

IEC FRANCISCO JAVIER TORRES VALLE 34


CAPÍTULO III: SINTAXIS DEL LENGUAJE

DECLARACION DE ENTIDADES y: IN bit_vector(msb DOWNTO 0);


equals: OUT bit;
x_may_y: OUT bit;
ENTITY identificador IS x_men_y; OUT bit);
GENERIC ( cte_1: tipo := valor; END comparador;
cte_2: tipo := valor;
· · ·
cte_n: tipo := valor
); 3.7.2 PUERTOS
PORT ( puerto_1: modo tipo;
puerto_2: modo tipo; Cada entrada y salida de la entidad se declara
· · ·
puerto_n: modo tipo dentro de la región puertos (PORT), en el
) ; momento de la declaración se debe indicar el
END identificador ; modo y tipo del puerto. Los puertos los podemos
asociar con los pines de un símbolo esquemático
y, al igual que estos, algunos son únicamente
Note que la ultima línea de declaración de entradas, otros salidas, o incluso bidirecionales.
puerto o de genéricos no lleva punto y coma al Un puerto es implícitamente un objeto de datos
final de la línea. del tipo señal porque representa conexiones en el
diseño, y puede ser utilizado en expresiones de
EJEMPLO programación dentro de la arquitectura que
describe a dicha entidad. Cada puerto debe tener
En este ejemplo se realiza la entidad de un
un nombre, un modo y se debe especificar el tipo
multiplexor 4 a 1 que se muestra en la figura 3.5.
de dato mediante el cual manipularemos dicho
ENTITY mux_4_1 IS puerto en la descripción.
PORT (a, b, c, d: IN bit;
mux_signal: IN bit_vector(1 DOWNTO 0);
x: OUT bit ); 3.7.3 MODOS
END mux_4_1;
El modo indica la forma en que los datos
fluyen a través del circuito. Estos pueden ser de
uno de cuatro tipos:
- IN
- OUT
- INOUT
- BUFFER
Figura 3.5 Multiplexor de 4 bits a 1
Si no se indica ningún modo en la declaración,
se asume que es del tipo IN. Un puerto del modo
3.7.1 GENÉRICOS IN describe un pin del circuito que únicamente
puede ser utilizado como entrada por lo que
Esta instrucción es opcional y se utiliza para solamente podremos leer datos de dicho puerto y
declarar propiedades y constantes del circuito. nunca escribir sobre él. Por el contrario, un puerto
Estas constantes se utilizan al igual que las que se que sea declarado del modo OUT podrá ser
declaran por el usuario, por lo que nos permiten utilizado para escribir datos pero no para ser
modelar circuitos en los que se pueden cambiar leído, este representa un pin que únicamente es
propiedades, tamaños de los buses de entrada o salida del circuito y que en él no existe ningún
salida del circuito. Se utilizan generalmente en tipo de retroalimentación hacia dentro del diseño.
paquetes. Un puerto INOUT indica aquellos puertos que
son pueden ser utilizados bidireccionalmente
EJEMPLO mientras que un puerto del modo BUFFER es
utilizado para salidas que tienen retroalimentación
ENTITY comparador IS interna. La diferencia entre el modo BUFFER y el
GENERIC(msb: integer := 3); INOUT, es que el INOUT es retroalimentado
PORT( x: IN bit_vector(msb DOWNTO 0);
desde el pin de salida del circuito, en tanto que
IEC FRANCISCO JAVIER TORRES VALLE 35
CAPÍTULO III: SINTAXIS DEL LENGUAJE

como un puerto del modo BUFFER lo hace


internamente no puede ser usado como
bidireccional.

Figura 36 Modos de direccionamiento para


puertos

IEC FRANCISCO JAVIER TORRES VALLE 36


CAPÍTULO III: SINTAXIS DEL LENGUAJE

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:

- Descripción de Flujo de Datos


Figura 3.7 Entidad, Símbolo Esquemático
- Descripción Comportamental
- Descripción Estructural

Los tres estilos son diferentes, pero esto no


significa que se tenga que utilizar únicamente un
estilo. De hecho lo mejor es tratar de utilizar los
tres como mejor nos convenga. En el siguiente
tema se explica el estilo de descripción de flujo de
Figura 3.8 Arquitectura, Estructura Interna datos, así como el tipo de instrucciones que
participan en este estilo.

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.

IEC FRANCISCO JAVIER TORRES VALLE 37


CAPÍTULO III: SINTAXIS DEL LENGUAJE

En este estilo de descripción se utilizan EJEMPLO


únicamente asignaciones mediante expresiones en
las que se indica como cambian los puertos de gray <= "00" WHEN binario = x"0" ELSE
"01" WHEN binario = x"1" ELSE
salida en función de los puertos de entrada, ya "11" WHEN binario = x"2" ELSE
sean asignaciones condicionales mediante "10";
instrucciones concurrentes o simples ecuaciones.
Un ejemplo de descripción de flujo de datos es el • ASIGNACIÓN WHIT... SELECT... WHEN
comprador utilizado en el primer tema de este
capítulo, en éste los datos son los que indican la SINTAXIS
forma en que cambian las salidas y por esto se le
llama de flujo de datos. WITH identificador SELECT
signal_name1 <= expresión WHEN valor1,
valor_a WHEN valor2,
3.9.1 INSTRUCCIONES CONCURRENTES valor_b WHEN
· · ·
valor3,

valor_n WHEN OTHERS ;


En lenguajes de programación como C o
Pascal, cada instrucción de asignación es
EJEMPLO
ejecutada una después de otra en un orden
especifico. El orden en el que las instrucciones WITH states SELECT
son ejecutadas es determinado por el orden de las salida <= "000" WHEN state0,
instrucciones en el archivo. Dentro de una "001" WHEN state1,
arquitectura en VHDL, no existe un orden "010" WHEN state2,
"100" WHEN state3,
especifico de ejecución de las asignaciones. El "000" WHEN OTHERS;
orden en el que las instrucciones son ejecutadas
depende de los eventos ocurridos en las señales, No olvidar la coma al final de cada línea,
similar al funcionamiento de un circuito. excepto en la ultima que lleva punto y coma.
En VHDL todos los bloques son concurrentes,
es decir que se están ejecutando en todo • ECUACIONES BOOLEANAS
momento. Después se explicará el bloque
signal_name <= ecuación_booleana;
PROCESS, el cual está compuesto por una serie
de instrucciones que sí se ejecutan en el orden en
el que fueron especificadas. Las instrucciones EJEMPLOS
concurrentes se utilizan fuera de un bloque x <= y AND z;
PROCESS, a diferencia de las instrucciones
secuenciales que únicamente se utilizan dentro del a <= ( b OR c OR d ) AND e ;
bloque concurrente PROCESS y en -- cuando se utilice más de un operador
-- lógico es necesario utilizar paréntesis
subprogramas.
op1 <= op2 NOR op3 NOR op4;
3.9.2 ESTRUCTURAS DE EJECUCIÓN
CONCURRENTE
3.9.3 ALU
• ASIGNACIÓN CONDICIONAL WHEN... ELSE
A continuación se muestra la tabla de
SINTAXIS funcionamiento de una pequeña unidad aritmético
— lógica la cual consta de dos bits de entrada, un
signal_name <= valor_a WHEN condición ELSE bit de salida, acarreo de entrada y acarreo de
valor_b WHEN condición ELSE
valor_c WHEN condición ELSE
salida.
valor_d WHEN condición ELSE
TABLA DE FUNCIONAMIENTO
· · ·
valor_n WHEN condición ELSE
otro_valor; ENTRADAS SALIDAS
s1 s0 z co

IEC FRANCISCO JAVIER TORRES VALLE 38


CAPÍTULO III: SINTAXIS DEL LENGUAJE

0 0 x AND y 0 instrucciones no importa dentro de una


descripción, recordemos que VHDL describe
0 1 x OR y 0 circuitos y por lo tanto todas las asignaciones
1 0 x XOR y 0 (conexiones) siempre están funcionando al igual
que todos los dispositivos dentro de un circuito.
1 1 x + y + ci acarreo de la suma
Las señales suma, acarreo, and_op, or_op y
xor_op son las salidas de varios bloques del
circuito, cada uno con una función distinta. El bus
CÓDIGO DE DESCRIPCIÓN "seleccion" se compone de los dos bits de entrada
LIBRARY ieee;
s0 y s1, estas se juntan en este bus únicamente
USE ieee.std_logic_1164.ALL; para facilitarnos la descripción. Y mediante los
USE ieee.numeric_std.ALL; bloques de la instrucción WITH... SELECT...
WHEN y la instrucción WHEN... ELSE se
ENTITY alu IS
PORT ( x, y: IN std_logic; asignan los datos correspondientes a cada salida
s0, s1: IN std_logic; de a cuerdo a las combinaciones de los bits s0 y
ci: IN std_logic; s1.
z: OUT std_logic;
co: OUT std_logic);
END alu;

ARCHITECTURE a_alu OF alu IS


SIGNAL seleccion: unsigned(1 DOWNTO 0);
SIGNAL suma: std_logic;
SIGNAL and_op: std_logic;
SIGNAL or_op: std_logic;
SIGNAL xor_op: std_logic;
SIGNAL acarreo: std_logic;
BEGIN

and_op <= x AND y ;

WITH seleccion SELECT


z <= or_op WHEN "01",
and_op WHEN "00",
suma WHEN "11",
xor_op WHEN "10",
'0' WHEN OTHERS;

seleccion <= s1 & s0;

suma <= x XOR y XOR ci;

or_op <= x OR y;

acarreo <= (x AND y) OR


(x AND ci) OR
(y AND ci);
Figura 3.9 Diagrama a bloques de la ALU
xor_op <= x XOR y;
El que hayamos realizado la descripción con
co <= acarreo WHEN seleccion = 3 ELSE tantos bloques no significa necesariamente que
'0' ; cuando el compilador sintetice el código respete
END a_alu;
todos esos bloques y quede exactamente como lo
describimos dentro del dispositivo que
Este circuito se sintetizo en un GAL22V10 seleccionamos. El compilador de WARP
utilizando WARP 5.0 de Cypress interpreta nuestra descripción y la sintetiza dentro
Semiconductors. Obsérvese que en el código de del dispositivo utilizando el mínimo de
descripción de esta alu no existe ningún orden en compuertas posible al mismo tiempo que trata de
las ecuaciones, asignaciones o instrucciones, de respetar la descripción del código, además, que
hecho el orden en el que se coloquen las por lo general trata de evitar retroalimentaciones

IEC FRANCISCO JAVIER TORRES VALLE 39


CAPÍTULO III: SINTAXIS DEL LENGUAJE

para que el dispositivo funcione a altas


velocidades. De hecho en ocasiones es posible
que existan todavía macroceldas libres, pero
como el compilador evita retroalimentaciones,
entonces no las usa. Como indicar que se usen
esas macroceldas libres se explicará
posteriormente, ya que este circuito sí puede
quedar dentro de un GAL16V8 utilizando
directivas de síntesis. A continuación se muestran
las ecuaciones, la asignación de pines y el
informe de utilización del dispositivo obtenidos
Summary:
por el compilador de WARP. Error Count = 0 Warning Count = 0
------------------------------------------ Completed Successfully
ECUACIONES ------------------------------------------
------------------------------------------

PLD Compiler Software: MAX2JED.EXE ------------------------------------------


02/APR/1999 [v4.02 ] 5.2 IR 17
UTILIZACIÓN
DESIGN EQUATIONS (05:56:54) ------------------------------------------

PLD Compiler Software: PLA2JED.EXE


02/APR/1999 [v4.02 ] 5.2 IR 17
RESOURCE UTILIZATION (06:15:25)
Information: Macrocell Utilization.

Information: Output Logic Product Term


Utilization.

Completed Successfully
------------------------------------------

------------------------------------------
PIN – OUT
------------------------------------------

PLD Compiler Software: PLA2JED.EXE


02/APR/1999 [v4.02 ] 5.2 IR 17
Completed Successfully
PINOUT INFORMATION (06:15:24) ------------------------------------------

Messages:
Information: Checking for duplicate NODE
logic.
None.

IEC FRANCISCO JAVIER TORRES VALLE 40


CAPÍTULO III: SINTAXIS DEL LENGUAJE

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

IEC FRANCISCO JAVIER TORRES VALLE 41


CAPÍTULO III: SINTAXIS DEL LENGUAJE

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;

En el ejemplo anterior únicamente nos


importan las combinaciones s = 3, s = 1, y s = 0.
En algunos programas de VHDL para síntesis, y
también dependiendo de la arquitectura del
dispositivo, la asignación de un "no importa" nos
Figura 3.10 Comparador va a permitir que se simplifique la ecuación de
y_tmp, quedando como:
Este ejemplo corresponde al mismo comprador
utilizado en el tema 3.1.2. Se definen 2 vectores y_tmp = s(1) +s(0)'
de 4 bits y 3 salidas de 1 bit. Esta arquitectura
únicamente tiene una instrucción concurrente: el De no utilizarla posiblemente quede de la
bloque PROCESS, el cual es sensible a los siguiente forma:
vectores de entrada. Siempre que ocurra un
cambio en alguno de estos, el proceso será y_tmp = s(0)'·s(1)' + s(0)·s(1)
llamado y generará la lógica de salida. La lista
sensible está completa porque, si observamos, el

IEC FRANCISCO JAVIER TORRES VALLE 42


CAPÍTULO III: SINTAXIS DEL LENGUAJE

3.10.3 DIFERENCIAS ENTRE SEÑALES Y z1 <= z_var;


-- driver de z1 = z_var = x,
VARIABLES -- esto es valido porque son
-- objetos que manejan el mismo
Un objeto de datos del tipo señal es muy -- tipo de datos
diferente a uno del tipo variable. Ya se había
z2 <= z_sig; -- z2 = z_sig = x AND y
mencionado que las señales pueden ser
sintetizados en elementos lógicos y/o conexiones, END PROCESS; -- finalizado el proceso,
lo cual no es posible con un variable. Una señal -- valor actual de z1 = x
representa un nodo de conexión entre elementos -- valor actual de z2 = x AND y
lógicos (compuertas, registros, buffers, etc.). z3 <= x OR y;
Inclusive un mismo nodo puede recibir más de un -- valor actual de z3 = x OR y,
nombre para facilitar la descripción, sin que esto -- en todo momento
END ejemplo_proceso;
implique más términos en las ecuaciones de
salida. Una señal que se vea involucrada dentro Otro detalle importante en VHDL para síntesis,
de un proceso no recibe inmediatamente el valor es que el valor actual de una señal no puede verse
asignado, sólo hasta el final del mismo. Una modificado más de una vez dentro de la
variable que sea utilizada dentro de un proceso sí arquitectura, porque las señales representan
recibe el valor de forma inmediata, por lo que son conexiones y esto equivaldría a unir dos cables. Y
muy útiles para poder obtener el estado de salida esto generalmente resultará en un error de
deseado para alguna señal de salida. Una variable compilación durante el proceso de síntesis.
funciona exactamente igual que cualquier variable
de cualquier lenguaje de programación de EJEMPLOS
software.
ARCHITECTURE no_valida1 OF senial IS
Podemos decir que una señal está formada por BEGIN
dos partes: un valor actual y un valor futuro (o z <= x AND y;
valor en proceso). El valor futuro es el que se z <= x OR y;
calcula dentro del proceso y una vez que se END no_valida1;
termina el proceso, los valores futuros de todas ARCHITECTURE no_valida2 OF senial IS
las señales se convierten en valores actuales. Al BEGIN
valor futuro se le conoce como driver. En VHDL PROCESS(x, y)
BEGIN
para síntesis el driver nunca es afectado fuera de z <= x OR y; -- driver de z = x OR y
un proceso, fuera de éste siempre estamos END PROCESS; -- finalizado el proceso,
modificando el valor actual. -- valor actual de z = x OR y

z <= x AND y; -- ERROR, se vuelve a


EJEMPLO -- modificar el valor actual de z
END no_valida2;
ENTITY proceso IS
PORT( x, y: IN bit; ARCHITECTURE valida1 OF senial IS
z1, z2, z3: OUT bit ); BEGIN
END proceso; PROCESS(x, y)
BEGIN
ARCHITECTURE ejemplo_proceso OF proceso IS z <= x AND y; -- driver de z = x AND y
BEGIN z <= x OR y; -- se modifica el driver
PROCESS (x,y) -- de z, driver de z = x OR y
VARIABLE z_var: bit;
SIGNAL z_sig: bit; END PROCESS; -- finalizado el proceso,
BEGIN -- valor actual de z = x OR y
z_var := '1'; -- z_var = '1'
z_sig <= '1'; -- driver de z_sig = '1' END valida1;

z_var := x AND z_var;


-- z_var = x AND '1'
-- z_var = x

z_sig <= x AND y;


-- driver de z_sig = x AND y

IEC FRANCISCO JAVIER TORRES VALLE 43


CAPÍTULO III: SINTAXIS DEL LENGUAJE

3.10.4 ESTRUCTURAS DE EJECUCIÓN EJEMPLO


SECUENCIAL
FOR i IN 3 DOWNTO 0 LOOP
-- i es una variable y no necesita ser
• IF - THEN - ELSE -- declarada
IF reset ( i ) = '1' THEN
SINTAXIS data_out ( i ) <= '0';
END IF;
IF condición THEN END LOOP;
· · ·
ELSIF condición THEN
· · · • WHILE - LOOP
END IF;
WHILE condición LOOP
EJEMPLO · · ·
END LOOP;
SIGNAL conteo: unsigned(3 DOWNTO 0);
· · · EJEMPLO
IF conteo = X"9" THEN contador := 0;
conteo <= ( OTHERS => '0' ) ; resultado_tmp := 0;
ELSE WHILE contador > 0 LOOP
conteo <= conteo + 1; contador := contador - 1;
END IF; resultado_tmp:= resultado_tmp+data_in;
END LOOP;
resultado <= resultado_tmp;
• CASE - WHEN • WAIT
CASE expresión IS La instrucción WAIT es utilizada en procesos
WHEN alternativa1 => que no tienen una lista sensible, ya que esta
· · · instrucción define implícitamente la lista sensible
WHEN alternativa2 =>
· · · del proceso. A continuación se muestran las 3
WHEN OTHERS => formas de utilizar la instrucción WAIT.
· · ·
END CASE; WAIT ON -- espera los cambios de las
-- señales especificada
EJEMPLO
WAIT UNTIL -- espera a que se cumpla la
-- condición especificada
TYPE estados IS (estado1, estado2,
estado3, estado4); WAIT FOR -- detiene la simulación
SIGNAL estado_maquina: estados; -- durante el tiempo
SIGNAL motor, alarma: bit; -- especificado
CONSTANT encendido: bit := '1';
CONSTANT apagado: bit := '0';
· · · La instrucción WAIT ON no es aceptada por la
CASE estado_maquina IS mayoría de los herramientas de síntesis, WAIT
WHEN estado0 =>
motor <= apagado;
FOR solo se utiliza para simulaciones. La única
WHEN estado1=> forma en que puede ser utilizada la instrucción
motor <= encendido; WAIT en síntesis sin tener problemas es
WHEN (estado3 OR estado4) => utilizándola como WAIT UNTIL.
alarma <= encendido;
WHEN OTHERS =>
motor <= apagado; EJEMPLO
alarma <= apagado;
END CASE;
PROCESS
BEGIN
• FOR - LOOP WAIT UNTIL rising_edge( clk ) ;
-- la función rising_edge viene
FOR identificador IN rango LOOP -- incluida en el paquete
-- std_logic_1164 y
· · ·
END LOOP; -- equivale a utilizar:
-- clk'event AND clk = '1'
IF reset = '1' THEN

IEC FRANCISCO JAVIER TORRES VALLE 44


CAPÍTULO III: SINTAXIS DEL LENGUAJE

y <= (OTHERS => '0');


ELSE
y <= y + 1;
END IF;
END PROCESS;

IEC FRANCISCO JAVIER TORRES VALLE 45


CAPÍTULO III: SINTAXIS DEL LENGUAJE

3.11 DESCRIPCIONES Las descripciones estructurales son útiles


ESTRUCTURALES cuando se trata de diseños jerárquicos. Este
ejemplo pretende mostrar como son este tipo de
En el siguiente ejemplo se muestra el código descripciones, aunque no es una aplicación
para una descripción estructural correspondiente práctica utilizar este estilo con circuitos sencillos
al circuito de la figura 3.11. como el anterior.

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;

IEC FRANCISCO JAVIER TORRES VALLE 46


CAPÍTULO III: SINTAXIS DEL LENGUAJE

· · · 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

OPEN indica cuando un puerto de salida del ARCHITECTURE a_reg8 OF reg8 IS


componente no se conecta a nada. SIGNAL clock, reset, enable: std_logic;
SIGNAL data_in: std_logic_vector(7
DOWNTO 0);
EJEMPLO SIGNAL data_out: std_logic_vector(7
DOWNTO 0);
BEGIN
ARCHITECTURE a_reg8 OF reg8 IS
SIGNAL clock, reset, enable: std_logic; reg_1: register8 PORT MAP(clock, reset,
SIGNAL data_in: std_logic_vector(7

IEC FRANCISCO JAVIER TORRES VALLE 47


CAPÍTULO III: SINTAXIS DEL LENGUAJE

enable, data_in, data_out);

END a_reg8;

IEC FRANCISCO JAVIER TORRES VALLE 48


CAPÍTULO III: SINTAXIS DEL LENGUAJE

ASOCIACIÓN POR POSICIÓN CON GENÉRICOS

etiqueta: identificador GENERIC MAP(


señal, variable, expresión, OPEN,
..., señal);
PORT MAP ( señal, variable, OPEN,
señal, variable, OPEN, ..., señal);

EJEMPLO

ARCHITECTURE a_sum4 OF sumador4 IS


SIGNAL carry_in, carry_out: std_logic;
SIGNAL x, y, z: std_logic_vector(3
DOWNTO 0);
BEGIN

-- add_n es el componente de ejemplo en


-- "declaración de componentes con
-- genéricos"
c(2*i + 1) <= a(i) NOR x;
u1: add_n GENERIC MAP(4); c(2*i) <= b(i) NOR x;
PORT MAP(x, y, carry_in, z, END GENERATE;
carry_out);
Figura 3.12 For... Generate
END a_reg8;
El uso más común de las instrucciones de
generación es para crear múltiples copias de
3.11.3 SENTENCIAS DE GENERACIÓN componentes y procesos. En el siguiente ejemplo
se muestra como utilizar estas instrucciones con
Las sentencias de generación de componentes componentes y en la figura 3.13 se muestra el
permiten crear una o más copias de un conjunto circuito resultante.
de interconexiones, lo cual facilita el diseño de
circuitos mediante descripciones estructurales. COMPONENT comp
PORT (x : IN bit;
• FOR.. GENERATE y : OUT bit);
END COMPONENT;
Esta instrucción genera un número finito de · · ·
SIGNAL a, b: bit_vector(0 TO 7);
conexiones o de instrucciones concurrentes . . .
mediante rango discreto. gen: FOR i IN a'RANGE GENERATE
u: comp PORT MAP (x => a(i),
SINTAXIS

etiqueta: FOR indice IN rango GENERATE


{ instucciones_concurrentes }
END GENERATE;

La etiqueta es necesaria y el índice de bucle es


una variable del tipo entero que no necesita ser
declarada anteriormente.
EJEMPLO
El siguiente ejemplo muestra como conectar
dos arreglos de cuatro bits un tercer arreglo de
ocho bits.

SIGNAL a, b : bit_vector(3 DOWNTO 0);


SIGNAL c : bit_vector(7 DOWNTO 0);
SIGNAL x : bit;
. . .
genera: FOR i IN 3 DOWNTO 0 GENERATE y => b(i));

IEC FRANCISCO JAVIER TORRES VALLE 49


CAPÍTULO III: SINTAXIS DEL LENGUAJE

END GENERATE gen; PROCESS(clk, s)


BEGIN
IF clk'EVENT AND clk='1' THEN
Figura 3.13 Instaniación de Componentes convert(i) <= s(i-1);
utilizando la inst. For... Generate END IF;
END PROCESS;
END GENERATE;
• IF.. GENERATE
If... Generate realiza la instrucción de -- Almacena el bit de entrada DATA en el
instanciación o la instrucción concurrente sólo si -- primer registro
la condición de prueba es válida. g3: IF (i = convert'RIGHT) GENERATE
PROCESS(clk,s)
SINTAXIS BEGIN
IF clk'EVENT AND clk='1' THEN
etiqueta: IF condición GENERATE convert(i) <= data;
{ instucciones_concurrentes } END IF;
END GENERATE; END PROCESS;
s(i) <= convert(i);
END GENERATE;
El uso es similar a la instrucción secuencial END GENERATE;
IF... THEN, la diferencia es que en esta no se END behavior;
pueden utilizar la condiciones extras ELSE o
ELSIF. El siguiente ejemplo muestra la Como podrá observar en la figura 3.14 las
descripción de un registro de conversión serie- retroalimentaciones en algunas ocasiones se
paralelo de N bits. La información serial DATA realizaron desde la salida Q de cada registro y en
es almacenada en los registros CONVERT a otros usando la salida negada. Esto dependerá del
través de cnexiones mediante la señal S, en cada programa de síntesis utilizado y del dispositivo
transición positiva del reloj. El circuito resultante empleado.
se muestra en la figura 3.14.

ENTITY converter IS
GENERIC(n: integer := 8);
PORT(clk, data: IN bit;
convert: BUFFER bit_vector(n-1
DOWNTO 0));
END converter;

ARCHITECTURE behavior OF converter IS


SIGNAL s: bit_vector(convert'RANGE);
BEGIN

g: FOR i IN convert'RANGE GENERATE

-- Desplaza el bit del registro (N-2)


-- en el registro superior (N-1).
-- Ya que el bit N-1 se pierde en
-- cada transición del reloj.

g1: IF (i = convert'LEFT) GENERATE


PROCESS(clk, s)
BEGIN
IF clk'EVENT AND clk='1' THEN
convert(i) <= s(i-1);
END IF;
END PROCESS;
END GENERATE;

-- Desplaza los bits intermedios


-- hacia arriba

g2: IF (i > convert'RIGHT AND


i < convert'LEFT) GENERATE
s(i) <= s(i-1) AND convert(i);

IEC FRANCISCO JAVIER TORRES VALLE 50


CAPÍTULO III: SINTAXIS DEL LENGUAJE

Figura 3.14 Diseño de circuitos utilizando la inst. If... Generate

IEC FRANCISCO JAVIER TORRES VALLE 51


CAPÍTULO III: SINTAXIS DEL LENGUAJE

3.12 SUBPROGRAMAS parámetros es un variable, entonces el


procedimiento puede ser utilizado sólo
Los subprogramas son secuencias secuencialmente. Recordemos que las variables
independientes de instrucciones y declaraciones solamente pueden ser declaradas dentro procesos,
que pueden ser llamadas en repetidas ocasiones procedimientos y funciones y por esto un
dentro de una arquitectura, proceso, o cuerpo de un procedimiento que utilice una variable como
paquete en VHDL. Existen dos tipos de parámetro puede ser invocado únicamente dentro
subprogramas: procedimientos y funciones. del proceso en el que se encuentra declarada dicha
variable.
Desde el punto de vista del hardware, un
llamado a un subprograma es similar a la Una variable declarada dentro de un
instanciación de un componente, con la diferencia procedimiento existe solamente en el momento de
que el subprograma forma parte del circuito en el ejecución del mismo, similar a la declaración de
cual esta siendo utilizado. La instanciación de un variables dentro de procesos.
componente o módulo, implica la síntesis de dos o
más niveles de jerarquía en el diseño. Un DECLARACIÓN DE PROCEDIMIENTOS
subprograma sintetizado generalmente es un único
circuito combinacional (utilícese un proceso si se PROCEDURE procedimiento ( lista de
desea crear un circuito secuencial). parámetros );

Los subprogramas se declaran habitualmente en


CUERPO DEL PROCEDIMIENTO
paquetes y los cuerpos de dichos subprogramas
son implementados en el cuerpo del paquete en el PROCEDURE procedimiento (lista de
que fueron declarados. Aunque es posible definir parámetros ) IS
los subprogramas dentro de otras estructuras -- declaraciones
(arquitecturas y procesos), no es común que se BEGIN
-- instrucciones secuenciales
haga, además, que algunos sintetizadores END procedimiento;
restringen la utilización de ellos sólo dentro de
paquetes. Acerca de dichas restricciones en el uso EJEMPLO
de subprogramas, consúltese los manuales de
referencia de VHDL o manuales de usuario del PACKAGE ejemplo IS
sintetizador que se este utilizando. -- declaración de procedimiento
PROCEDURE procedimiento(a: IN bit ;
b: INOUT bit);
3.12.1 PROCEDIMIENTOS END ejemplo;

Un procedimiento es un algoritmo que puede PACKAGE BODY ejemplo IS


-- cuerpo del procedimiento
regresar uno o varios valores y que, además, puede PROCEDURE procedimiento ( a: IN bit ;
o no tener parámetros. Estos se utilizan b: INOUT bit) IS
generalmente para descomponer grandes BEGIN
b := a AND b ;
descripciones comportamentales en pequeñas END;
secciones, las cuales a su vez pueden ser utilizadas END ejemplo;
por distintos procesos dentro de la descripción.
Los parámetros que se utilizan en el llamado de 3.12.2 FUNCIONES
un procedimiento deben ser constantes, variables,
o señales. Además, también debe especificarse el Una función es un algoritmo que retorna un
modo ya sea IN, OUT, o INOUT. A menos que se único valor y puede o no tener parámetros de
especifique, un parámetro se considera como una entrada. Las funciones se utilizan generalmente
constante si se utiliza en el modo IN, y por para:
omisión una variable si se utiliza el modo INOUT (1) Convertir objetos de datos de un tipo a otro.
o OUT.
(2) Como simples funciones que realizan
Los procedimientos pueden ser utilizados de operaciones para las más frecuentes
manera concurrente o secuencial, es decir, ya sea situaciones de diseño. Los parámetros de una
fuera o dentro de un proceso. Si alguno de los función siempre son del modo IN y deben

IEC FRANCISCO JAVIER TORRES VALLE 47


CAPÍTULO III: SINTAXIS DEL LENGUAJE

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;

IEC FRANCISCO JAVIER TORRES VALLE 48


CAPÍTULO III: SINTAXIS DEL LENGUAJE

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;

IEC FRANCISCO JAVIER TORRES VALLE 49


CAPÍTULO III: SINTAXIS DEL LENGUAJE

ARCHITECTURE funcion OF uso_funcion IS -- de datos


BEGIN
valor_de_retorno <= ejemplo_func(in1, FUNCTION "AND" (input1, input2: IN mi_bit)
in2, in3); RETURN mi_bit;
END funcion; FUNCTION "OR" (input1, input2: IN mi_bit)
RETURN mi_bit;
· · ·
SIGNAL a, b, c: mi_bit;
En el siguiente ejemplo, la función OPERATE · · ·
realiza las funciones AND y OR con los operandos c <= ( a OR b ) AND c;
de entrada A y B. LA operación realizada depende
del valor del parámetro OPERATION. El circuito Cuando se sobrecarga un operador en VHDL, es
resultante se muestra en la figura 3.15. necesario que el nombre del operador se encuentre
entre comillas dobles " " para que el programa de
síntesis lo interprete como operador. Si no se hace
FUNCTION operate(a, b, operation: bit) así entonces se considera a la función como tal y
RETURN bit IS no como un operador sobrecargado.
BEGIN
IF (operation = '1') THEN
RETURN (a AND b);
ELSE 3.13 LIBRERÍAS
RETURN (a OR b);
END IF;
END operate;
Una librería consiste en una colección de
unidades de diseño analizadas previamente con lo
cual se facilita la utilización de estas en nuevos
diseño. Para incluir una librería se utiliza la
siguiente sintaxis.

LIBRARY identificador_librería;

La cláusula LIBRARY permite utilizar la


Figura 3.15 Circuito generado mediante el uso de librería especificada únicamente para la unidad de
funciones diseño en la cual se declara. Una unidad de diseño
es una entidad, paquete, arquitectura, o cuerpo de
paquete.
3.12.4 SOBRECARGA DE OPERADORES
La sobrecarga de operadores consiste en definir EJEMPLO
nuevas funciones para utilizar tipos de datos con
los que no estaba definido anteriormente el LIBRARY mi_libreria;
operador. Así, por ejemplo el operador AND no
está definido de manera predeterminada para ser
utilizado con los tipos std_logic_vector, unsigned 3.13.1 SÍNTESIS DE LIBRERÍAS EN WARP
y signed. Pero dentro de los paquetes
Para sintetizar librerías en WARP de Cypress
std_logic_1164, numeric_std, y numeric_bit, que
Semiconductors necesitas hacer lo siguiente:
es donde se definen estos tipos de datos, se
sobrecarga el operador AND para poder utilizarlo
con estos tipos de datos. También es posible crear 1. – Dentro de Galaxy selecciona: File > New >
operadores para ser utilizados con los tipos de Project [ Target - Library ]
datos definidos por el usuario.

EJEMPLO
TYPE mi_bit IS ('0', '1', 'x') ;
-- tipo de datos definido por el usuario

-- Sobrecarga de los operadores AND y OR


-- para ser utilizados con el nuevo tipo

IEC FRANCISCO JAVIER TORRES VALLE 50


CAPÍTULO III: SINTAXIS DEL LENGUAJE

Como ya se menciono anteriormente, en una


2. – A continuación proporcionas la información librería puedes incluir todas las unidades de diseño
del nombre de la librería, nombre del que desees, siendo unidades de diseños las
proyecto, y localización del proyecto en disco estructuras: ENTITY, ARCHITECTURE,
duro. Cabe mencionar que es posible crear PACKAGE, o PACKAGE BODY. Por lo general
cualquier número de proyectos dentro del en los archivos de librería se utilizan paquetes.
mismo directorio, y todos compilando la
Para incluir una librería creada por el usuario en
misma librería. Por ejemplo, podemos crear
algún proyecto en particular necesitar hacer lo
un proyecto con el nombre "multiplexores"
siguiente:
para compilar dentro de la librería
"mi_libreria" en el directorio
"c:\vhdl_proj\mi_libreria". Diseñar todas las
1. – Seleccionas Project > Library Manager...
unidades de diseño deseadas dentro de esta
librería y compilarlas en la misma. Después
podemos otro proyecto con el nombre
2. – Dentro del cuadro de dialogo del
"comparadores" para compilar en la librería
administrador de librerías, seleccionas Assign
"mi_libreria" en el directorio
y después haces click en el botón Add...
"c:\vhdl_proj\mi_libreria". Diseñar otras
unidades de diseño y compilarlas. Cuando se
incluya la librería "mi_librería" en otros
proyectos podemos utilizar cualquier unidad
de diseño que se encuentre ya sea en el
proyecto de librería "multiplexores" o en el de
"comparadores". Esto es posible porque
ambos proyectos se compilaron en una
librería con el mismo nombre y en el mismo
directorio.

3. – Ahora se te pide el nombre de la librería que


vas a incluir y la ruta en donde se encuentran
los archivos de la librería. Por ejemplo, en
Library podrías poner la librería del ejemplo
anterior "mi_libreria". Y en el Path escribes
la ruta del directorio donde se encuentra
3. – Después aparece un cuadro de dialogo en el compilada la librería. Debes escribir toda la
cual puedes agregar archivos .vhd al proyecto ruta tal y como aparece en MS-DOS. Esta
de librería. Si ya los tienes, puedes copiarlos librería se creo en el directorio
al directorio o buscarlos mediante el botón "c:\vhdl_proj\mi_libreria", pero la librería se
Browse... agregarlos al proyecto. Si no los compilo en el directorio
tienes sólo haz click en Finalizar y "c:\vhdl_proj\mi_libreria\mi_libreria" y el
posteriormente podrás crear los archivos del nombre MS-DOS del directorio es "
proyecto de librería. C:\vhdl_p~1\mi_lib~1\mi_lib~1".

IEC FRANCISCO JAVIER TORRES VALLE 51


CAPÍTULO III: SINTAXIS DEL LENGUAJE

RETURN tempo ;
END;
END swap ;

-- instanciación de un paquete que se


-- encuentra en el mismo proyecto
USE work.swap.ALL;

ENTITY swap_ent IS
PORT (x:IN bit_vector(3 DOWNTO 0);
y: OUT bit_vector(3 DOWNTO 0));
END swap_ent;

ARCHITECTURE swap_ent OF swap_ent IS


BEGIN
y <= swap4(x) ;
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.

EJEMPLO DECLARACIÓN DEL PAQUETE


Crea un nuevo proyecto en WARP y en un
PACKAGE identificador IS
archivo de texto copia toda la siguiente -- declaración de subprograma
descripción. -- declaración de tipo de datos
-- declaración de subtipos
PACKAGE swap IS -- declaración de constantes
FUNCTION swap4(data: IN bit_vector -- declaración de señales
( 3 DOWNTO 0 ) ) -- declaración de componentes
RETURN bit_vector; -- declaración de atributos
END swap; -- especificación de atributos
-- instrucción USE
PACKAGE BODY swap IS END identificador;
FUNCTION swap4 (data: IN bit_vector
( 3 DOWNTO 0 ) )
RETURN bit_vector IS
CUERPO DEL PAQUETE
VARIABLE tempo: bit_vector
( 3 DOWNTO 0 ); PACKAGE BODY identificador IS
BEGIN -- declaración de subprograma
tempo := data(1 DOWNTO 0)& -- cuerpo del subprograma
data(3 DOWNTO 2); -- declaración de tipo de datos

IEC FRANCISCO JAVIER TORRES VALLE 52


CAPÍTULO III: SINTAXIS DEL LENGUAJE

-- declaración de subtipos LIBRARY ieee;


-- declaración de constantes USE ieee.std_logic_1164.ALL;
-- instrucción USE
END identificador; ENTITY mux_2_a_1 IS
GENERIC ( msb: integer := 3 ) ;
-- debe declararse siempre un valor
En la declaración del paquete se hace mención -- inicial para que en caso de no ser
de todo aquello que puede ser utilizado por otras -- especificado en el momento de la
descripciones cuando se incluye el paquete. El -- instanciación, el componente tome un
cuerpo del paquete proporciona definiciones y -- valor por omisión
PORT(selec: IN std_logic;
declaraciones adicionales, así como la descripción x: IN std_logic_vector
completa de funciones y procedimientos que (msb DOWNTO 0);
fueron declarados previamente en el paquete. y: IN std_logic_vector
(msb DOWNTO 0);
EJEMPLO z: OUT std_logic_vector
(msb DOWNTO 0));
END mux_2_a_1;
PACKAGE v3_tbl IS
SUBTYPE v3 IS std_logic_vector(0 TO 2);
ARCHITECTURE a_mux_2_a_1 OF mux_2_a_1 IS
TYPE v3_array IS ARRAY(0 TO 7) OF v3;
BEGIN
CONSTANT v3_table : v3_array := (
z <= x WHEN selec = '1' ELSE
"000",
y WHEN selec = '0';
"001",
END a_mux_2_a_1 ;
"010",
"011",
"100", Sintetiza el proyecto y después crea otro para
"101", utilizar el paquete anterior. Para agregar la librería
"110",
"111") ; a este nuevo proyecto hazlo desde el administrador
FUNCTION int2v3 (ia: integer) RETURN v3; de librerías. Crea un nuevo archivo de texto y
END v3_tbl; copia la siguiente descripción en él.
-- convierte un entero entre 0 y 7 en un
-- vector de 3 bits
PACKAGE BODY v3_tbl IS
LIBRARY ieee;
FUNCTION int2v3 (ia: integer) RETURN v3
USE ieee.std_logic_1164.ALL;
IS
USE mi_libreria.multiplexores.ALL;
BEGIN
-- referencia al paquete multiplexores
RETURN v3_table(ia);
-- que se encuentra dentro
END int2v3;
-- de la librería "mi_libreria"
END v3_tbl;
ENTITY multiplexor IS
EJEMPLO PORT(a,b,c,d: IN std_logic_vector
(3 DOWNTO 0);
selec: IN std_logic_vector
Para este ejemplo crea un proyecto para (1 DOWNTO 0);
compilar la librería "mi_libreria". Crea un nuevo salida: OUT std_logic_vector
(3 DOWNTO 0));
archivo de texto y copia la siguiente descripción en END multiplexor;
él.
ARCHITECTURE estructural OF multiplexor IS
LIBRARY ieee; SIGNAL salida1: std_logic_vector
USE ieee.std_logic_1164.ALL; (3 DOWNTO 0);
SIGNAL salida2: std_logic_vector
PACKAGE multiplexores IS (3 DOWNTO 0);
COMPONENT mux_2_a_1 BEGIN
GENERIC(msb: integer); -- instanciación del componente mux_2_a_1
PORT( selec: IN std_logic; u1: mux_2_a_1 PORT MAP
x: IN std_logic_vector (a, b, selec(0), salida1);
(msb DOWNTO 0); u2: mux_2_a_1 PORT MAP
y: IN std_logic_vector (c, d, selec(0), salida2);
(msb DOWNTO 0); u3: mux_2_a_1 PORT MAP
z: OUT std_logic_vector (salida1, salida2, selec(1),
(msb DOWNTO 0)); salida) ;
END COMPONENT; END estructural ;
END multiplexores;

IEC FRANCISCO JAVIER TORRES VALLE 53


CAPÍTULO III: SINTAXIS DEL LENGUAJE

Como se mencionó al principio una librería es


una colección de unidades de diseño que pueden
ser incluidas es otras descripciones mediante el
llamada a la respectiva librería.

IEC FRANCISCO JAVIER TORRES VALLE 54


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

IV DESCRIPCIÓN DE
CIRCUITOS
DIGITALES

IEC FRANCISCO JAVIER TORRES VALLE 54


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

4.1 PROYECTOS EN WARP 5.0 Figura 4.2

El objetivo de este capítulo es enseñarte a crear 3. Posteriormente debe aparecer un cuadro de


proyectos en VHDL utilizando Warp de Cypress dialogo como el que se muestra a continuación.
Semiconductors. Así como diferentes métodos Para crear un proyecto con el que quieres
prácticos para la síntesis de los circuitos digitales programar un dispositivo debes de seleccionar la
más comunes. segunda opción (Project [Target - Device]).

PROCEDIMIENTO
1. Una vez en Windows haz click en el botón de
inicio, selecciona Programas > Warp R5.0 >
Galaxy.

4. Cuando selecciones la opción de Project


[Target - Device] aparecerá una ventana que te
pide que pongas un nombre a tu proyecto, escribe
el nombre de nuevo. En el segundo cuadro de texto
te pide que especifiques el directorio en donde
debe de guardar tu proyecto, puedes hacer un
directorio nuevo desde esa misma ventana con solo
escribir el nombre, por ejemplo c:\nuevo, o puedes
buscar una carpeta ya existente con la opción
Browse. Cuando hayas terminado de especificar
los nombres haz click en el botón de Siguiente.

Figura 4.1

2. Cuando te encuentres dentro del Galaxy,


selecciona File > New.

Figura 4.3

5. Aparecerá una ventana con título Add Files to


Project, esta ventana se usa cuando ya tienes
archivos que quieres agregar a tu proyecto, pero en
esta ocasión por tratarse de un proyecto totalmente
nuevo no es necesario especificar nada dentro de
esta ventana. Solo haz click en el botón de
Siguiente.

IEC FRANCISCO JAVIER TORRES VALLE 55


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

7. Luego de lo anterior, aparecerá una ventana


que te pregunta si deseas guardar tu nuevo
proyecto, solo haz click en Sí.
8. Ahora ya tienes un nuevo proyecto donde se
encuentra suficiente información para que el
compilador te genere el archivo .jed. Pero te falta
agregar el código que habrá de compilarse.
Selecciona File > New > Text File, o puedes hacer
click en el icono de nuevo. Escribe lo siguiente
dentro del archivo de texto:

library ieee;

Elige File > Save As y en la opción de Guardar


en, selecciona el nombre de la carpeta que usaste
Figura 4.4 en el paso número 4 (c:\nuevo). Una vez que hayas
6. La siguiente ventana lleva el título de Select seleccionado el directorio, escribe el nombre de
Target Device, esta ventana es muy importante ya archivo, se sugiere el nombre nuevo, con la
que es aquí donde debes de especificar el PLD en extensión .vhd, ya que de esta manera se especifica
el que vas a trabajar. Los PLD's que se usan un archivo que contiene un código en VHDL.
cuando se está aprendiendo son los pequeños Luego de hacer esto, guarda tu archivo.
(generalmente 16V8, 22V8 ó 22V10), estos PLD's 9. Cierra el archivo de texto.
están en la ventana como SPLD. Haz doble click
sobre este texto, te aparecerá una lista de los 10. Selecciona Project > Add Files, te aparecerá
SPLD's más comunes, selecciona el SPLD que te una ventana que debe de tener tu archivo
interese y nuevamente aparecerá una lista donde nuevo.vhd , haz click en Add, y posteriormente en
hay varios tipos del mismo SPLD, por ejemplo OK.
PALCE16V8-10PC/PI. Esta parte es importante,
ya que debes de seleccionar un SPLD que tenga un
encapsulado de tipo PDIP, para que lo puedas
montar en tu protoboard. En la parte inferior
aparece información sobre el SPLD que te interese.
Cuando escojas el SPLD adecuado haz click en
Finalizar.

Figura 4.6

11. Tu archivo de texto se ha convertido en un


archivo de VHDL y está dentro de tu proyecto,
todo lo que programes, será compilado en el
dispositivo que especificaste. En tu ventana de
proyecto (si no se encuentra abierta, la puedes
activar haciendo View > Project Window) debe de
aparecer un icono en forma de hoja que tiene el
nombre de tu proyecto. Haz click en esta hoja y te
Figura 4.5 debe de aparecer un archivo con la instrucción:
library ieee; solo que ahora la palabra library está

IEC FRANCISCO JAVIER TORRES VALLE 56


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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

12. Si la configuración de colores es la normal, Figura 4.8


notarás que todas las palabras reservadas se
muestran en color azul y los comentarios en color 2. Lo anterior abrirá la ventana de opciones de
rojo. Ahora ya puedes comenzar a hacer tu compilación, dentro de esta se encuentra una
descripción en VHDL. sección para elegir el formato de los retardos para
simular el circuito Simulation—Timing Model.
Aquí es donde debes de seleccionar el formato
4.2 SIMULACIÓN DE 1164/VHDL.
PROYECTOS
Active - HDL de la empresa Aldec Inc. es un
simulador que utiliza un archivo de post - síntesis
creado por WARP. Éste es un archivo .vhd con los
retardos de tiempo del código sintetizado en el
dispositivo seleccionado. Este tema tiene por
objetivo dar una pequeña introducción a este
simulador de VHDL en las siguientes tres
secciones.
1. Formato de simulación 1164/VHDL.
2. Simulación.
3. Tipos de señales de estimulación.

FORMATO DE SIMULACIÓN 1164/VHDL


El archivo de entrada para Active - HDL es un
modelo de simulación post - síntesis generado Figura 4.9
cuando se compila un archivo .vhd en el
dispositivo elegido. En WARP es posible crear 3. Asegúrate que se encuentre habilitado el
archivos con diferentes formatos para simulación cuadro de Enable Testbench Output.
post - síntesis. Active - HDL requiere de un archivo
con el formato de simulación IEEE - 1164 / VHDL. 4.2.1 PROCESO DE SIMULACIÓN
Para crear este archivo post - síntesis debes
El proceso de simulación lo podemos resumir en
seguir el siguiente procedimiento.
los siguientes siete pasos.

IEC FRANCISCO JAVIER TORRES VALLE 57


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

1. Cargar un archivo con el formato de 2. - INICIACIÓN DE LA SIMULACIÓN


simulación 1164/VHDL. Para iniciar la simulación, activa el simulador
utilizando la opción Initialize Simulation, dentro
2. Iniciación de la simulación.
del menú Simulation. Después abre una ventana
3. Agregar señales. para el análisis de señales Waveform Window, si es
que no se encontrara ya una abierta.. Para crear
4. Asignar señales de estimulación. una nueva ventana de este tipo, haz clic en el icono
5. Correr la simulación. dentro de la barra estándar de trabajo o selecciona
File > New Waveform..
6. Observación de la simulación.
3. - AGREGANDO SEÑALES
7. Guarda la simulación.
El siguiente paso es agregar señales a la ventana
1. - CARGA DEL ARCHIVO de análisis, para esto selecciona Add Signals...en el
menú Waveform. La ventana para agregar señales
El primer paso es abrir el programa Active-HDL aparecerá con una lista de todas las señales de
Sim que normalmente se encuentra en Menu Inicio entrada, salida, entrada/salida y nodos internos de
> Programas > Warp > Active-HDL Sim. Para conexión disponibles en el diseño. Para agregar
cargar el archivo selecciona Open Vhdl dentro del alguna de las señales que se encuentran en esta
Menú File. lista basta con hacer doble clic sobre el nombre de
la señal. Si deseas agregar varias señales al mismo
tiempo, puedes seleccionarlas mediante la tecla
control y haciendo clic sobre cada señal que deseas
agregar para después hacer clic sobre el botón Add
que se encuentra en la parte inferior de la ventana.

Figura 4.10

Es importante mencionar que el archivo con el Figura 4.11


formato 1164/VHDL se crea en el subdirectorio
vhd dentro del directorio de trabajo del proyecto 4. - TIPOS DE SEÑALES DE ESTIMULACIÓN
una vez que éste es compilado. Si se selecciona por
accidente el archivo .vhd creado por el usuario, el Las señales de estimulación son utilizadas para
compilador del programa generará varios errores y definir diferentes impulsos a los puertos de entrada
no podrá ser simulado. Una vez que el archivo del diseño que esta siendo simulado. Para
apropiado es cargado, se desplegarán una serie de seleccionar alguno de estos tipos primero
mensajes dentro de la ventana de compilación. selecciona la señal y después selecciona Waveform
Uno de los mensaje que debería aparecer cuando el > Stimulators..., a continuación se describe
archivo es compilado correctamente es el brevemente los diferentes tipos de señales de
siguiente: estimulación de Active-HDL Sim.

-- Compile success 0 Errors 0 Warnings


Analysis time: 3.0 [s].

IEC FRANCISCO JAVIER TORRES VALLE 58


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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.

IEC FRANCISCO JAVIER TORRES VALLE 59


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

ZOOM ventas de simulación abiertas. La extensión de los


archivos de simulación en Active-HDL Sim es
Para aumentar o reducir la escala de tiempo de
.awf.
la simulación, selecciona View > Zoom >
In/Out/Full.
4.3 COMPARADORES
BOOKMARKS
Para colocar marcas sobre la ventana de El objetivo de este tema es crear, sintetizar, y
simulación primero selecciona Waveform > Select simular la descripción de circuitos comparadores
Mode. Cuando este modo se encuentra de magnitud utilizando WARP.
seleccionado, es posible colocar marcas sobre PROCEDIMIENTO
diferentes puntos de la simulación para una rápida
referencia a ciertos puntos importantes de la 1. Primero crearemos un proyecto para el
misma. Para colocarlas primero haz clic con el ejemplo del comparador visto en el tema 3.1.2
botón izquierdo en donde deseas colocar una Antes que nada debemos crear el proyecto dentro
marca, después selecciona Search > Toggle de un directorio en el que se encontrarán todos los
Bookmark. Utilizando Next/Previous Bookmark archivos del proyecto (.pfg, .vhd, .jed, .rpt, etc. ).
del mismo menú puedes cambiar entre una marca y Se sugiere crear primero una carpeta para todos los
otra dentro de la simulación. Las marcas son proyectos VHDL y dentro de esa carpeta crear otra
desplegadas como un triángulo azul sobre la escala carpeta para el presente proyecto, por ejemplo
de tiempo en la ventana de simulación. Para c:\vhdl_proj\comparador_1, con el nombre
eliminar alguna marca selecciona Waveform > Edit comparador_1.
Mode y después haz clic con el botón izquierdo
sobre la marca que deseas eliminar.
MODO DE MEDICIÓN
Para entrar al modo de medición selecciona
Waveform > Measurement Mode. En este modo es
posible desplegar el tiempo exacto entre dos
eventos de la simulación. Para obtener esta
información coloca el puntero sobre una transición
negativa o positiva, cuando el puntero es colocado
sobre alguna transición debe cambiar a color
verde, presiona el botón izquierdo sobre la
transición y arrastra el puntero hasta otra transición
de cualquier señal dentro de la ventana de
simulación y entonces suelta el botón. La medida
exacta entre estas dos transiciones se desplegara
como una etiqueta entre las dos transiciones. Si la Figura 4.13
etiqueta no es mostrada o no se ve completa,
amplia el alto de la fila haciendo clic con el botón 2. Seleccionaremos un 22V10 con empaquetado
derecho sobre alguna de las señales que tipo DIP para sintetizar el código.
intervienen en la medición y después selecciona 3. Ahora creamos un nuevo archivo de texto
Properties, dentro de la venta de propiedades para editar el código (File > New > Text File).
aumenta la altura modificando el valor del cuadro Este archivo debe ser guardado con extensión .vhd
de texto Height. Para eliminar alguna etiqueta de y en la misma carpeta del proyecto. Se sugiere
medición selecciona Waveform > Edit Mode, guardarlo como:
después seleciona la etiqueta y presiona suprimir
c:\vhdl_proj\comparador_1\comparador1.vhd
7. - GUARDANDO LA SIMULACIÓN
4. A continuación se muestra la tabla de
Existen dos formas de guardar la simulación. funcionamiento de este comparador y basándose
Guardar solamente la simulación de la ventana en ella haremos el código de descripción en
activa o guardar todas las simulaciones de las VHDL. Primero utilizaremos el estilo de

IEC FRANCISCO JAVIER TORRES VALLE 60


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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.

5. Abajo se muestra el listado del comparador


correspondiente al estilo de descripción de flujo de
datos. Este listado debemos editarlo dentro del
archivo comparador_1.vhd.

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;

ARCHITECTURE comparador OF comparador IS


BEGIN
equals <= '1' WHEN x = y ELSE Figura 4.14
'0';
x_may_y <= '1' WHEN x > y ELSE
7. Una vez editado y agregado el archivo al
'0';
x_men_y <= '1' WHEN x < y ELSE proyecto se procede a sintetizar el código en el
'0'; 22V10. Seleccionamos Compile > Project o
END comparador; también lo podemos hacer presionado el icono de
compilación.
6. Como se puede observar no se cargó ninguna
librería, y no es necesario hacerlo porque el tipo bit
es un tipo predefinido en WARP y en muchos
otros sintetizadores de VHDL. Por esto no
necesitamos de ninguna librería para poder
utilizarlo. Además, recuerde que la última Figura 4.15
declaración de puertos no lleva ;
Si el archivo tiene errores, estos aparecerán en
Una vez que se terminó de editar el código, la ventana de salida (Output Window). Dentro de
procedemos a guardar los cambios en el archivo y "Errors & Warnings" en la ventana de salida se

IEC FRANCISCO JAVIER TORRES VALLE 61


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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

10. Una vez iniciado el simulador, ahora


abrimos el archivo .vhd de postsíntesis como se
explica a continuación. Primero seleccionamos
File > Open VHDL.

Figura 4.16

En el archivo .rpt se muestra un informe de los


resultados de la compilación. En éste se encuentran

IEC FRANCISCO JAVIER TORRES VALLE 62


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

Figura 4.18 7 us, 1000 8 us, 1001 9 us, 1010 10 us,


1011 11 us, 1100 12 us, 1101 13 us, 1110
14 us, 1111 15 us -r 16 us
Para después abrir el archivo .vhd de
postsíntesis, el cual debería estar (si seguiste
correctamente todos los pasos) en el subdirectorio: Y al bus "y" también le asignaremos un
c:\vhdl_proj\comparador_1\vhd\comparador1.
estimulador del mismo tipo con la siguiente
vhd formula.

0000 0 ns, 1111 1 us, 1110 2 us, 1101 3


us, 1100 4 us, 1011 5 us, 1010 6 us, 1001
7 us, 1000 8 us, 0111 9 us, 0110 10 us,
0101 11 us, 0100 12 us, 0011 13 us, 0010
14 us, 0001 15 us -r 16 us

13. Una vez que asignamos los estimuladores


iniciamos la simulación seleccionando: Simulation
> Initialize Simulation.
14. Una vez iniciada la simulación ahora
corremos la simulación. Para poder correrla
existen tres opciones: correr completamente la
simulación (el máximo es de 2ms+3), correrla y
Figura 4.19 que se detenga en un momento especifico, o
adelantar la simulación solamente por algún
11. Hecho lo anterior ahora agregamos las tiempo. Para correr la simulación completamente
señales y/o puertos que deseamos simular. seleccionamos Simulation > Run. Si queremos
Seleccionamos Waveform > Add Signals... correr la simulación y especificar un tiempo en el
que debe detenerse seleccionamos Simulation >
Run Until... . Para correr la simulación "por pasos"
o por tiempos especificados, seleccionamos
Simulation > Run For. El tiempo de paso se
especifica a un lado del icono de Run For. Esta
última opción es la más practica al momento de
simular descripciones.

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.

IEC FRANCISCO JAVIER TORRES VALLE 63


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

Figura 4.22

Figura 4.23

Figura 4.24

IEC FRANCISCO JAVIER TORRES VALLE 64


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

4.4 MULTIPLEXORES descripción de circuitos digitales utilizando


WARP. De esta librería se llamó el paquete
En este tema el objetivo es elaborar std_arith, el cual contiene muchas funciones que
descripciones de circuitos multiplexores utilizando facilitan el uso de vectores tipo std_logic con
los tres estilos de descripción de VHDL. enteros. De no haber utilizado este paquete no
podríamos hacer ninguna de la comparaciones que
PROCEDIMIENTO están en la asignación condicional WHEN... ELSE.
Es decir, no es posible hacer la comparación "selec
Para la síntesis utilizaremos un 22V10 siguiendo = 3" porque "selec" es del tipo std_logic_vector y
la siguiente tabla de funcionamiento en los tres "3" es un número entero. El paquete
estilos de descripción. std_logic_1164 contiene los tipos de datos
std_logic y std_logic_vector que comúnmente
TABLA DE FUNCIONAMIENTO utilizamos por lo que es necesario cargar el
paquete para poder utilizar estos tipos, sin
embargo, no contiene funciones de comparación
selec salida
entre tipos std_logic (o arreglos de este) y enteros.
00 a Como la librería es de propia del sintetizador, es
decir, que siempre esta cargada dentro del área de
01 b trabajo del proyecto o "work", podemos llamar el
10 c paquete como se muestra a continuación.
11 d USE work.std_arith.ALL;

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;

ARCHITECTURE data_flow OF multiplexor IS


BEGIN
salida <= a WHEN selec = 0 ELSE
b WHEN selec = 1 ELSE
c WHEN selec = 2 ELSE
d WHEN selec = 3 ;
END data_flow;

El listado anterior corresponde a un multiplexor


4 a 1. El bus de salida es seleccionado mediante las
señales de selección selec(1) y selec(0)
(std_logic_vector es un arreglo de datos del tipo Figura 4.25
std_logic). Como habrás notado se hizo el llamado
a una librería no mencionada anteriormente, la Cada que presiones la tecla "s" el vector s estará
librería "cypress". Esta librería es de Cypress cambiando de valor, por omisión la lista de valores
Semiconductors y fue desarrollada para facilitar la de asignación incluye el '0' y el '1' solamente, en

IEC FRANCISCO JAVIER TORRES VALLE 65


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

este caso necesitamos generar valores para un


vector de 2 bits. Para poder hacerlo, en el mismo
cuadro de dialogo cámbiate a la sección de
"Hotkeys". En esta parte aparecerán las teclas que
ya han sido asignadas dentro del archivo para ser
utilizadas como estimuladores, así como la lista de
valores de asignación de cada tecla. Para modificar
la lista de valores de la tecla "s" (la que estamos
utilizando), con el puntero colócate en el cuadro de
secuencia y escribe la nueva lista de valores.

4.4.2 DESCRIPCIÓN COMPORTAMENTAL

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;

IEC FRANCISCO JAVIER TORRES VALLE 66


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

Dentro del proceso se hace uso de un objeto de


datos del tipo variable declarado como entero. Al
inicio del proceso se hace la asignación "selec_int
<= to_integer ( selec ) ;", esto es para poder usar
enteros en la instrucción CASE, de otra manera
tendríamos que indicar todos los casos utilizando
los valores naturales de un vector, es decir, "00",
"01", "10", y "11" para este ejemplo. Esto es
solamente para facilitar la descripción y no
significa que obtengamos una mejor síntesis del
código en el dispositivo. Es necesario que
"selec_int" sea una variable para que se le asigne Figura 4.27
inmediatamente el valor actual del vector "selec" y
estemos describiendo el correctamente el 4.4.3 DESCRIPCIÓN ESTRUCTURAL
funcionamiento del multiplexor. Si quisiéramos
utilizar una señal en vez de una variable tenemos Para la descripción estructural primero debemos
que hacerlo de la siguiente manera. realizar la descripción de un multiplexor 2 a 1 para
después interconectar tres de ello como se muestra
ARCHITECTURE behavorial2 OF multiplexor IS en la figura siguiente.
SIGNAL selec_int:integer;
BEGIN
selec_int <= to_integer( selec );
PROCESS(selec_int, a, b, c, d)
BEGIN
CASE selec_int IS
WHEN 0 =>
salida <= a ;
WHEN 1 =>
salida <= b ;
WHEN 2 =>
salida <= c ;
WHEN 3 =>
salida <= d ;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END behavorial2;

Si observas con cuidado podrás ver que Figura 4.28


seguimos describiendo exactamente los mismo.
Tanto el procesos como la asignación son de Para realizar descripciones estructurales lo
naturaleza concurrente, por lo que selec_int tiene recomendable es utilizar varios archivos .vhd, cada
siempre el valor actual de selec y lo convertimos a uno para una entidad o paquete en particular. Crea
un tipo entero para facilitar la descripción. Trata de un proyecto para la descripción estructural del
imaginar la asignación "selec_int <= to_integer ( multiplexor 4 a 1. Ahora crea un nuevo archivo de
selec )" como un circuito combinacional cuya texto y copia la siguiente descripción.
función es cambiar el tipo de datos con el estamos
manejando el vector selec y cuya salida (selec_int) LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
se la conectamos (piensa en señales como cables)
al proceso, que viene siendo otro circuito que PACKAGE multiplexor IS
"procesa" la información que se le suministra y COMPONENT mux_2_a_1
obtiene finalmente la lógica de salida. A PORT( in1: IN std_logic_vector
(3 DOWNTO 0);
continuación se muestra un diagrama a bloques in2: IN std_logic_vector
que trata de representar lo que estamos haciendo (3 DOWNTO 0);
en la arquitectura anterior (behavorial2). sel: IN std_logic;
out1: OUT std_logic_vector
(3 DOWNTO 0));

IEC FRANCISCO JAVIER TORRES VALLE 67


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

END COMPONENT; funcionamiento. Dentro de la ventana de proyecto


END multiplexor;
en la "vista de jerarquía" (Hierarchy View) aparece
LIBRARY ieee; el orden en que los componentes están siendo
USE ieee.std_logic_1164.ALL; utilizados dentro del diseño jerárquico.
ENTITY mux_2_a_1 IS
PORT (in1, in2: IN std_logic_vector
(3 DOWNTO 0);
sel: IN std_logic;
out1: OUT std_logic_vector
(3 DOWNTO 0));
END mux_2_a_1;

ARCHITECTURE data_flow OF mux_2_a_1 IS


BEGIN
out1 <= in1 WHEN sel = '0' ELSE
in2;
END data_flow;

Guarda este archivo como mux_2_a_1.vhd


Figura 4.29
dentro de la carpeta de trabajo del proyecto. Como
podrás ver estamos creando un paquete con Una vez que has compilado y simulado este
nombre "multiplexor" el cual se agrega a la librería multiplexor utilizando los tres estilos podrás ver
del proyecto work. Además se tienen que llamar que no hay ninguna diferencia entre usar un estilo
las librerías que se necesiten antes del paquete y u otro. Lo importante es describir el mismo
antes de la entidad. Ahora abre un nuevo archivo funcionamiento para obtener los mismo resultados.
de texto y copia en él la siguiente descripción. De hecho, mientras estemos describiendo
exactamente lo mismo no importa el número de
-- mux_structural.vhd
LIBRARY ieee; líneas que se hagan, porque VHDL no es un
USE ieee.std_logic_1164.ALL; lenguaje de programación de software.
USE work.multiplexor.ALL;
-- llamado al paquete multiplexor que se
-- encuentra en la librería 4.5 SUMADORES
-- del proyecto
El diseño de circuitos aritméticos eficientes es
ENTITY multiplexor IS
PORT ( a,b,c,d: IN std_logic_vector un tema fundamental en el diseño de circuitos
(3 DOWNTO 0); digitales, por lo que es importante para el
selec: IN std_logic_vector diseñador estar familiarizado con las opciones
(3 DOWNTO 0); disponibles en la selección de algoritmos eficientes
salida: OUT std_logic_vector
(3 DOWNTO 0)); en sus aplicaciones. Está práctica tiene por
END multiplexor; objetivo familiarizarte en el diseño de circuitos
sumadores utilizando algoritmos eficientes en
ARCHITECTURE structural OF multiplexor IS
SIGNAL salida1, salida2:
VHDL.
std_logic_vector(3 DOWNTO 0);
BEGIN 4.5.1 SUMADOR TOTAL
u1: mux_2_a_1 PORT MAP(a, b, selec(0),
salida1); El componente básico usado en la adición de
u2: mux_2_a_1 PORT MAP(c, d, selec(0), dos operandos es conocido como "sumador total".
salida2);
u3: mux_2_a_1 PORT MAP ( salida1, Este sumador total representa el componente con
salida2, selec(1), salida); el cual podemos formar sumadores de cualquier
END structural; número de bits. A continuación se muestra la tabla
de funcionamiento y la representación esquemática
Guarda este archivo como mux_structural.vhd, de un sumador total, y basándose en la tabla se
y agrega ambos archivos al proyecto (Proyect > hará la descripción de sumador total en VHDL,
Add Files...). Compila el proyecto y comprueba para posteriormente diseñar un circuito sumador de
que las ecuaciones de salida siguen siendo las 4 bits utilizando un 22V10.
mismas ya que estamos describiendo el mismo

IEC FRANCISCO JAVIER TORRES VALLE 68


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

"10" WHEN entradas = 5 ELSE


"10" WHEN entradas = 6 ELSE
"11" WHEN entradas = 7;
sum <= salidas(0);
co <= salidas(1) ;
END data_flow;

Si conoces las ecuaciones del circuito también


puedes utilizarlas para hacer la descripción.
ARCHITECTURE data_flow OF full_adder IS
BEGIN
sum <= a XOR b XOR C;
Figura 4.30 co <= (a AND b) OR
(a AND ci) OR
TABLA DE FUNCIONAMIENTO (b AND ci);
END data_flow;
ENTRADAS SALIDAS
a b ci co suma Crea un nuevo proyecto en c:\vhdl_proj\prac5\
y llámalo sumador. Después crea un nuevo archivo
0 0 0 0 0
de texto y copia en él la descripción anterior.
0 0 1 0 1
Guarda el archivo de texto como full_adder.vhd
0 1 0 0 1 dentro de la carpeta de trabajo del proyecto.
0 1 1 1 0 Agrega el archivo al proyecto y compila el
1 0 0 0 1 proyecto utilizando la arquitectura data_flow. Abre
1 0 1 1 0 el reporte de compilación y observa las ecuaciones.
1 1 0 1 0 Ahora compila el proyecto utilizando la segunda
1 1 1 1 1 arquitectura data_flow. Vuele a abrir el proyecto y
observa las ecuaciones. ¿Por qué son las mismas
LIBRARY ieee; -- full_adder.vhd ecuaciones? porque estamos describiendo el
USE ieee.std_logic_1164.ALL;
mismo funcionamiento y el estilo o el número de
PACKAGE adder IS líneas que utilices no importa siempre y cuando
COMPONENT full_adder este describiendo exactamente el mismo circuito.
PORT(ci: IN std_logic;
a, b: IN std_logic;
sum: OUT std_logic; 4.5.2 SUMADOR DE CUATRO BITS
co: OUT std_logic);
END COMPONENT;
END adder;
Para hacer la descripción utilizaremos cuatro
unidades del sumador total (u1 a u4) y las
LIBRARY ieee; conectaremos como se muestra continuación.
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;

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;

ARCHITECTURE data_flow OF full_adder IS


SIGNAL entradas: std_logic_vector
(2 DOWNTO 0);
SIGNAL salidas: std_logic_vector
(1 DOWNTO 0); Figura 4.31
BEGIN
entradas <= a&b&ci ; Abre un nuevo archivo de texto y copia en él la
salidas <= "00" WHEN entradas = 0 ELSE
"01" WHEN entradas = 1 ELSE siguiente descripción.
"01" WHEN entradas = 2 ELSE
"10" WHEN entradas = 3 ELSE -- sumador de 4 bits utilizando
"01" WHEN entradas = 4 ELSE -- un sumador total

IEC FRANCISCO JAVIER TORRES VALLE 69


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

co, c1, c2, c3: INOUT std_logic);


LIBRARY ieee; END sumador;
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;
USE work.adder.ALL; De esta forma enviamos los nodos c1, c2, y c3 a
la salida de una macroceldas, en el caso del 22V10
ENTITY sumador IS a un pin de salida, y así evitamos que el
PORT (ci: IN std_logic; sintetizador elimine el nodo porque ya lo
a, b: IN std_logic_vector
(3 DOWNTO 0); declaramos como puerto.
sum: OUT std_logic_vector
(3 DOWNTO 0);
co: OUT std_logic); 4.5.3 SYNTHESIS OFF
END sumador;
Otra forma de evitar que se simplifique el nodo
ARCHITECTURE structural OF sumador IS es utilizando directivas de síntesis. En este caso
SIGNAL c1, c2, c3: std_logic;
BEGIN
utilizaremos la directiva synthesis_off que está
u1: full_adder PORT MAP (ci, a(0), b(0), incluida en WARP. Esta directiva nos permite
sum(0), c1 ) ; controlar la forma en que el sintetizador factoriza y
u2: full_adder PORT MAP (c1, a(1), b(1), obtiene las ecuaciones de salida y de esta manera
sum(1), c2 ) ;
u3: full_adder PORT MAP (c2, a(2), b(2), evitar que la ecuación de un nodo se incluya en la
sum(2), c3); ecuación de otro nodo y así evitar
u4: full_adder PORT MAP (c3, a(3), b(3), retroalimentaciones. Para entender como funciona
sum(3), co); esta directiva observe el siguiente ejemplo.
END structural;
ENTITY synthesis_off IS
Guarda el archivo de texto en la carpeta de PORT ( a, b, c: IN bit;
trabajo del proyecto (c:\vhdl_proj\prac5) como y: OUT bit);
sumador.vhd. Compila el proyecto y observa lo END synthesis_off;
que sucede. Si estas usando la versión 5.0 o 5.2 de ARCHITECTURE simplifica_nodo OF
WARP, la compilación te indicará los siguientes synthesis_off IS
errores. SIGNAL x: bit;
BEGIN
x <= a AND b;
Error: Logic equation has too many product y <= x OR c;
terms on signal co.
END simplifica_nodo;
Error: Logic equation has too many product
terms on signal sum(2). Cuando compilemos el archivo la ecuación del
Error: Logic equation has too many product nodo "x" se sustituye en la ecuación del puerto "y"
terms on signal sum(3).
como se muestra abajo.
Abre el reporte de compilación y observa las y = a * b + c
ecuaciones. La descripción no se pudo compilar
porque las ecuaciones tienen demasiadas sumas de Lo que trataríamos de hacer entonces sería
productos. El sintetizador de WARP siempre trata declara el nodo "x" como puerto y no como señal
de evitar retroalimentaciones para que el circuito de interconexión, pero observa que es lo que
funcione con la mayor velocidad posible. Nosotros sucede.
deseamos que los nodos c1, c2, y c3 queden en un
pin de salida del 22V10 para de esta forma hacer x = a * b y = a * b + c
las conexiones como se muestran en el diagrama a
bloques del sumador de 4 bits. Para lograrlo basta La ecuación de "x" se sigue sustituyendo en la
con describir la entidad como se muestra a ecuación del puerto "y". Como habíamos
continuación. mencionado, el sintetizador siempre busca que el
circuito que le estamos describiendo funcione a la
ENTITY sumador IS
PORT ( ci: IN std_logic;
mayor frecuencia posible. Al obtener las
a, b: IN std_logic_vector ecuaciones de la forma anterior evitamos que
(3 DOWNTO 0); exista una retroalimentación desde el pin del
sum: OUT std_logic_vector puerto "x", ya que si retroalimentamos tenemos
(3 DOWNTO 0);
que esperar el tiempo de retardo de las compuertas

IEC FRANCISCO JAVIER TORRES VALLE 70


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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

IEC FRANCISCO JAVIER TORRES VALLE 71


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

señal de reloj "clk". Todas las asignaciones a . . .


END IF;
señales dentro del proceso serán registradas, ya END PROCESS;
que estas sólo cambian de valor en las transiciones
de reloj y lo retienen por lo menos hasta la Este proceso es sensible a los cambios en la
siguiente transición. señales "clk", "rst" y "pst", como se indica en la
PROCESS (clk)
lista sensible. De esta forma es posible realizar la
BEGIN descripción de registros con "preset" y "reset"
IF ( clk'event AND clk ='1' ) THEN asíncronos. La primera instrucción dentro del
. . . proceso checa el estado de la señal "rst". Todas las
END IF;
END PROCESS;
señales que son asignadas dentro de la primera
porción de la estructura, se asume que serán
Este proceso es sensible solamente a los registradas mediante la señal de "rst" asíncrono. La
cambios en la señal "clk", como se indica en la segunda condición checa el estado de la señal
lista sensible. La primera instrucción, IF... THEN, "pst", y todas las señales que sean asignadas dentro
dentro del proceso restringe al resto de las de esta porción del proceso son registradas
instrucciones a ser ejecutadas únicamente durante asíncronamente mediante la señal de "preset"
la transición positiva de la señal "clk", por lo que asíncrono "pst". Si las dos primeras condiciones no
ahora también todas las señales que reciban una se cumplen, el resto de la instrucción IF... THEN...
asignación dentro de la instrucción IF... THEN ELSIF, representa el funcionamiento síncrono del
serán registradas y mantendrán dicho valor registro.
recibido por lo menos hasta la siguiente transición EJEMPLO
de reloj.

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.

PROCESS(rst, pst, clk) EJEMPLOS


BEGIN
IF rst = '1' THEN A continuación realice la descripción de los
. . .
ELSIF pst = '1' THEN
siguientes registros de acuerdo con su tabla de
. . . funcionamiento.
ELSIF (clk'event AND clk='1') THEN

IEC FRANCISCO JAVIER TORRES VALLE 72


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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;

0 - transición positiva 0 -- buffer


q <= q_tmp WHEN enable = '1' g
'Z';
END areg2;
ENTITY reg2 IS
PORT(reset, d,clk: IN bit;
q: OUT bit);
END reg2;

IEC FRANCISCO JAVIER TORRES VALLE 73


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

4.7 CONTADORES LIBRARY ieee;


USE ieee.std_logic_1164.ALL;
La finalidad de un contador es computar el USE ieee.numeric_std.ALL;
número de ocurrencias de un evento que se da en
intervalos aleatorios o uniformes. En los siguientes ENTITY counter IS
PORT (clk, load, reset: IN std_logic;
ejemplos se muestran diferentes tipos de data: IN unsigned(3 DOWNTO 0);
contadores y la forma más común de describir su count: BUFFER unsigned(3 DOWNTO 0));
comportamiento con VHDL. END counter;

EJEMPLOS ARCHITECTURE archcounter OF counter IS


BEGIN
LIBRARY ieee; PROCESS(clk, reset, load, count, data)
USE ieee.std_logic_1164.ALL; BEGIN
USE ieee.numeric_std.ALL; IF ( clk’event AND clk= '1' ) THEN
IF reset = '1' THEN
ENTITY counter IS count <= (OTHERS => '0');
PORT( clk, load: IN std_logic; ELSIF load = '1' THEN
data: IN unsigned(3 DOWNTO 0); count <= data;
count: BUFFER unsigned(3 DOWNTO 0)); ELSE
END counter; count <= count + 1;
END IF;
ARCHITECTURE archcounter OF counter IS END IF;
BEGIN END PROCESS;
PROCESS( clk, load, count, data ) END archcounter;
BEGIN
IF( clk'event AND clk= '1' ) THEN En este ejemplo se describe un contador
IF load = ’1’ THEN
count <= data;
ascendente, con reset síncrono dependiendo de la
ELSE entrada "reset", además, con capacidad de carga
count <= count + 1; paralela de datos mediante el puerto de control
END IF; "load". Al igual que el ejemplo anterior, la
END IF;
END PROCESS; instrucción IF (clk'event AND clk = '1' ) aparece al
END archcounter; principio e implica que todas las operaciones del
La instrucción USE ieee.numeric_std.ALL es contador se ejecuten durante la transición positiva
para incluir el tipo de datos unsigned, así como las de la señal de reloj "clk". La subsecuente
funciones aritméticas y lógicas que nos permiten instrucción IF describe la operación de reset
manipular objetos de datos que manejen este tipo. síncrono durante la transición positiva del reloj. El
En este ejemplo en particular nos interesa la resto de las operaciones, el conteo y la carga
función "+" definida para ser utilizada con el tipo paralela, son descritas en las siguientes cláusulas
unsigned y enteros. Ya que el operador "+" en ELSIF y ELSE dentro de la misma instrucción IF,
VHDL originalmente está definido únicamente por lo que podemos observar que la operación de
para ser utilizado con enteros. La arquitectura que reset tiene precedencia sobre las operaciones de
describe al contador utiliza el estilo carga y conteo. Así, si reset no es '1', entonces la
comportamental. En este diseño el contador operación de conteo depende de la señal "load".
funciona ascendentemente y, además, realiza carga Como podemos ver las operaciones de carga y
paralela de datos síncronamente con la señal de conteo son identificas al contador en el ejemplo
reloj dependiendo del valor del puerto de control anterior.
"load". Ahora se expone a continuación un contador
Dentro del proceso, la instrucción IF ( clk’event con reset asíncrono y con capacidad para salida en
AND clk= ’1’ ) THEN... implica que el alta impedancia.
funcionamiento del contador, conteo y carga LIBRARY ieee;
paralela, tome lugar durante la transición positiva USE ieee.std_logic_1164.ALL;
de la señal de reloj "clk". La siguiente instrucción USE ieee.numeric_std.ALL;
IF... THEN... define la operación de conteo o de
ENTITY cnt_oe IS
carga paralela del circuito dependiendo de la PORT(clk, reset, oe: IN std_logic;
condición: load = '1'. A continuación se expone un count_io: INOUT std_logic_vector
contador similar pero con reset síncrono. (7 DOWNTO 0));

IEC FRANCISCO JAVIER TORRES VALLE 74


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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;

IEC FRANCISCO JAVIER TORRES VALLE 75


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

CONTADOR NO. 3 transición descendente


1 1 0
positiva 9-0
ENTRADAS SALIDAS
0 1 - - 0
reset oe up_down clk conteo
0 0 - - Z
1 1 1 transición positiva ascendente
1 1 0 transición positiva descendente ** NOTA

0 1 - - 0 Aunque se encuentre la salida del circuito en


alta impedancia, el conteo y reset asíncrono deben
0 0 - - Z seguir funcionando internamente. En el momento
de cambio de sentido ascendente/descendente, el
** NOTA contador no debe de iniciar la cuenta, por ejemplo:
si el contador está funcionando ascendentemente y
Aunque se encuentre la salida del circuito en se encuentra en el número 5 cuando se cambia a
alta impedancia, el conteo y reset asíncrono deben descendente, en la siguiente transición positiva se
seguir funcionando internamente. debe continuar la cuenta con un 4, después un 3...
etc.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL; LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENITTY counter IS USE ieee.numeric_std.ALL;
PORT(reset: IN std_logic;
ud: IN std_logic; ENITTY counter IS
oe: IN std_logic; PORT(reset: IN std_logic;
clk: IN std_logic; ud: IN std_logic;
conteo: INOUT unsigned (3 DOWNTO 0) oe: IN std_logic;
); clk: IN std_logic;
END counter; conteo: INOUT unsigned (3 DOWNTO 0)
);
ARCHITECTURE counter OF counter IS END counter;
SIGNAL count_tmp: unsigned(3 DOWNTO 0);
BEGIN ARCHITECTURE counter OF counter IS
PROCESS(reset,ud,clk) SIGNAL count_tmp: unsigned(3 DOWNTO 0);
BEGIN BEGIN
IF reset = '1' THEN PROCESS(reset,ud,clk)
count_tmp <= (OTHERS => '0'); BEGIN
ELSIF (clk'event AND clk = '1') THEN IF reset = '1' THEN
IF ud = '1' THEN count_tmp <= (OTHERS => '0');
count_tmp <= count_tmp + 1; ELSIF (clk'event AND clk = '1') THEN
ELSE IF ud = '1' THEN
count_tmp <= count_tmp - 1; count_tmp <= count_tmp + 1;
END IF; IF count_tmp = 9 THEN
END IF; count_tmp <= (OTHERS => '0');
END IF;
-- instanciación de los buffers ELSIF ud = '0' THEN
conteo <= count_tmp WHEN oe = '1' ELSE count_tmp <= count_tmp - 1;
(OTHERS 'Z'); IF count_tmp = 0 THEN
END counter; count_tmp <= "1001";
END IF;
END IF;
CONTADOR NO. 4 END IF;

-- instanciación de los buffers


ENTRADAS SALIDAS conteo <= count_tmp WHEN oe = '1' ELSE
(OTHERS 'Z');
reset oe up_down clk conteo END counter;

transición ascendente
1 1 1
positiva 0-9

IEC FRANCISCO JAVIER TORRES VALLE 76


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

4.8 ALU DE CUATRO BITS solamente con un bit, y en la entidad TOP se


realiza la interconexión de cuatr de estos módulos
Realice la descripción en VHDL para la para formar la ALU de cuatro bits.
siguiente unidad aritmético - lógica de acuerdo a
ENTIDAD TOP
la tabla de funcionamiento utilizando un 22V10. El
circuito consta de 2 bus de entrada "a" y "b", de 4 LIBRARY ieee;
bits cada uno y mediante el bus "s", de 3 bits, se USE ieee.std_logic_1164.ALL;
selecciona la operación a realizar en la ALU. USE work.modulo_alu.ALL;
Dicha operación se realiza combinacionalmente y
ENTITY alu IS
en el momento que ocurre una transición positiva PORT(a: IN std_logic_vector(3 DOWNTO 0);
en la señal de reloj el resultado de dicha operación b: IN std_logic_vector(3 DOWNTO 0);
se registra en los flip-flop's tipo D del 22V10. cin: IN std_logic ;
Además, la salida registrada será conducida hacia clk: IN std_logic ;
reset: IN std_logic ;
los pines de salida (I/O pads) únicamente cuando oe: IN std_logic ;
se habiliten los buffers de tres estados mediante la s: IN std_logic_vector(2 DOWNTO 0);
entrada de control "oe", de lo contrario deberán cout: OUT std_logic;
output: OUT std_logic_vector(3 DOWNTO 0)
encontrarse en alta impedancia. );
END alu ;
ENTRADAS SALIDAS
ARCHITECTURE a_alu OF alu IS
s(2) s(1) s(0) clk oe output cout SIGNAL c2, c3, c4: std_logic;
SIGNAL salida_r: std_logic_vector
transición a AND (3 DOWNTO 0);
0 0 0 0 0
positiva b ATTRIBUTE synthesis_off OF c2, c3, c4:
SIGNAL IS true;
transición BEGIN
0 0 1 0 a OR b 0
positiva x0: modulo PORT MAP(a(0), b(0), cin,
clk, reset, s, c2, salida_r(0));
transición a XOR
0 1 0 0 0
positiva b x1: modulo PORT MAP(a(1), b(1), c2, clk,
reset, s, c3, salida_r(1));
transición
0 1 1 0 NOT a 0
positiva x2: modulo PORT MAP(a(2), b(2), c3, clk,
reset, s, c4, salida_r(2));
transición x3: modulo PORT MAP(a(3), b(3), c4, clk,
1 0 0 0 a+0 0
positiva reset, s, cout, salida_r(3));

transición acarreo de -- instanciación de los biffers


1 0 1 0 a+b
positiva la suma output <= (OTHERS=>'Z') WHEN oe='1' ELSE
salida_r;
transición acarreo de END a_alu;
1 1 0 0 a + b'
positiva la suma
transición MÓDULO
1 1 1 0 a-1 0 LIBRARY ieee ;
positiva USE ieee.std_logic_1164.ALL;
- - - - 1 Z 0
ENTITY modulo IS
PORT (in1: IN std_logic;
in2: IN std_logic;
** NOTA cin: IN std_logic;
clk: IN std_logic;
b' = NOT b reset: IN std_logic;
selec: IN std_logic_vector(2 DOWNTO 0);
cout: OUT std_logic ;
4.8.1 DESCRIPCIÓN ESTRUCTURAL salida_r: INOUT std_logic);
END modulo;
La descripción se realiza utilizando tres
archivos, los cuales contienen: la entidad TOP, el ARCHITECTURE a_modulo OF modulo IS
SIGNAL salida_comb: std_logic ;
módulo y el paquete respectivamente. El módulo BEGIN
realiza todas las operaciones dela ALU pero PROCESS(in2, in1, selec, cin)

IEC FRANCISCO JAVIER TORRES VALLE 77


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

CONSTANT uno: std_logic := '1'; 4.8.2 DESCRIPCIÓN


BEGIN
CASE selec IS COMPORTAMENTAL
WHEN o"0" =>
LIBRARY ieee ;
salida_comb <= in1 AND in2;
USE ieee.std_logic_1164.ALL;
cout <= '0'; USE ieee.numeric_std.ALL;
WHEN o"1" =>
salida_comb <= in1 OR in2;
ENTITY aluIS
cout <= '0'; PORT (in1: IN unsigned(3 DOWNTO 0);
WHEN o"2" =>
in2: IN unsigned(3 DOWNTO 0);
salida_comb <= in1 XOR in2;
cin, clk: IN std_logic;
cout <= '0'; oe: IN std_logic;
WHEN o"3" =>
reset: IN std_logic;
salida_comb <= NOT in1;
selec: IN integer RANGE 0 TO 7;
cout <= '0'; cout: OUT std_logic ;
WHEN o"4" =>
salida: INOUT unsigned(3 DOWNTO 0);
salida_comb <= in1;
);
cout <= '0' ; END alu;
WHEN o"5" =>
salida_comb<=in2 XOR in1 XOR cin;
ARCHITECTURE alu OF alu IS
cout <= ( in1 AND cin ) OR
SIGNAL comb, reg: unsigned(3 DOWNTO 0);
( in2 AND cin ) OR
SIGNAL c: unsigned(4 DOWNTO 0);
( in2 AND in1 );
SIGNAL c1,c2,c3
WHEN o"6" =>
ATTRIBUTE synthesis_off OF c1, c2, c3:
salida_comb<= (NOT in2) XOR in1
SIGNAL IS true
XOR cin;
BEGIN
cout <= (in1 AND cin) OR
c(0) <= cin;
(( NOT in2 ) AND cin) OR
cout <= c(4);
(( NOT in2 ) AND in1);
c1 <= c(1);
WHEN o"7" =>
c2 <= c(2);
salida_comb<=uno XOR in1 XOR cin;
c3 <= c(3);
cout <= ( in1 AND cin) OR
PROCESS(in2, in1, selec, cin)
(uno AND cin ) OR
CONSTANT uno: unsigned:= "0001";
( uno AND in1 ) ;
BEGIN
WHEN OTHERS =>
FOR i IN in1'range LOOP
NULL;
CASE selec IS
END CASE;
WHEN 0 =>
END PROCESS;
comb(i) <= in1(i) AND in2(i);
c(i+1) <= '0';
PROCESS( salida_comb, clk, reset )
WHEN 1 =>
BEGIN
comb(i) <= in1(i) OR in2(i);
IF rising_edge( clk ) THEN
c(i+1) <= '0';
salida_r <= salida_comb; WHEN 2 =>
END IF;
comb(i) <= in1(i) XOR in2(i);
END PROCESS;
c(i+1) <= '0';
WHEN 3 =>
END a_modulo;
comb(i) <= NOT in1(i);
c(i+1) <= '0';
PAQUETE WHEN 4 =>
comb(i) <= in1(i);
c(i+1) <= '0' ;
LIBRARY ieee;
WHEN 5 =>
USE ieee.std_logic_1164.ALL;
comb(i) <= in2(i) XOR in1(i) XOR
c(i);
PACKAGE modulo_alu IS
c(i+1) <= (in1(i) AND c(i)) OR
COMPONENT modulo
(in2(i) AND c(i)) OR
PORT(in1: IN std_logic;
(in2(i) AND in1(i);
in2: IN std_logic ;
WHEN 6 =>
cin: IN std_logic ;
comb(i) <= (NOT in2(i)) XOR
clk: IN std_logic ;
in1(i) XOR c(i);
reset: IN std_logic ;
c(i+1) <= (in1(i) AND c(i)) OR
selec: IN std_logic_vector(2 DOWNTO 0);
((NOT in2(i)) AND c(i)) OR
cout: OUT std_logic ;
((NOT in2(i)) AND in1(i));
salida_r: INOUT std_logic ) ;
WHEN 7 =>
END COMPONENT;
comb(i) <= uno(i) XOR in1(i)
END modulo_alu;
XOR c(i);
c(i+1) <= (in1(i) AND c(i)) OR

IEC FRANCISCO JAVIER TORRES VALLE 78


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

(uno(i) AND c(i)) OR 1. REGISTRO DEL ESTADO PRESENTE.


(uno(i) AND in1(i)) ;
Este registro es un conjunto de n flip-flops
WHEN OTHERS =>
NULL;
sincronizados con la misma señal de reloj
END CASE; para almacenar el estado presente en la
END LOOP; máquina.
END PROCESS;
2. LÓGICA COMBINACIONAL PARA GENERAR EL
PROCESS( comb, clk, reset ) SIGUIENTE ESTADO.
BEGIN
IF rising_edge( clk ) THEN 3. Una máquina de estados solamente puede
reg <= comb; estar en un estado a un tiempo dado, es
END IF;
END PROCESS; decir no puede hacer dos cosas a la vez. La
lógica combinacional permite que en cada
salida <= reg WHEN oe = '0' ELSE transición activa del reloj, la máquina vaya
(OTHERS => 'Z');
de un estado a otro o se mantenga en el
cout <= '0' WHEN selec = 7 ELSE mismo dependiendo de las condiciones
c(4); definidas por el diseñador.
END alu;s
4. LÓGICA COMBINACIONAL DE SALIDA.
4.9 MÁQUINAS DE ESTADO Las salidas normalmente están en función del
estado presente y/o también en función de las
Una máquina de estados es un circuito
entradas (Máquina de Estados de Mealy). Es
secuencial que es diseñado para seguir un patrón
común que en una máquina de estados de
de funciones previamente definidas. Existen dos
Moore se desee que las salidas estén en
tipos de máquinas de estado: Mealy y Moore. En
función del siguiente estado en vez de utilizar
una máquina de estados de Moore, las salidas están
el actual cuando se utiliza una señal de reloj
únicamente en función del estado presente. Si es
de alta frecuencia.
una máquina de estados de Mealy, las salidas están
en función del estado presente y de las entradas. A continuación se muestran las estructuras para
Una máquina de estados se compone de tres partes: máquinas de estados de Moore y Mealy

Figura 4.33 Máquina de Estados de Moore

Figura 4.34 Máquina de Estados de Mealy

IEC FRANCISCO JAVIER TORRES VALLE 79


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

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:

SECUENCIA ONE HOT SECUENCIA


ESTADOS
BINARÍA ENCODIG GRAY
S0 000 00000001 000
S1 001 00000010 001
S2 010 00000100 011
S3 011 00001000 010
S4 100 00010000 110
S5 101 00100000 100
S6 110 01000000 101
S7 111 10000000 111

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

IEC FRANCISCO JAVIER TORRES VALLE 80


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

EJEMPLO

Figura 4.35 Diagrama de Estados

-- Máquina de Estados del tipo Mealy state <= S0;


ELSIF clk'event and clk = '1' THEN
LIBRARY ieee; state <= next_state ;
USE ieee.std_logic_1164.ALL; END IF;
END PRCESS;
ENTITY mealy IS
PORT ( clk: IN std_logic; -- lógica combinacional para definir el
reset: IN std_logic; -- siguiente estado
entradas: IN std_logic_vector PROCESS(entradas, state)
(3 DOWNTO 0); BEGIN
salidas: OUT std_logic_vector CASE state IS
(3 DOWNTO 0)) ; WHEN S0 =>
END mealy; IF entradas = "0001" THEN
next_state <= S1;
ARCHITECTURE comportamental OF mealy IS END IF;
-- ONE HOT ENCODED state machine WHEN S1 =>
TYPE states IS (S0, S1, S2, S3, S4); IF entradas = "1001" THEN
ATTRIBUTE enum_encoding OF states: TYPE IS next_state <= S1;
"00001 " & -- S0 -- atributo de WARP ELSIF entradas <= "1011" THEN
"00010 " & -- S1 next_state <= S4;
"00100 " & -- S2
"01000 " & -- S3 ELSIF entradas = "0101" THEN
"10000" ; -- S4 next_state <= S2;
SIGNAL state, next_state: states ; END IF;
BEGIN WHEN S2 =>
-- registro del estado presente IF entradas = "0111" THEN
PROCESS(clk, reset) next_state <= S1;
BEGIN ELSIF entradas = "0010" THEN
IF reset='0' THEN next_state <= S2 ;

IEC FRANCISCO JAVIER TORRES VALLE 79


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

ELSIF entradas = "1100" THEN 1. - Suponiendo que esta vacía al principio,


next_state <= S3;
END IF;
cuando se presione el botón de "INICIO", activo
WHEN S3 => en ALTO, se enciende la válvula de agua fría.
IF entradas = "0101" THEN
next_state <= S4; 2. - En el momento que el nivel del agua llegue
END IF; al SENSOR, activo en ALTO, se apaga la válvula
WHEN S4 => de agua fría y se enciende la de agua caliente
IF entradas = "0011" THEN
next_state <= S2;
durante dos minutos.
ELSIF entradas = "0100" THEN
next_state <= S3;
3. - Después se apaga la válvula de agua caliente
ELSIF entradas = "0110" THEN y se enciende el motor durante cuatro minutos.
next_state <= S4;
ELSIF entradas = "1110" THEN 4. - Transcurridos los cuatro minutos, se apaga
next_state <= S0 ; el motor y se enciende la válvula de desagüe
END IF; durante tres minutos.
WHEN OTHERS =>
NULL; 5. - Una vez que se ha vaciado la lavadora se
END CASE; cierra la válvula de desagüe y el ciclo de lavado
END PROCESS;
comenzará nuevamente cuando se vuelva a
-- lógica combinacional de salida presionar el botón de inicio.
salidas <= "1000" WHEN (state= S1) ELSE
"0110" WHEN (state=S1 AND LIBRARY ieee;
entradas="1001") ELSE USE ieee.std_logic_1164.ALL;
"1100" WHEN (state=S2) ELSE
"0000" WHEN (state= S2 AND ENTITY lavadora IS
entradas="0010") ELSE PORT( clk: IN std_logic;
"0011" WHEN (state=S3) ELSE inicio: IN std_logic;
"0111" WHEN (state=S4) ELSE sensor: IN std_logic;
"0101" WHEN (state= S4 AND vaf: OUT std_logic;
entradas="0110") ELSE vac OUT std_logic;
"1011"; -- asignación en el estado de motor: OUT std_logic;
-- reset S0 des: OUT std_logic
END comportamental; );
END lavadora;
EJEMPLO
ARCHITECTURE state_machine OF lavadora IS
Elabore la descripción en VHDL del siguiente TYPE states IS
(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10);
problema mediante máquina de estados definiendo SIGNAL state, nex_state: states;
su diagrama de estados, frecuencia de trabajo y SIGNAL outputs: std_logic_vector
dispositivo a utilizar. Se desea diseñar el circuito (3 DOWNTO 0);
de control para lavadora de la siguiente figura. CONSTANT vaf_on: std_logic_vector
(3 DOWNTO 0):="0001";
CONSTANT vac_on: std_logic_vector
(3 DOWNTO 0):="0010";
CONSTANT mot_on: std_logic_vector
(3 DOWNTO 0):="1000";
CONSTANT des_on: std_logic_vector
(3 DOWNTO 0):="0100";
CONSTANT all_off: std_logic_vector
(3 DOWNTO 0):="0000";
BEGIN

-- 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;

-- LÓGICA COMBINACIONAL PARA DEFINIR EL

IEC FRANCISCO JAVIER TORRES VALLE 81


CAPÍTULO IV: DESCRIPCIÓN DE CIRCUITOS DIGITALES

-- SIGUIENTE ESTADO

PROCESS(clk, state, sensor)


BEGIN
CASE state IS
WHEN S0 =>
IF sensor='0' THEN
next_state <= S0;
ELSIF sensor='1' THEN
next_state <= S1;
END IF;
WHEN S1 =>
next_state <= S2;
WHEN S2 =>
next_state <= S3;
WHEN S3 =>
next_state <= S4;
WHEN S4 =>
next_state <= S5;
WHEN S5 =>
next_state <= S6;
WHEN S6 =>
next_state <= S7;
WHEN S7 =>
next_state <= S8;
WHEN S8 =>
next_state <= S9;
WHEN S9 =>
next_state <= S10;
WHEN S10 =>
IF inicio = '0' THEN
next_state <= S10;
ELSE
next_state <= S0;
END IF;
WHEN OTHERS =>
NULL;
END CASE;
END IF;
END PROCESS;

-- LÓGICA COMBINACIONAL DE SALIDA

outputs <= all_off WHEN (state=S10) ELSE


vaf_on WHEN (state=S0 AND
sensor='0') ELSE
vac_on WHEN (state=S1) ELSE
vac_on WHEN (state=S2) ELSE
mot_on WHEN (state=S3) ELSE
mot_on WHEN (state=S4) ELSE
mot_on WHEN (state=S5) ELSE
mot_on WHEN (state=S6) ELSE
des_on WHEN (state=S7) ELSE
des_on WHEN (state=S8) ELSE
des_on WHEN (state=S9) ELSE
all_off;

END state_machine;

IEC FRANCISCO JAVIER TORRES VALLE 82


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

V IMPLEMENTACIÓN DE
FILTROS DIGITALES
EN FPGA'S

IEC FRANCISCO JAVIER TORRES VALLE 83


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

5.1 INTRODUCCIÓN 5.3 MARCO TEÓRICO


Un FPGA es un dispositivo cuyas características El término filtro se utiliza comúnmente para
pueden ser modificadas, manipuladas o describir un dispositivo que discrimina aquello que
almacenadas mediante programación. La pasa a través de él. Así, por ejemplo, un filtro de
arquitectura de un FPGA (Field Programmable aire permite que sólo pase aire a través de éste,
Gate Array) consiste en arreglos de múltiples evitando que las partículas de polvo presentes en el
celdas lógicas las cuales se comunican unas con aire lo atraviesen. Un filtro digital es un sistema
otras mediante canales de conexión verticales y lineal e invariante en el tiempo (LTI) que modifica
horizontales. Cada celda lógica contiene arreglos el espectro en frecuencia de la señal de entrada
de compuertas lógicas AND y OR, así como un X(w), según la respuesta que tenga en frecuencia
número definido de registros y multiplexores. H(w) (conocida como función de transferencia),
Mediante estos recursos es posible implementar para dar lugar a una señal de salida con espectro:
funciones matemáticas y de almacenamiento de Y(w) = H(w) * X(w). En cierto sentido, H(w)
datos. Dada la gran densidad de compuertas con actúa como una función de ponderación o función
las que cuenta un FPGA, es posible implementar de conformación espectral para las diferentes
sistemas digitales muy complejos, entre los que componentes frecuenciales de la señal de entrada.
destaca el filtrado digital. Además, en un FPGA es Los sistemas LTI se clasifican como: FIR (finite
posible realizar modificaciones de último minuto impulse response) que se caracterizan pos ser
sin que esto implique grandes alteraciones en el sistemas no recursivos, e IIR (infinite impulse
hardware o en el software. response) que se distinguen por tener
retroalimentación en la señal salida.
5.2 ANTECEDENTES
En las últimas tres décadas la ingeniería se ha 5.3.1 FILTROS FIR
visto revolucionada en el campo del procesamiento Un filtro FIR de orden M se describe mediante
digital de señales, donde los filtros digitales la ecuación en diferencias: y(n) = b0 x(n) + b1 x(n-
forman un apartado muy importante, ya que estos 1) + b2 x(n-2) + bM x(n-M), donde la secuencia
se encuentran en una extensa gama de bk son los coeficientes del filtro. En este tipo de
aplicaciones. Desde procesamiento de audio y filtrado no existe retroalimentación. Además, la
vídeo hasta control de motores; donde la respuesta al impulso H(w), es de duración finita ya
utilización del filtrado digital incluye ventajas que si la entrada se mantiene en cero durante M
como: periodos consecutivos la salida también será cero.
1) El ancho de banda y la calidad del filtro no Algunas de las ventajas de este tipo de filtros son
están necesariamente relacionadas. las siguientes:
2) Al utilizar dispositivos programables, la 1) Un filtro FIR puede ser diseñado para
función de transferencia de el filtro puede tener fase lineal.
ser transformada sin más modificaciones 2) Siempre son estables porque son hechos
que el cambio de los coeficientes en únicamente con ceros en el plano
memoria. complejo.
3) Variables como temperatura o alteraciones 3) Los errores por desbordamiento no son
en el voltaje no afectan la funcionalidad problemáticos porque la suma de
del circuito. productos en un filtro FIR es
4) El costo de la aplicación es relativamente desempeñada por un conjunto finito de
bajo. datos.
4) Un filtro FIR es fácil de comprender e
implementar.

IEC FRANCISCO JAVIER TORRES VALLE 84


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

Figura 5.1 Estructura para la realización de filtros IIR

5.3.2 FILTROS IIR Sin embargo, algunas consideraciones que se


deben considerar en la implementación de filtros
Los filtros IIR corresponden directamente al IIR son las siguientes:
equivalente analógico. Una forma de diseñar filtros
IIR es creando la función de transferencia deseada 1) Los filtros IIR no son necesariamente
en el dominio analógico para transformarla al estables, es tarea del diseñador buscar la
dominio z y después calcular los coeficientes del estabilidad del sistema.
filtro IIR mediante los cuales se obtiene la 2) Los filtros IIR producen en general
siguiente ecuación en diferencias: y(n) = b0 x(n) distorsión de fase.
+ b1 x(n – 1) + b2 x(n – 2) + ... bM x(n –M) - a1 y(n
– 1) - a2 y(n – 2) - ....- aN y(n – N), donde las 3) La posibilidad desbordamiento de
variables ak y bk son los coeficientes del filtro. resultados en la operaciones realizadas
Dentro de las ventajas que ofrecen los filtros IIR deben ser consideradas ya que un filtro IIR
sobre los tipo FIR encontramos: se implementa mediante sumas de
productos que están basadas en una suma
1) Los filtros IIR requieren menos memoria y infinita.
menos instrucciones para implementar su
función de transferencia. La implementación de filtros IIR puede hacerse de
varias formas. Asumiendo el comportamiento
2) Un filtro IIR se diseña mediante el calculo lineal e invariante en el tiempo del sistema, la
de polos y ceros en el plano complejo. El ecuación en diferencias de un filtro puede ser
uso de polos confieren a un filtro IIR la manipulada matemáticamente para obtener una
capacidad de implementar funciones de realización con N elementos de memoria, (N + M
transferencia que es imposible realizar + 1) multiplicadores y N sumadores, conocida
mediante filtros FIR. como Forma Directa II Transpuesta.
3) Es posible trasladar un filtro IIR a un
modelo analítico.

IEC FRANCISCO JAVIER TORRES VALLE 85


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

Figura 5.2 Implementación de filtros IIR mediante FDII-T

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

IEC FRANCISCO JAVIER TORRES VALLE 86


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

y(n) = 0.0014*x(n) + 0.0071*x(n-1) + A continuación se muestra la respuesta en


0.0142*x(n-2) + 0.0142*x(n-3) + 0.0071*x(n-4) + frecuencia del sistema en magnitud y fase.
0.0014*x(n-5) + 2.9272*y(n-1) - 3.7016*y(n-2) +
2.4521*y(n-3) - 0.8422*y(n-4) + 0.1191*y(n-5)

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

Figura 5.3 Respuesta del filtro en magnitud y fase

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,
.

IEC FRANCISCO JAVIER TORRES VALLE 87


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

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

A continuación se muestra la descripción en


entity fir is
VHDL de la estructura FIR. port(clk,reset,load: in std_logic;
data_in: in signed
------------------------------------- (19 downto 0);
-- FIR data_out: out signed
------------------------------------- (19 downto 0));
library ieee; end fir;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all; architecture a_fir of fir is
type fifo_array is array
package fir_coef is (0 to 10) of signed
subtype coef_word is signed (19 downto 0);
(3 downto 0); signal fifo: fifo_array;
subtype coef_range is integer range begin
0 to 10;
type coef_table is array process (reset,clk,fifo,data_in)
(0 to 10) of coef_word; begin
constant coef_rom: coef_table:= ( if reset = '0' then
("0001"), for i in 0 to 10 loop
("0010"), fifo(i) <= (others => '0');
("0011"), end loop;
("0100"), elsif clk'event and clk = '1'
("0100"), then
("0011"), if load = '1' then
("0010"), for i in 1 to 10 loop
("0001"), fifo(i) <= fifo(i-1);
("1111"), end loop;
("1111"), fifo(0) <= data_in;
("1111")); end if;
end fir_coef; end if;
end process;
library ieee;
use ieee.std_logic_1164.all; process (fifo)
use ieee.numeric_std.all;
use work.fir_coef.all;

IEC FRANCISCO JAVIER TORRES VALLE 88


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

variable prod,data_tmp: signed


(23 downto 0);
begin
data_tmp := (others => '0');
for i in 0 to 10 loop
prod := fifo(i) * coef_rom(i);
data_tmp := data_tmp + prod;
end loop;
data_out <=
data_tmp(23)&data_tmp(18 downto 0);
end process;

end a_fir;

El diseño del circuito se basa en el siguiente


diagrama.

IEC FRANCISCO JAVIER TORRES VALLE 89


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

Figura 5.5 Filtro FIR implementado en el FPGA

IEC FRANCISCO JAVIER TORRES VALLE


90
CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

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

Figura 5.6 Salida del filtro a 1.027 kHz

Figura 5.6 Salida del filtro a 2.024 kHz

IEC FRANCISCO JAVIER TORRES VALLE


91
CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

Figura 5.6 Salida del filtro a 3.021 kHz

Figura 5.6 Salida del filtro a 5 kHz

IEC FRANCISCO JAVIER TORRES VALLE 92


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

Figura 5.6 Salida del filtro a 6.061 kHz

Figura 5.6 Salida del filtro a 7.092 kHz


5.7 RESULTADOS hardware de un filtro digital puede
implementar una gran variedad de filtros, sin
• Los filtros digitales cuentan con muchas que esto implique modificaciones en el
ventajas que los hacen más atractivos que sus circuito.
predecesores analógicos. • Las funciones de transferencia de los filtros
• Al utilizar dispositivos programables, como digitales cuentan con rigurosas
un FPGA, la función de transferencia del especificaciones, como que las frecuencias
filtro puede ser transformada sin más que se desea sean rechazadas pueden ser
modificaciones que la reprogramación del extremadamente atenuadas sin sacrificar el
dispositivo. Por lo que un simple diseño en ancho de banda que se está filtrando.

IEC FRANCISCO JAVIER TORRES VALLE 93


CAPÍTULO V: IMPLEMENTACIÓN FILTROS DIGITALES EN FPGA's

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

Figura 5.7 Respuesta en frecuencia del filtro

IEC FRANCISCO JAVIER TORRES VALLE 94


CONCLUSIONES

CONCLUSIONES

IEC FRANCISCO JAVIER TORRES VALLE 95


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.

IEC FRANCISCO JAVIER TORRES VALLE 96


BIBLIOGRAFÍA

BIBLIOGRAFÍA

IEC FRANCISCO JAVIER TORRES VALLE 97


BIBLIOGRAFÍA

VHDL FOR PROGRAMMABLE LOGIC THE PROGRAMMABLE LOGIC DATA BOOK

KEVIN SKAHILL XILINX, INC.

CYPRESS SEMICONDUCTOR & 1999

ADDISON WESLEY
1996 CYPRESS PROGRAMMABLE LOGIC DATA
BOOK

VHDL CYPRESS SEMICONDUCTOR

DOUGLAS L. PERRY 1997

MCGRAW HILL
2ª EDICIÓN DIGITAL SIGNAL PROCCESING
JOHN G. PROAKIS,

VHDL, LENGUAJE PARA SÍNTESIS Y DIMITRIS G. MANOLAKIS

MODELADO DE CIRCUITOS PRENTICE HALL

FERNANDO PARDO, JOSÉ A. BOLUDA 1992

EDITORIAL RA-MA
1999 DISCRETE-TIME SIGNAL PROCCESING
A. V. OPPENHEIM

VHDL REFERENCE GUIDE R. W. SCHAFFER

XILINX, INC. PRENTICE HALL

1999 1989

ACTEL HDL CODING, STYLE GUIDE VHDL LENGUAJE PARA SÍNTESIS Y

ACTEL CORPORATION MODELADO DE CIRCUITOS

1999 http://bugs.uv.es/dpt/atc/asignat
uras/ti/curso/curso.html

WARP, LANGUAGE REFERENCE MANUAL


CYPRESS SEMICONDUCTOR VHDL LENGUAJE PARA SÍNTESIS Y
MODELADO DE CIRCUITOS (2)
1998
http://tapec.uv.es/VHDL/libro.ht
ml
MAX+PLUS II, GETTING STARTED
MANUAL
ALTERA CORPORATION IZQUIERDA DE LENGUAJES DE DESCRIPCIÓN
1999 DE HARDWARE VHDL

http://cseg.inaoep.mx/~ariasm/arqcomp/v
hdlweb/indexiz.htm

IEC FRANCISCO JAVIER TORRES VALLE 98


BIBLIOGRAFÍA

LÓGICA PROGRAMABLE DE ALTA DENSIDAD


HUMBERTO DE JESÚS OCHOA RASSP TECHNOLOGY BASE VHDL
DOMÍNGUEZ
MODELING DEVELOPMENT
http://intranet.uacj.mx/
http://www.erc.msstate.edu/mpl/
rassp/modeling/html/modeling.ht
SYNTHESIS USING VHDL ml

http://www.cedcc.psu.edu/ee497f/rassp_6 THE HAMBURG VHDL ARCHIVE


0/index.htm
http://tech-www.informatik.uni-
hamburg.de/vhdl/vhdl.html
VHDL EXAMPLES FOR SYNTHESIS
http://eecad.sogang.ac.kr/~chang/vhdl/We VHDL AND VERILOG REFERENCES AND
lcome.html TUTORIALS
http://www.optimagic.com/tutori
EXAMPLES FOR VHDL als.html
http://www.eej.ulst.ac.uk/exa/exam.html
VHDL COOKBOOK (C) 1990, PETER J.
ASHENDEN
NORTHEASTERN UNIVERSITY VHDL DESIGN
& DEVELOPMENT http://www.fastsys.co.kr/~jwpar
k/Outside/Comp/EDA/Cookboo
http://www.ece.neu.edu/info/vhd k.html
l/vhdl.html

VHDL INTERNATIONAL HOME PAGE


AN INTRODUCTION TO VHDL
http://www.vhdl.org/
http://www.acc-
eda.com/h_intro.htm
VHDL RESOURCE PAGE

DOULOS VHDL TRAINING VERILOG http://www.ece.uc.edu/~rmiller/


VHDL/intro.html
TRAINING DOULOS HOME PAGE
http://www.doulos.co.uk/thewin
ningedge/index.htm VHDL-ONLINE MAIN FRAME
http://www.vhdl-online.de/

RASSP HOME PAGE


http://rassp.scra.org/ ACTEL CORPORATION'S HOME PAGE
http://www.actel.com/

ACTEL DESKTOP HOME


http://www.acteldesktop.com/

IEC FRANCISCO JAVIER TORRES VALLE 99


BIBLIOGRAFÍA

CYPRESS SEMICONDUCTOR CORPORATION


http://www.cypress.com/

ALTERA WEB SITE


http://www.altera.com/
XILINX HOME PAGE
http://www.xilinx.com/

INTECTRA INC.
http://www.intectra.com/

VHDL, LEGUAJE PARA LA SÍNTESIS Y


DESCRIPCIÓN DE HARDWARE
http://www.gdl.uag.mx/214/inicio.htm

IEC FRANCISCO JAVIER TORRES VALLE 100