Descargar

Controlador electrónico de velocidad PID usando CPLD (página 2)

Enviado por Cesar


Partes: 1, 2, 3, 4

Fig. 3.21: Diagrama de un motor de DC controlado por armadura.

edu.red

Suponiendo que todas las condiciones iniciales son cero, y tomando las transformadas de Laplace de las ecuaciones 3 17, 18,19 y 20, se obtiene:

edu.red

Fig. 3.22: Diagrama de bloques obtenido por las ecuaciones 3.21, 22, 23, y 24.

El servomotor DC controlado por armadura es, un sistema retroalimentado. El efecto de la fuerza contra-electromotriz se ve que es una retroalimentación de la señal proporcional a la velocidad del motor. Esta fuerza contra-electromotriz incremente el amortiguamiento efectivo del sistema.

La función de transferencia para este servomotor de DC se puede obtener:

edu.red

Fig. 3.23: Diagrama de bloques simplificado.

3.6.3 Sensor de velocidad, tacómetro

La velocidad, como variable en los procesos industriales se refiere normalmente a la medición de las revoluciones de algún eje giratorio, es decir, la velocidad angular y de esta se derivan los métodos de medición de velocidad lineal.

Estas dos formas de medición implican la posibilidad de realizarlas mediante métodos mecánicos como eléctricos y electrónicos.

En la siguiente tabla se puede apreciar los tipos de velocidad así como sus unidades y el tipo de instrumento empleado.

Tabla 3.03: Medición de velocidad.

Tipo de velocidad

Unidades de medición

Tipo de instrumento

Lineal

m/s

Velocímetro

Angular

r.p.m. o rad/s

Tacómetro

Por frecuencia

ciclo/s.

Frecuencimetro

Tacómetros

El tacómetro consiste en un transductor que transforma la velocidad de rotación en una señal eléctrica que se transmite a un indicador. Esta proporción a la velocidad, el transductor produce ya sea:

-Una señal análoga que puede emplearse para indicación analógica.

-Pulsos que pueden ser digitales cuando se cuentan en términos de revoluciones por unidad de tiempo.

Efectos del sensor en el comportamiento del sistema

Como las características dinámicoas y estáticas del sensor o elemento de medición afectan la indicación del valor efectivo de la variable de salida, el sensor juega un papel importante en la determinación del comportamiento global del sistema de control. El sensor suele determinar la función de transferencia en la retroalimentación. Si las constantes de tiempo del sensor son insignificantes en comparación con las constantes de tiempo de los demás componentes del sistema de control, la función de transferencia del sensor se convierte en una constante.

edu.red

Fig. 3.24: Diagrama de controladores con tipo de sensores.

CAPÍTULO IV

Dispositivos lógicos programables complejos y el lenguaje de programación de hardware VHDL

4.1 Nociones fundamentales

Los chips discretos SSI y MSI, poco a poco se van sustituyendo con los LSI, los cuales pueden programarse para realizar las funciones. Un dispositivo lógico programable es un chip LSI que contiene una estructura de circuito "regular", pero que permite al diseñador adecuarlo para una aplicación específica.

Cuando un PLD típica deja la fábrica de IC, aún no está listo para una función específica, sino que debe ser programado por el usuario para que realice la función requerida en una aplicación particular. La estructura del circuito "regular" en un PLD por regla general es un arreglo rectangular de celdas idénticas que pueden programarse en forma individual.

Para un área de chip dada, el potencial de funcionalidad que puede obtenerse con tal estructura es más grande que el de una colección aleatoria de compuertas lógica. De hecho, en cada punto del desarrollo de la tecnología de IC, los chips con la mayor funcionalidad por unidad de área han sido los chips de memoria, que contienen arreglos rectangulares de celdas de memoria.

Los diseños que usan PLD por lo común son más pequeños y rápidos que sus equivalentes SSI/MSI y, a menudo también cuestan menos. Los PLD, por regla general simplifican la tarea del diseñador. Un PLD equivalente a un circuito más grande SSI/MSI puede especificarse, a menudo, con un programa simple, el cuál puede modificarse fácilmente para encontrar error o mejorar su funcionalidad.

Los diseñadores lógicos tienen una gama muy amplia de CI disponibles con numerosas funciones lógicas y arreglos de circuitos sobre el mismo CI. Además, estos CI son ofrecidos por varios fabricantes y con un costo razonablemente bajo. Por estas razones, los diseñadores han interconectado CI estándares para construir una variedad casi sin fin de circuitos y sistemas diferentes, y continuarán haciéndolo en el futuro.

4.2. PLD complejas: CPLD

También conocidos como: EPLD (Erasable PLD) y MAX (Multiple Array matriX, Altera) Estas estructuras extienden el concepto de de PLD a un nivel de integración superior; esto es, se dispone de mayor número de puertas y de entradas/salidas en un circuito programable (con lo que se disminuye el tamaño del diseño, el consumo y el precio).

En vez de hacer estos circuitos con mayor número de términos producto por macrocelda, o de mayor número de entradas/salidas, cada CPLD contiene bloques lógicos, cada uno de ellos similar a una estructura PAL o GAL. Estos bloques lógicos se comunican entre sí por medio de interconexiones programables, con lo que se optimizan los recursos incorporados en el chip.

4.2.1 Interconexiones programables

Las interconexiones programables, conducen las señales de los dispositivos de entrada/salida (I/O) hacia los bloques lógicos. Cada uno de estos bloques tiene un número predeterminado de entradas.

La mayoría de los CPLDs utilizan una de las siguientes estrategias para la implementación de la interconexión programable:

Interconexión basada en estructura matricial.

Interconexión basada en multiplexores.

4.2.2 Bloques lógicos

Un bloque lógico equivale a una pequeña estructura PAL. Dispone de una matriz que implementa términos producto y macroceldas. Las celdas de I/O son a veces consideradas parte de un bloque lógico.

El tamaño de un bloque lógico es una medida de su capacidad (cuanta lógica se puede implementar) y se expresa, habitualmente en términos del número de macroceldas, el número de entradas y el número de términos producto, así de cómo su distribución.

4.2.3 Matriz de términos producto y su distribución

Además del tamaño de la matriz (importante par identificar el número de términos producto promedio por macrocleda), es interesante conocer la distribución por macroceldas.

La familia MAX está organizada de forma que cada macrocelda tiene cuatro términos producto fijos por macrocelda. Además dispone de una serie de términos producto (expander product terms) que se pueden asociar a una o varias macroceldas. Si este término se utiliza por una única macrocelda se denomina "product-term steering", mientras que si se puede utilizar por varias a la vez se denomina "product-term sharing".

Versiones más evolucionadas de este concepto se encuentran en las familia MACH de Advanced Micro Devices o en la familia 7000 de Altera.

4.2.4 Macroceldas

Como en las PLD más sencillas, las CPLD incluyen macroceldas en las que se dispone de biestables y señales de control de polaridad. Además se aumenta la flexibilidad de las mismas.

Por ejemplo muchas CPLDs ofrecen la posibilidad de configurar los biestables como tipo D o T, para mejorar el proceso de implementación. Además los CPLDs suelen disponer de macroceldas de I/O (esto es, asociada con una entrada/salida) y macroceldas con salidas sólo a la matriz programble (buried macrocell).

También se puede seleccionar la señal de reloj de la macrocelda, o configurar el biestable como T, JK o RS. La salida de la macrocelda también se puede configurar como puramente combinacional o a través del biestable. Esta salida puede ser realimentada a la matriz programable, tanto a nivel local como a nivel global.

Otras macroceldas con una función especializada son las macroceldas de entrada, que son utilizadas para dotar al dispositivo de unas líneas adicionales de entrada, que pueden tener funciones tales como señales de reloj, entradas de la matriz programable, etc.

4.2.5 Celdas de I/O

Son la parte que establece una conexión entre las macroceldas y las patillas del Circuito Integrado.

4.2.6 Otras características de las CPLD

Además de los recursos lógicos, mecanismos de rutado, esquemas de distribución de términos productos y modelos de retardos temporales, existen otras características propias de los mismos.

Programabilidad en el sistema (in system programmability o ISP)

Es la capacidad de programar el dispositivo mientras se encuentra en la placa de circuito impreso en el que opera. De esta forma se reduce significativamente el coste de fabricación, ya que el dispositivo se manipula menos en fábrica, no es necesario llevar un inventario complejo, etc.

Re-programabilidad en el sistema (in system reprogrammability o ISR)

Es la capacidad de reprogramar el CPLD mientras se encuentra en la placa de circuito impreso. Se puede utilizar para el prototipado, cargar actualizaciones o incluso alterar la función del dispositivo mientras se encuentra en operación.

