IEC SINTESIS Y DESCRIPCIÓN DE CIRCUITOS DIGITALES UTILIZANDO VHDL User Manual

CIRCUITOS DIGITALES
UTILIZANDO VHDL
SÍNTESIS Y DESCRIPCIÓN DE
IEC FRANCISCO J AVIER T ORRES V ALLE
2001
ANTECEDENTES
En los últimos diez años la industria electrónica ha tenido una gran evolución en el desarrollo de sistemas digitales; desde computadoras personales, sistemas de audio y vídeo hasta dispositivos de alta velocidad para las comunicaciones. Productos hechos con una alta tecnología que permite aumentar la funcionalidad, disminuir costos, mejorar el aprovechamiento de la energía, así como una marcada tendencia hacia la miniaturización. Esto ha sido posible gracias a 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.
El presente trabajo considera los dispositivos lógicos programables, enfocándonos en los PLDs, CPLDs y FPGAs. Ya que el principal motivo por el que debemos aprender a utilizar VHDL es el de diseñar circuitos lógicos utilizando este tipo de dispositivos. Se expondrán los estilos elementales de codificación, exponiendo las principales características de VHDL como lenguaje para síntesis de circuitos. Finalmente se desarrolla la implementación de filtros digitales utilizando FPGAs.
i
IEC FRANCISCO JAVIER TORRES VALLE
ÍNDICE
ANTECEDENTES
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
i
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
ii
IEC FRANCISCO JAVIER TORRES VALLE
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
iii
IEC FRANCISCO JAVIER TORRES VALLE
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
iv
IEC FRANCISCO JAVIER TORRES VALLE
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
v
IEC FRANCISCO JAVIER TORRES VALLE
CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE
LENGUAJES DE
I
IEC FRANCISCO JAVIER TORRES VALLE
DESCRIPCIÓN DE
HARDWARE
1
CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE
1.1 INTRODUCCIÓN
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 de circuitos digitales hasta la primera mitad de los años ochenta. En aquellas épocas el esfuerzo de diseño se concentraba en los niveles eléctricos para establecer características e interconexiones entre los componentes básicos al nivel de transistor. El proceso de diseño era altamente manual y tan sólo se empleaban herramientas como PSPICE para simular esquemas eléctricos con modelos previamente caracterizados a cada una de las distintas tecnologías. A medida que pasaban los años, los procesos tecnológicos se hacían más y más complejos. Los problemas de integración iban en aumento y los diseños eran cada vez más difíciles de depurar y de dar mantenimiento. Inicialmente los circuitos MSI (Medium Scale Integration) y LSI (Low Scale Integration) se diseñaron mediante el desarrollo de prototipos basados en módulos simples. Cada uno de estos módulos estaba formado por compuertas ya probadas, pero este método poco a poco iba quedándose obsoleto conforme aumentaba la complejidad y tamaño de los circuitos. A finales de los años setenta se constata el enorme desfase que existía entre tecnología y diseño.
La considerable dificultad que puede llegar a tomar el fabricar un circuito de alta escala de integración, involucra riesgos y costos de diseño desmesurados e imposibles de asumir por las empresas. Es entonces, cuando diversos grupos de investigadores empiezan a crear y desarrollar los llamados “lenguajes de descripción de hardware”, lenguajes en los que no fuera necesario caracterizar eléctricamente cada componente del circuito al nivel de transistor para así enfocarse solamente en el funcionamiento lógico del sistema. Empresas tales como IBM con su IDL, el TI-HDL de Texas Instruments, ZEUS de General Electric, etc., así como los primeros prototipos empleados en las universidades, empezaron a desarrollarse buscando una solución a los problemas que presentaba el diseño de sistemas complejos. Sin embargo, estos lenguajes nunca alcanzaron el nivel de difusión y consolidación necesarios por motivos distintos. Unos, los industriales, por ser propiedad de la empresa permanecieron encerrados en ellas y no estuvieron disponibles para su estandarización y mayor difusión, en tanto que los universitarios
perecieron por no disponer de soporte ni mantenimiento adecuado.
1.2 EL CONCEPTO DE HERRAMIENTAS CAD-EDA
CAD son las siglas de Computer Aided Design,
o diseño asistido por computadora el cual constituye todo un proceso de trabajo utilizando técnicas de análisis apoyadas en gráficos mediante sofisticadas herramientas de software las cuales facilitan el estudio de los problemas asociados con el diseño en cuestión. El concepto CAD se relaciona con el dibujo como parte importante en el proceso de diseño pero, además, el diseño de un circuito debe cumplir con los requerimientos especificados por el equipo de diseño, por las normas de calidad existentes, los costos, etc. por lo que las herramientas CAD intervienen en todas las fases del diseño. Ya que no sólo son importantes por acelerar el desarrollo del sistema al permitir que varias personas puedan trabajar simultáneamente en distintas etapas del diseño sino que, además, es posible verificar el funcionamiento del circuito mediante la simulación del sistema. Todo esto simplifica la tarea del equipo de diseño y conduce a la conclusión del prototipo en menos tiempo. EDA, Electronic Design Automation, es el nombre que se le da a todas las herramientas de hardware y software en el diseño de sistemas electrónicos. Porque no sólo el software es importante, también lo es el hecho de que las computadoras cada día son más veloces y de mayor capacidad de procesamiento, lo cual influye en el proceso de diseño de circuitos electrónicos.
El diseño de hardware tiene un problema fundamental, que no existe en desarrollo de software. Este problema es el alto costo del ciclo
diseño
reinicio del ciclo, ya que el costo del prototipo
generalmente suele ser bastante elevado. Se impone la necesidad de reducir este ciclo de diseño para no incluir la fase de desarrollo del prototipo más que al final del proceso, evitando la repetición de varios prototipos que es lo que encarece el ciclo. Para ello se introduce la fase de simulación y verificación de circuitos utilizando herramientas EDA, de tal forma que no sea necesario implementar físicamente un prototipo para comprobar el funcionamiento del circuito.
desarrollo del prototipo pruebas
IEC FRANCISCO JAVIER TORRES VALLE
2
CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE
i
i
i
En el ciclo de diseño de circuitos, las herramientas EDA están presentes en todas las fases. Primero en la fase de generación del sistema que puede representarse mediante un diagrama esquemático, a bloques o de flujo.
Se encuentran también en la fase de simulación y comprobación de circuitos, donde diferentes herramientas permiten verificar el funcionamiento del sistema. Estas simulaciones pueden ser de eventos, funcionales, digitales o eléctricas, de acuerdo al nivel de simulación requerido. Después están las herramientas EDA utilizadas en la síntesis y programación de circuitos digitales en dispositivos lógicos programables. Existen, además, las herramientas EDA orientadas a la fabricación de circuitos. En el caso del diseño de hardware estas herramientas sirven para la realización de PCBs (Printed Circuit Boards o placas de circuito impreso), o para desarrollar circuitos integrados de aplicación especifica conocidos como ASICs (Application Specific Integrated Circuits). Este ciclo de diseño de hardware se muestra en la figura 1.1.
IDEA
DESCRIPCIÓN
DEL CIRCUITO
SÍNTESIS
A continuación se mencionan las principales características y finalidad de algunas herramientas EDA que intervienen en el diseño de circuitos.
I. Lenguajes de descripción de circuitos.
Son lenguajes mediante los cuales es posible describir el funcionamiento y estructura de un circuito eléctrico o digital. La descripción puede ser mediante bloques donde se muestra la arquitectura del diseño, o de comportamiento, es decir, se describe el funcionamiento del circuito en vez de especificar los elementos de los que está compuesto.
II. Diagramas esquemáticos.
Es la forma clásica de describir un diseño electrónico y la más extendida ya que era la única usada antes de la aparición de las herramientas de EDA. La descripción está basada en un “plano” donde se muestran los diferentes componentes utilizados en el circuito.
III. Grafos y diagramas de flujo.
Es posible describir un circuito o sistema 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 comportamental, porque no es una descripción mediante componentes.
no
no
¿FUNCIONA?
s
SIMULACIÓN
FUNCIONAL
¿FUNCIONA?
s
PRUEBAS AL DISEÑO
FINALIZA EL PROCESO DE
DISEÑO
ANÁLISIS
TEMPORAL
¿FUNCIONA?
s
PROGRAMACIÓN
DEL
DISPOSITIVO
ELABORACIÓN
DEL PROTOTIPO
Figura 1.1 Flujo de diseño en el desarrollo de
sistemas electrónicos
IEC FRANCISCO JAVIER TORRES VALLE
IV. Simulación de eventos.
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
alto nivel como discos duros, buses de comunicaciones, memorias RAM etc.
V. Simulación funcional.
Bajando al nivel de compuertas digitales se puede realizar una simulación funcional de las mismas. Este tipo de simulación comprueba la operación de circuitos digitales a partir del comportamiento lógico de sus elementos con el fin de comprobar el funcionamiento en conjunto del circuito mediante unos estímulos dados. Similar a lo que se realiza en un laboratorio.
VI. Simulación digital.
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
3
CAPÍTULO I: LENGUAJES DE DESCRIPCIÓN DE HARDWARE
de propagación de cada compuerta. Es una simulación muy cercana al comportamiento real del circuito y prácticamente garantiza el funcionamiento correcto del circuito en cuestión. En las herramientas EDA este tipo de simulación se conoce como análisis temporal o timing.
VII. Simulación eléctrica.
Es la simulación de más bajo nivel donde las respuestas del sistema se verifican al nivel de transistor. Sirven tanto para circuitos analógicos como digitales y su respuesta es prácticamente idéntica a la realidad ya que se prueban retardos de tiempo, niveles de voltaje, disipación de potencia, etc.
VIII. Diseño de PCBs
Con estas herramientas es posible realizar el trazado de pistas para la fabricación de placas de circuitos impresos.
IX. Diseño de circuitos integrados
Son herramientas EDA que sirven para la realización de circuitos integrados. Las capacidades gráficas de estas herramientas permiten la realización de las diferentes máscaras que intervienen en la realización de éstos.
X. Diseño con dispositivos programables.
Estas herramientas facilitan la programación de dispositivos, ya sean PALs, PLDs, CPLDs o FPGAs.
1.3 LENGUAJES DE
DESCRIPCIÓN DE HARDWARE
Los lenguajes de descripción de hardware (HDLs) son utilizados para describir la arquitectura y comportamiento de un sistema electrónico los cuales fueron desarrollados para trabajar con diseños complejos.
Comparando un HDL con los lenguajes para el desarrollo de software vemos que en un lenguaje de este tipo un programa que se encuentra en un lenguaje de alto nivel (VHDL) necesita ser ensamblado a código máquina (compuertas y conexiones) para poder ser interpretado por el procesador. De igual manera, el objetivo de un HDL es describir un circuito mediante un conjunto de instrucciones de alto nivel de abstracción para
que el programa de síntesis genere (ensamble) un circuito que pueda ser implementado físicamente.
La forma más común de describir un circuito es mediante la utilización de esquemas que son una representación gráfica de lo que se pretende realizar. Con la aparición de herramientas EDA cada vez más complejas, que integran en el mismo marco de trabajo las herramientas de descripción, síntesis, simulación y realización; apareció la necesidad de disponer de un método de descripción de circuitos que permitiera el intercambio de información entre las diferentes herramientas que componen el ciclo de diseño. En principio se utilizó un lenguaje de descripción que permitía, mediante sentencias simples, describir completamente un circuito. A estos lenguajes se les llamó Netlist puesto que eran simplemente eso, un conjunto de instrucciones que indicaban las interconexiones entre los componentes de un diseño. A partir de estos lenguajes simples, que ya eran auténticos lenguajes de descripción hardware, se descubrió el interés que podría tener el describir circuitos utilizando un lenguaje en vez de usar esquemas. Sin embargo, se siguieron utilizando esquemas puesto que desde el punto de vista del ser humano son mucho más sencillos de entender, aunque un lenguaje siempre permite una edición más rápida y sencilla.
Conforme las herramientas de diseño se volvieron más sofisticadas, y la posibilidad de desarrollar circuitos digitales mediante dispositivos 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 punto de vista estructural, sino desde el punto de vista funcional. Este nivel de abstracción se había alcanzado ya con las herramientas de simulación, ya que para poder simular partes de un sistema era necesario disponer de modelos que describieran el funcionamiento de bloques del circuito o de cada componente si fuera necesario. Estos lenguajes estaban sobre todo orientados a la simulación, por lo que poco importaba que el nivel de abstracción fuera tan alto que no fuera sencillo una realización o síntesis a partir de dicho modelo. Con la aparición de técnicas para la síntesis de circuitos a partir de lenguajes de alto nivel de abstracción, se comenzaron a utilizar los lenguajes de simulación para sintetizar circuitos. Que si bien alcanzan un altísimo nivel de abstracción, su orientación era básicamente la de simular, por lo que los 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 optimas.
Además, los lenguajes de descripción de hardware al formar parte de las herramientas EDA permiten el trabajo en equipo. Así, al estructurar el desarrollo del proyecto, cada integrante del equipo de diseño puede trabajar en subproyectos antes de integrar todas las partes del sistema.
1.3.1 VENTAJAS DE LOS HDLS
Una metodología de diseño que utiliza un HDL posee varias ventajas sobre la metodología tradicional de diseño a nivel compuerta. Algunas de estas ventajas son listadas a continuación.
Es posible verificar el funcionamiento del
sistema dentro del proceso de diseño sin necesidad de implementar el circuito.
Las simulaciones del diseño, antes de que éste
sea implementado mediante compuertas, permiten probar la arquitectura del sistema para tomar decisiones en cuanto a cambios en el diseño.
Las herramientas de síntesis tienen la
capacidad de convertir una descripción hecha en un HDL, VHDL por ejemplo, a compuertas lógicas y, además, optimizar dicha descripción de acuerdo a la tecnología utilizada.
Esta metodología elimina el antiguo método
tedioso de diseño mediante compuertas, reduce el tiempo de diseño y la cantidad de errores producidos por el armado del circuito.
Las herramientas de síntesis pueden
transformar automáticamente un circuito obtenido mediante la síntesis de un código en algún HDL, a un circuito pequeño y rápido. Además, es posible aplicar ciertas características al circuito dentro de la descripción para afinar detalles (retardos, simplificación de compuertas, etc.) en la arquitectura del circuito y que estas características se obtengan en la síntesis de la descripción.
Las descripciones en un HDL proporcionan
documentación de la funcionalidad de un diseño independientemente de la tecnología utilizada.
Un circuito hecho mediante una descripción en un HDL puede ser utilizado en cualquier tipo de dispositivo programable capaz de soportar la densidad del diseño. Es decir, no es necesario adecuar el circuito a cada dispositivo porque las herramientas de síntesis se encargan de ello.
Una descripción realizada en un HDL es más fácil de leer y comprender que los netlist o circuitos esquemáticos.
1.4 VHDL
VHDL es un lenguaje de descripción de hardware utilizado para describir circuitos en un alto nivel de abstracción el cual está siendo rápidamente aceptado como un medio estándar de diseño. VHDL es producto del programa Very High Speed Integrated Circuit (VHSIC) desarrollado por el Departamento de Defensa de los Estados Unidos a finales de la década de los 70's. El propósito era hacer un estándar para diseñar, modelar, y documentar circuitos complejos de tal manera que un diseño desarrollado por una empresa pudiera ser entendido por otra y, además, pudiera ser procesado por software con propósitos de simulación.
VHDL es reconocido como un estándar de los lenguajes HDL por el Instituto de Ingenieros en Electricidad y Electrónica – IEEE – como su estándar 1076 el cual fue ratificado en 1987, y por parte del Departamento de Defensa de los Estados Unidos como el estándar MIL-STD-454L En 1993 el estándar IEEE-1076 se actualizó y un estándar adicional, el IEEE-1164, fue adoptado. Para 1996 el estándar IEEE-1076.3 se convirtió en un estándar de VHDL para síntesis siendo éste el que se utiliza en el diseño de sistemas digitales. Los estándares más utilizados en síntesis de circuitos por la mayoría de las herramientas de diseño son el IEEE-1164 y el IEEE-1076.3. En la actualidad VHDL es un estándar de la industria para la descripción, modelado y síntesis de circuitos digitales. Por esto, los ingenieros de la mayoría de las áreas de electrónica, si no es que todas, deben aprender a programar en VHDL para incrementar su eficiencia.
VHDL divide los circuitos en dos “vistas” 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 conexiones que vienen siendo las entradas y salidas del circuito. En tanto que la arquitectura, que es la vista interna, define el funcionamiento del circuito. Después de definir las interfaces de la entidad, otras entidades pueden utilizar a la primera como un subcircuito, al mismo tiempo que todas están siendo desarrolladas, es decir, están siendo detalladas en su funcionamiento. Este concepto de vistas externas e internas es propio de VHDL y permite segmentar un sistema en bloques. Así, una entidad es relativa a otras entidades a través de sus conexiones y comportamiento. Por lo que es posible experimentar cada entidad con diferentes arquitecturas sin necesidad de cambiar el resto del diseño. Y obviamente cada entidad puede ser reutilizada en otros sistemas aunque no hayan sido diseñadas específicamente para estos.
Un modelo de hardware de VHDL es mostrado
en la siguiente figura.
Figura 1.2 Modelo de Hardware de VHDL
Una entidad en VHDL, que ya es todo un diseño, posee una o más conexiones hacia los sistemas que la rodean. Una entidad puede estar compuesta de otras entidades, de procesos y por componentes, todos ellos trabajando concurrentemente. Cada entidad está definida por su arquitectura la cual se forma de instrucciones en VHDL, ya sean aritméticas, asignaciones a señales o de simples instanciaciones de componentes.
Los PROCESS en VHDL son utilizados para modelar tanto circuitos secuénciales como combinacionales utilizando un estilo de descripción secuencial. Para interconectar procesos distintos se utilizan SIGNALS que no son otra cosa que simples cables.
Una señal posee una fuente (driver) y uno más destinos (receptores) y un tipo de dato que le proporciona características de interconexión. Por ejemplo, una señal que se define como tipo bit puede manejar los valores binarios ‘0’ y ‘1’ solamente, en tanto que una señal que se define como bit_vector puede manejar mas de una posición binaria.
La forma de diseñar circuitos en VHDL se divide en tres categorías de acuerdo a su complejidad: flujo de datos, comportamental, y estructural. Estos tres estilos de diseño se detallan a continuación.
F
LUJO DE DATOS
En este estilo el diseño del circuito no es complicado por lo que basta con describir como fluyen los datos través de la entidad, de las entradas hacia las salidas. La operación del sistema está definida en términos de un conjunto de transformaciones de datos expresadas como instrucciones concurrentes.
C
OMPORTAMENTAL
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.
E
STRUCTURAL
Una descripción estructural se utiliza en circuitos que requieren de más de una función, hablando en términos de hardware, para realizar la finalidad del sistema. Para ello segmentamos el sistema en subcircuitos o componentes para facilitar el diseño. Cada componente es caracterizado en particular ya sea utilizando una descripción de flujo de datos o comportamental. Y a la entidad donde se describen las interconexiones de estos componentes recibe el nombre de descripción estructural.
Lo que ha hecho que VHDL sea en un tiempo tan corto el lenguaje de descripción de hardware más utilizado por la industria electrónica, es su 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 aplicaciones un mismo código.
1.5 METODOLOGÍA DE DISEÑO UTILIZANDO VHDL
I. Definición de los requerimientos del
sistema.
Antes de comenzar a realizar la descripción del diseño, es muy importante que se tenga una idea clara de los objetivos y requerimientos. Tales como: funciones del circuito, máxima frecuencia de operación, y los puntos críticos del sistema. Esto servirá para poder definir a grandes rasgos cual será la arquitectura del circuito y así comenzar a realizar la descripción.
II. Descripción del circuito en VHDL.
Antes de comenzar a escribir el código es recomendable seleccionar alguna metodología de diseño como: Top-Down, Bottom-Up, o Flat. Los dos primeros involucran la creación de diseños jerárquicos que generalmente son grandes, y el último es utilizado normalmente en el diseño de circuitos pequeños.
La metodología Top-Down consiste en dividir el sistema en varios bloques de tal manera que se puedan resolver los problemas por separado, además, cada bloque a su vez se puede dividir en otros bloques si es necesario. El objetivo es que cada bloque tenga una función especifica representada mediante un componente que desempeñe dicha función. Bottom-Up es todo lo contrario, comenzamos por caracterizar los componentes básicos del circuito y con estos formamos bloques de mayor tamaño que representen un circuito más complejo que sus partes individuales. La metodología Flat es comúnmente utilizada para diseños pequeños, donde los requerimientos son pocos y no muy complejos por lo que no nos distraen y no perdemos de vista la funcionalidad del circuito. Este método de diseño es el que utilizamos cotidianamente en el diseño de circuitos digitales, y se le llama Flat por que no es necesario seccionar el circuito para poder diseñarlo.
Después de decidir cual será la metodología que debemos implementar entonces comenzamos a describir el circuito de acuerdo con lo que se había establecido. Es recomendable utilizar algún tipo de
diagrama a bloques con la descripción del funcionamiento de cada bloque, diagramas de estado, o usar alguna tabla de funcionamiento donde se resumen las funciones de cada bloque en particular. Obviamente existe la posibilidad de cometer errores en VHDL, pero generalmente estos son de son de sintaxis, como ";" al final de cada instrucción, o simplemente por no utilizar adecuadamente alguna instrucción. Algunas ocasiones se podrán tener problemas al tratar de sintetizar el código y esto se debe a que se comete el error de pensar en términos de programación en vez de enfocarnos en la descripción del circuito.
Cuando se utiliza VHDL el objetivo principal es el diseño de hardware y para ello debemos de utilizar técnicas de síntesis apropiadas al lenguaje, ya que se suele cometer el error de comenzar a programar en vez de describir y esto provoca que nos olvidemos del objetivo que es el hardware.
LA CLAVE PARA DESCRIBIR Y SINTETIZAR
FÁCILMENTE CIRCUITOS DIGITALES CON
VHDL ES PENSAR EN TÉRMINOS DE
COMPUERTAS Y REGISTROS Y NO EN
FUNCIÓN DE VARIABLES Y SUBRUTINAS
III. Simulación de la descripción en VHDL.
La simulación del código, o simulación funcional, nos permite detectar y corregir errores antes que se implemente en el dispositivo. La modularidad implementada facilita la evaluación del circuito, porque al describir el circuito por bloques podemos analizar cada uno por separado antes de unirlos. Esta simulación equivale a la depuración de programas en los lenguajes de computación.
IV. Síntesis
Síntesis consiste en reducir una descripción realizada en un lenguaje de alto nivel de abstracción a un nivel de compuerta que pueda ser implementada en un circuito. Dicho de otra manera, síntesis es el proceso mediante el cual una descripción es convertida en un listado de conexiones (netlist) entre las compuertas, registros, multiplexores, etc. de un dispositivo lógico programable.
Por ejemplo, una compuerta XOR puede ser sustituido por su equivalente: A XOR B = A'B+AB', o una instrucción IF puede ser en 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 involucra diferentes tipos de compuertas. Por lo que el proceso de síntesis depende del dispositivo utilizado. Generalmente una misma función es implementada de diferentes formas de acuerdo al dispositivo que estemos utilizando y esto no cambia la funcionalidad del diseño y será la misma si se selecciona el componente adecuado a la complejidad del diseño. El proceso utilizado para sintetizar un código en un CPLD es conocido como Fitting o ajuste y consiste en adaptar las ecuaciones booleanas en los diferentes bloques lógicos del dispositivo. Cuando se utiliza un FPGA el proceso empleado se le llama Place And Route y consiste en adecuar las ecuaciones a través de varias celdas lógicas. Aunque la finalidad es la misma, la manera en que se sintetiza un código en un CPLD es totalmente distinta a la síntesis de circuitos utilizando FPGAs.
Por otro lado la optimización en la conversión del código VHDL a ecuaciones booleanas depende de tres factores:
I. La descripción del circuito. II. Los recursos disponibles en el dispositivo
seleccionado.
III. Las directivas de síntesis seleccionadas por el
diseñador.
La descripción es el punto más importante porque de esto dependen los otros dos. En la descripción no solamente tenemos que “decir” como funciona el circuito, además, tenemos que describir en que “forma” debe de hacerlo. No es lo mismo describir el diseño de un sumador de cuatro bits utilizando cuatro módulos que realizan la suma basándose en propagación de bits de acarreo entre estos, a describir un circuito que realice la suma de manera paralela sin utilizar retroalimentaciones. Finalmente suman pero no lo 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
que son descritas en el mismo código, como por ejemplo forzar a que un nodo no sea simplificado o eliminado y pueda ser retenido a la salida de una macrocelda. Cuando se sintetiza para maximizar la frecuencia generalmente quedan funciones con varios términos e incluso hay términos que se repiten en las ecuaciones de los nodos de salida, pero esto se hace para evitar la retroalimentación.
V. Simulación del código sintetizado
Aún y cuando la simulación funcional se haya realizado con éxito, debemos volver a evaluar el circuito que realmente quedó sintetizado en el dispositivo. Ya que las sustituciones de funciones, como el caso de la compuerta XOR, dependerán de las características del dispositivo utilizado. Y es posible que ciertas funciones se ejecuten en más tiempo de los esperado y esto altere el funcionamiento del resto del diseño. Simular el código sintetizado en el circuito permite verificar los retrasos de tiempo de un nodo a otro, evaluar la máxima frecuencia de operación del circuito y verificar que éste funcione adecuadamente. En dado caso que el código no pudiera ser sintetizado podemos tratar de mejorar la descripción, es decir, mejorar el diseño tratando de eliminar registros, compuertas, buffers, etc., encontrar algún error en la descripción, cambiar las directivas de síntesis o definitivamente seleccionar otro dispositivo.
VI. Programación del dispositivo
Después de completar la descripción, la síntesis y la simulación del circuito con éxito, el siguiente paso es generar el archivo que nos permite implementar físicamente nuestro diseño en un dispositivo programable. Todos los programas de VHDL para síntesis generan un archivo con el que podemos programar el dispositivo. Ya sea JEDEC, JTAG, BITSTREAM, etc. de acuerdo al tipo dispositivo y fabricante.
IEC FRANCISCO JAVIER TORRES VALLE
8
CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES
II
DISPOSITIVOS LÓGICOS
PROGRAMABLES
9
IEC FRANCISCO JAVIER TORRES VALLE
CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES
2.1 CONCEPTOS FUNDAMENTALES
La fabricación de dispositivos de lógica programable se basa en los siguientes dos conceptos.
UNCIONALIDAD COMPLETA
F
La cual se fundamenta en el hecho de que cualquier función lógica se puede realizar mediante una suma de productos.
C
ELDAS 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 almacenan los datos de salida del circuito combinacional en vez de implementar físicamente la ecuación booleana.
2.2 DISPOSITIVOS LÓGICOS
PROGRAMABLES
Un dispositivo lógico programable, o PLD (Programmable Logic Device), es un dispositivo cuyas características pueden ser modificadas y almacenadas mediante programación. El dispositivo programable más simple es el PAL (Programmable Array Logic). El circuito interno de un PAL consiste en una matriz de conexiones, un matriz de compuertas AND y un arreglo de compuertas OR. Una matriz de conexiones es una red de conductores distribuidos en filas y columnas con un fusible en cada punto de intersección, mediante la cual se seleccionan cuales entradas del dispositivo serán conectadas al arreglo AND cuyas salidas son conectadas al arreglo OR y de esta manera obtener una función lógica en forma de suma de productos.
La mayoría de los PLDs están formados por una matriz de conexiones, una matriz de compuertas AND, y una matriz de compuertas OR y algunos, además, con registros. Las matrices pueden ser fijas o programables. Con estos recursos se implementan las funciones lógicas deseadas mediante un software especial y un programador de dispositivos. El tipo más sencillo de matriz 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
muestran los circuitos básicos para la mayoría de los PLDs.
Figura 2.1 Estructuras comúnmente utilizadas en
PLDs
2.2.1 MATRIZ GENÉRICA PROGRAMABLE
Una Matriz Genérica Programable, GAL
(Generic Array Logic), es una denominación que utilizaba originalmente Lattice Semiconductor y que más tarde se licenció a otros fabricantes. Un GAL en su forma básica es un PLD con una matriz AND reprogramable, una matriz OR fija y una lógica de salida programable mediante una macrocelda. Esta estructura permite implementar cualquier función lógica en forma de suma de productos con un numero de términos definido. En los PLDs no reprogramables la síntesis de las ecuaciones lógicas se realiza mediante la quema de fusibles en cada punto de intersección de los pines de entrada con las compuertas. En un GAL el fusible se reemplaza por una celda CMOS eléctricamente borrable (EECMOS) y mediante programación se activa o desactiva cada celda EECMOS. Una celda activada conecta su correspondiente intersección de fila y columna, y una celda desactivada desconecta dicha intersección. Con esta estructura se puede aplicar cualquier combinación de variables de entrada, o sus complementos, a una compuerta AND para generar cualquier operación producto que se desee. A continuación se muestran las estructuras típicas de un dispositivo GAL y la macrocelda de salida del GAL22V10.
10
IEC FRANCISCO JAVIER TORRES VALLE
CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES
Figura 2.2 Estructura típica de un GAL
FIGURA 2.3 Macrocelda de un GAL22V10
2.3 CPLD
Un CPLD (Complex Programmable Logic Device) extiende el concepto de un PLD a un mayor nivel de integración ya que permite implementar sistemas más eficientes porque 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.
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 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 las vías de la matriz por lo que la rutabilidad se incrementa usando multiplexores de mayor tamaño, permitiendo así que cualquier combinación de señales de la matriz de interconexión pueda ser enlazada hacia cualquier bloque lógico. Sin embargo, el uso de grandes multiplexores incrementa el tamaño de dispositivo y reduce su desempeño.
2.3.1 MATRIZ DE INTERCONEXIONES
PROGRAMABLES
La matriz de interconexiones programables, PIM Programmable Interconect Matrix (véase la 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, o inclusive a las entradas del mismo bloque. La mayoría de los CPLDs usan una de dos configuraciones para esta matriz: interconexión mediante arreglo o interconexión mediante
11
IEC FRANCISCO JAVIER TORRES VALLE
Figura 2.4 Arquitectura Básica de un CPLD
2.3.2 BLOQUES LÓGICOS
Un bloque lógico es muy similar a un PLD, cada uno de ellos poseen generalmente una matriz de compuertas AND, una matriz de compuertas OR y una configuración para la distribución de los
CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES
productos en las diferentes macroceldas del boque. El tamaño del bloque lógico es una medida de la capacidad del CPLD, ya que de esto depende el tamaño de la función booleana que pueda ser implementada dentro del bloque. Los bloques lógicos usualmente tienen de cuatro a veinte macroceldas. La cantidad de bloques lógicos que puede poseer un CPLD depende de la familia y fabricante del dispositivo.
familia MAX se colocan 4 productos por macrocelda los cuales pueden ser compartidos con otras macroceldas. Cuando un producto puede ser únicamente utilizado por una macrocelda se le conoce como termino - producto dirigido, y cuando estos pueden ser utilizados por otras macroceldas se le llama termino - producto compartido. Mediante estos productos 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 dependerá de la familia del dispositivo y del 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 fabricante distribuye los productos de diferente forma.
La familia MAX de CPLDs que fue desarrollada por Cypress Semiconductor conjuntamente con Altera Corporation, siendo los primeros en sacar al mercado unan familia de CPLDs, Altera la llamó MAX5000 y Cypress por su parte la clasificó como MAX340, la distribución de productos no es igual a la de un PLD. En un dispositivo como el 22V10 tenemos que la suma de productos es fija por cada macrocelda -8, 10, 12, 14 o 16 productos-, en la
Figura 2.6 Distribución de Productos en
dispositivos de las familias MAX340 y MAX5000
2.3.4 MACROCELDAS
Las macroceldas de un CPLD son similares a las de un PLD. Estas también están provistas con registros, control de polaridad, y buffers para utilizar salidas con alta impedancia. Por lo general un CPLD tiene macroceldas de entrada/salida,
macroceldas de entrada y macroceldas internas u ocultas (buried macrocells), en tanto que un
22V10 tiene solamente macroceldas de entrada/salida. Una macrocelda interna es similar a una macrocelda de entrada/salida, sólo que esta no puede ser conectada directamente a una terminal del dispositivo. La salida de una macrocelda
12
IEC FRANCISCO JAVIER TORRES VALLE
CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES
interna va conectada directamente a la matriz de interconexiones programable. Por lo que es posible manejar ecuaciones y almacenar el valor de salida de estas internamente utilizando los registros de estas macroceldas.
En la figura 2.7 se muestran la arquitectura interna de un CPLD de la familia FLASH 370 de Cypress Semiconductors. En esta podemos apreciar las macroceldas de entrada/salida, 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 proporcionar entradas adicionales para las funciones lógicas. En el diagrama se muestra la macrocelda de entrada de la familia FLASH 370. En general las macroceldas de entrada incrementan la eficiencia del dispositivo al ofrecer algunos registros adicionales con los que se pueden almacenar el valor de la terminal de entrada.
2.3.5 CELDA DE ENTRADA/SALIDA
En la figura 2.7 se puede apreciar una celda de entrada/salida, que bien podría considerarse parte del bloque lógico, pero no necesariamente tienen que estar a la salida de un bloque lógico. La función de una celda de entrada/salida es permitir 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
de la familia FLASH 370
Programmable Gate Array) consiste en arreglos de varias celdas lógicas las cuales se comunican unas con otras mediante canales de conexión verticales
13
IEC FRANCISCO JAVIER TORRES VALLE
CAPÍTULO II: DISPOSITIVOS LÓGICOS PROGRAMABLES
y horizontales tal y como se muestra en la figura
2.9.
Figura 2.9 Arquitectura básica de un FPGA
2.4.1 CELDAS LÓGICAS
Cada celda lógica es funcionalmente similar a los bloques lógicos de un CPLD. La diferencia está en que un FPGA normalmente utiliza generadores de funciones en vez de compuertas. Cada uno de estos generadores es como una memoria en donde en vez de implementar la función lógica mediante compuertas, se precalcula el resultado y se almacena en el generador. Las entradas al generador funcionan como un bus de direcciones, y mediante las diferentes combinaciones de las entradas al generador se selecciona el resultado correcto. Esto le da una gran densidad al dispositivo ya que se maneja un gran número de generadores, pero el tiempo de propagación al implementar una función lógica en estos generadores es menor al que se necesitaría si utilizáramos compuertas. La estructura de las celdas lógicas y las formas en que estas pueden ser interconectadas, tanto salidas como entradas de la celda, varían de acuerdo al fabricante. En general una celda lógica tiene menos funcionalidad que la combinación de sumas de productos y macroceldas de un CPLD, pero como cada FPGA tienen una gran cantidad de celdas lógicas es posible implementar grandes funciones utilizando varias celdas lógicas en cascada. Además de las celdas lógicas también es importante la tecnología utilizada para crear las conexiones entre los canales, las más importantes son las siguientes.
ANTIFUSE
Al igual que la tecnología PROM, un FPGA que utiliza este tipo de tecnología sólo se puede programar una sola vez y utilizan algo similar a un fusible para realizar las conexiones. Una vez que
éste es programado ya no se puede recuperar. La 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, son usadas para controlar multiplexores e interconectar las celdas lógicas entre ellas. En estas el contenido se almacena mediante un proceso de configuración en el momento de encendido del circuito que contiene al FPGA. Ya que al ser SRAM, el contenido de estos bloques de memoria se pierde cuando se deja de suministrar la energía. La información binaria de las celdas SRAM generalmente se almacena en memorias seriales EEPROM conocidas como memorias de configuración. En el momento de encendido del circuito toda la información binaria es transferida a las celdas del FPGA mediante el proceso de configuración el cual es generalmente automático y el propio FPGA contiene un circuito interno que se encarga de hacer todo el proceso.
Un FPGA que tiene una gran cantidad de canales de interconexión tiende a tener pequeñas celdas lógicas con muchas entradas y salidas en comparación con el número de compuertas que tiene la celda, este tipo de FPGAs generalmente utilizan tecnología ANTIFUSE. Un FPGA que tiene una estructura pequeña en canales de interconexión tiende a tener grandes celdas lógicas con pocas entradas y salidas en comparación con el número de compuertas que hay en la celda. Este tipo de FPGA generalmente está fabricado con tecnología SRAM. Una arquitectura con celdas lógicas pequeñas permite utilizar todos los recursos del dispositivo. Sin embargo, si las celdas lógicas son muy pequeñas entonces tendremos que utilizar un gran número de estas para poder implementar funciones lógicas de varios términos, lo cual agrega un tiempo de retardo por cada celda lógica implementada. Cuando el tamaño de la celda lógica es grande sucede lo contrario, en este tipo de celdas lógicas es posible utilizar un gran 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 con pocas celdas lógicas. El que el tamaño de la celda sea grande no afecta la frecuencia máxima de trabajo porque estamos hablando de que existe un gran numero de compuertas que pueden ser usadas en la función paralelamente, siendo el mismo tiempo de retardo para todas. Sin embargo, cuando las funciones son pequeñas en comparación con el tamaño de la celda no es necesario utilizar todas
las compuertas de la celda, por lo que este tipo de celdas no son precisamente las más indicadas para desempeñar pequeñas funciones. La tecnología SRAM es utilizada por Altera, Lucent Technologies, Atmel, Xilinx y otros. La tecnología ANTIFUSE es utilizada por Cypress, Actel, QuickLogic, y Xilinx. A continuación se muestran algunas celdas lógicas de distintos fabricantes.
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
SINTAXIS DEL
III
IEC FRANCISCO JAVIER TORRES VALLE
LENGUAJE
17
CAPÍTULO III: SINTAXIS DEL LENGUAJE
3.1 INTRODUCCIÓN A LA DESCRIPCIÓN EN VHDL DE CIRCUITOS DIGITALES
En este capítulo se discutirán los elementos 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.
3.1.1 MULTIPLEXORES
Antes de examinar la descripción en VHDL de multiplexores, analizaremos el funcionamiento interno y la metodología tradicional de diseño utilizada en este tipo de circuitos para después realizar la descripción del circuito en VHDL. En la figura 3.1 se describe externamente a un multiplexor y la tabla resume su funcionalidad.
ENTRADA SALIDA
x0 x1
s0
z0
s0 z0
0 x0
1 x1
Figura 3.1 Multiplexor 2 a 1
La tabla de verdad completa sería la siguiente.
ENTRADAS SALIDA
s0 x0 x1 z0
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 0
1 1 1 1
Utilizando cualquier técnica de simplificación de ecuaciones obtenemos: z0 = s0’·x0+s0·x1. Y el circuito quedaría como se muestra en la figura
3.2.
Figura 3.2 Circuito del Multiplexor 2 a 1
En VHDL podemos describir el circuito ya sea mediante la descripción completa de todas las combinaciones de las entradas, utilizando la tabla simplificada de funcionamiento o si lo deseamos es posible realizar la descripción compuerta por compuerta del circuito. Al primer estilo se le conoce como de flujo de datos y en este debemos describir como fluyen los datos de entrada hacia la salida. A continuación se muestra la descripción de flujo de datos del multiplexor con VHDL utilizando la tabla completa de funcionamiento del mismo. Las palabras en negritas son palabras reservadas en VHDL y los comentarios comienzan con dos guiones (--).
ENTITY multiplexor IS
PORT (s0, x0, x1: IN bit;
z0: OUT bit);
END multiplexor;
ARCHITECTURE data_flow OF multiplexor IS
SIGNAL temp: bit_vector (2 DOWNTO 0); BEGIN
z0 <= '0' WHEN temp = "000" ELSE
'0' WHEN temp = "001" ELSE '1' WHEN temp = "010" ELSE '1' WHEN temp = "011" ELSE '0' WHEN temp = "100" ELSE '1' WHEN temp = "101" ELSE '0' WHEN temp = "110" ELSE '1';
temp <= s0 & x0 & x1; -- Concatenación
-- de las entradas en un
-- solo bus.
END data_flow;
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. Básicamente la entidad es la estructura en la que se define cuales son las entradas y salidas del circuito que deseamos representar, la cual podemos asociar con una “caja” en la que se que precisan cuales son las interfaces de comunicación con el exterior, siendo la arquitectura donde se detalla el comportamiento interno de esa “caja”. Observe que en la descripción anterior se utilizó un objeto de datos llamado SIGNAL para crear el bus “temp” y concatenar “s0”, “x0” y “x1” en un solo objeto y así facilitar la descripción. A continuación utilizaremos la tabla simplificada para diseñar el multiplexor, ya que si observamos la salida depende fundamentalmente de la entrada de selección “s0”, por lo que atendiendo a esta característica la descripción de flujo de datos quedaría tal y como se muestra a continuación.
ENTITY multiplexor IS
PORT (s0, x0, x1: IN bit;
z0: OUT bit);
END multiplexor;
ARCHITECTURE data_flow OF multiplexor IS BEGIN
z0 <= x0 WHEN s0 = '0' ELSE x1;
END data_flow;
En ambas descripciones hemos definido el funcionamiento de la salida apoyándonos en las entradas. Note que existe cierto “paralelismo” de las entradas hacia las salidas, es decir, no importa cual combinación de entradas se dé, sólo una opción será asignada a la salida. Por lo que no 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 importa tanto el orden de las instrucciones, lo cual no es así en lenguaje de programación de software. Tal vez este “paralelismo” se perciba con mayor detalle realizando la descripción del circuito compuerta por compuerta utilizando la ecuación simplificada del circuito obtenida 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;
not_s0 <= NOT s0; and2 <= s0 AND x1;
END data_flow;
La descripción anterior también es de flujo de datos y no sigue ningún orden en particular en el uso de las instrucciones y esto se ha hecho para destacar el comportamiento paralelo o concurrente de VHDL. Observe que cada ecuación describe a cada una de las compuertas que se muestran en la figura 3.2, por lo cual no hubiera importado el orden que hayamos seguido siempre y cuando se realicen las conexiones correctamente.
Pensemos en el circuito implementado físicamente en el laboratorio. Cada una de estas compuertas posee características eléctricas que les asignan un funcionamiento definido. Estas particularidades eléctricas cumplen con leyes físicas que se están cumpliendo todo momento y, entonces, no importa como se hayan ordenado los circuitos entre sí lo importante es realizar correctamente las conexiones para obtener la función deseada. En VHDL se trata de emular ese comportamiento, por lo tanto el orden que se haya seguido en cada una de las instrucciones anteriores no es importante, ya que hicimos correctamente la interconexión entre las compuertas.
3.1.2 COMPARADORES
La figura 3.3 representa a un comparador y la siguiente tabla resume su funcionalidad.
ENTRADAS SALIDAS
x_may_y equals x_men_y
x > y 1 0 0
x = y 0 1 0
x < y 0 0 1
IEC FRANCISCO JAVIER TORRES VALLE
19
CAPÍTULO III: SINTAXIS DEL LENGUAJE
Figura 3.3 Comparador
En el diseño convencional de un comparador tendríamos que realizar una tabla de todos los posibles valores lógicos de las salidas respecto a las entradas. Lo cual en este caso sería de 256 combinaciones, dado que tenemos ocho bits de entrada para obtener las tres ecuaciones de salida. En VHDL basta con describir de una forma general el funcionamiento del hardware y el sintetizador se encargará de generar toda esta tabla de 256 combinaciones y obtener las ecuaciones lógicas de las tres salidas. El código mostrado a continuación corresponde al comparador mostrado en la figura 3.3.
ENTITY comparador IS
PORT ( x: IN bit_vector (3 DOWNTO 0);
END comparador;
ARCHITECTURE data_flow OF comparador IS BEGIN
equals <= '1' WHEN x = y ELSE '0';
x_may_y <= '1' WHEN x > y ELSE '0';
x_men_y <= '1' WHEN x < y ELSE '0'; END data_flow;
y: IN bit_vector (3 DOWNTO 0); equals: OUT bit; x_may_y: OUT bit; x_men_y: OUT bit);
Nótese que en la primera declaración de puertos, dentro de la entidad del comparador, se definen dos bus de entrada de cuatro bits de magnitud (x, y), en cambio las salidas son de solamente un bit. En la entidad lo único que hacemos es describir como es el circuito, o aquello del circuito que permite a la entidad comunicarse hacia otras entidades, sin mencionar para nada su comportamiento interno. Y es en la arquitectura, después del BEGIN, es donde se realiza la descripción del comportamiento del circuito atendiendo únicamente a la funcionalidad del mismo, es decir, no es necesario analizar cada caso en particular de las 256 posibles combinaciones.
3.1.3 EL ESTILO DE “PROGRAMACIÓN
N VHDL
E
Haciendo una comparación con un lenguaje de programación de alto nivel podemos ver que el código es similar en cuanto a las sentencias utilizadas, sin embargo, no es así en el flujo de ejecución de las instrucciones. Un código de programación en VHDL no es precisamente un
“programa”, ya que un programa es un conjunto de instrucciones que se ejecutan paso a paso para llevar a cabo una tarea determinada, y en este caso no podemos decir que las instrucciones se estén ejecutando de esta manera, porque esto no corresponde en la realidad al comportamiento de un circuito. En VHDL las instrucciones se están ejecutando en todo momento lo cual sí se asemeja al comportamiento real de un circuito. Así cuando cambie alguna señal de entrada cambiará inmediatamente la salida y, por consiguiente, estamos describiendo cual es el verdadero funcionamiento del circuito. La forma en que se “programa” en VHDL al principio resultará un tanto extraña, pero si asociamos éste código con el circuito que estamos describiendo, podemos darnos cuenta que en él los componentes siempre están activos, y es esto es precisamente lo que describimos mediante VHDL. Tal vez alguna vez ha utilizado PSPICE o algún programa de entrada esquemática de diseño para modelar y simular circuitos, estos también son para la descripción de circuitos. En PSPICE la descripción se realiza mediante un listado de conexiones (netlist) entre los componentes, en tanto que en los otros lo hacemos de manera gráfica y en ambos se considera que todos los componentes siempre están funcionando para que la simulación o modelado del diseño sea de acuerdo a la realidad. Por esto en VHDL el orden de las instrucciones no es tan importante como en el caso de un lenguaje de programación de software, porque las instrucciones se están ejecutando al mismo tiempo y así sí se modela adecuadamente un circuito. Posteriormente se explicarán los tipos de instrucciones y sus diferencias, ya que VHDL si permite la “descripción secuencial” utilizando instrucciones de esta naturaleza dentro de una estructura llamada PROCESS. En esta estructura las instrucciones se ejecutan “paso a paso” como en los lenguajes de programación de software. Pero de cualquier manera esta estructura siempre esta activa, como si fuera un componente o subcircuito del diseño, por lo que todo lo que se obtenga dentro del proceso se ejecutará paralelamente con el resto de las instrucciones que están fuera de esta estructura.
Otro punto importante es el dispositivo lógico programable que estemos utilizando, ya que si éste no tiene la capacidad para realizar lo que “dice” nuestra descripción nunca podremos
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 salidas puedan ser programadas para que trabajen con alta impedancia, aún y cuando la descripción sea correcta nunca podremos sintetizarla en el dispositivo.
Al principio generalmente se comete el error de tratar de “programar” como si fuera C++, Pascal, Visual Basic o cualquier otro lenguaje de programación de software, además de olvidar que el PLD, CPLD, o FPGA que utilicemos tiene características propias que deben ser consideradas cuando se hace la descripción. Pero basta con recordar que estamos diseñando hardware y que por lo tanto no se trata de un lenguaje secuencial de programación para software.
3.2 IDENTIFICADORES
Un identificador se define como un conjunto de caracteres con el cual podemos representar diferentes elementos dentro de una descripción. En VHDL un identificador está compuesto por una secuencia de uno o más caracteres alfabéticos, numéricos, o del carácter de subrayado. Las condiciones que debe de seguir un identificador son las siguientes:
VHDL permite la utilización de las letras
mayúsculas (A.. Z), minúsculas (a.... z),
dígitos (0...9), y el carácter de subrayado (_).
El primer carácter de un identificador debe
ser una letra.
El ultimo carácter de identificador no puede
ser el carácter de subrayado. Además, el carácter de subrayado no puede aparecer dos o más veces consecutivas.
Mayúsculas y minúsculas son consideradas
idénticas. Así, Signal_A, signal_a, y SIGNAL_A se refieren al mismo identificador.
Los comentarios en VHDL comienzan con
dos guiones consecutivos (--), y se extienden hasta el final de la línea. Los comentarios pueden aparecer en cualquier lugar dentro de una descripción en VHDL.
VHDL define un grupo de palabras
reservadas, llamadas "palabras clave" (keywords), las cuales no pueden ser usadas como identificadores.
EJEMPLOS
-- Este es un comentario.
ENTITY contador IS -- comentario al final
-- de una línea
Los siguientes ejemplos son de identificadores
válidos en VHDL.
Mi_entidad
Mux4a2
TTL_7490
A continuación se muestran ejemplos de
identificadores no válidos en VHDL.
3er_Modulo -- un identificador no
-- puede iniciar con un
-- dígito
_salida_x -- o con el carácter de
-- subrayado
M__24xmax -- no se permiten dos
-- caracteres de
-- subrayado seguidos
My_design_ -- un identificador no
-- debe terminar con un
-- carácter de subrayado
Unidad& -- el caracter "&", no
-- es un carácter válido
SIGNAL -- palabra reservada
3.3 OBJETOS DE DATOS
Un objeto de datos en VHDL es un elemento que toma un valor de algún tipo de dato determinado. Según sea este tipo de dato, el objeto poseerá un conjunto de propiedades que se le podrán aplicar, como las operaciones en las que el objeto puede ser usado. En VHDL los objetos de datos son generalmente de una de tres clases: constantes, variables o señales.
3.3.1 CONSTANTES
Una constante es un elemento que puede tomar un único valor de un tipo dado. A las constantes se les debe asignar un valor en el momento de la declaración. Una vez que se le ha asignado algún valor, éste no puede ser cambiado dentro de la descripción del diseño. Las constantes pueden ser
IEC FRANCISCO JAVIER TORRES VALLE
21
CAPÍTULO III: SINTAXIS DEL LENGUAJE
declaradas dentro de las entidades, arquitecturas, procesos o paquetes. Las constantes que se declaren en un paquete pueden ser utilizadas en cualquier descripción en la que se este utilizando dicho paquete. Por otra parte las constantes declaradas dentro de una entidad pueden ser utilizadas por la o las arquitecturas en las que se este haciendo la descripción de dicha entidad, y aquellas constantes que sean declaradas dentro de una arquitectura o proceso, son válidas únicamente dentro de la estructura correspondiente.
D
ECLARACIÓN DE CONSTANTES
CONSTANT identificador: tipo := valor;
EJEMPLO
CONSTANT byte: integer := 8;
3.3.2 VARIABLES
Los objetos de datos de la clase variable son similares a las constantes, con la diferencia que su valor puede ser modificado cuando sea necesario. Las variables en VHDL son similares a cualquier tipo de variable de un lenguaje de programación de alto nivel. A las variables también se les puede asignar un valor inicial al momento de ser declaradas. Se utilizan únicamente en los procesos y subprogramas (funciones y procedimientos). Las variables generalmente se utilizan como índices, principalmente en instrucciones de bucle, o para tomar valores que permitan modelar componentes. Las variables no representan conexiones o estados de memoria.
DECLARACIÓN DE VARIABLES
VARIABLE identificador: tipo [:=valor];
EJEMPLO
VARIABLE aux1, aux2: bit;
3.3.3 SEÑALES
representan elementos de memoria o conexiones y si pueden ser sintetizadas.
Los puertos de una entidad son implícitamente declarados como señales en el momento de la declaración, ya que estos representan conexiones. También pueden ser declaradas en las arquitecturas antes del BEGIN, lo cual nos permite realizar conexiones entre diferentes estructuras de programación. La asignación de valores a un objeto de datos del tipo señal no es inmediata como en el caso de las variables, esto se explicará más detalladamente cuando se exponga la estructura PROCESS y los tipos de instrucciones.
DECLARACIÓN DE SEÑALES
SIGNAL identificador: tipo [:=valor];
EJEMPLOS
SIGNAL A, B: bit := '0'; -- el valor
-- inicial es
-- opcional
SIGNAL dato: bit_vector (7 DOWNTO 0);
3.3.4 ALIAS
Un ALIAS no es precisamente un objeto de datos. La instrucción ALIAS permite que utilicemos un identificador diferente para hacer referencia a un objeto de datos, o a parte de él, ya existente. Este no es un objeto de datos nuevo, sino que nos permite manipular fragmentos del objeto de datos original para facilitar la programación. Al modificar el ALIAS se modifica el objeto de datos al que señala.
DECLARACIÓN DE ALIAS
ALIAS identif: tipo IS identif2 <rango>;
EJEMPLO
ALIAS instr: bit_vector (3 DOWNTO 0) IS
dato (7 DOWNTO 4);
Un objeto de la clase señal es similar a un objeto de la clase variable, con una importante diferencia: las señales si pueden almacenar o pasar valores lógicos, mientras que una variable no lo puede hacer. Las señales, por lo tanto,
IEC FRANCISCO JAVIER TORRES VALLE
3.4 TIPOS DE DATOS
Un tipo de dato especifica el grupo de valores que un objeto de datos puede tomar así como las operaciones que son permitidas con esos valores. En VHDL es sumamente importante el tipo de
22
CAPÍTULO III: SINTAXIS DEL LENGUAJE
dato, los objetos de datos no pueden tomar o no se les puede asignar un objeto de datos de otro tipo, y no todas las operaciones se pueden utilizar con los diferentes tipos de datos a menos que se utilicen las librerías adecuadas en las que estén definidas funciones para la conversión de tipos. Además, es posible que el usuario defina subtipos y tipos compuestos, modificando los tipos básicos, así como definir tipos particulares con combinaciones de los diferentes tipos. A continuación se discutirán las dos categorías de tipos de datos más utilizadas en síntesis: escalares y compuestos.
3.4.1 TIPOS ESCALARES
Los tipos escalares tienen un orden especifico lo cual permite que sean usados con diferentes operadores. Existen cuatro clases de tipos escalares: enteros, reales o de punto flotante, enumerados, y físicos.
ENTERO
VHDL permite especificar la gama del entero (integer) de manera diferente. Sin embargo, la gama debe extender desde por lo menos -(2^31-1) a +(2^31-1), o - 2147483648 a +2147483647. Una señal o variable declarada como tipo entero y que tenga que ser sintetizada en elementos lógicos, debe ser limitada con un rango.
EJEMPLO
VARIABLE n: integer RANGE -15 TO 15;
REAL
El rango de valores que puede tomar este tipo de dato se encuentra entre -1.038E38 a +1.038E38. El Real rara vez es usado en síntesis y en la gran mayoría de las herramientas de software de VHDL para síntesis no es posible utilizar este tipo de dato.
ENUMERADOS
Un tipo enumerado es un tipo de dato con un grupo de posibles valores asignados por el usuario. Los tipos enumerados se utilizan principalmente en el diseño de maquinas de estado.
TYPE nombre IS ( valor [,valor...] );
El orden en el que los valores son listados en la declaración del tipo enumerado define el orden léxico para ese tipo.
EJEMPLOS
a) En este ejemplo se define un tipo enumerado llamado “arith”, y los posibles valores son add, sub, mul, y div.
TYPE arith IS (add, sub, mul, div);
b) Ahora se define un tipo enumerado llamado “estados”, con 4 posibles valores: estado0, estado1, estado2 y estado3.
TYPE estados IS ( estado0, estado1,
estado2, estado3 );
Existen varios tipos de datos enumerados, algunos predefinidos en los programas de síntesis, para el lenguaje pero generalmente los siguientes tipos enumerados son los más comúnmente utilizados para síntesis de circuitos.
B
OOLEAN
El tipo BOLEAN es un tipo enumerado con dos valores, FALSE y TRUE, donde FALSE < TRUE. Las funciones lógicas y de comparación retornan siempre un valor booleano.
Cuando en una operación lógica o de comparación se utilza un tipo de dato no booleano, el bit por ejemplo, existen funciones de conversión que permiten realizar dichas operaciones con distintos tipos de datos. En el caso del bit se utiliza la siguiente función.
boolean_var := (bit_var = '1');
BIT
El bit es un tipo enumerado que representa valores binarios: '0' y '1'. Las operaciones lógicas en las participa este tipo de dato regresan valores binarios mediante las siguiente función.
IF (boolean_var) THEN bit_var := '1';
ELSE
bit_var := '0';
END IF;
D
ECLARACIÓN DE UN TIPO ENUMERADO
IEC FRANCISCO JAVIER TORRES VALLE
23
CAPÍTULO III: SINTAXIS DEL LENGUAJE
CHARACTER
El tipo character es un tipo enumerado que contiene el conjunto de los símbolos contenido en el ASCII.
STD_LOGIC
El tipo std_logic es similar al tipo bit pero con 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 puede tomar los valores 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-'. Para poder utilizar este tipo de dato es necesario incluir el paquete dentro de la descripción utilizando las siguientes dos líneas antes de la declaración de la entidad.
LIBRARY ieee; USE ieee.std_logic_1164.ALL;
El significado de los valores del std_logic se muestra en la siguiente tabla.
'U' -- Uninitialized 'W' -- Weak Unknow
'X' -- Forcing 'L' -- Weak 0
'0' -- Forcing 0 'H' -- Weak 1
'1' -- Forcing 1 '-' -- Don't care
'Z' -- High Impedance
Los valores '0', '1', 'L' y 'H', se utilizan en síntesis de circuitos, los valores 'Z' y '-' tienen restricciones sobre como y donde pueden ser usados. Los valores 'U', 'W' y 'X' se utilizan únicamente para simulación y evaluación de diseños mas no para síntesis. Para la mayoría de los diseños se utiliza este tipo de dato ya que es más completo que el tipo bit por proporcionar los valores 'Z' y '-'.
S
OBRECARGA DE UN TIPO ENUMERADO
Es posible cargar el valor de algún tipo enumerado incluyendo dicho valor en la definición de dos o más tipos enumerados. Cuando se utilice en una descripción dos o más tipos que usen el mismo valor generalmente el programa de síntesis identifica de cual tipo proviene, pero bajo ciertas condiciones esta determinación es imposible. En estos casos es necesario indicar explícitamente de cual tipo se trata. En el siguiente ejemplo se muestra como realizar esta indicación explicita.
TYPE color is (red, green, yellow, blue,
violet);
TYPE primary_color IS (red, yellow, blue);
. . .
SIGNAL A: color; SIGNAL B: primary_color; SIGNAL C: bit; SINAL D: std_logic;
. . .
A <= color'(red); -- Se indica a que
-- tipo estamos
-- haciendo
-- referencia
B <= blue; -- Posiblemente el
-- programa de síntesis
-- marque error en este
-- caso
C <= '1'; -- En estas dos
-- asignaciones el
D <= '1'; -- programa de síntesis
-- identifica de que
-- tipo se trata
CODIFICACIÓN DE LOS TIPOS ENUMERADOS
Los tipos enumerados se ordenan de acuerdo a sus valores. Los programas de síntesis automáticamente codifican binariamente los valores del tipo enumerado para que estos puedan ser sintetizados. Algunos programas los hacen mediante una secuencia binaria ascendente, otros buscan cual es la codificación que mejor conviene para tratar de minimizar el circuito o para incrementar la velocidad del mismo una vez que la descripción es sintetizada. También es posible asignar el tipo de codificación mediante directivas de síntesis.
El siguiente ejemplo muestra la forma en que el programa de síntesis Foundation de Xilinx, Inc. codifica un tipo enumerado de cinco posibles valores.
TYPE color IS (red, green, yellow, blue,
violet);
La codificación sería la siguiente: red="000", green="001", yellow="010", blue="011", violet="100".
Para realizar la codificación manualmente se deben utilizar directivas de síntesis que son propias de cada programa. Para ver ejemplo de cómo se utilizan consulte la ayuda del programa y
IEC FRANCISCO JAVIER TORRES VALLE
24
Loading...
+ 83 hidden pages