Boundary Scan

Las especificaciones del grupo JTAG (Joint Test Action Group), que se han convertido en la norma IEEE 1149.1, definen un método para comprobar la funcionalidad de un dispositivo y las conexiones a otros circuitos integrados. Desplazando datos a través de las celdas "boundary scan", se pueden comprobar las conexiones con otros dispositivos y se pueden aplicar vectores de test a la lógica interna.

JTAG es una metodología que se puede utilizar para comprobar y asegurar la calidad o para depurar código. Para limitar el número de vectores de test necesarios, JTAG también especifica un modo BIST (built-in self-test): Un dispositivo en este modo genera un conjunto de vectores de test pseudo-aleatorio como vectores de estímulo, compara las salidas con los resultados esperados e informa de los posibles errores.

4.2.7 Fabricantes de CPLD

Son las siguientes empresas de desarrollo electrónico:

Altera Xilinx Cypress

Lattice Philips

4.3 Características técnicas de la familia MAX 7000 de Altera

La familia MAX 7000 de alta densidad, es un PLD de alta performanse, basado en la segunda generación de la arquitectura MAX de Altera. Fabricado con tecnología de avanzada CMOS, la EEPROM basado en la familia MAX 7000 provee de 600 a 5000 entradas utilizables, ISP, pin a pin de retraso tan rápido de 5 ns. y velocidad de contador en 175.4 MHz.

Los dispositivos MAX 7000E, que incluyen los dispositivos EPM 7128E, EPM 7160E, 7192E, y 7256E, tienen características magníficas como: relojes globales adicionales, adicionales controles de habilitación de salida, grandes recursos de interconexión, y recursos de entradas rápidos.

En dispositivos ISP MAX 7000, dispositivos llamados MAX 7000S, que incluye los dispositivos EPM 7032S, EPM 7064S, EPM 7128S, EPM 7160S, EPM 7192S, y EPM 7256S. Los dispositivos MAX 7000S tienen las grandes características de los dispositivos MAX 7000E tan bien como la circuitería JTAG BST en dispositivos con 128 o más macroceldas, ISP, y una opción de salida drenador-abierto.

4.3.1 Características del MAX 7000

Tiene alta performance, el dispositivo lógico programable está basado en EEPROM, basado en la arquitectura de segunda generación de MAX.

El sistema programador en 5V. (ISP) completamente construido por norma IEEE Std. 1149.1 del JTAG (Joint Test Action Group).

La norma JTAG es compatible en los MAX 7000S que cuentan con 128 o más macroceldas.

La familia completa de EPLD con densidades lógicas que van desde 600 a 5000 puertas usables.

La frecuencia del reloj es 175.4 MHz y retardo lógico de pin a pin lógico de 5 ns (incluyendo interconexión).

Cuenta con la opción de salida drenador-abierto en dispositivos MAX 7000S.

Incluye macroceldas programables, flipflop, "clear" individual, reloj preseteable y reloj habilitador de control.

La distribución producto-termino expandible es configurable, permitiendo más de 32 producto-término por macrocelda.

Disponible desde 44 a 208 pines en chips de con encapsulados plásticos (PLCC), arreglo de pines-grid cerámico (PGA), empaque llano cuadrado plástico (PQFP), empaque llano cuadrado alimentado (RQFP) y empaque llano cuadrado fino de 1 mm. (TQFP).

Contiene un bit de seguridad programable para la protección de diseños.

Operación de 3.3 a 5 V.:

La operación de interfase i/o multivolt(, es una cualidad de los dispositivos con interfase de 3.3 a 5V. (La operación Multivolt( i/o no es permitida en chips de 44 pines).

Tiene pines compatibles con bajo-voltaje en dispositivos MAX 7000A Y 7000B.

Características generales de los MAX 7000E y MAX 7000S.

Habilita seis pines o salidas para señales de guías-lógicas.

Tiene 2 señales de reloj global, con opciones inversas.

Realza los recursos para la interconexión y para improvisadas fugas.

Rápidas entradas para sistemas de tiempo provistas por una trayectoria dedicada, desde pines i/o a registros de macroceldas.

Salidas programables con control rate/slow.

Soporta diseño por software y ruteado automático, provisto por el sistema de desarrollo de Altera para Windows-PC y SunSPARC station, y estaciones HP 9000 Serie 700/800.

Adicionalmente para el diseño y mantenimiento se tiene, la simulación provista por los archivos EDIF 2.0 y 3.0, librerías de módulos parametrizados (LPM), Verilog HDL, VHDL, y otros interfaces como las populares herramientas EDA.

Mantenimiento Programable.

Unidad Programadora Maestra Altera (MPU) y programación de hardware de otros fabricantes, para todos MAX 7000.

El cable de descarga serial BitBlaster, el cable de descarga paralelo ByteBlasterMV y ByteBlasterII, y el bus serial serial/universal (USB) MasterBlaster cable de descarga para el programa del MAX 7000S.

Tabla 4.1: Características del MAX 7000.

edu.red

Tabla 4.2: Características del MAX 7000S.

edu.red

Tabla 4.3: Uso máximo de pines I/O del MAX 7000.

edu.red

4.3.2 Descripción Funcional

La arquitectura MAX 7000 incluye los siguientes elementos:

Bloque de arreglo lógico

Macrocelda

Términos de productos expandibles

Arreglo de interconexión programable

Bloques de control entrada/salida

edu.red

Fig. 4.1: Diagrama de bloques del dispositivo MAX 7000E & MAX 7000S.

Bloques de arreglo lógico

La arquitectura del dispositivo MAX 7000 está basado en: el ruteado de alta performance, flexibilidad, módulos de arreglo lógico llamados bloques de arreglo lógico (Logic Array Blocks, LAB). Los bloques de arreglo lógico consisten en 16 arreglos de macroceldas. Los múltiples bloques de arreglo lógico son ruteados junto a la vía del arreglo de interconexión programable (Programmable Interconnect Array, PIA), como un bus global que es alimentado por todas las entradas dedicadas, pines entrada/salida y macroceldas.

Macroceldas

Las macroceldas del MAX 7000 puede ser individualmente configurada para operaciones lógicas secuenciales o combinacionales. Las macroceldas consisten de tres bloques funcionales: el arreglo lógico, la matriz seleccionable término producto, y el registro programable.

edu.red

Fig. 4.2: Macrocelda para dispositivos MAX 7000E & MAX 7000S.

Términos producto expandible

Aunque muchas funciones lógicas pueden ser implementadas con los 5 productos términos disponibles en cada macrocelda, la más compleja función lógica requiere adicionales términos productos. Otras macroceldas puede ser usados para energizar los recursos lógicos requeridos; la arquitectura MAX 7000 permite los términos productos expandibles compartidos y términos expandibles paralelos que provee términos productos adicionales directamente a cualquier macrocelda en el mismo LAB.

Esas ayudas de términos expandibles aseguran que la lógica es sintetizada con los pocos recursos lógicos posibles a obtener la más rápida velocidad posible.

Términos expandibles compartidos

Cada LAB tiene 16 terminos expandibles compartidos que pueden ser visto como un almacén disponible de simples productos términos (uno desde cada macrocelda) con salidas invertidas que son retroalimentadas en el arreglo lógico. Cada termino expandible compartido puede ser usado y compartido por cualquiera de todas las macroceldas en el LAB que construye la función lógica compleja. Un pequeño retraso (tSEXP) es provocado cuando los expandibles compartidos son usados.

edu.red

Fig. 4.3: Términos expandibles compartidos.

Expandibles paralelos

Los paralelos expandibles no son usados como términos productos que pueden ser asignados a macroceldas vecinas, para implementación rápida de funciones lógicas complejas. Los paralelos expandibles permiten que más de 20 términos productos energicen directamente a la macrocelda lógica OR, con cinco términos productos proveídos por la macrocelda y 15 expandibles paralelos proveído por células vecinas en el LAB.

edu.red

Fig. 4.4: Términos expandibles paralelos.

Arreglo de Interconexión Programable (PIA)

La lógica recorre entre los LAB por el arreglo de interconexión programable. Este bus global es una ruta programable que conecta cualquier fuente de señal a cualquier destino en el dispositivo. Todos los pines del MAX 7000, pines entrada/salida, y salidas de las macroceldas energizan el PIA, hace que la señal disponible recorra en su totalidad del dispositivo completo. Solo las señales necesarias por cada LAB son recorrido dentro del LAB.

edu.red

Fig. 4.5: Ruteado del PIA.

Bloques de control entrada/salida

El bloque de control entrada/salida permite que cada pin entrada/salida es configurado individualmente para entrada, salida, o operación bi-direccinal, Todos los pines de entrada/salida tienen una memoria tri-estado, aquello controla individualmente cada una de las salidas, lo que permite recorrido de señales o conexión directa a la tierra o al Vcc.

edu.red

Fig. 4.6: Bloque de control I/O de los dispositivos MAX 7000.

4.3.3 Condiciones de operación

Tabla 4.4: Lista de valores máximos absolutos de los dispositivos MAX 7000 en 5 V.

edu.red

Tabla 4.5: Condiciones de operación recomendada para un dispositivo MAX 7000 a 5 V.

edu.red

Tabla 4.6: Condiciones de operación DC para dispositivos MAX 7000 en 5 V.

edu.red

Tabla 4.7: Capacitancia para dispositivos MAX 7000 a 5 V.: MAX 7000S

edu.red

4.3.4 Modelado de tiempos

Los tiempos del dispositivos MAX 7000 puede ser analizado con el software de Altera, con una variedad de simuladores EDA estándar-industrial y analizadores de tiempos, o con el modelado de tiempos. Los dispositivos MAX 7000 tienen retardos internos fijos.

edu.red

Fig. 4.07: Modelamiento de tiempos en dispositivos MAX 7000.

Las características de tiempos para cualquier ruta de señal pueden ser derivadas desde el modelamiento de tiempos y parámetros de un dispositivo particular. Los parámetros de tiempos externos, las cuáles representan los retardos de pin a pin, pueden ser calculados como la suma de parámetros internos.

En la Fig. 4.08, se muestran las siguientes figuras: modo combinacional, modo reloj global, modo reloj de arreglo. Se muestra la relación de tiempos internos de los parámetros de retardo externo e interno. Donde tR y tF < 3 ns. Las entradas conducen para una señal lógica alta en 3 V. y para una señal lógica baja en 0 V. Todas las características de tiempos son medidos en 1.5 V.

edu.red

Fig. 4.08.a: Modelo combinacional.

edu.red

Fig. 4.08.b: Modo de reloj global.

edu.red

Fig. 4.08.c: Modelo reloj de arreglo.

Las tablas 4.08 y 4.09, muestran al MAX 7000S EPM7128S muestran las condiciones en operación AC.

Tabla 4.08: Parámetros de tiempos externo del EPM 7128S.

edu.rededu.red

Tabla 4.09(1): Parámetros de tiempos interno del EPM 7128S.

edu.rededu.rededu.red

Grados de Velocidad.

Los dispositivos MAX usan los grados de velocidad que indica el retraso en nanosegundo (ns.) a través de una macrocelda en el dispositivo. Por ejemplo, un dispositivo MAX con un grado de velocidad -10 tiene un retrado de 10 ns. a través de una macrocelda. Los dispositivos con número bajo grado de velocidad, corren más rápido que un dispositivo con un número alto grado de velocidad.

4.3.5 Consumo de energía.

La fuente de energía (P) vs. la frecuencia (fMAX en MHz) para los dispositivos MAX 7000 es calculado con la siguiente ecuación:

edu.red

Tabla IV.10: Disipación de potencia DC.

edu.red

Tabla IV.11: Valores VCCIO & VO.

edu.red

A, B, C: Constantes para el MAX 7000S EPM7128S es:

A=0.93

B=0.40

C=0.040

Se muestra la figura típica: corriente de alimentación versus frecuencia, para los dispositivos MAX 7000S EPM 7128S:

edu.red

Fig.4.09: Icc Vs. Frecuencia para los dispositivos MAX 7000S – EPM 7128S.

4.3.6 Pines del dispositivo MAX 7000 – EPM7128S

El dispositivo MAX 7000-EPM 7128S con encapsulado PLCC de 84 pines se muestra en la siguiente figura:

edu.red

Fig. 4.10: Pines del MAX 7000S EPM 7128S.

4.4 Lenguaje de Programación de Hardware para Dispositivos Lógicos Programables – VHDL.

4.4.1 Generalidades de herramientas CAD-EDA.

CAD (diseño asistido por ordenador, Computer Aided Design) significa proceso de diseño que emplea sotisficadas técnicas gráficas de ordenador, apoyadas en paquetes de software para ayuda en los problemas analíticos, de desarrollo, de coste y ergonómicos asociados con el trabajo de diseño.

El CAD es un término asociado al dibujo como parte principal del proceso de diseño, sin embargo, dado que el diseño incluye otras fase, el término CAD se emplea tanto para el dibujo, o el diseño gráfico, como para el resto de herramientas que ayudan al diseño (por ejemplo, la comprobación de funcionamiento, análisis de costes, etc.)

El impacto de las herramientas de CAD sobre el proceso de diseño de circuitos electrónicos y sistemas procesadores es fundamental. No sólo por la adición de interfaces gráficas para facilitar la descripción de esquemas, sino por la inclusión de herramientas, como los simuladores que facilitan el proceso de diseño y la conclusión con éxito de los proyectos.

EDA (Electronic Design Automation) es el nombre que se le da a todas las herramientas (tanto hardware como software) que sirven de ayuda en el diseño de sistemas electrónicos. Dentro del EDA, las herramientas de CAD juegan un importante papel. Sin embargo, no sólo el software es importante; computadoras cada día más veloces, elementos de entrada de diseño cada vez más sofisticados, etc., son también características que ayudan a facilitar el diseño de circuitos electrónicos.

El diseño hardware tiene un problema fundamental, que no existe, por ejemplo, en la producción del software. Este problema es el alto coste del ciclo diseño-prototipación-testeo-vuelta a empezar, ya que el coste del prototipo suele ser, en general, bastante, elevado. Se impone la necesidad de reducir este ciclo de diseño para no incluir la fase de prototipación más que al final del proceso, evitando así la repetición de varios prototipos que es lo que encarece el ciclo.

Para ello se introduce la fase de simulación y de comprobación de circuitos utilizando herramientas de CAD, de forma que no es necesario realizarlo físicamente un prototipo para comprobar el funcionamiento del circuito, economizando así el ciclo de diseño. Este ciclo de diseño hardware se muestra en detalle en la figura.

edu.red

Fig. 4.11: Flujo de diseño para sistemas electrónicos y digitales.

En el ciclo de diseño hardware las herramientas de CAD están presentes en todos los pasos. En primer lugar en la fase de descripción de la idea, que será un esquema eléctrico, un diagrama de bloques, etc. En segundo lugar en la fase de simulación y comprobación de circuitos, donde diferentes herramientas permiten realizar simulación por eventos, funcional, digital o eléctrica de un circuito atendiendo al nivel de simulación requerido.

Por último existen las herramientas de CAD orientadas a la fabricación. En el caso de diseño hardware estas herramientas sirven para la realización de PCBs (Printed Circuit Boards o placas de circuito impreso), y también para la realización de ASICs o Circuitos Integrados de Aplicación Específica (Application Specific Integrated Circuits). Estas herramientas permiten la realización de microchips, así como la realización y programación de dispositivos programables.

Herramientas CAD para el diseño hardware:

Lenguaje de descripción de circuitos.

Son lenguajes mediante los cuales es posible describir un circuito eléctrico o digital. La descripción puede ser estructural, donde se muestra la arquitectura del diseño, o bien de comportamiento, donde se describe el comportamiento del circuito en vez de los elementos de los que está compuesto.

Captura de esquemas.

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 CAD. La descripción está basada en un diagrama donde se muestran los diferentes componentes de un circuito y sus interconexiones.

Grafos y diagramas de flujo.

Es posible describir un circuito, o sistema, mediante diagramas de flujo, máquinas de estados, etc. En este caso sería una descripción gráfica pero, al contrario que en la captura de esquemas, la descripción sería comportamental en vez de una descripción de componentes.

Simulación de sistemas.

Estas herramientas se usan sobre todo para la simulación global de sistemas. Los componentes de la simulación son elementos de alto nivel como discos duros, buses de comunicaciones, etc. Se aplica la teoría de colas para la simulación.

Simulación funcional.

Bajando al nivel de circuitos digitales se puede realizar una simulación funcional. Este tipo de simulación comprueba el funcionamiento de circuitos digitales de forma funcional, es decir, a partir del comportamiento lógico de sus elementos (sin tener en cuenta problemas eléctricos como retrasos, etc.) se genera el comportamiento del circuito frente a unos estímulos dados.

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 retrasos en la propagación de las señales digitales. Es una simulación muy cercana al comportamiento real del circuito y prácticamente garantiza el funcionamiento correcto del circuito a realizar.

Simulación eléctrica.

Es la simulación de más bajo nivel donde las respuestas se elaboran a nivel del transistor. Sirven tanto para circuitos analógicos como digitales y su respuesta es prácticamente idéntica a la realidad.

Realización de PCBs.

Con estas herramientas es posible realizar el trazado de pistas para la posterior fabricación de una placa de circuito impreso.

Realización de circuitos integrados.

Son herramientas de CAD que sirven para el diseño 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 circuitos integrados.

Realización de dispositivos programables.

Con estas herramientas se facilita la programaxción de este tipo de dispositivos, desde las simples PAL, PLD y FPGA.

4.4.2 El lenguaje de programación de un PLD.

Un PLD se programa al especificar un patrón de diodos o fusibles. Sin embargo, a pocos diseñadores les gusta cortar los fusibles en forma directa y ni siquiera en modo indirecto con un archivo de texto hexadecimal. En su lugar, la mayoría de los diseñadores usan un lenguaje de programación PLD para especificar simbólicamente las funciones lógicas.

Un lenguaje de programación PLD está respaldado por un procesador de lenguaje PLD, que simplemente se llamará compilador. La tarea del compilador es traducir un archivo de texto escrito en el lenguaje en un patrón de fusibles para el PLD físico.

Aún cuando la mayoría de los PLD pueden programarse físicamente sólo con expresiones de suma de productos, otros lenguajes de programación permiten que las ecuaciones PLD se escriban casi en cualquier formato.

El compilador manipula algebraicamente y minimiza las ecuaciones para ajuste, si es posible dentro de la estructura PLD disponible. Los compiladores más avanzados para PLD secuenciales permiten que las máquinas de estados se definan en un lenguaje de alto nivel y seleccionan en forma automática un PLD apropiado, hacen la asignación de estado y desarrollan las ecuaciones lógicas.

En cuánto las PLD y sus versiones más complejas (CPLD) y FPGAs (Field Programmable Gate Array) se utilizan para integrar gran cantidad de lógica en un único C.I. Frente a los diseños ASIC (Application Specific Integrated Circuit) los productos basados en PLD ofrecen al diseñador una mayor flexibilidad, menor tiempo de desarrollo, y en una primera aproximación son apropiados para bajos volúmenes de producción.

En cuanto a las herramientas EDA, tanto gráficas (ej. Viewlogic) como textuales (ABEL o VHDL). Se opta por el lenguaje VHDL como lenguaje de descripción hardware por los siguientes motivos:

– Aunque otros lenguajes (ej. ABEL) resultan más intuitivos, y de hecho se encuentran optimizados para el diseño con estructuras programables, el lenguaje VHDL también se utiliza (y se considera un estándar) en el diseño de circuitos integrados de aplicación especifica (ASIC) por lo que el mismo esfuerzo de aprendizaje sirve para los dos ámbitos.

– Consideramos que, una vez aprendido el lenguaje VHDL, resulta muy fácil

utilizar otros lenguajes como ABEL.

– VHDL se puede entender como un lenguaje de alto nivel que permite describir circuitos complejos. Permite la creación de librerías, en las que se definen componentes que pueden ser utilizados repetidamente.

– El hecho de ser un estándar (norma IEEE 1076) permite la portabilidad de código entre diferentes plataformas de desarrollo.

– Facilita el paso de la implementación de un diseño en PLD hacia la implementación en ASIC.

4.5 Programación en lenguaje VHDL.

VHDL es el lenguaje de descripción de hardware de circuitos integrados de muy alta velocidad. VHDL es un lenguaje de descripción y modelado diseñado para describir, en una forma en que el programador y la máquina pueda leer y entender la funcionalidad y la organización de sistemas hardware digitales, placas de circuitos y componentes.

4.5.1 Introducción al VHDL.

VHDL es un lenguaje con una sintaxis amplia y flexible que permite el modelado estructural, en flujo de datos y de comportamiento hardware. VHDL permite le modelado preciso, en distintos estilos, del comportamiento de un sistema digital conocido y el desarrollo de modelos de simulación.

Las ventajas del uso de VHDL para la descripción hardware son:

– Permite diseñar, modelar y comprobar un sistema desde un alto nivel de abstracción bajando hasta el nivel de definición estructural de puertas.

– Circuitos descritos utilizando VHDL, siguiendo unas guías para síntesis, pueden ser utilizados por diversas herramientas de síntesis para crear e implementar circuitos.

– Los módulos creados en VHDL pueden utilizarse en diferentes diseño, lo que permite la reutilización del código.

– Al estar basado en el estándar IEEE Std. 1076-1987, IEEE Std 1076-1993, se usa este lenguaje para minimizar errores de comunicación y problemas de compatibilidad.

– VHDL permite diseño top-down, esto es describir (modelar) el comportamiento de los bloques de alto nivel, analizarlos (simularlos) y refinar la funcionalidad en alto nivel requerida antes de llegar a niveles más bajos de abstracción de la implementación del diseño.

edu.red

Fig. 4.12: Metodología de diseño top-down.

– Modularidad: VHDL permite dividir o descomponer un diseño hardware y su descripción VHDL en unidades más pequeñas.

Existen dos formas de describir un circuito:

– Se describe un circuito indicando los diferentes componentes que lo forman y su interconexión, así se tiene especificado un circuito y como funciona. Las herramientas utilizadas para ello son la captura de esquemas y la descripción Netlist.

– El netlist o lista de conexiones, es la primera forma de describir un circuito mediante un lenguaje, y consiste en dar una lista de componentes, sus interconexiones y las entradas y salidas.

– Se describe un circuito indicando lo que hace o cómo funciona, es decir, describiendo su comportamiento

VHDL permite los dos tipos de descripciones:

Estructura: VHDL puede ser usado como un lenguaje de Netlist normal y corriente donde se especifican por un lado los componentes del sistema y por otro lado sus interconexiones.

Comportamiento: VHDL también se puede utilizar para la descripción comportamental o funcional de un circuito. Esto es lo que distingue de un lenguaje de Netlist. Esto es útil en simulación, ya que permite simular un sistema sin conocer su estructura interna. Así este tipo de descripción se está volviendo cada día más importante porque las actuales herramientas de síntesis permiten la creación automática de circuitos a partir de una descripción de su funcionamiento.

La descripción de circuitos según su comportamiento se divide, dependiendo del nivel de abstracción y del modo en que se ejecutan las instrucciones. Estás son:

– Descripción algorítmica.

– Descripción flujo de datos.

– Descripción estructural.

Para ilustrarlos se propone el siguiente ejemplo de diseño: Describir en VHDL un circuito que multiplexe dos líneas de entrada (a y b) de un bit, a una sol línea (salida) también de un bit; la señal selec sirve para seleccionar la línea a (selec="0") o b (selec="1").

edu.red

Fig. 4.13: Esquema del ejemplo de diseño en VHDL.

En primer lugar, sea el tipo de descripción que sea, hay que definir el símbolo o entidad del circuito. En efecto, lo primero es definir las entradas y salidas del circuito, es decir, la caja negra quelo define. Se le llama entidad porque en la sintaxis de VHDL esta parte se declara con la palabra clave ENTITY .

Esta definición de entidad, que suele ser la primera parte de toda descripción VHDL, se expone:

ENTITY mux IS

PORT (a: IN bit;

b: IN bit;

selec: IN bit;

salida: OUT bit);

END mux;

Está parte del lenguaje indica que la entidad mux (nombre dado al circuito) tiene tres entradas de tipo bit y una salida también del tipo bit. El tipo bit simplemente indica una línea que puede tomar los valores "0" o "1".

La entidad de un circuito es única. Sin embargo puede tener varias arquitecturas. Cada bloque de arquitectura, que es donde se describe el circuito, puede ser una representación diferente del mismo circuito, por ejemplo la descripción estructural y otra comportamental, ambas son diferentes pero son el mismo circuito.

Descripción algorítmica

Se muestra la descripción comportamental del multiplexo (ejemplo de diseño).

ARCHITECTURE comportamental OF mux IS

BEGIN

PROCESS (a,b,selec)

BEGIN

IF (selec:="0") THEN

salida<=a;

ELSE

salida<=b;

END IF;

END PROCESS;

END comportamental;

Está descripción comportamental algorítmica sigue una estructura parecida a los lenguajes de programación convencionales. Lo que se está indicando es si la señal selec es cero, entonces la salida es la entrada a, y si selec es uno, entonces la salida es la entrada b.

Descripción flujo de datos.

VHDL posee la forma de describir circuitos, permite paralelización de instrucciones, encontrándose muy cerca de una descripción estructural, es una descripción funcional. Se muestra dos ejemplos:

Ejemplo 1:

ARCHITECTURE flujo1 OF mux IS

SIGNAL nosel , ax , bx: bit;

BEGIN

nosel<=NOT selec;

ax<=a AND nosel;

bx<=b AND selec;

salida<=ax OR bx;

END flujo1;

Hay varias instrucciones todas ellas concurrentes, es decir se ejecutan cada vez que cambia alguna de las señales que intervienen en la asignación. Este ejemplo 1 es casi una descripción estructural, ya que de alguna manera se están describiendo las señales (cables) y los componentes que la definen; aunque no es estructural, ya que se trata de asignaciones a señales y no una lista de componentes y conexiones.

Ejemplo 2.

ARCHITECTURE flujo2 OF mux IS

BEGIN

salida<=a WHEN selec:="0" ELSE

b;

END flujo2;

Es una descripción de flujo de datos, aunque basta una única instrucción de asignación para definir el circuito.

Descripción estructural.

Aunque no es la característica más interesante del VHDL, también permite ser usado como Netlist o lenguaje de descripción de estructura. En este caso esta estructura también estaría indicada dentro de un bloque de arquitectura, aunque la sintaxis interna es completamente diferente:

ARCHITECTURE estructura OF mux IS

SIGNAL ax,bx,nosel:bit;

BEGIN

u0: ENTITY inv PORT MAP (e=>selec, y=>nosel);

u1: ENTITY and2 PORTMAP (e1=>a,e2>=nosel,y=>ax);

u2: ENTITY and2 PORTMAP (b,selec,bx);

u3: ENTITY or2 PORTMAP (e1=>ax,e2=>bx,y=>salida);

END estructura;

En el cuerpo de la arquitectura se hace lo que en un netlist normal, se coloca los componentes y sus interconexiones. Para los componentes se utilizarán entidades que estarán definidas en alguna biblioteca, y para la conexiones se usarán señales que se declararán al principio de la arquitectura.

Al igual que un netlist, las señales o conexiones tienen un nombre. Las líneas de conexión del circuito se declara como SIGNAL en el cuerpo de la arquitectura y delante del BEGIN. Se identifica cada componente, que es la replicación, asignando a cada componente concreto un símbolo y/o nombre, después del nombre viene la entidad correspondiente al componente. Después se realiza las conexiones poniendo cada señal en su lugar correspondiente con PORT MAP.

Las dos primeras descripciones se ajustan al VHDL´87 y VHDL´93 y el último al VHDL´93. En VHDL´87, no se permite la referencia directa a la entidad, por lo que se hace necesaria la definición de un componente y luego el enlace, en un bloque de configuración, del componente con la entidad que se quiera. Esto es muy extenso, y se pretende mostrar las posibilidades del VHDL, como lenguaje estructural, se ha preferido utilizar esta última forma que además es más moderna y actual.

VHDL´87 y VHDL´93

VHDL es efectivamente un lenguaje estándar y existe dos versiones. El primer VHDL estándar fue creado en 1987: VHDL´87, está fue estandarizada por la IEEE y su número de registro fue el 1076: IEEE Std.1076-1987.

Está primera versión mostró algunas carencias, especialmente en lo relacionado con la síntesis de circuitos. En 1993 apareció la segunda versión VHDL´93 y es la versión IEEE Std. 1076-1993. Ambas especificaciones son bastantes parecidas y sólo tienen algunas diferencias, excepto en la declaración y uso de los ficheros.

En la siguiente lista se enumeran la mayoría de las incorporaciones realizadas al VHDL´93 frente a la versión del 87.

– Se dio consistencia a la delimitación de varias estructuras: entidades, arquitecturas, configuraciones, paquetes, componentes, procedimientos, funciones, procesos, senencias de generación, sentencias condicionales.

– Referencia directa de entidades y configuración, así es innecesario el uso de los componentes.

– Se añade la posibilidad de abrir y cerrar ficheros.

– Es posible el uso de variables compartidas.

– Se definen nuevos atributos como "image y path_name´.

– Sentencia de informe report para escribir mensajes.

– Nuevos operadores que incluyen todos los de rotación y desplazamiento, además del XNOR.

– Generalización de las formas Octal y Hexadecimal, que sólo se podían usar con el tipo bit_vector, y que ahora también sirven para el tipo std_logic_vector.

– Los puertos en modo entrada (IN) se pueden conectar a constantes en el PORT MAP.

– Se añada la posibilidad REJECT para las asignaciones a señal con retraso inercial.

– Se admite la posibilidad de posponer la ejecución de procesos al final del ciclo de simulación, son los procesos POSTPONED.

– Las funciones se pueden declarar como puras o impuras.

– Se pueden realizar declaraciones dentro de las sentencias de referencia.

– A cualquier elemento sintáctico se le puede poner un alias.

– Se añaden los grupos para permitir el paso de información entre herramientas.

– Se permiten etiquetas para las sentencias en serie.

– Los identificadores pueden contener casi cualquier carácter imprimible.

– Los ficheros se usan y declaran de forma diferente.

4.5.2 Elementos sintácticos del VHDL.

Algunos de los elementos sintácticos son los siguientes:

Comentarios

Cualquier línea que empiezan por dos guiones "—".

Símbolos especiales

Además de las palabras reservadas, existen caracteres especiales: + – / * ( ) . , : ; & " " < > = # ** => := /= >= <= <> —

Identificadores

Es lo que se usa para dar nombre a los diferentes objetos del lenguaje como variables, señales, nombres de rutina, etc.

Números

Cualquier número se considera que se encuentra en base 10. Se admite la notación científica convencional para números en coma flotante. Es posible números en otras bases utilizando el símbolo del sostenido "#". Ejemplo: 2#11000100#.

Caracteres

Es cualquier letra o carácter entre comillas simples: "1", "t".

Cadenas

Son un conjunto de caracteres englobados por comillas dobles: "esto es una cadena".

Cadena de bits

Los tipo bit y bit_vector son en realidad de tipo carácter y matriz de caracteres respectivamente. En VHDL se tiene una forma de definir números con estos tipos, y es mediante una cadena de bits. Dependiendo de la base en que se especifique el número se puede poner un prefijo B (binario), O (octal), X (hexadecimal). Ejem.: B"11101001".

Palabras reservadas

Son las instrucciones, órdenes y elementos que permiten definir sentencias. No se deben utilizar como identificadores. Estos son:

edu.red

Operadores aritméticos:

Exponencial (**)

Sirve para elevar un número a una potencia: 4**2 es 42 .

Valor Absoluto (ABS)

Devuelve el valor absoluto de su argumento que puede ser de cualquier tipo numérico..

Multiplicación (*)

Multiplica dos números de tipo numérico, los tipos bit o bit_vector no son numéricos.

División (/)

Divide dos números de tipo numérico.

Operadores de desplazamiento

Existen en el VHDL´93.

SLL, SRL (desplazamiento lógico a izquierda y a derecha)

Desplaza un vector un número de bits a izquierda (SLL) o derecha (SRL) rellenando con ceros los huecos libres.

SLA, SRA (desplazamiento aritmético a izquierda y derecha).

La diferencia con el anterior es que este desplazamiento conserva el signo, es decir, conserva el valor que tuviera el bit más significativo del vector.

ROL, ROR (rotación a izquierda y a derecha)

Es como el de desplazamiento, pero los huecos que se forman son ocupados por los bits que van saliendo.

Operadores relacionales

Devuelven siempre un valor de tipo booleano (trae o false): Los tipos con los que pueden operar dependen de la operación:

Igualdad (= o :=, /=)

El primero devuelve true si los operandos son iguales y false en caso contrario. El segundo indica desigualdad, así que funciona justo al revés. Los operandos pueden ser de cualquier tipo con la condición de que ambos sean del mismo tipo.

Menor y mayor (<, <=,> ,>=)

Tienen el significado habitual. La diferencia con los anteriores es que los tipos de datos que pueden manejar son siempre de tipo escalar o matrices de una sola dimensión de tipos discretos.

Operadores lógicos

Son NOT, AND, NAND, OR, NOR, XOR y en el VHDL´93 se añade el XNOR. El funcionamiento es el habitual para este tipo de operadores. Actúan sobre los tipos bit, bit_vector y bolean. En caso de realizarse estas operaciones sobre un vector, la operación se realiza bit a bit, incluyendo la operación NOT que nada tienen que ver con el signo.

Tipos de datos:

VHDL tiene dos grupos de tipos de datos: escalares y compuestos.

Tipo escalares

Son tipos simples que contienen algún tipo de magnitud. Los tipos de escalares y predefinidos en VHDL son:

Enteros

Son datos cuyo contenido constituye un valor numérico entero. La forma en que se definen estos datos es mediante la palabra clave RANGE, es decir, no se dice que un dato es de tipo entero, sino que está comprendido en cierto intervalo especificando los límites de dicho intervalo con valores enteros.

Ejemplos:

TYPE byte IS RANGE 0 TO 255;

TYPE index IS RANGE 7 DOWNTO 1;

TYPE integer IS RANGE -2147483648 TO 2147483647;

Reales

Conocidos también como coma flotante, son los tipos que definen un número real. Al igual que los enteros se definen mediante la palabra clave RANGE, con la diferencia de que los límites son números reales.

Ejemplos:

TYPE nivel IS RANGE 0.0 TO 5.0;

TYPE real IS RANGE -1.0E38 TO 1.0E.38;

Físicos

Se trata de datos que se corresponden con magnitudes físicas, tienen un valor y unidades.

TYPE longitud IS RANGE 0 TO 1.0e9

UNITS

um;

mm=1000 um;

m=1000 mm;

inch=25.4 mm;

END UNITS;

El tipo físico predefinido en VHDL es el time. Este tipo se utiliza para indicar retrasos y tiene todos los submúltiplos, desde fs (femtosegundos) hasta hr (horas).

Cualquier dato físico se escribe siempre con su valor seguido de la unidad.

Enumerados

Son datos que pueden tomar cualquier valor especificado en un conjunto finito o lista. Este conjunto se indica mediante una lista encerrada entre paréntesis de elementos separados por comas.

Ejemplos:

TYPE nivel_logico IS (nose,alto,bajo,z);

TYPE bit IS ("0","1");

VHDL permite la definición de subtipos que son restricciones o subconjuntos de tipos existentes. Sea los ejemplos de subtipo obtenido a partir de la restricción de un tipo escalar a un rango.

SUBTYPE raro IS integer RANGE 4 TO 7;

SUBTYPE digitos IS carácter RANGE "0" TO "9";

SUBTYPE natural IS integer RANGE 0 TO entero_mas_alto;

SUBTYPE positivo IS integer RANGE 1 TO entero_mas_alto;

La ventaja de utilizar un subtipo es que las mismas operaciones que servían para el tipo también sirven para el subtipo.

Tipo Compuestos

Son tipos de datos que están compuestos por tipos escalares.

Matrices

Es una colección de elementos del mismo tipe a los que se accede mediante un índice. Los hay monodimensionales (un índice) o multidimensionales (varios índices). Los matrices VHDL son enmarcadas en un rango, o el índice puede ser libre teniendo la matriz una dimensión teórica infinita.

Ejemplos:

TYPE word IS ARRAY (31 DOWNTO 0) OF bit;

TYPE transformada IS ARRAY (1 TO 4, 1 TO 4) OF real;

TYPE positivo IS ARRAY (byte RANGE 0 TO 127) OF integer;

A los elementos de una matriz se accede mediante el índice. Así dato (3) es el elemento 3 del vector dato. De la misma manera se puede acceder a un rango:

datobyte<=datoword(2 TO 9)

Sea ejemplo de subtipos de datos que restingen el rango de una matriz:

SYBTYPE id IS swing (1 TO 20);

SUBTYPE word IS BIT_VECTOR (31 DOWNTO 0);

Atributos

Los elementos en VHDL, como señales, variables, etc., pueden tener información adicional llamada atributos. Estos atributos están asociados a estos elementos del lenguaje y se manejan en VHDL mediante: ".

Suponiendo que t es un tipo enumerado, entero, flotante, o físico, se tiene los siguientes atributos más usados en VHDL:

– T"left: límite izquierdo del tipo t.

– T"right: límite derecho del tipo t.

– T"low: límite inferior del tipo t.

– T"high: límite superior del tipo t.

Por ejemplo, t"left indica el atributo ´left de t (valor escalar), este atributo indica el límite izquierdo del rango.

Suponiendo que s es una señal, se pueden utilizar los siguientes atributos, de los más usados:

– S"event: devuelve true si se ha producido un cambio en la señal s.

– S"stable (tiempo): Devuelve true si la señal estuvo estable durante el último periodo tiempo.

El atributo "event es especialmente útil en la definición de circuitos secuénciales para detectar el flaco de subida o bajada de la señal de reloj.

Declaración de constantes, variables y señales

Hay tres tipos de elementos en VHDL: las variables, las señales, y las constantes.

Constantes

Es un elemento que inicializa a un determinado valor que no puede ser cambiado una vez inicializado, si no que se conserva para siempre. Ejemplos:

CONSTANT e: real :=2.71828;

CONSTANT ratraso: time := 10 ns.

Variables

Se diferencia de la constante en que su valor puede ser alterado en cualquier instante. A las variables también se les puede asignar un valor inicial. Ejemplos:

VARIABLE aux: bit_vector (31 DOWNTO 0);

Señales

Las señales se declaran igual que las constantes y variables con la diferencia de que las señales pueden ser normal, register y bus. Si en la declaración no se especifica nada, se entiende que la señal es de tipo normal; para que sea de tipo bus o register se debe declarar explícitamente con las palabras claves: BUS o REGISTER.

Una señal no es lo mismo que una variable. La señal no es exactamente un objeto del lenguaje que guarda un valor, si no guarda un valor o varios, y hacerlo visible en el momento adecuado. Esto quiere decir, la señal tiene dos partes, una donde se escribe y que almacena el valor, y otra que se lee y que no tiene por qué coincidir con lo que se acaba de escribir.

Al igual que en variables y constantes, a las señales también se les puede dar un valor inicial si se quiere. Ejemplo:

SIGNAL selec: bit := "0";

Comparación entre constantes, señales y variables

– Las variables sólo tienen sentido dentro de un bloque (PROCESS) o un subprograma, es decir, sólo tienen sentido en entornos de programación donde las sentencias son ejecutadas en serie.

– Las señales pueden ser declaradas únicamente en las arquitecturas, paquetes (PACKAGE), o en los bloques concurrentes (BLOCK).

– Las constantes son declaradas en los mismos sitios que las variables y señales.

– Las variables son elementos abstractos del lenguaje, lo que significa que no tienen por qué tener una concordancia física real inmediata.

– Las señales poseen un significado físico inmediato, y es el de representar conexiones reales en el circuito

Declaración de entidad

La entidad es la parte del programa que define el símbolo. Es decir, define las entradas y salidas del circuito. Además, la entidad es la estructura que permite realizar diseños jerárquicos en VHDL, ya que un diseño jerárquico es generalmente una colección de módulos interconectados entre sí. En VHDL estos módulos se definen mediante la palabre clave ENTITY.

La forma general de declaración de entidad es:

ENTITY nombre IS

[GENERIC (lista de parámetros); ]

[PORT (lista de puertos); ]

[declaraciones]

[BEGIN

sentencias]

END [ENTITY] [nombre];

Las sentencias GENERIC y PORT son las que más significado tienen a pesar de ser opcionales.

La instrucción GENERIC sirve para definir y declarar propiedades o constantes del módulo que está siendo declarado en la entidad. Las constantes declaradas aquí tienen el mismo significado que las constantes declaradas como parámetros en las funciones y procedimientos que se verán más adelante.

Es decir a la entidad se le puede pasar como parámetros las constantes definidas en GENERIC, si se pasan valores entonces la constante tomará el valor que se le pasa, y si no se le pasa ningún valor., la constante tomará el valor por defecto que se le hubiera asignado en GENERIC, si es que se le asignó uno.

La instrucción PORT, también opcional como el resto de partes de la entidad, se definen las entradas y salidas del módulo que está siendo definido. Esta forma de declarar estas entradas y salidas ya se ha visto, y simplemente consiste en un nombre, seguido por el modo de conexión, y seguido por el tipo de datos de la línea. Los dos modos de conexiones son IN, para indicar entrada, y OUT para indicar salida.

La diferencia entre IN y OUT es importante: las señales de entrada se pueden leer pero no puede asignárseles ningún valor, es decir, no se puede cambiar su valor en el programa, y vienen a ser como constantes. Las señales de salida pueden cambiar y se les pueden asignar valores, pero no pueden leerse, es decir, no pueden ser usadas como argumentos en la asignación de cualquier elemento del VHDL. Si no se especifica el tipo de puerto se supone el tipo IN por defecto.

La parte de declaraciones es opcional, como todo lo que va dentro de la entidad, y sirve para realizar algunas declaraciones de constantes, etc. A continuación le sigue un bloque BEGIN, también opcional, donde se pueden incluir sentencias. El tipo de sentencias que se pueden utilizar en esta parte son muy restringidas y se limitan a sentencias de indicación de errores o comprobación de algo.

Ejemplo:

ENTITY rom IS

GENERIC (tamano, ancho: positive);

PORT (enable : IN bit;

address : IN bit_vector (tamano-1 DOWNTO 0);

data: OUT bit_vector (ancho-1 DOWNTO 0));

END rom;

Declaración de arquitectura

En la arquitectura es donde se define el funcionamiento del módulo definido en la entidad. Una arquitectura siempre está referida a una entidad concreta, por lo que no tiene sentido hacer declaraciones de arquitectura sin especificar la entidad. Una misma entidad puede tener diferentes arquitecturas.

La declaración de la arquitectura se realiza con la palabra reservada ARCHITECTURE, y su sintaxis completa es:

ARCHITECTURE nombre OF nombre_entidad IS

[declaraciones]

BEGIN

[sentencias concurrentes]

END [ARCHITECTURE] [nombre]

Antes de definir la funcionalidad en el bloque BEGIN..END hay una parte declarativa donde se definen los subprogramas (funciones, procedimientos, etc.), declaraciones de tipo, declaraciones de constantes, declaraciones de señales, declaraciones de alías, declaraciones de componentes, etc. Es importantes destacar que uno de los pocos sitios donde se pueden declarar señales es dentro de la parte declarativa de una arquitectura.

A continuación, después del BEGIN, se encuentran todas las instrucciones que definen el comportamiento, estructura, y funcionalidad del circuito. Hay que destacar que dentro de la arquitectura las instrucciones son de dos tipos: o concurrentes, o de referencia de componentes, que en realidad también es una construcción concurrente. En el caso de definir estructura las instrucciones serán de referencia, es decir, de colocación de componentes y las conexiones entre ellos.

4.5.3 Descripción de sentencias comportamental algorítmica.

VHDL permite una programación de descripción algorítmica o en serie,

Bloque de ejecución serie: PROCESS

La programación serie se define dentro de bloques indicados con la palabra reservada PROCESS. En un mismo programa puede haber múltiples bloques PROCESS. En el caso de que ocurra, cada uno de ellos equivale a una instrucción concurrente. Es decir, internamente a los PROCESS la ejecución de las instrucciones es serie, pero entre los propios bloques PROCESS, que pueden convivir con otras instrucciones concurrentes, la ejecución es concurrente.

La forma en que se declara un bloque PROCESS es la siguiente:

[id_proc];

[POSTPONES] PROCESS [(lista_sensible)] [IS]

declaraciones

BEGIN

Instrucciones_serie

END [POSTPONED] PROCESS [id_proc];

El id_proc es simplemente una etiqueta opcional que sirve para ponerle nombre a los diferentes procesos de una descripción.

La (lista sensible) es también opcional y contiene una lista de señales separadas por comas y encerradas entre paréntesis.

La ejecución PROCESS se activa cuando se produce un evento, o cambio, en alguna de las señales de la lista sensible. En el caso de no existir una lista sensible, la ejecución se controla mediante el uso de sentencias WAIT dentro del PROCESS.

La parte de declaración es parecida a la de otras estructuras, de forma que se opueden definir aquí variables, tipos, subprogramas, atributos, etc., pero en ningún caso señales. Este es el único lugar, aparte de en los subprogramas, donde se pueden definir las variables, donde no se puede hacer en estructuras como entidades, bloques, arquitecturas o paquetes.

Entre el BEGIN .. END vienen todas las instrucciones serie que , como se verá, presentan sus propios elementos sintácticos, siendo la asignación simple el único elemento común con la ejecución concurrente.

Sentencia de espera: WAIT.

La ejecución de un bloque PROCESS, si no se indica nada más, se realiza de forma continuada como si de un bucle se tratara. Es decir, se ejecutan todas las instrucciones y se vuelve a empezar. Por lo tanto, debe existir un mecanismo que permita detener la ejecución del bloque serie.

Una de las formas de detener la ejecución es mediante la inclusión de la lista sensible. La inclusión de esta lista equivale a la adición de una sentencia de espera al final del proceso, para que detenga la ejecución del PROCESS hasta que cambie alguna de las señales de la lista sensible.

Aunque la utilización de la lista sensible es suficiente para la mayoría de procesos en un programa, existe una posibilidad más compleja de detener la ejecución del bloque serie resultando la lista sensible un caso particular de esta operación. La forma genérica de detener la ejecución en un proceso se realiza mediante la palabra reservada WAIT que detiene la ejecución hasta que se cumple una condición o evento especificado en la propia sentencia. La sintaxis es como sigue:

[id_wait]

WAIT [ON lista_sensible] [UNTIL condición] [FOR tiempo_límite]

Los tres elementos que se ven en la instrucción de espera indican las condiciones bajo las cuales se reanudará la ejecución del bloque.

La lista_sensible es simplemente una lista de señales separadas por comas.

La condición es una condición que cuando se cumple permite que siga la ejecución.

El tiempo_límite indica un tiempo durante el cual la ejecución está detenida, cuando ese tiempo se acaba sigue la ejecución.

Estas tres posibilidades, es decir, la de la lista sensible, la condición y el tiempo límite, son opcionales, y pueden especificarse una, dos o las tres en una misma sentencia WAIT. Cualquiera que ocurra primero permitirá que se continú8e con la ejecución del proceso.

Se aprecia claramente que la lista sensible del bloque PROCESS es completamente equivalente a poner la sentencia WAIT ON lista_sensible; al final del bloque PROCESS.

Ejemplos de uso de la sentencia WAIT:

WAIT ON pulso;

WAIT UNTIL contador=7;

WAIT FORM 1ns;

WAIT ON interrupcion FOR 25 ns;

WAIT ON clk,sensor UNTIL contador=3 FOR 100 ns;

Ejemplo donde una lista sensible es equivalente a la sentencia WAIT.

–con lista sensible

p1: PROCESS (b,a)

BEGIN

a<=b+a+2;

END PROCESS p1;

–con WAIT

p1: PROCESS

BEGIN

a<=b+a+2;

WAIT ON a,b;

END PROCESS p1;

Sentencia condicional: IF….THEN…..ELSE.

Es la estructura típica para realizar una acción u otra según el resultado de una expresión booleana, siendo equivalente en significado a estructuras del mismo tipo en otros lenguajes. La forma general es:

[id_if:]

IF condición THEN

Sentencias

{ELSIF condición THEN

sentencias}

{ELSE

sentencias}

END_IF [id_if];

Es importante resaltar que esta estructura tiene la posibilidad de anidar IFS consecutivos mediante la palabra ELSIF, de esta manera se evita tener que poner al final de cada nuevo IF un END IF, ganando el programa en legibilidad.

Tanto el ELSE como el ELSIF son opcionales, pero convienen asegurarse de sihay que poner ELSE al final o no, y sobre todo, saber por qué. El no hacerlo así va a tener impacto sobre el tipo de hardware que se está describiendo; si por ejemplo no se pone ELSE, el hardware correspondiente será secuencial y necesitará registros.

Sentencia de selección : CASE

Es la estructura típica que permite ejecutar unas sentencias u otras dependiendo del resultado de una expresión. Su forma sintáctica es la siguiente:

[id_case:]

CASE expresion IS

WHEN caso => sentencias;

{WHEN caso => sentencias;}

[WHEN OTHERS => sentencias;]

END CASE [id_case];

Bucles: FOR y WHILE LOOPS

En VHDL existen las dos posibilidades típicas para bucles, es decir, los de tipo WHILE y FOR. La parte repetitiva del bucle siempre viene especificada por la palabra reservada LOOP . . END LOOP, y será la parte anterior del bucle lo que indique si es de tipo for o while. La sintaxis general es:

[id_bucle]

[esquema_iterativo] LOOP

sentencias;

END LOOP [id_bucle];

El esquema_iterativo indica si es un WHILE o FOR. Es opcional, por lo que se puede definir un bucle sin más de manera que las sentencias en ese bucle se repiten para siempre.

La construcción para el bucle FOR es:

[id_for: ]

FOR identificador IN rango

LOOP

Sentencias;

END LOOP [id_for];

El bucle se repite para cada valor que toma el identificador en el rango especificado. Esto quiere decir que el tipo del identificador debe ser discreto: entero o un enumerado.

La construcción para el bucle WHILE es:

[id_while:]

WHILE condición

LOOP

sentencias;

END LOOP [id_while];

El bucle en la instrucción WHILE se repite mientras la condición sea cierta, si no lo es deja de repetirse.

Interrupción en bucles: NEXT y EXIT

Junto a las instrucciones de bucles, se dan dos más que permiten interrumpir el flujo normal de ejecución. Estas sentencias son NEXT y EXIT. La primera permite detener la ejecución de la iteración actual y pasar a la siguiente.

La segunda detiene la ejecución en ese instante y sale del bucle. En el caso de tener varios bucles anidados, la salida se realiza del bucle donde se encuentre la instrucción o bien del bucle indicado por la etiqueta después de la instrucción, si es que se especifica. Estas instrucciones aceptan opcionalmente una condición, de manera que si se cumple la condición se interrumpe el lazo, y si no, no.

La sintaxis general para la interrupción del bucle NEXT es:

[id_next:]

NEXT [id_bucle] [WHEN condición];

La sintaxis general para la interrupción del bucle EXIT es:

[id_exit:]

EXIT [id_bucle] [WHEN condición];

4.5.4 Definición de subprogramas, paquetes y bibliotecas

En descripciones complejas de un programa se hace necesaria una organización que permita al diseñador trabajar con grandes cantidades de información, al organizar esta información, utilizando funciones y procedimientos llamados: subprogamas, se hace más legible la descripción.

Se puede agrupar también los subprogramas, definiciones de tipos, bloques, etc., a un nivel más elevado en estructuras por encima de la propia descripción; estos elementos son los que formarían a los paquetes, que junto al anterior y otros elementos de configuración, etc. Formarían las bibliotecas.

Subprogramas

Igual que en los lenguajes de programación estándar, en VHDL se puede estructurar mediante el uso de subprogramas. Un subprograma no es más que una función o procedimiento que contiene una porción de código.

Las funciones y procedimientos en VHDL son estructuras muy parecidas entre sí aunque existen algunas diferencias. Estas diferencias se especifican a continuación:

Una función siempre devuelve un valor, mientras que un procedimiento sólo puede devolver valores a través de los parámetros que se le pasen.

Los argumentos de una función son siempre de entrada, por lo que sólo se pueden leer dentro del a función. En el procedimiento pueden ser de entrada, de salida o de entrada y salida, por lo que pueden sufrir modificaciones.

Una función no tiene efectos colaterales, pero un procedimiento sí, es decir, puede provocar cambios en objetos externos a él debido a que se pueden cambiar las señales aunque no se hubieran especificado en el argumento. Es decir, en los procedimientos se permite realizar asignaciones sobre señales declaradas en la arquitectura y, por tanto, externas al procedimiento.

Las funciones, como devuelven un valor, se usan en expresiones, mientras que los procedimientos se llaman con una sentencia secuencial o concurrente.

La función debe contener la palabra reservada RETURN seguida de una expresión puesto que siempre devuelve un valor, mientras que en el procedimiento no es necesario.

Una función jamás puede tener la instrucción WAIT, mientras que un procedimiento sí.

Declaración de procedimientos y funciones

Las declaraciones de procedimientos y funciones se realizan en las partes declarativas de las arquitecturas, bloques, paquetes, etc. Las declaraciones de una estructura y otra son muy parecidas. A continuación se muestra la definición de un procedimiento:

PROCEDURE nombre [ (parámetros) ] IS

[ declaraciones ]

BEGIN

[ sentencias_serie ]

END [ PROCEDURE ] [nombre ] ;

La declaración de funciones es muy similar, con la diferencia de que hay que indicar el tipo del valor que devuelve:

[pure (impure]

FUNCTION nombre [ (parámetros) ] RETURN tipo IS

[declaraciones]

BEGIN

[sentencias serie] –debe incluir al menos un RETURN

END [ FUNCTION ] [ nombre ];

La lista de parámetros, tanto en la función como en el procedimiento, es opcional. Si no hay parámetros tampoco es necesario usar los paréntesis. Está lista es el conjunto de parámetros que se la pasan al subprograma, y se declaran de forma muy parecida a como se declaraban los puertos en una entidad.

Dependiendo de si se trata de funciones o procedimientos, los parámetros pueden ser en:

Funciones

– Sólo es válido el modo IN, por lo que no es necesario especificarlo.

– El parámetro puede ser CONSTANT o SINGAL. El valor por defecto es CONSTAN, si se desea SIGNAL hay que ponerlo explícitamente.

Procedimientos

– Por defecto el modo es IN, pero el modo OUT e INOUT son también válidos.

– Por defecto la clase es CONSTANT si el modo es IN o VARIABLE en el resto de casos. La clase SIGNAL hay que declararla explícitamente.

Las declaraciones dentro de una función o procedimiento pueden incluir las mismas que incluiría un PROCESS, ya que se trata también de ejecución serie. Todo lo que se declara en esta parte sólo es visible en el cuerpo de la función.

En una función, y siempre con carácter opcional e informativo, existe la posibilidad declararla como PURE o IMPURE. Una función pura es una función que devuelve siempre el mismo valor para unos parámetros de entrada dados. Una función es impura si para unos mismos parámetros puede devolver valores diferentes.

Normalmente las funciones impuras lo son porque dependen de alguna variable o señal global, Poner PURE o IMPURE en la declaración de la función no hace a esa función pura o impura, es sólo un comentario.

Llamadas a subprogramas

La forma de invocar un subprograma consiste solamente en indicar el nombre seguido por los argumentos entre paréntesis, si los tiene. A las funciones sólo se las puede invocar comparte de una expresión, mientras que los procedimientos se llaman como si fueran una sentencia, secuencial o concurrente.

Bibliotecas, Paquetes y Unidades

Las unidades son el tipo de estructuras conformado por las entidades y las arquitecturas, la entidad sirve para definir el interfase de un módulo o sistema, mientras la arquitectura describía el comportamiento del circuito.

Los elementos que componen una biblioteca se llaman unidades. A las unidades de tipo declarativo, que son la entidad, paquete y configuración, se las conoce como unidades primarias. Al resto de las unidades, que son de tipo ejecutivo, es decir, a las arquitecturas y cuerpos de los paquetes, se las llama unidades secundarias.

Una unidad secundaria tiene siempre asociada una unidad primaria, por lo que las primarias deben ser evaluadas en primer lugar, ésta es la razón por la que también se suelen poner al principio de una descripción las unidades primarias, a excepción de las configuraciones que hacen referencia también a las arquitecturas.

edu.red

Fig. 4.14: Las bibliotecas y las unidades que la componen.

En cualquier sistema VHDL existen dos bibliotecas que son invocadas por defecto. Las bibliotecas son work y std, la biblioteca work contiene las unidades de diseño que se están compilando, la biblioteca std contiene dos paquetes, el standard y textio El paquete standar dentro de esta biblioteca contiene todas las definiciones de tipos y constantes. El paquete textio contiene tipos y funciones para el acceso a ficheros de texto.

Junto a estas bibliotecas, esta otra biblioteca que es prácticamente estándar, la biblioteca ieee y contiene algunos tipos y funciones que completan los que vienen incorporados por defecto. Dentro de esta biblioteca hay inicialmente un paquete, el std_logic_1164, que contienen la definición de tipos y funciones para trabajar con un sistema de nueve niveles lógicos que incluyen los de tipo bit con sus fuerzas correspondientes, así como los de desconocido, alta impedancia, etc.

El nombre de este tipo es el std_ulogic. Otro paquete es el std_logic_1164_ext, este paquete es como el anterior pero incorpora operaciones aritméticas y relacionales.

Paquetes: PACKAGE Y PACKAGE BODY

Un paquete es una colección de declaraciones de tipo constantes, subprogramas, etc., normalmente con la intención de implementar algún servicio en particular o aislar un grupo de elementos relacionados. De esta manera se pueden hacer visibles las interfaces de algunos elementos como funciones o procedimientos quedando ocultas las descripciones de estos elementos.

Los paquetes están separados en dos partes, una es la parte de declaraciones y la otra es la de cuerpo. La parte de cuerpo, donde se encuentran por ejemplo algunas definiciones de funciones y procedimientos, puede ser omitida si no hay ninguno de estos elementos.

La declaración del paquete es:

–declaración de paquete

PACKAGE nombre IS

declaraciones

END [PACKAGE] [nombre];

La declaración del cuerpo es:

–declaración del cuerpo

PACKAGE BODY nombre IS

Declaraciones

subprogramas, etc.

END [ PACKAGE BODY ] [ nombre ];

4.5.5 VHDL para síntesis

La síntesis de un circuito, a partir de una descripción VHDL, consiste en reducir el nivel de abstracción de la descripción del circuito hasta convertirlo en una definición puramente estructural cuyos componentes son los elementos de una determinada biblioteca. Al final del proceso de síntesis se debe obtener un circuito que funcionalmente se comporte igual que la descripción que de él se ha hecho.

Partes: 1, 2, 3, 4
 Página anterior Volver al principio del trabajoPágina siguiente