You are on page 1of 88

4

CAPTULO IV LENGUAJE VHDL

Antes de comenzar a describir los elementos primordiales del lenguaje VHDL que sern de utilidad para el desarrollo de las actividades prcticas, se har una breve referencia a ciertos conceptos introductorios para ubicar este lenguaje como una de las herramientas de trabajo dentro del diseo de sistemas digitales.

4.1

HERRAMIENTAS CAD-EDA

Los conceptos CAD EDA estn relacionados con herramientas para el Diseo Asistido por Computador (Computer Aided Design) y la Automatizacin del Diseo Electrnico (Electronic Design Automation) que permiten utilizar diversos recursos de software y hardware para facilitar el diseo y prueba de circuitos digitales. Las herramientas CAD se refieren especficamente a la utilizacin de software especializado para el diseo de cualquier tipo de sistema (mecnicos, elctricos, de procesos, etc.) mediante tcnicas grficas y no es exclusiva para los sistemas digitales, sino que estos ltimos hacen uso de este tipo de recurso. La potencialidad del CAD est en proporcionar un medio de programacin para realizar un diseo de acuerdo a las especificaciones exigidas en cuanto a funcionamiento, normas de calidad, costos, entre otras, y en un tiempo menor al invertido en un proceso de diseo manual. (Torres, 2001), (Carpio, 1997). El concepto EDA por su parte engloba diversas herramientas de hardware y software que se emplean en el diseo de sistemas electrnicos. Estas permiten junto con las herramientas CAD, reducir los tiempos de diseo y desarrollo de prototipos de sistemas electrnicos incluyendo los digitales al poder simular y verificar los prototipos con las mismas caractersticas de operacin reales antes de construirlos. Todas las pruebas que se realicen antes de las construcciones de prototipos y del sistema final redundarn en ahorro de costos y de tiempo, optimizando entonces el ciclo de diseo de hardware desde el ms sencillo hasta el ms complejo. Para este trabajo, el inters est en el diseo de circuitos y sistemas digitales. (Torres, 2001). Las herramientas EDA son muy amplias y pueden conseguirse desde la fase de descripcin de un circuito o sistema digital, pasando por la simulacin y comprobacin hasta llegar a la sntesis y programacin de circuitos digitales con dispositivos lgicos programables. Tambin existen herramientas EDA para asistir en

109

la fabricacin de circuitos impresos y de circuitos integrados segn el caso. El uso de cada tipo de recurso EDA es importante para lograr que un sistema digital y/o electrnico llegue a su etapa final de desarrollo con resultados satisfactorios. (Prez, y Fernndez, 2002). Entre las principales herramientas se pueden mencionar las siguientes: Lenguajes de descripcin de circuitos. Diagramas y esquemticos. Grafos y diagramas de flujo. Simulacin de eventos (simulaciones a grandes rasgos). Simulacin funcional (nivel de compuertas digitales, a partir de comportamiento lgico de los elementos del circuito) Simulacin digital (para circuitos digitales, toma en cuenta los retardos de propagacin en el circuito)

En este captulo resulta de inters el conocimiento de la primera herramienta, los lenguajes de descripcin de circuitos, especficamente la forma de utilizar las estructuras del VHLD (VHSIC Hardware Language Descriptor), el Lenguaje Descriptor de Hardware para Circuitos Integrados de Muy Alta Velocidad (Very High Speed Integrated Circuit). 4.2 LENGUAJES DESCRIPTORES DE HARDWARE HDL

Los lenguajes descriptores de hardware o HDLs son lenguajes por medio de los cuales se puede describir el funcionamiento y la arquitectura de un sistema digital o elctrico. Esa descripcin puede hacerse mediante bloques con los que se especifique la arquitectura del sistema bajo diseo, o puede hacerse a partir de la descripcin del funcionamiento del circuito. (Torres, 2001), (Carpio, 1997). Un programa escrito en lenguaje descriptor de hardware para un circuito digital parte de una descripcin en un cdigo de alto nivel, el cual ser luego ensamblado a cdigo mquina para representar las compuertas y conexiones del circuito de inters. Ese ensamblado est referido a la generacin de un circuito que se pueda implementar fsicamente, dicho proceso se conoce como sntesis y tambin existen programas para llevarlo a cabo, pudiendo estar en un mismo entorno de programacin con el HDL. La sntesis es dependiente del dispositivo final donde se desee implementar el circuito, porque deber generar un circuito adaptado a los recursos del dispositivo a programar. Las herramientas de sntesis tambin buscan optimizar el circuito a implementar, es decir utilizando de forma eficiente las conexiones y compuertas disponibles.

110

Los cdigos para lenguajes descriptores de hardware tambin pueden emplearse para simular el funcionamiento de un circuito, con lo que se puede analizar el diseo realizado y tomar decisiones sobre cambios en el mismo en caso de requerirse. Esta simulacin requerir una herramienta de software adicional en algn entorno de programacin. Se debe resaltar que una descripcin de un circuito en HDL permite comprender el funcionamiento de un diseo sin importar la tecnologa que se utilice finalmente para implementarlo. La adaptacin del circuito al dispositivo final segn su capacidad en recursos ser llevada a cabo por las herramientas de sntesis. 4.3 VHDL

VHDL (VHSIC Hardware Language Descriptor) es un lenguaje descriptor de hardware para Circuitos Integrados de Muy Alta Velocidad (VHSIC: Very High Speed Integrated Circuit). Permite describir este tipo de circuitos con un alto nivel de abstraccin, y actualmente su uso est ampliamente aceptado como un estndar para disear sistemas digitales y electrnicos. (Torres, 2001), Este lenguaje fue desarrollado por el programa VHSIC del Departamento de Defensa de los Estados Unidos a finales de la dcada de los setenta. El propsito de dicho programa era generar un estndar para el diseo, modelacin y documentacin de circuitos complejos, de esta manera un diseo realizado por una empresa poda ser entendido por otra y tambin podra probado mediante algn software de simulacin. Un aspecto muy importante que respalda el uso de VHDL es el hecho de ser reconocido como un HDL estndar por el Instituto de Ingenieros en Electricidad y Electrnica (IEEE). Fue reconocido por IEEE como su estndar 1076 en 1987, y por el Departamento de Defensa de los Estados Unidos como estndar MIL-STD-454L. En 1996 el estndar IEEE-1076 se actualiz a su versin adicional, el IEEE-1076.3. En 1996 el estndar IEEE-1076.3 fue adoptado como un estndar de VHDL para sntesis, este ltimo es el que se usa para disear sistemas digitales. VHDL es actualmente un estndar en la industria dedicada al desarrollo de circuitos digitales. (Torres, 2001), (Prez y Fernndez, 2002). A continuacin se explicarn los elementos y estructuras del VHDL, presentando adems la forma de escribirlos en un programa, siguiendo el estndar IEEE-1076-2002, una de sus versiones ms actuales. Al describir un diseo en VHDL siguiendo este estndar, se asegura que el cdigo obtenido es portable, es decir puede ser simulado y sintetizado en diferentes entornos de programacin, e implementado en diversos dispositivos lgicos programables con capacidad para el circuito generado, con independencia del fabricante.

111

4.3.1 ETAPAS DE DISEO EN VHDL En un diseo con VHDL existen una serie de etapas que guan ese proceso, esas etapas se denominan flujo de diseo (Wakerly, 2001). La escritura del cdigo en VHDL es uno de los pasos, y est interconectada con las dems fases del diseo de un circuito. Las etapas de un flujo de diseo se pueden observar en la figura 4.1:

Diagrama de bloques jerrquico

Codificacin

Compilacin

Simulacin y verificacin

Sntesis

Verificacin con tiempo

Ajuste/ubicacin y enrutado

Figura 4.1. Etapas de diseo en VHDL Fuente: Wakerly, 2001.

112

De acuerdo a la Figura 4.1, existen siete pasos, los cuatro primeros se llaman pasos del componente frontal y los tres ltimos son los pasos del componente posterior. Los pasos de componente frontal se refieren a los que sirven como interfaz al usuario, aquellos que el diseador puede detallar ms de cerca con las herramientas de diseo. Los pasos de componente posterior tambin requiere de herramientas adecuadas, la diferencia se encuentra en que estos pasos se relacionan con la adaptacin del diseo a un circuito que pueda ser implementado y a la verificacin de funcionamiento tomando en cuenta retardos de tiempo similares a los que pueden presentarse en el circuito en fsico y las limitaciones de rutado de los dispositivos utilizados. El flujo de diseo se inicia desde los pasos de componente frontal y sigue con los pasos de componente posterior. El primer paso en el componente frontal consiste en presentar un diagrama de bloques del diseo, dividindolo en bloques ms pequeos que cumplan cada uno cierta funcin. Esto permite trabajar en forma jerrquica a travs de mdulos al desarrollar programas en VHDL, lo que facilita la tarea del diseo total. En el paso siguiente (codificacin) se escribe el cdigo o cdigos necesarios para expresar el diseo en una descripcin VHDL, de acuerdo a los mdulos definidos en el primer paso. Se puede escribir el cdigo en cualquier editor de texto, o mejor aun, aprovechar los editores de texto de VHDL incluidos en la mayora de los entornos de software especiales para este lenguaje descriptor, esos editores buscan facilitar la escritura de cdigo al usuario. Con el paso de compilacin, un compilador para VHDL analiza el cdigo del usuario para detectar errores de sintaxis y comprobar compatibilidad entre mdulos de cdigo que tengan dependencia entre s. Los compiladores VHDL generan adems informacin interna que es requerida para el paso posterior de simulacin. A travs del paso de simulacin/verificacin, se unen dos fases importantes: la simulacin y la verificacin. Primero, un entorno de simulacin para VHDL permite al usuario definir y aplicar entradas de su diseo, simular su circuito y as observar las salidas, sin requerir el montaje en fsico. Las herramientas de simulacin en VHDL permiten ir desde la generacin de entradas manuales cada vez que se simule, hasta la creacin de bancos de prueba especiales para aplicar entradas de forma automtica y comparar los resultados con las salidas deseadas. La fase de verificacin dentro del paso nmero cuatro tambin es de suma importancia porque a travs de ella se busca comprobar que el circuito opera tal como se desea. En sistemas complejos suele invertirse tiempo y esfuerzo suficientes en codificacin y en simulacin/verificacin, lo ltimo con el fin de probar el circuito ante diferentes de condiciones de operacin segn como trabajar en la realidad. La

113

deteccin de errores de funcionamiento en esta etapa es vital para corregir a tiempo y regresar a las etapas previas, antes de avanzar a las fases siguientes. La verificacin puede ser de dos tipos: funcional y de temporizacin. La verificacin funcional permite comprobar el funcionamiento lgico del diseo sin tomar en cuenta los retardos en compuertas y otros parmetros de tiempo que influyan en el circuito. La verificacin de temporizacin en cambio permite analizar la operacin del circuito tomando en cuenta retardos aproximados en las compuertas y el cumplimiento de etapas de temporizacin en dispositivos secuenciales. En el cuarto paso pueden realizarse los dos tipos de verificacin si se desea, aunque la verificacin de temporizacin ser limitada hasta tanto no se realice la sntesis y ajuste, esto se debe a que los retardos verdaderos dependen del dispositivo final sobre el cual se implemente el diseo. El quinto paso, sntesis, est dentro de las etapas de componente posterior. Esta etapa toma el cdigo VHDL y lo convierte en un conjunto de componentes que puedan implementarse sobre una determinada tecnologa (ejemplos: CPLD, FPGA). Esos componentes generados por la sntesis pueden ser ecuaciones booleanas, listas de compuertas, listas de interconexiones, entre otros. El programa sintetizador tambin buscar obtener la implementacin ms ptima posible para una tecnologa determinada. Adicionalmente el que disea puede establecer restricciones en el circuito final, segn el dispositivo y el fabricante empleado. En la etapa nmero seis, de ajuste/ubicacin y enrutado, se realizan a su vez varios pasos. El pase de ajuste, ejecutado con la herramienta respectiva, permite mapear los componentes o primitivas obtenidas en la sntesis para adecuarlos a los recursos disponibles en el dispositivo sobre el cual se desea montar el circuito. Cada dispositivo de un determinado fabricante contar con una cantidad diferente de recursos de compuertas, conexiones, memoria, etc. La ubicacin y enrutamiento estn referidas a la forma como se interconectarn las compuertas u otros recursos disponibles tomando en cuenta las restricciones fsicas del dispositivo y a la asignacin de los terminales de entrada-salida para el circuito, en esa asignacin de terminales el diseador puede fijar restricciones adicionales. El ltimo paso en el flujo de diseo consiste en la verificacin de temporizacin del circuito ya ajustado, para comprobar su funcionamiento tomando en cuenta los retardos de tiempo del circuito real, que se pueden calcular con buena precisin por tenerse la sntesis y el ajuste del dispositivo a usar. Aqu se pueden aplicar las mismas pruebas de la etapa nmero cuatro pero ahora con los parmetros de tiempo reales del montaje (o lo ms cercanos que se pueda a los tiempos esperados).

114

Las flechas que se regresan entre los bloques de las etapas indican que durante el desarrollo del diseo, se puede retornar a pasos previos cuando el diseo no satisface el funcionamiento deseado en algunas de las fases. Por ejemplo, si en la etapa de simulacin/verificacin el circuito no trabaja como se esperaba, se debe revisar la codificacin y se podra incluso regresar a la etapa de diseo del diagrama de bloques si la concepcin del diseo no es la adecuada. En otros casos, si la sntesis genera un circuito que no se ajusta al dispositivo programable disponible, puede ser necesario iniciar desde la primera etapa para generar un nuevo diseo o para cambiar las funciones de los mdulos definidos. Con estas etapas como prembulo, se explicarn los elementos principales que conforman el lenguaje VHDL, ya que es necesario conocer su estructura para llevar a cabo la etapa de codificacin en un flujo de diseo.

4.3.2 ESTRUCTURA SINTCTICA DEL LENGUAJE VHDL 4.3.2.1 Estructura de un programa en VHDL Un programa en VHDL est estructurado con cinco unidades: Entidad Arquitectura de una entidad Configuracin Declaracin de paquetes Cuerpo del paquete o paquetes

Las tres primeras unidades son las bsicas que se necesitan para realizar un diseo en VHDL, mientras que las dos ltimas se emplean para la creacin de libreras. Los paquetes pueden ser declarados en un archivo despus de una definicin de entidad, o en un archivo independiente para luego ser empleado en un diseo que s contenga las unidades bsicas de un cdigo en VHDL. La primera parte que se debe definir en un diseo VHDL es la entidad, la cual constituye la representacin externa del diseo como un encapsulado con entradas y salidas. Con la arquitectura se define el funcionamiento de esa entidad. En VHDL se pueden definir varias arquitecturas para una misma entidad, a travs de la unidad de configuracin se especifica la arquitectura con la cual se simular y/o implementar una entidad en un diseo determinado. Las unidades para declarar un paquete y su contenido sirven para formar libreras, de manera que un cdigo completo o parte de l pueda ser utilizado en otros diseos. (Torres, 2001), (Prez y Fernndez, 2002).

115

La figura 4.2 indica las cinco unidades que estn presentes en un programa en VHDL.

Figura 4.2. Estructura de unidades presentes en un programa en VHDL Fuente: Propia.

Enmarcados en estas cinco unidades fundamentales, existen elementos sintcticos para las definiciones y declaraciones, as como tambin para el uso de comentarios, definiciones para tipos de datos, creacin de funciones y procedimientos, entre otros. A continuacin se presentarn la sintaxis y el significado de los elementos requeridos para la descripcin y sntesis de circuitos digitales a partir del lenguaje VHDL. La sintaxis a presentar seguir el estndar IEEE 1076 en su versin del ao 2002. Las primeras unidades a describir son la entidad y la arquitectura, las unidades restantes: configuracin y paquetes (declaracin y cuerpo) aparecern como soporte importante dentro de secciones ms amplias donde se explican las estructuras concurrentes y secuenciales que permiten describir el comportamiento de un diseo en VHDL. 4.3.2.2 Entidad La entidad es la representacin abstracta de un circuito, a travs de ella se describe su forma externa especificando las entradas y salidas necesarias en el diseo para realizar su conexin fsica. La entidad no proporciona detalles de cmo est diseado un sistema por dentro, esto ser indicado por la arquitectura. Las entradas y salidas se especifican en forma de puertos. La entidad permite definir los puertos de un sistema completo que se est diseando, o definir la representacin externa de un

116

circuito o mdulo que ser utilizado por un sistema ms grande. (Torres, 2001), (Carpio, 1997), (Prez y Fernndez, 2002). La sintaxis para declarar una entidad segn el estndar IEEE 1076-2002 es la siguiente: ENTITY identificador IS [Encabezado de entidad]; [Parte Declarativa]; [BEGIN Sentencias] END [ENTITY] [identificador]; La definicin de entidad comienza con la palabra reservada ENTITY (en mayscula o minscula) para indicar que se trata de este tipo de elemento, seguido de un identificador que ser un nombre especificado por el diseador y de la palabra reservada IS. Los identificadores son nombres que empiezan por letras y que no sean palabras reservadas del lenguaje VHDL. Varias de las palabras reservadas irn apareciendo a medida que se explique la sintaxis para VHDL. Los identificadores pueden tener letras, nmeros y guiones bajos (el _ ), no pueden contener otros caracteres especiales y no se pueden usar dos o ms guiones seguidos. Las maysculas y minsculas son consideradas iguales en VHDL. a. Encabezado de entidad El encabezado de entidad es la parte bsica o fundamental en una declaracin de entidad. Pueden aparecer uno o los dos tipos de encabezado disponibles que se denominan GENERIC y PORT. Los encabezados se escriben de la siguiente forma: ENTITY identificador IS [GENERIC (lista de parmetros)]; [PORT (lista de puertos)]; . . . END [ENTITY] [identificador]; La instruccin GENERIC es opcional y permite declarar constantes y otras propiedades de la entidad. Por ejemplo, pueden especificarse: tamao de los puertos, constantes de tiempo y caractersticas fsicas del diseo como temperatura o

117

capacitancia. Sirven para modelar circuitos donde se puedan cambiar algunas de sus propiedades, y suelen emplearse cuando se declaran paquetes. La sintaxis para GENERIC es: GENERIC Nombre de la constante: tipo de constante:= valor); La instruccin PORT se utiliza para declarar los puertos de entrada y salida de la entidad. Los puertos son los canales para la comunicacin dinmica entre un bloque de entidad y su entorno. La lista de puertos se escribe con el nombre del puerto seguido de dos puntos, el modo de puerto y el tipo de dato. Cuando no se indica el tipo de puerto, el compilador VHDL lo supondr como puerto de entrada (IN). (Torres, 2001). La sintaxis para definicin de puertos es: PORT ( Identificador1: modo de puerto tipo de dato; Identificador2: modo de puerto tipo de dato; . . . Identificador_n: modo de puerto tipo de dato); Si existen varios identificadores del mismo tipo de puerto y de dato, se pueden definir en una lista de nombres separados por coma: PORT ( Identificador1, Identificador2, Identificador_n: modo de puerto tipo de dato; . . . Identificadorx: modo de puerto tipo de dato); A continuacin se muestra un ejemplo de una definicin de entidad, donde se utiliza GENERIC y PORT: ENTITY compuerta_and IS GENERIC (N: Natural:= 3); PORT (Datos: in Bit_Vector (1 to N); Resultado: out Bit); END compuerta_and; -- tambin puede ser END ENTITY compuerta_and;

118

En el ejemplo anterior, la entidad compuerta_and posee dos entradas tipo bit en el vector datos. El identificador resultado corresponde a un puerto de salida cuyo tamao es de un bit. Los dos guiones corresponden a un comentario. Con GENERIC se define una constante N correspondiente a un nmero natural, cuyo valor es 3.

Figura 4.3. Ejemplo de una entidad. Fuente: Propia.

b. Puertos Los puertos de VHDL se pueden asociar con los pines de conexin de un smbolo esquemtico. El puerto es un objeto de datos que permite la transferencia de informacin entre el diseo representado con la entidad y otros circuitos digitales, o para conectarlo externamente en el encapsulado. De forma implcita un puerto es una seal, porque indica conexiones del diseo y se puede emplear en la descripcin de la arquitectura que define el funcionamiento de la entidad. En la seccin anterior se explic la forma de definir un puerto. Los tipos o modos de puertos que se pueden utilizar se listan a continuacin, y estn definidos en el estndar IEEE 1076-2002. (IEEE Standard VHDL, 2002), (Gmez, 2003). IN OUT INOUT BUFFER LINKAGE

Modo IN: para seales que son de tipo entrada para la entidad. Se puede leer su valor pero no puede ser modificado. Cuando no se especifica el modo de un puerto, ser por defecto de entrada. Modo OUT: este modo de puerto corresponde a seales de salida de la entidad. Se puede modificar y se le pueden asignar valores, pero no se puede leer. Esto implica que al no tener acceso a su valor, no se le puede emplear en las conexiones internas del diseo.

119

Modo INOUT: para seales que pueden ser de entrada y salida a la vez, por tanto se puede leer y escribir en ellas. Son puertos bidireccionales. Modo BUFFER: un puerto de este tipo se utiliza para salidas de la entidad que tengan realimentacin interna. Se puede leer y cambiar el valor de la seal. Este tipo de puerto es una salida con registro, y slo se puede conectar directamente a una seal interna o a un buffer de otra entidad. Modo LINKAGE: es un modo de puerto parecido al INOUT en el que se puede leer y escribir, pero slo se utiliza con objetos de datos denominados LINKAGE. Sirve como interfaz para vincular un diseo con otros mdulos creados con herramientas diferentes al VHDL.

c. Parte Declarativa para la entidad En la declaracin de la entidad puede existir una parte declarativa opcional, ubicada despus de las instrucciones GENERIC y PORT: ENTITY identificador IS [Encabezado de entidad]; [Parte Declarativa]; [BEGIN Sentencias] END [ENTITY] [identificador]; Esta parte declarativa sirve para definir elementos que son comunes a todas las entidades del diseo cuya estructura viene descrita por la declaracin de una entidad principal. (IEEE Standard VHDL, 2002). Las declaraciones que pueden incluirse son: | Declaracin de Subprograma | Cuerpo del subprograma | Declaracin de tipos | Declaracin de subtipos | Declaracin de constantes | Declaracin de seales | Declaracin de variables compartidas (shared) | Declaracin de archivos | Declaracin de alias | Declaracin de atributos | Especificacin de atributos | Especificacin de desconexiones

120

| Clusula use | Declaracin de plantilla de grupo | Declaracin de grupo De los elementos anteriores se explicarn en secciones posteriores los principales, aquellos no descritos podrn consultarse en las referencias bibliogrficas de este trabajo. El siguiente ejemplo muestra una entidad con parte declarativa. En ella se define una entidad llamada memoria con una entrada direccion tipo palabra, una entrada Selector tipo bit y una salida Dato tipo palabra. La parte declarativa contiene la definicin de dos tipos de datos: Instru que es un arreglo de ocho elementos siendo cada uno un nmero natural, y Programa que es otro arreglo cuyo tamao es el rango de los nmeros naturales; cada elemento de Programa es a su vez un arreglo del tipo Instru ya definido. entity memoria is port ( direccion: in Word; Dato: out Word; Selector: in Bit); type Instru is array (1 to 8) of Natural; type Programa is array (Natural range <>) of Instru; end memoria; d. Sentencias para la entidad En la sintaxis general de entidad aparece un tem referido a la declaracin de sentencias o instrucciones: ENTITY identificador IS [Encabezado de entidad]; [Parte Declarativa]; [BEGIN Sentencias] END [ENTITY] [identificador]; La parte de sentencias es opcional y contiene instrucciones concurrentes (paralelas) que son comunes para cada entidad de diseo que use la estructura de la entidad principal.

121

[BEGIN Sentencias concurrentes: | Llamadas a procedimientos concurrentes pasivos | Instrucciones de procesos pasivos] END Slo pueden aparecer sentencias relacionadas con rdenes concurrentes, llamadas a procedimientos o instrucciones de procesos pasivos. Un proceso es pasivo si el mismo proceso y sus procedimientos no contienen sentencias de asignacin de seales. (IEEE Standard VHDL, 2002). En otras secciones de este captulo se explicarn los trminos proceso y seales, lo cual aclarar el uso de este elemento adicional. 4.3.2.3 Arquitectura En la arquitectura se define cmo funciona una entidad, proporcionando detalles de la relacin interna entre las entradas y salidas que la conforman. Esta relacin entre las entradas y salidas de la entidad puede expresarse de tres maneras: estructural, de flujo de datos y comportamental. (Wakerly, 2001), (Carpio, 1997), (Torres, 2001). En secciones posteriores de este captulo se explicar la manera de utilizar estas tres formas de descripcin. La sintaxis para definir una arquitectura segn el estndar IEEE 1076-2002 es la siguiente: ARCHITECTURE identificador OF nombre_de_entidad IS [declaraciones] BEGIN [sentencias] END [ARCHITECTURE] [identificador]; El identificador define el nombre del cuerpo de la arquitectura y la diferencia de otras arquitecturas asociadas con la misma declaracin de entidad. Este identificador sigue la misma sintaxis del identificador de identidad en cuanto a tipos de caracteres a usar (seccin 4.3.2.2). El nombre de entidad indica el nombre de la entidad declarada para un diseo determinado. Para un diseo dado, la declaracin de entidad y su definicin de arquitectura deben encontrarse en la misma librera. Se puede cerrar la arquitectura con END ARCHITECTURE o con END identificador, con el mismo nombre inicial del cuerpo.

122

Entre ARCHITECTURE y BEGIN se definen todas las seales que se usen en el diseo de forma interna. En esta parte declarativa se pueden definir subprogramas, tipos, constantes y funciones se requiera usar en la parte de sentencias. En la seccin de sentencias ubicada entre BEGIN y END es donde se detalla el funcionamiento de la entidad a la cual esta asociada la arquitectura. a. Declaraciones para la arquitectura En la declaracin de la arquitectura se definen las seales y otros elementos necesarios para la descripcin del funcionamiento de la entidad. Las declaraciones que pueden incluirse son: | Declaracin de Subprograma | Cuerpo del subprograma | Declaracin de tipos | Declaracin de subtipos | Declaracin de constantes | Declaracin de seales | Declaracin de variables compartidas (shared) | Declaracin de archivos | Declaracin de alias | Declaracin de componentes | Declaracin de atributos | Especificacin de atributos | Especificacin de desconexiones | Clusula use | Declaracin de plantilla de grupo | Declaracin de grupo Las declaraciones anteriores tambin se aplican en la entidad, con excepcin de la declaracin de componente que puede definirse en la arquitectura ms no aparece en la parte declarativa de entidad (IEEE Standard VHDL, 2002).

b. Sentencias de la Arquitectura Las sentencias describen la organizacin interna y/o la operacin de una entidad; estas sentencias son concurrentes porque cada una se ejecuta en forma asncrona respecto a las dems. Los detalles de las instrucciones o sentencias que pueden incluirse en la arquitectura se explicarn en las siguientes secciones.

123

El siguiente es un ejemplo de una declaracin de entidad con una definicin de arquitectura: ENTITY compuerta_and2 IS PORT (a, b: in Bit; y: out Bit); END compuerta_and2; ARCHITECTURE calculo_and OF compuerta_and2 IS signal c: Bit; -- declaracin de una seal BEGIN c <= a and b; -- realiza operacin lgica and entre a y b y <= c; -- asigna resultado de la seal c a la salida y END calculo_and; En el ejemplo anterior se declar una entidad llamada compuerta_and2, con dos puertos de entrada de un bit cada uno y un puerto de salida tambin de un bit. En la arquitectura se define su comportamiento. Se defini una seal llamada c a l que se asigna el resultado de la operacin lgica and entre las entradas a y b, posteriormente ese resultado se asigna a la salida y de la entidad. Esa seal c es interna y no se tiene acceso a ella en los puertos, permite conectar su informacin a otras seales de la entidad. Los dos guiones -- representan un comentario en VHDL. Otra forma de hacer el ejemplo anterior es obviar la seal interna c, la misma no era necesaria en el ejemplo por no requerirse conectar su valor con otros puntos de la entidad. Se puede asignar el resultado de la operacin lgica directamente a la salida y como se muestra a continuacin: ARCHITECTURE calculo_and OF compuerta_and2 IS BEGIN -- sin declaracin de seal y <= a and b; -- realiza operacin lgica and entre a y b -- asigna resultado directamente a la salida y END calculo_and; La Figura 4.4 muestra una representacin de la entidad compuerta_and2 y de su arquitectura, asociando su operacin con una compuerta lgica.

124

Figura 4.4. Ejemplo de una entidad y su arquitectura asociada. Fuente: Propia.

4.3.2.4 Objetos de datos Antes de explicar los tipos de datos disponibles en VHDL, es importante hacer referencia a los objetos de datos de manera que se tengan diferenciados los dos conceptos. Un objeto de datos de VHDL es un elemento que puede tomar un valor de un cierto tipo de dato (Torres, 2001), (Prez y Fernndez, 2002), (Pedroni, 2004). Ese objeto de datos tendr determinadas propiedades y se le podrn aplicar operaciones especficas dependiendo del tipo de dato asociado. Los objetos de datos pueden clasificarse en tres tipos bsicos: Constantes Variables Seales

a. Constantes Una constante es un elemento al que se le puede asignar un nico valor de un tipo determinado. El valor de la constante se le asigna cuando es declarada y no puede ser cambiado en la descripcin del diseo. Se puede declarar una constante en los siguientes elementos del cdigo en VHDL: en entidades, arquitecturas, paquetes y procesos. Los trminos de paquete y proceso sern aclarados en posteriores secciones del captulo. La sintaxis para declarar una constante en VHDL de acuerdo al estndar IEEE 1076 es la siguiente: CONSTANT identificador o lista de identificadores: subtipo [ := expresin ] ; Se escribe la palabra reservada CONSTANT (mayscula o minscula) seguido del identificador. El identificador o lista de identificadores es el nombre de la

125

constante o constantes en caso de ser ms de una. Si de trata de varios identificadores, los mismos se separan entre s con coma, excepto el ltimo que llevar los dos puntos. A continuacin se escriben dos puntos y el tipo de dato (llamado subtipo). Despus del smbolo := se coloca el valor de la constante. Los corchetes indican que el uso de la expresin es opcional. Tambin se puede escribir una expresin que especifique dicho valor; el tipo de dato de la expresin debe coincidir con el tipo de dato de la constante. Al final de la declaracin se coloca un punto y coma (;). A continuacin se muestran varios ejemplos de declaracin de constantes. En el primer ejemplo se define una constante entera que vale 16. La siguiente constante llamada Valor_interes tambin es de tipo entero y su valor se obtiene a partir de una expresin que depende de la primera constante. La tercera constante es una letra (tipo carcter) y la ltima constante es de tipo bit con valor booleano 1. Constant Cantidad_bits : integer := 16; Constant Valor_interes : integer := Cantidad de bits 15; Constant Letra : character := A; Constant valor_bit : bit := 1; Las constantes que se declaren en un paquete se pueden usar en cualquier diseo que contenga dicho paquete. Si se declara una constante dentro de una entidad, podr usarse en las arquitecturas que describan a esa entidad. Ahora bien, si se trata de una constante declarada en una arquitectura o en un proceso, slo podr utilizarse en el lugar respectivo donde sea definida. Cuando el smbolo := no aparece en la declaracin, se trata de una constante diferida, esto se debe usar solamente en la declaracin de un paquete. La declaracin completa de esa constante para asignarle su valor deber aparecer en el cuerpo del paquete. b. Variables Las variables son objetos de datos a los cuales se les puede modificar su valor cuando se requiera. A las variables se les puede asignar un valor inicial cuando son declaradas. (Carpio, 1997). Las variables slo se deben usar en los procesos, funciones y procedimientos. Se utilizan por lo general como ndices o para asignarles valores que modelen a un componente. Las variables no representan conexiones de memoria, esto es importante recordarlo cuando se escribe un cdigo en VHDL para evitar inconsistencias de asignaciones entre puertos, seales y variables.

126

Las variables que se declaran en un proceso slo son visibles dentro de esa estructura, y por ello no permiten transmitir informacin entre procesos. Los valores de las variables son asignados de inmediato en la estructura donde se les utilice. La sintaxis para declaracin de variables en VHDL es: [ shared ] VARIABLE identificador o lista de identificadores: indicacin de subtipo [ := expresin ] ; La palabra reservada shared es opcional e indica que se trata de una declaracin de variable compartida. Despus de la palabra reservada VARIABLE, lo siguiente es un identificador o lista de identificadores para la variable o variables. A continuacin se seala el tipo de dato. Si se asigna un valor inicial a la variable, este se escribe despus del smbolo :=, dicho valor inicial tambin se puede indicar con una expresin. Ntese que las asignaciones de valores para variables se hacen con :=, esto es una diferencia con las seales. Cuando se declara ms de una variable del mismo tipo los identificadores se separan entre s con coma. Despus de los dos puntos se escribe la declaracin de tipo. Los siguientes son ejemplos de declaraciones de variables: VARIABLE valor1, valor2: bit; -- dos variables tipo bit sin valor inicial VARIABLE auxiliar: integer:= 4; -- variable entera con valor inicial 4 Variable valor3: bolean:= true; -- variable booleana con valor inicial true c. Seales Las seales son objetos de datos a los cuales se les puede modificar su valor como en el caso de las variables, con la diferencia que s pueden almacenar y transferir valores lgicos; una variable en cambio no puede transferir su valor de un proceso o subprograma a otro. Las seales s representan conexiones de memoria y pueden por tanto ser sintetizadas. Las seales pueden ser declaradas al inicio de una arquitectura antes de la palabra BEGIN. Los puertos de una entidad son tambin seales implcitas, porque representan en general conexiones de entrada o salida para la entidad donde se declaren. (Torres, 2001), (Carpio, 1997).

127

Por representar conexiones fsicas internas en una arquitectura, las seales se pueden utilizar para interconectar elementos de un circuito, sincronizar un proceso o transferir informacin entre procesos. Cada seal deber tener asociado un tipo de dato, como en el caso de las constantes y variables, y podr estar o no inicializada. Otro punto importante a resaltar es que los valores para las seales no se asignan de forma inmediata como s ocurre con las variables. Esto ocurre porque las seales pueden utilizarse en estructuras secuenciales llamadas procesos (PROCESS), donde el valor de cada seal ser el ltimo que se le asigne al final del proceso. Esto se detallar cuando se describa en qu consiste un proceso en este mismo captulo. La sintaxis para declarar una seal en VHDL es la siguiente: SIGNAL identificador o lista de identificadores: subtipo [ := valor o expresin ] ; Se escribe la palabra reservada SIGNAL, seguida del identificador o identificadores para la seal o seales (si son varias del mismo subtipo de dato), luego se indica el subtipo de dato y opcionalmente se puede indicar despus del := un valor inicial directamente o con una expresin. El siguiente ejemplo muestra varias declaraciones de seales: ARCHITECTURE ejemplo1 OF entidad1 IS SIGNAL auxiliar2: bit:= 0; SIGNAL arreglo1, arreglo2: std_logic_vector (3 downto 0); SIGNAL m1, m2: integer; SIGNAL t1: boolean: = false; BEGIN . . . END ejemplo1; En el ejemplo anterior, se observa que todas las seales estn declaradas en la arquitectura antes del BEGIN. La primera seal es tipo bit y tiene un valor inicial de cero. Las seales arreglo1 y arreglo2 son dos vectores de 4 bits cada uno, de un tipo denominado Standard logic vector definido dentro de los tipos de datos usados en VHDL y dentro del estndar IEEE-1076. El downto indica una declaracin de los dos vectores ordenados desde su bit ms significativo (3) hasta su bit menos significativo (0) de izquierda a derecha. Las seales m1 y m2 son enteras y no estn inicializadas, al igual que los arreglos. La ltima seal del ejemplo es de tipo booleana, con valor inicial false (falso).

128

En relacin a la captura del valor en una seal al final de un proceso, se presenta el siguiente ejemplo: PROCESS VARIABLE dato1, dato2: integer; BEGIN m1<= dato1+1; m1<= dato1 + dato2; END PROCESS; En el ejemplo presentado, hay dos asignaciones para la seal m1 (del ejemplo previo) pero el valor que tomar ser el de la ltima asignacin, porque en los procesos las seales se actualizan al final de su ejecucin. Este ejemplo puede escribirse slo con la segunda lnea de asignacin y el resultado ser el mismo. La seal m1 puede recibir una asignacin de variables o de operaciones entre variables, siempre y cuando sea del mismo tipo. La descripcin de los procesos se realizar en una seccin posterior. Ntese que la asignacin de un valor (no inicial) para la seal m1 se hace con el smbolo <=, esto la distingue de una asignacin para variable. d. Alias Se har referencia a los alias, aun cuando no sean objetos de datos como las constantes, variables y seales. Un alias es un nombre o identificador alterno que se declara para un objeto de datos ya existente, o para una parte de un objeto de datos. Permite manejar si se desea una parte de un objeto de datos cuando se necesita facilitar su manipulacin en la programacin de VHDL. Cada vez que se modifique al alias, se est cambiando el objeto de datos al que hace referencia. (Torres, 2001).

La sintaxis para declarar un alias en VHDL es la siguiente: ALIAS identificador de alias: [subtipo] IS identificador2 <rango>; Identificador de alias: identificador | carcter literal | smbolo de un operador Primero se coloca la palabra reservada ALIAS (maysculas o minsculas), seguida del identificador de alias, el cual puede tratarse de un identificador o nombre como los asignados a entidades y a objetos de datos, puede ser tambin una letra o un smbolo de alguna operacin. Despus del identificador de alias se indica el subtipo de dato, la palabra IS y el identificador2 del objeto de datos al cual haga referencia el alias. Si se har referencia slo a una parte del identificador2, se definir el rango de ese objeto que ser sealado por el alias.

129

Los alias se pueden usar para casi todos los objetos de datos y para entidades, excepto para etiquetas, parmetros loop y parmetros generate; se explicarn el generate y el whileloop en la seccin de descripciones de arquitecturas. Un alias siempre ser del mismo tipo de datos que el objeto al cual seale, o un subtipo compatible con los elementos que forman al objeto referido. Por ejemplo, un alias de una variable ser tambin una variable. De forma similar, un alias de un subprograma denota un subprograma. Si el identificador de alias es un smbolo de operador, el identificador2 debe hacer referencia a una funcin. (IEEE Standard VHDL, 2002). A continuacin se presentan ejemplos de declaraciones de alias. La variable dato3 es un vector de 8 bits, y el alias signo seala el bit 0 de este vector. El alias mitad es un vector de 4 bits organizados desde el bit ms significativo al menos significativo, formado por los bits 3 al 7 de la variable dato3, en orden opuesto. El ltimo ejemplo es la denotacin de la operacin lgica del negado segn un estndar STD.STANDARD, haciendo referencia a la funcin not. variable dato3: bit_vector (0 to 7); alias signo : bit is dato3 (0); alias mitad : bit_vector (3 downto 0) is dato3 (3 to 7); alias "not" is STD.STANDARD."not"; 4.3.2.5 Tipos de datos Un tipo de dato est formado por un conjunto de valores que puede tomar un objeto de datos y por las operaciones que se pueden realizar con esos valores. Es muy importante conocer los tipos de datos para poder asignar valores a los objetos de datos de una manera consistente, porque a cada objeto slo le deben corresponder valores del tipo con que fue declarado. Adems, para cada tipo existirn operaciones especficas. Se pueden definir funciones para convertir un tipo de dato a otro y as aplicarle las operaciones que se requieran en un cdigo VHDL. (Torres, 2001). En VHDL se pueden crear otros tipos de datos a partir de los tipos bsicos. Los tipos de datos se pueden dividir en escalares y compuestos. A continuacin se realizar una descripcin de los principales tipos de datos. a. Tipos de datos escalares Los tipos de datos escalares poseen un orden especfico, esto permite que se puedan usar diferentes operadores predefinidos con sus valores. Se emplean como soporte para la elaboracin de algoritmos en un cdigo VHDL, y pueden ser pasados

130

al sintetizador si es necesaria su implementacin fsica aunque esta sntesis no siempre lograr un equivalente de hardware para los escalares en el circuito bajo diseo. Los tipos escalares son los siguientes: Enteros Reales o de punto flotante Enumerados y Fsicos

Para cada tipo escalar existe un rango asociado, definido con la palabra reservada range: Range nombre de atributo | valor1 direccin valor2 Direccin:= to | downto Un rango especifica un subconjunto de valores de un tipo escalar. Se dice que un rango es nulo si el subconjunto especificado es vaco. Al lado de la palabra range se puede escribir directamente o el rango completo de un tipo escalar, que est identificado como nombre de atributo, o dos valores para sealar el rango acompaados de la direccin. La direccin puede ser ascendente (to) o descendente (downto). Para direcciones ascendentes el primer valor debe ser menor al segundo, y para direcciones descendentes el valor2 deber ser menor que valor1. En cada tipo de escalar se proporcionarn ejemplos que refuercen este concepto. i. Enteros Los escalares enteros (INTEGER) se pueden especificar en VHDL desde 2147483647 a +2147483648 (desde -231-1 hasta +231). El rango real depender de la mquina sobre la cual se compile el cdigo en VHDL. Los enteros soportan las operaciones de suma, resta, multiplicacin y divisin. Cuando se sintetiza una seal o variable declarada como entero, la misma deber estar limitada en un rango. Los enteros son un tipo predefinido. Los nmeros naturales y los nmeros positivos son subtipos de enteros predefinidos en VHDL. Los subtipos predefinidos positivos y naturales son: Subtype natural is integer range 0 to valor entero ms alto; Subtype positive is integer range 1 to valor entero ms alto;

131

Los operadores predefinidos para el tipo entero se muestran en la siguiente tabla. Las operaciones de comparacin (desde el signo igual = en adelante) retornan valores de tipo booleano. Los operadores + hasta ** regresan valores enteros cuando se aplican. Tabla 4.1. Operadores predefinidos para el tipo entero Operador + * / mod rem abs Significado Suma Resta Multiplicacin Divisin Divisin entera Residuo Valor absoluto Operador ** = /= < <= > >= Significado Exponenciacin Igual a Diferente de Menor que Menor o igual Mayor que Mayor o igual

Con RANGE se pueden crear tipos de enteros que slo abarquen un subconjunto de valores. Ejemplos: VARIABLE N1: integer; -- abarca todo el rango de los enteros VARIABLE N2: integer RANGE -15 to 15; SIGNAL N3: integer RANGE 20 downto 0; TYPE longitud1 is range 0 to 255; SUBTYPE longitud_baja is longitud1 range 0 to 127; VARIABLE N4: longitud1; VARIABLE N5: longitud_baja; En los ejemplos mostrados se aprecia una variable entera N1 que abarca el rango completo de valores enteros, N2 es una variable entera que slo puede tomar valores entre -15 y 15, la seal N3 tambin tiene un rango restringido en este caso de 20 a 0 (orden descendente, equivale de 0 a 20 ascendente). Con TYPE se puede definir un tipo de dato y con SUBTYPE un subtipo de dato, para a partir de ellos declara seales, constantes y variables. El tipo longitud abarca un rango de enteros de 0 a 255 y el subtipo longitud_baja est formado por una fraccin de los valores contenidos en longitud1. Despus de definir tipos y subtipos pueden declararse objetos de datos con ellos, por ejemplo N4 es una variable entera que podr tomar valores entre 0 y 255, mientras que a la variable N5 se le podrn asignar enteros entre 0 y 127. Ntese que al definir el rango en un tipo o subtipo, no hace falta especificar que se trata de un entero, simplemente se colocan los lmites, si se coloca es opcional. TYPE y SUBTYPE son entonces palabras

132

reservadas que permiten al usuario definir tipos y subtipos de datos. Los subtipos son subconjuntos de un tipo predefinido o definido por el usuario en VHDL. ii. Reales o de punto flotante Los tipos reales o de punto flotante pueden tomar valores que van en el rango de -1.038x1038 a +1.038x1038 (1.038E38 a +1.038E38). (Torres, 2001). El escalar real rara vez es usado en sntesis y en la mayora de las herramientas de software de VHDL para sntesis no se puede utilizar este tipo de dato. Si se usa en un cdigo, se puede especificar un rango de reales con la palabra RANGE. Los siguientes son ejemplos de tipos reales: VARIABLE M5: real range 0.0 to 20.5; TYPE ejemplo_real is RANGE 0.0 to 15.0; VARIABLE m6: ejemplo_real; Los operadores aplicados a los reales son los mismos de los tipos enteros, con excepcin de los operadores mod y rem que slo aplican para enteros. Las operaciones matemticas retornarn en este caso nmeros reales. iii. Enumerados El tipo enumerado es un tipo de dato que cuenta con un grupo posible de valores asignados por el usuario en una lista. Se utilizan con frecuencia para identificar los estados de un sistema secuencial. (Torres, 2001). La sintaxis para declarar un tipo enumerado es la siguiente: TYPE nombre IS ( valor [, valor...] ); Se escribe la palabra TYPE (tipo), el nombre del tipo enumerado, la palabra is y a continuacin entre parntesis la lista de los valores separados por coma que puede tomar el tipo definido. Ejemplos: TYPE operar is (suma, resta, divide, multiplica); TYPE bit is ('0', '1'); -- Predefinido en el lenguaje TYPE pasos is (paso0, paso1, paso2, paso4); Los tipos enumerados por lo general son inicializados por defecto en el valor especificado a la izquierda. Siempre que se pueda se recomienda definir la lista de

133

posibles valores en orden alfabtico. Como este tipo de datos puede ser creado por el usuario, no tiene una funcin o procedimiento que resuelva inconsistencias de asignaciones cuando dos o ms estructuras asignen valores diferentes a un mismo objeto de tipo enumerado. Las inconsistencias debern resueltas por el usuario. Existen varios tipos enumerados predefinidos en VHDL. Estos tipos son: boolean, bit, character y severity_level. (Torres, 2001) Boolean

El tipo booleano (BOOLEAN) es un tipo enumerado que puede tomar dos valores, faso (FALSE) y verdadero (TRUE). El valor FALSE es menor que TRUE. Las funciones lgicas y de comparacin retornan siempre un valor booleano. Cuando se utilizan datos no booleanos en operaciones lgicas, por ejemplo datos tipo bit, se aplican funciones de conversin que permiten realizar esas operaciones con tipos de datos diferentes al booleano. Ejemplo: Variable a: boolean := true; -- valor inicial verdadero Los operadores predefinidos para el tipo booleano se muestran en la Tabla 4.2. Las operaciones and hasta xnor regresan resultados booleanos, al igual que las operaciones de comparacin. Tabla 4.2. Operadores predefinidos para el tipo booleano Operador and or nand Nor Xor xnor Not = /= < <= > >= Significado AND OR NAND NOR OR exclusivo NOR exclusivo Complemento a uno Igual a Diferente de Menor que Menor o igual Mayor que Mayor o igual

134

Bit

El bit es un tipo enumerado que puede tomar los valores binarios 0 y 1. Las operaciones lgicas donde se usan tipos de dato bit regresan valores binarios por medio de la siguiente funcin: IF (boolean_var) THEN bit_var := '1'; ELSE bit_var := '0'; END IF; Lo anterior indica que si al evaluar una expresin o variable booleana ocurre un resultado TRUE, a una variable tipo bit se le asigna 1, de producirse un resultado FALSE entonces la variable tipo bit toma el valor 0. Los operadores para el tipo bit son los mismos operadores del tipo booleano. Las operaciones lgicas desde and hasta not regresarn resultados tipo bit y las relacionadas con comparaciones producirn valores booleanos. Character

El tipo carcter (character) es un tipo enumerado cuyos valores posibles son el conjunto de los smbolos contenidos en el cdigo ASCII. Los operadores predefinidos para este tipo booleano aparecen en la Tabla 4.3. Todas las operaciones asociadas a estos smbolos producen resultados booleanos. Tabla 4.3. Operadores predefinidos para el tipo character Operador = /= < <= > >= Significado Igual a Diferente de Menor que Menor o igual Mayor que Mayor o igual

Tipo Std_logic

El tipo lgico estndar (Standard logic) o Std_logic es similar al tipo bit, con la excepcin que ste no est predefinido dentro del lenguaje. El std_logic es una

135

mejora del tipo bit definida por la norma IEEE 1164. Se usa como un paquete (std_logic_1164) de IEEE, donde se le define como un tipo de dato que puede tomar diferentes valores adicionales al 1 y al 0, que permiten realizar una mejor simulacin del comportamiento real esperado en un circuito lgico. Para emplear este tipo de dato en un cdigo de VHDL se debe incluir ese paquete en la descripcin del diseo usando dos lneas adicionales antes de declarar la entidad. La sintaxis para usar el paquete es la siguiente: LIBRARY ieee; USE ieee.std_logic_1164.ALL; La primera lnea indica que se usar la librera de IEEE donde se dispone de diferentes recursos bajo estndares, y con la clusula USE en la siguiente lnea se especifica que se utilizar un paquete llamado ieee.std_logic_1164, con la palabra ALL se seala que se seleccionarn todos los elementos o tems que formen a ese paquete. Los paquetes contienen elementos como subprogramas, tipos, subtipos, componentes y constantes previamente declarados. Posteriormente se ampliar la explicacin de los paquetes. El primer tipo se inici con el std_ulogic y a partir de l se derivaron los grupos std_logic, std_ulogic_vector y std_logic_vector. Los grupos std_ulogic_vector y std_logic_vector se pueden clasificar como tipos compuestos, mientras que std_ulogic y std_logic son tipos simples. Los valores que pueden tomar los tipos std_ulogic y std_logic son los siguientes: Tabla 4.4. Valores predefinidos de los tipos std_ulogic y std_logic Valor U X 0 1 Z W L H - Significado Sin inicializar Forzado a desconocido Forzado a cero Forzado a uno Alta Impedancia Desconocido dbil Cero dbil Uno dbil No Importa

136

La declaracin (predefinida) de std_ulogic y std_logic es de la siguiente forma: TYPE std_ulogic IS (U, X, 0, 1, Z, W, L, H, -); SUBTYPE std_logic is resolved std_ulogic; El tipo de dato std_ulogic es lo que se denomina un tipo no resuelto (unresolved), es decir, no se permite que dos valores (como por ejemplo 0 y 1, o 1 y Z) sean manejados simultneamente dentro de una seal del tipo std_ulogic. Si no se est describiendo un circuito que ser manejar diferentes valores en el conexionado, como en el caso de un bus de interfaz, el usuario podra utilizar el tipo std_ulogic para capturar errores en la descripcin de un diseo. Cuando se describe en cambio un circuito que puede involucrar la manipulacin de mltiples valores en el conexionado, entonces se debe utilizar el tipo std_logic. Std_logic es un tipo resuelto (resolved) del std_ulogic. Los tipos resueltos se declaran con funciones de resolucin que permiten definir el comportamiento resultante cuando un objeto es manejado con diferentes valores de forma simultneas, es decir cuando una seal es manejada por mltiples fuentes. El siguiente es un ejemplo de la utilizacin del tipo std_logic, sustituyendo al tipo bit. Se trata de una compuerta OR, con sus dos entradas y su salida. Este ejemplo tambin puede resolverse con tipo bit. Si el circuito va a ser operado en forma independiente, la salida y solo podr tener dos valores posibles, 0 y 1. Si en cambio dicha compuerta est incluida dentro de una jerarqua ms grande de conexiones fsicas, es muy probable que en esas interconexiones ocurran valores diferentes a 0 y 1, y sera de utilidad el tipo std_logic. Ejemplo: library ieee; use ieee.std_logic_1164.all; ENTITY compuerta_or IS PORT (a, b: in std_logic; y: out std_logic); END compuerta_or; ARCHITECTURE arqui OF compuerta_or IS signal c1: Bit; -- declaracin de una seal BEGIN c1 <= a or b; -- realiza operacin lgica or entre a y b y <= c1; -- asigna resultado de la seal c1 a la salida y END arqui;

137

Adicional a los tipos de un solo bit std_logic y std_ulogic, el estndar IEEE incluye los tipos de arreglos std_logic_vector y std_ulogic_vector. Ambos estn definidos en el paquete std_logic_1164 como arreglos sin fronteras, similares al tipo bit_vector. Se pueden definir adems subtipos con esos tipos para crear arreglos. El siguiente ejemplo muestra la definicin de un subtipo a partir del tipo std_ulogic_vector: library ieee; use ieee.std_logic_1164.all; package mi_tipo is subtype un_byte is std_ulogic_vector(7 downto 0); end mi_tipo; La importancia de trabajar con estndares, en este caso el IEEE 1076 y el IEEE 1164 para el caso de lgica estndar (std_ulogic y tipos asociados), radica en que estos tipos permiten aplicar valores diferentes de 0 y 1 como entradas y observar resultados. Esto puede ser de utilidad por ejemplo, para verificar que una entrada con valor desconocido no ocasione un comportamiento inesperado en el circuito final. Un ejemplo de aplicacin es un driver de tres estados, que puede tomar tres valores diferentes. Otra ventaja que presentan los tipos lgicos estndares es la portabilidad. Si un usuario necesita realizar interfaces de un diseo con otros componentes, o probar su descripcin de diseo en diversos ambientes de simulacin, el IEEE 1164 proporciona un estilo estndar y portable para describir el circuito con tipos de datos compatibles. El tipo std_logic y std_logic_vector son en la actualidad el tipo lgico estndar de la industria de semiconductores. Sin embargo, slo una parte de sus valores son vlidos para sntesis y son los siguientes: Tabla 4.5. Valores de los tipos std_ulogic y std_logic aceptados para sntesis Valor 0 1 Z L H - Significado Forzado a cero Forzado a uno Alta Impedancia Cero dbil Uno dbil No Importa

138

Severity level

Es un tipo de dato predefinido asociado con condiciones especiales de advertencia y de aviso de fallas. Sus valores posibles son: TYPE SEVERITY_LEVEL IS (NOTE, WARNING, ERROR, FAILURE); Los operadores asociados a este tipo se sealan en la tabla Tabla 4.6. Al aplicar estos operadores, todos retornan resultados booleanos. Tabla 4.6. Operadores predefinidos para el tipo Severity level Operador = /= < <= > >= Significado Igual a Diferente de Menor que Menor o igual Mayor que Mayor o igual

Codificacin de los tipos enumerados

Los tipos de datos enumerados son ordenados de acuerdo a sus valores. Los programas de sntesis codifican en forma binaria los valores de los tipos enumerados para que estos puedan ser sintetizados. Algunos programas codifican con una secuencia binaria ascendente, mientras que otros buscan cual es la codificacin ms conveniente para minimizacin del circuito o para optimizacin de su velocidad. Tambin es posible asignar el tipo de codificacin mediante directivas de sntesis propias de cada herramienta de programacin. Por ejemplo el siguiente tipo enumerado podra ser codificado por un sintetizador en valores binarios para cada valor, como: paso1 = 00, paso2 = 01, paso3 = 10, paso4 = 11. TYPE pasos IS (paso1, paso2, paso3, paso4); iv. Fsicos Son tipos de datos que se utilizan para especificar magnitudes fsicas, es decir unidades de medida, como tiempo y unidades elctricas. El nico tipo predefinido es

139

el tiempo (time), mediante el cual se pueden establecer medidas para simular retardos de tiempo o para generar diferentes seales que permitan simular un diseo. La unidad bsica del tipo time es el femtosegundo, y de ste se forman diferente mltiplos. Las otras unidades que se requieran como por ejemplo resistencia elctrica, requieren ser definidas por el usuario. Este tipo de datos no tiene significado en sntesis, slo se les usa en simulacin. Los siguientes son ejemplo de tipos fsicos: TYPE time IS RANGE -2147483647 TO 2147483647 UNITS fs; -- unidad bsica femtosegundo ps = 1000 fs; -- picosegundo ns = 1000 ps; -- nanosegundo us = 1000 ns; -- microsegundo ms = 1000 us; -- milisegundo sec = 1000 ms; -- segundo min = 60 sec; -- minuto hr = 60 min; -- hora END UNITS; TYPE ohm IS RANGE 0 TO 999999999999; UNITS ohm; -- unidad base K = 1000 ohm; -- Kilo ohm M = 1000 K; -- Mega ohm END UNITS; b. Tipos de datos compuestos Un tipo compuesto es un tipo de dato formado por tipos de datos escalares. Los tipos compuestos se clasifican en dos tipos fundamentales: arreglos y registros. Adicionalmente se cuenta con los tipos bit_vector y std_logic_vector. (Torres, 2001) (Carpio, 1997), (Perry, 2002), (Wakerly, 2001). i. Arreglos Un arreglo (ARRAY) es un conjunto indexado de elementos del mismo tipo. Los arreglos pueden ser de una o ms dimensiones. Para utilizar los elementos de un

140

arreglo en forma separada se especifica el nombre del arreglo y la posicin del elemento (ndice) dentro del arreglo. La sintaxis general para la declaracin de un arreglo en VHDL es la siguiente: TYPE nombre IS ARRAY ( rango ) OF tipo; Se escribe la palabra reservada TYPE, a continuacin el nombre del arreglo, las palabras IS y ARRAY, seguidas del rango del arreglo y el tipo de elementos que lo forman. Una vez que se define un tipo arreglo, pueden declararse objetos de datos (constantes, seales, variables) de ese tipo. En el siguiente ejemplo el tipo de arreglo entradas tiene 16 elementos tipo bit, ordenados de forma ascendente. El segundo tipo declarado es un arreglo de 32 elementos cada uno del tipo entradas. La variable arreglo1 es un objeto del tipo combinaciones. TYPE entradas IS ARRAY (0 TO 15) OF bit; TYPE combinaciones is ARRAY (0 TO 32) OF entradas; VARIABLE arreglo1: combinaciones; -- declaracin de variable

A continuacin se muestra las diversas sintaxis para declarar arreglos en VHDL: TYPE nombre del tipo IS ARRAY (inicio to fin) of tipo; TYPE nombre del tipo IS ARRAY (inicio downto fin) of tipo; TYPE nombre del tipo IS ARRAY (tipo rango) of tipo; TYPE nombre del tipo IS ARRAY (tipo rango range inicio to fin) of tipo; TYPE nombre del tipo IS ARRAY (tipo rango range inicio downto fin) of tipo; Todas las sintaxis anteriores son variantes o formas de especificar la sintaxis general, pues lo que cambia es la manera de definir el rango del arreglo. En las dos primeras variantes, inicio y fin son valores enteros para definir el intervalo del arreglo en forma ascendente o descendente respectivamente. En las tres siguientes variantes de sintaxis, el rango se especifica por medio del total o de un subconjunto de valores pertenecientes a un tipo intervalo o arreglo previamente definido. Es decir, se crea un tipo arreglo y este se puede utilizar como rango para otro arreglo. La tercera sintaxis permite usar el total de valores de un tipo arreglo como rango y las dos ltimas

141

sintaxis sirven para especificar el rango con un subconjunto de valores de ese tipo arreglo. Ejemplos: TYPE dias_mes IS ARRAY (1 to 30) OF integer; TYPE byte IS ARRAY (7 downto 0) OF std_logic; TYPE semana is ARRAY (1 to 7) OF integer; -- una constante para definir el -- tamao del arreglo TYPE posiciones IS ARRAY (numero downto 0) OF std_logic; SIGNAL Indices : posiciones; -- una seal de tipo arreglo TYPE Instrucc IS ARRAY (7 downto 0) OF bit; TYPE codigo is array (numero downto 0) of Instrucc; TYPE estados IS (cero, uno, dos, tres, cuatro, cinco, seis, siete); -- tipo enumerado TYPE valores_estados IS ARRAY (estados) OF integer; TYPE subvalores IS ARRAY (estados range 0 to 3) of integer; En el ejemplo del tipo posiciones, el valor inicial del rango es especificado por medio de una constante previamente declarada, esto tambin se presenta en el tipo codigo, el cual es un arreglo formado a su vez por 1024 arreglos del tipo Instru. El tipo valores_estados ejemplifica el uso de la tercera sintaxis, pues en este arreglo su rango est especificado con un tipo enumerado llamado estados que posee ocho valores. Entonces el rango de valores_estados es de 8 valores enteros. El tipo subvalores es otro arreglo especificado con la cuarta sintaxis; el rango de este tipo de dato se define como el subconjunto de valores 0 a 3 del tipo enumerado estados. Literales de arreglo CONSTANT numero: Integer: = 1023;

Son la forma de especificar los valores de los elementos que conforman un arreglo, enumerando dichos elementos entre parntesis. Esta manera de asignar los valores sirve para cualquier tipo de arreglo. Los literales son especificados entre comillas simples, siempre que se trate de elementos tipo bit, std_logic, o caracter. Si se trata de arreglos de enteros o reales, no se usan las comillas ya que stos no son literales.

142

A continuacin se muestra dos ejemplo de arreglos y la asignacin de valores con literales. TYPE vector1 IS ARRAY (7 downto 0) of bit; Variable Operando: vector1; Operando : = (0, 1, 1, 1, 0, 1, 0, 1); TYPE aviso IS ARRAY (3 downto 0) of character; Variable Saludo: aviso; Saludo : = (H, O, L, A); Cuando se trata de arreglos que no usan literales, su asignacin de valores tambin se hace con parntesis sin la comilla. Por ejemplo: TYPE arreglo1 IS ARRAY (4 downto 0) of integer; Variable Dato: aviso; Dato : = (1, 2, 8, 4, 16); -- asignacin de valores al arreglo Otra forma de especificar los valores de un arreglo es por medio de notacin abreviada con la cual se asignan valores usando el ndice para las posiciones del arreglo. Se escribe el ndice del elemento acompaado del smbolo => y al lado el valor para ese elemento; si se desea especificar varios ndices con sus valores, se separa cada par con comas. Si para los dems elementos del arreglo se pretende fijar un mismo valor, esto se indica con la palabra reservada OTHERS. Todas estas especificaciones se hacen entre parntesis como en el literal de arreglo. Ejemplos de notacin abreviada: TYPE vector2 IS ARRAY (15 downto 0) of bit; Variable W1 : vector2; Signal H1 : vector2; W1 := (1 = > 1, 15 = > 1, others = > 0); H1 < = (0 = > 0, 3 => 0, others = > 1); En los ejemplos anteriores se usa notacin abreviada para especificar los valores de los elementos de dos arreglos; en el caso de W1 por tratarse de una variable la asignacin se hace con :=, mientras que para H1 la asignacin de los literales se escribe con =>. Existen varios tipos de arreglos en VHDL, entre ellos se pueden mencionar:
Cadena de caracteres Bit_vector Std_logic_vector

143

De los anteriores, la cadena de caracteres (STRING) y el bit_vector son tipos de arreglos predefinidos en VHDL. El std_logic_vector requiere el uso del paquete std_logic_1164 de IEEE. Cadena de caracteres

Una cadena de caracteres es una secuencia o arreglo de caracteres ISO encerrados entre comillas dobles. Las cadenas se pueden utilizar para especificar los valores de los arreglos de tipo bit o std_logic de una manera ms sencilla que los literales de arreglo. La secuencia de caracteres que se asignen deber ser de la misma longitud que el arreglo y contener solamente caracteres definidos segn el tipo de dado. As, si se trata de un arreglo de bit, la cadena slo puede contener unos 1 y ceros 0, en un arreglo tipo std_logic nicamente aparecern caracteres incluidos en los valores definidos para ese tipo de dato. Ejemplos de cadena de caracteres: TYPE vector3 IS ARRAY (7 downto 0) of bit; Variable W2 : vector3; W1 := 11010110; TYPE aviso IS ARRAY (0 to 9) of character; Variable letrero: aviso; Letrero := Ejemplo_xy; TYPE vector4 IS ARRAY (3 downto 0) of std_logic; Signal Dato_xx : vector4; Dato_xx <= 1011; Los ejemplos anteriores parten de la definicin de un tipo arreglo y el uso de cadenas de caracteres para especificacin de valores. En VHDL tambin se pueden utilizar el tipo predefinido STRING el cual es tambin un arreglo de caracteres. Sus valores son elementos pertenecientes al tipo predefinido CHARACTER, y van a estar indexados por valores positivos, es decir no se puede utilizar ndice cero. El tipo STRING est definido segn IEEE-1076 de la siguiente manera: SUBTYPE POSITIVE IS INTEGER range 1 to 2147483647; TYPE STRING IS ARRAY (POSITIVE range <>) of CHARACTER;

144

El tipo STRING es un arreglo cuyo rango mximo es el indicado por los nmeros positivos. Se muestra la definicin del subtipo de los nmeros positivos, los cuales son un subconjunto de los enteros. El tipo STRING y el subtipo POSITIVE estn predefinidos en VHDL y se incluyen en el paquete Standard de la IEEE. Los operadores predefinidos para el tipo STRING aparecen en la Tabla 4.7. En la Tabla 4.7, las operaciones asociadas con comparaciones (desde = hasta >=) producen resultados booleanos. El operador & permite unir cadenas de caracteres (strings) en una sola, por tanto su resultado es otro STRING. Cuando se concatenan caracteres, el resultado tambin es un arreglo de caracteres. El objeto de datos resultante de una concatenacin deber ser de un tamao tal que soporte la unin de las cadenas de caracteres. Tabla 4.7. Operadores predefinidos para el tipo STRING Operador = /= < <= > >= & Significado Igual a Diferente de Menor que Menor o igual Mayor que Mayor o igual Concatenar cadenas (strings)

Los siguientes son ejemplos con uso de STRING. En el primer ejemplo la variable Mensaje1 est inicializada en la declaracin. En el segundo ejemplo se declarara la variable Mensaje2 y luego se le asigna su valor por medio de una concatenacin de dos cadenas que en total suman la cantidad de caracteres definida previamente en el rango del string (del 1 al 11). Variable Mensaje1 : STRING(1 to 18) := "ESTO ES UN EJEMPLO" ; Variable Mensaje2 : STRING(1 to 11); Mensaje2 := HOLA & QUE TAL; Bit_vector

Es un arreglo formado por elementos del tipo predefinido BIT, cada elemento puede tener el valor lgico uno (1) o cero. El orden del bit ms significativo del vector se define dependiendo de si se utiliza TO o DOWNTO para el rango. El ndice

145

para los elementos del arreglo es un nmero natural, por lo que es vlido el ndice cero (0). El tipo Bit_vector est definido segn IEEE-1076 de la siguiente manera: SUBTYPE NATURAL IS INTEGER range 0 to 2147483647; TYPE BIT_VECTOR IS ARRAY (NATURAL range <>) of BIT; Los valores que se asignen al bit_vector deben escribirse entre comillas dobles, o bien entre parntesis como los literales de arreglos. Se pueden escribir prefijos para especificar la base del valor. Los prefijos son: 'X' o 'x' para valor hexadecimal, 'O' y 'o' para denotar un valor octal y el prefijo 'B' o 'b' para indicar valor binario. Si no se especifica ningn prefijo, el prefijo por defecto es binario. Las asignaciones en hexadecimal y octal deben usarse slo si los valores coinciden con el tamao del vector. Los operadores predefinidos para el tipo bit_vector aparecen en la Tabla 4.8. Tabla 4.8. Operadores predefinidos para el tipo bit_vector Operador Significado AND and OR or NAND nand NOR nor OR exclusivo xor NOR exclusivo xnor Complemento a uno not Desplazamiento lgico a la izquierda sll Desplazamiento lgico a la derecha srl Desplazamiento aritmtico a la izquierda sla Desplazamiento aritmtico a la derecha sra Rotacin lgica a la izquierda rol Rotacin lgica a la derecha ror Concatenacin & Igual a = Diferente de /= Menor que < Menor o igual <= Mayor que > Mayor o igual >=

146

Los operadores de la Tabla 4.8 relacionados con operaciones lgicas (desde and hasta ror) regresan resultados tipo bit_vector. La concatenacin (&) tambin produce un resultado tipo bit_vector. El resto de los operadores por relacionarse con comparaciones lgicas generan resultados tipo booleano. A continuacin se presentan varios ejemplos de declaraciones con bit_vector. En V1 el bit ms significativo es el bit 0 (uso del to), mientras que en V2 el bit ms significativo es el bit 3 (uso del downto). SIGNAL V1: bit_vector (0 TO 3); SIGNAL V2: bit_vector (3 DOWNTO 0); V1 <= 1100; V2 <= 0101; Esto implica que: V1(0) = 1, V1(1) = 1; V1(2) = 0; V1(3) = 0 V2(0) = 0; V2(1) = 1; V2(2) = 0; V2(3) = 1 Variable V3 : bit_vector (3 DOWNTO 0); Variable V4 : bit_vector (2 DOWNTO 0); V3 := xB; -- valor en hexadecimal V4 := o3; -- valor en octal Std_logic_vector

Es un arreglo cuyos elementos son del tipo std_logic, definido en el estndar IEEE 1164. Se utiliza de manera similar a la del bit_vector y se puede hacer referencia a sus elementos con ndices a partir del cero. No es un tipo predefinido, y requiere el uso del paquete ieee.std_logic_1164. El tipo std_logic_vector es un tipo resuelto (resolved) del std_ulogic_vector, el cual a su vez est formado por elementos tipo std_ulogic. Se haba mencionado en el std_logic que los tipos resueltos se utilizan cuando un objeto de datos puede tomar valores de mltiples fuentes en forma simultnea. Estos arreglos se definen en IEEE 1164 de la siguiente manera: TYPE std_ulogic_vector IS ARRAY (natural range <> ) of std_ulogic; TYPE std_logic_vector is array (natural range <>) of std_logic;

147

Ejemplos con std_logic_vector: Variable M5 : std_logic_vector(7 downto 0); Signal M6 : std_logic_vector(0 to 3); Variable M7 : std_logic_vector(0 to 3) := 1111; M5 := 11010011; M6 <= 1100; M7(1) := 0; -- asigna un cero al elemento con ndice uno de M7 ii. Registros Un tipo de dato registro o RECORD es un arreglo de elementos de diferentes tipos. Se puede hacer uso de los campos individuales de un RECORD utilizando los nombres de los elementos. (Carpio, 1997), (Torres, 2001), (Prez y Fernndez, 2002), (Gmez, 2003) Tambin se puede utilizar ms de un campo. La sintaxis para definir un registro es la siguiente: TYPE nombre IS RECORD elemento: tipo_de_dato; [;elemento: tipo_de_dato...]; END RECORD [nombre]; En la declaracin del registro se escribe la palabra reservada TYPE, el nombre del registro y las palabras IS RECORD. A continuacin se declaran los elementos del arreglo acompaado cada uno de su tipo de dato. Para cerrar se escribe END RECORD, opcionalmente si se desea se puede escribir el nombre del registro. Los siguientes ejemplos ilustran la forma de declarar un tipo RECORD y la definicin de variables de este tipo: En este ejemplo se observa que un tipo previamente definido (tipo operar) puede ser parte de un registro. El tipo instrucc est formado por tres campos: operador, operando1 y operando2. Para manejar un elemento del arreglo se escribe el nombre del objeto de datos (seal o variable) seguido de un punto y el nombre del campo de inters. TYPE operar IS (suma, resta, multip, divide); TYPE instrucc IS RECORD operador: operar; operando1: integer;

148

operando2: integer; END RECORD; Variable instru: instrucc; instru.operador := resta; instru.operando1 := 20; instru.operando1 := 49; En el siguiente ejemplo se aprecia la asignacin de valores por cada campo del registro y la asignacin de un registro completo a otro del mismo tipo.

TYPE Informac IS RECORD Nombre : string(1 to 10); edad: integer; Nota: real; END RECORD; Variable Ficha1, Ficha2 : informac; Ficha1. Nombre := Juan Gomez; Ficha1.edad := 22; Ficha1.nota := 16.0; Ficha2 := Ficha1; Arreglos Restringidos

Un arreglo restringido (constrained array) es un arreglo cuyo rango entero est explcitamente definido para un determinado tipo de datos. Es decir tiene un tamao finito. Cuando se declara un objeto de datos con arreglo restringido, el objeto posee el mismo rango declarado para el arreglo. Los ejemplos proporcionados anteriormente en la seccin de arreglos muestran en muchos casos arreglos definidos, porque se especifica el rango del tipo de datos. Ejemplos: TYPE operando IS ARRAY (7 DOWNTO 0) OF bit; TYPE formato IS ARRAY (15 DOWNTO 0) OF bit; Variable dato1 : operando; Variable orden: formato;

149

En los ejemplos anteriores, los arreglos operando y formato son restringidos porque tienen un tamao especfico definido con el rango (valor entero1 DOWNTO valor entero2). A su vez, las variables dato1 y orden son objetos de datos de tamao definido por ser de los tipos de datos ya declarados. Arreglos no Restringidos

Un arreglo no restringido o indefinido (unconstrained array) es aquel que no est delimitado por un rango entero especfico. Un objeto de datos declarado a partir de un arreglo indefinido deber ser limitado pues en caso contrario no podr ser sintetizado por la herramienta de software utilizada. Ejemplos: TYPE bit_vector IS ARRAY (integer RANGE <>) OF bit; TYPE std_logic_vector is array (natural range <>) of std_logic; TYPE string IS ARRAY (positive range <>) of CHARACTER; VARIABLE EJEM1: bit_vector(0 to 31); VARIABLE EJEM2: std_logic_vector (0 to 15); SIGNAL EJEM3: string(1 TO 20); En los ejemplos indicados, los arreglos bit_vector, std_logic_vector y string son indefinidos porque se especifica su rango en base al rango propio de otros tipos (rango de los nmeros enteros, naturales y positivos respectivamente), el nico lmite es el mximo valor de cada tipo. Los arreglos predefinidos y los arreglos definidos en un paquete estndar IEEE tienden a ser no restringidos, esto permite generar diseos con arquitecturas, paquetes y componentes generales que sean independientes del tamao del arreglo. Cuando se va a aplicar el tipo de arreglo sobre un objeto de datos, se le especifica el rango limitado a dicho objeto (seal o variable). c. Subtipos de datos Un subtipo es un subconjunto declarado a partir de un tipo de datos predefinido. (Torres, 2001) Los subtipos permiten crear tipos de datos con limitaciones sobre tipos mayores. La sintaxis para declarar un subtipo en VHDL es la siguiente: SUBTYPE IDENTIFICADOR IS TIPO_BASE RANGE <RANGO>;

150

La declaracin comienza con la palabra reservada SUBTYPE seguida del identificador para el subtipo y la palabra reservada IS; a continuacin se coloca el nombre del tipo base que debe estar predefinido o declarado previamente por el usuario. Por ltimo se especifica el rango del subtipo, el cual puede ser un intervalo, o un ndice cuando interese un subtipo de un solo elemento. Los valores dentro del subtipo deben ser un intervalo continuo de valores del tipo base, dicho intervalo incluye los extremos. Cuando se trate de tipos enumerados, el intervalo se especifica con las posiciones o con los valores en la lista de elementos definidos en el tipo base. Los nicos subtipos predefinidos son los correspondientes a los nmeros naturales (natural) y los nmeros positivos (positive): SUBTYPE NATURAL IS INTEGER range 0 to 2147483647; SUBTYPE POSITIVE IS INTEGER range 1 to 2147483647; A continuacin se presentan varios ejemplos de declaracin de subtipos. El subtipo byte es un subgrupo de 8 bits del tipo no restringido bit_vector. El subtipo digitos_decimales corresponde a un intervalo de nmeros enteros de 0 a 9, inluyndolos. El subtipo primero es un subgrupo del tipo estados, que contiene solamente a estado1. Los siguientes ejemplos son subtipos resueltos del tipo std_ulogic. En el ltimo ejemplo el subtipo Segmento corresponde a una porcin del tipo Memoria, el tipo base est formado por 1024 elementos, donde cada uno es a su vez un arreglo de 8 bits. El subtipo Segmento se especifica para los primeros 32 elementos de su tipo base. Ejemplos: SUBTYPE byte IS bit_vector (7 DOWNTO 0); SUBTYPE digitos_decimales IS integer RANGE (0 TO 9); TYPE estados IS (estado1, estado2, estado3, estado4); SUBTYPE primero IS estados RANGE estado1 TO estado2; TYPE std_ulogic is ( 'U', 'X', '0', 1, Z, 'W', L, H, - ); -- ('X','0','1'); subtype X01 is resolved std_ulogic range 'X' to '1'; subtype X01Z is resolved std_ulogic range 'X' to 'Z'; -- ('X','0','1','Z') ; subtype UX01 is resolved std_ulogic range 'U' to '1'; -- ('U','X','0','1'); TYPE posiciones is ARRAY (7 downto 0) of bit TYPE Memoria is ARRAY (0 to 1023) of posiciones; SUBTYPE Segmento IS Memoria RANGE (0 TO 31);

151

d. Tipos predefinidos en VHDL En las descripciones previas de los tipos de datos se hizo referencia a los tipos predefinidos en VHDL. En relacin a ello, el estndar VHDL de la IEE describe dos paquetes donde se especifican un conjunto de tipos de datos y las operaciones que se pueden realizar sobre esos tipos de datos. Esos paquetes de la IEEE son el STANDARD y el TEXTIO. Al incluirse un conjunto de tipos de datos en un paquete, no hace falta declararlos cada vez que se les necesite en un cdigo en VHDL, por ello dichos tipos se dice que estn predefinidos. (Carpio, 1997), (Torres, 2001). El paquete STANDARD de tipos de datos se incluye en todos archivos fuente de VHDL y por lo tanto no es necesario declararlo dentro de un cdigo para poder utilizarlo. La mayora de los programas para sntesis soportan el paquete STANDARD. El paquete TEXTIO s debe ser declarado para usarlo, y en l se definen tipos de datos y sus operaciones para la comunicacin con el software de sntesis que se este utilizando. El paquete TEXTIO no es necesario para la sntesis de circuitos y no todas las herramientas programas de sntesis lo soportan. A continuacin se lista una parte del paquete STANDARD en la cual se sealan algunos tipos y subtipos predefinidos usados con frecuencia en los diseos con VHDL. En los ejercicios prcticos desarrollados no se requerir del paquete TEXTIO y por tanto no se presentar parte de su contenido; para mayor informacin consultar las referencias bibliogrficas de este trabajo. PACKAGE standard IS TYPE boolean IS (FALSE, TRUE); TYPE bit IS ('0', '1'); TYPE character IS (
NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, HT, LF, VT, FF, CR, SO, SI, DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, FSP, GSP, RSP, USP, ' ', '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', ''', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',

152

'x', 'y', 'z', '{', '|', '}', '~', DEL);

TYPE integer IS RANGE -2147483647 TO 2147483647; TYPE TIME is range implementation_de.ned UNITS fs; -- femtosecond ps = 1000 fs; -- picosecond ns = 1000 ps; -- nanosecond us = 1000 ns; -- microsecond ms = 1000 us; -- millisecond sec = 1000 ms; -- second min = 60 sec; -- minute hr = 60 min; -- hour END UNITS; SUBTYPE natural IS integer RANGE 0 TO 2147483647; SUBTYPE positive IS integer RANGE 1 TO 2147483647; TYPE string IS ARRAY (positive RANGE <>) OF character; TYPE bit_vector IS ARRAY (natural RANGE <>) OF bit; END standard; i. Paquetes para manejo de datos con signo y sin signo (Signed - Unsigned) Entre los estndares disponibles de la IEEE para VHDL se encuentra el 1076.3 el cual consiste en un paquete para VHDL donde se definen nuevos tipos de datos y funciones aritmticas y lgicas para ser utilizadas por herramientas de sntesis. Este estndar define dos paquetes: el numeric_std y el numeric_bit en los que se especifican dos nuevos tipos de datos: signed y unsigned (con signo y sin signo). Estos tipos de datos son similares a los tipos std_logic_vector o bit_vector y son parte de la norma IEEE 1076.3 para la realizacin de operaciones numricas sobre seales manejadas en forma de vectores. El paquete numeric_bit define a los tipos unsigned y signed como un vector cuyos elementos son del tipo bit y el paquete numeric_std define los mismos pero con elementos del tipo std_logic. (Torres, 2001)

El fin de estos dos tipos de datos es representar nmeros enteros positivos y negativos en forma binaria, donde el bit ms significativo est a la izquierda. El tipo signed sirve para representar un nmero entero con signo en forma binaria con complemento a dos, y el unsigned es un nmero entero sin signo en forma binaria.

153

El paquete numeric_std define funciones y operadores aritmticos, de comparaciones, lgicos y de asignacin para ser utilizados con estos tipos de datos. Los tipos Signed, unsigned y std_logic_vector son diferentes y no se pueden mezclar. Algunas funciones de conversin son definidas para la conversin entre los tipos y as aplicar operaciones entre ellos. e. Tipos no soportados en VHDL para sntesis Cuando se escribe un cdigo en VHDL puede ocurrir que ciertos tipos de datos no sean soportados por una determinada herramienta de sntesis. Los tipos de datos no soportados sern ignorados por el software de sntesis; esto tiene relacin con las caractersticas del hardware disponible en cada fabricante para implementar los datos y estructuras que se definan en un diseo. Cada herramienta de sntesis para programacin en VHDL definir los tipos y objetos de datos soportados y no soportados. Por ejemplo algunos tipos de datos que generalmente no pueden ser sintetizados son los tipos fsicos, reales y objetos de datos para manejo de archivos (File), esto al final ser determinado por cada software particular. (Torres, 2001) f. Atributos para tipos de datos Los objetos de datos en VHDL tales como seales y variables, pueden tener informacin adicional asociada denominada atributos. Para hacer referencia a estos atributos se utiliza el nombre del tipo de datos asociado al objeto acompaado de comilla simple, con el identificador del atributo de inters. No son parte de las instrucciones de VHDL pero existen ciertos atributos predefinidos para utilizar en los cdigos. A continuacin se presentan los atributos predefinidos bsicos: i. Atributos asociados al tipo de dato Son atributos que devuelven informacin relacionada con el tipo de dato asociado a una seal. (Carpio, 1997), (Gmez, 2003) Para seales de tipo enumerado o de tipo escalar se pueden usar los siguientes atributos:

Left: devuelve el valor que se encuentra en el lmite izquierdo del tipo. Right: valor situado en el lmite derecho del tipo. Low: lmite inferior del tipo de dato. High: lmite superior del tipo de dato.

154

Leftof(X): devuelve el elemento que est a la izquierda de X. Rightof(X): devuelve el elemento que est a la derecha de X. Pos(X): posicin del valor X dentro de su tipo. Val(N): valor correspondiente a la posicin N. Ejemplo: ENTITY ejemplo IS PORT (Dato: in; Resultado: out Bit); END ejemplo; ARCHITECTURE ejemplo_atributo OF ejemplo IS TYPE colores IS (verde, azul, rojo, blanco); TYPE vector_color IS ARRAY (0 to 3) OF colores; SIGNAL lapiz: vector_color; SIGNAL n: integer; BEGIN lapiz (0) <= coloresleft; lapiz (1) <= coloresright; lapiz (2) <= coloresleftof(rojo); lapiz (3) <= coloresrightof(rojo); n <= colorespos(azul); END ejemplo_atributo; -- verde -- blanco -- azul -- blanco -- posicin: 1

ii. Atributos asociados a arreglos Son atributos que devuelven informacin asociada con arreglos. Entre estos atributos se encuentran los siguientes:

Left(N): valor del lmite izquierdo del N arreglo. Right(N): valor situado en el lmite derecho del N arreglo. Low(N): el menor valor del N arreglo. High(N): el mayor valor del N arreglo. Length(N): valor del tipo al cual le corresponde la mayor codificacin (longitud del ndice de dimensin N del arreglo).

Range(N): posicin del valor X dentro de su tipo.

155

Reverse_range(N): valor correspondiente a la posicin N.

iii. Atributos asociados al estado de una seal Los siguientes atributos (Carpio, 1997) devuelven una seal dependiendo de lo ocurrido:

Event. Devuelve un valor verdadero si es ha ocurrido un cambio en una seal, sin importar el cambio real del valor. Last_event. Devuelve el tiempo transcurrido desde la ltima asignacin en la seal. Last_value. Devuelve el valor previo en la seal, antes de que ocurra la ltima asignacin.

iv. Atributos que generan seales Este tipo de atributos son utilizados para mantener sincronismo ya que permiten generar nuevas seales con respecto a un tiempo determinado. Entre estos atributos estn (Carpio, 1997), (Gmez, 2003):

Delayed (tiempo). Genera una seal del mismo tipo del dato, pero retrasada el tiempo especificado. Stable (tiempo). Genera una seal booleana verdadera cuando la seal no tiene ningn evento de cambio durante un tiempo especificado. Quiet (tiempo). Genera una seal booleana verdadera cuando no ocurre ningn cambio de valor en la seal, es decir la seal no tiene transicin. Transaction. Genera una seal tipo bit que cambia su valor cada vez que la seal tiene una transicin.

g. Atributos definidos por el usuario Los atributos para tipos de datos descritos anteriormente son predefinidos y asociados a cierta informacin de esos tipos. En un concepto ms amplio, un atributo es un valor, funcin, tipo rango o constante que puede ser asociado con uno o ms objetos de datos en una descripcin. Los primeros atributos vistos fueron los predefinidos, los segundos son los definidos por el usuario.

156

Los atributos definidos por el usuario son constantes de un tipo arbitrario. Este tipo de atributos se define mediante una declaracin de atributo con la siguiente sintaxis: ATTRIBUTE identificador: tipo o subtipo; El identificador se denomina el designador del atributo. Un atributo puede estar asociado con una declaracin de entidad, una arquitectura, una configuracin, un subprograma, una funcin, un tipo, un subtipo, una constante, una seal, una variable, un componente, un grupo, un literal, un archivo, u otros ms. El tipo o subtipo del atributo no necesita ser restringido. (Prez y Fernndez, 2002). Ejemplos: type sistema_xy is record x,y: Integer; end record; subtype valores_positivos is INTEGER range 1 to 15000; attribute puntos: sistema_xy; attribute valor1: valores_positivos; En los ejemplos anteriores, el atributo puntos es de un tipo previamente declarado llamado sistema_xy, es un atributo no restringido. El atributo valor1 es del subtipo valores_positivos y s est limitado. Una vez que se declara, la forma de utilizarlo es con una especificacin de atributo, para asociar un atributo definido por el usuario con uno o ms identificadores y definir el valor del atributo para esos identificadores. La especificacin de un atributo se realiza con la siguiente sintaxis. ATTRIBUTE designador de atributo OF especificacin de identificador IS expresin; La especificacin de identificador es de la forma: Identificador de una clase de entidad : clase de entidad La clase de entidad se refiere a alguna de las siguientes estructuras: entity | architecture | configuration | procedure | function | package | type | subtype | constant | signal | variable | component | label | literal | units | group | file

157

El identificador de una clase de entidad puede ser un identificador, un smbolo de un operador, la palabra other o la palabra all. En los siguientes ejemplos el atributo puntos es especificado para el identificador ejemplo el cual corresponde a una entidad, y el valor asignado es (4,8). El atributo valor1 se especifica para la seal dato2, asignndole el valor 15. attribute puntos of ejemplo : entity is (4,8); attribute valor1 of dato2 : signal is 15; 4.3.2.6 Operadores Un operador sirve para construir diversos tipos de expresiones mediante las cuales se pueden calcular datos utilizando los diferentes objetos de datos con un determinado tipo de dato. Existen diversos tipos de operadores en VHDL, su disponibilidad depender del software utilizado. (Torres, 2001), (Carpio, 1997). Para usar la mayora de los operadores con los tipos signed, unsigned y std_logic_vector, se utiliza el paquete donde se encuentren declarados esos tipos ya que en esos paquetes se incluyen funciones aritmticas y lgicas para ser aplicadas con dichos tipos de datos. Por ejemplo, los paquetes std_logic_1164, numeric_std y numeric_bit incluyen funciones para sus tipos de datos predefinidos. Los operadores pueden agruparse en:

Lgicos De comparacin (relacionales) Aritmticos Asignacin Asociacin De desplazamiento Varios En la siguiente tabla se muestra un resumen de los operadores segn su grupo.

158

Tabla 4.9. Tipos de operadores en VHDL TIPOS Lgicos De comparacin Aritmticos De Asignacin De Asociacin De Desplazamiento y Rotacin Varios a. Operadores lgicos Los operadores lgicos AND, OR, NAND, NOR XOR, XNOR, y NOT estn definidos para actuar con los tipos bit y boolean. Para utilizar estos operadores, excepto el operador NOT, los operandos deben ser del mismo tamao. Si se aplican estas operaciones sobre un vector, las mismas se realizan bit a bit. Ejemplos: Signal X, Y, W, T, Z : bit; Z <= X and Y; W <= (X xor Z) and not(T); b. Operadores de comparacin Son operadores relacionales y se usan para ejecutar pruebas de igualdad, desigualdad, o de magnitud entre dos objetos de datos. Los operandos a comparar deben ser del mismo tipo y el resultado de la operacin es del tipo booleana. Los operadores de igualdad y desigualdad (= y /=) pueden ser utilizados para todos los tipos de datos predefinidos en el lenguaje Los operadores de magnitud (< menor que, > mayor que, <= menor o igual que, y >= mayor o igual que) deben ser utilizados con tipos escalares. Ejemplos: Signal X1, Y1: bit_vector; Signal resultado: bit; resultado <= '1' WHEN X1 = Y1 ELSE '0'; OPERADORES and, or, nand, nor, xor, xnor, not =, /=, <, >, <=, >= Adicin: +, Multiplicacin: *, /, MOD, REM < =, := => SLL, SRL, SLA, SRA, ROL, ROR ABS, **, &

159

c. Operadores Aritmticos Estos incluyen operadores de adicin, multiplicacin y divisin. Los operadores de adicin son: + y -, se usan para describir sumas y restas, adems de signos positivos y negativos. Se usan con datos de tipo entero. Los dos operadores tienen igual orden de precedencia; debido a ello cuando se use ms de un operador de adicin es importante indicar el orden de las operaciones mediante parntesis. Los objetos de datos a operar debern ser del mismo tipo y tamao. Un objeto de datos que sea una cadena de bits solo podr ser operado con un entero si se declara como signed o unsigned y se incluye en el programa el paquete numeric_std o el numeric_bit, pues en los mismos los operadores + y - estn sobrecargados para utilizarlos con estos tipos de datos. Aun en este caso no se deben realizar adiciones entre cadenas de bit de diferentes tamaos. Si se desea obtener el acarreo de la suma del resultado de una operacin aritmtica entre dos vectores de bit de igual longitud, para llevarlo a un bit_vector de mayor longitud en un bit, se utiliza el operador de concatenacin & para incrementar el tamao solamente en el primer vector de bits que participa en la operacin. Ejemplos: SIGNAL Valores: positive RANGE 1 TO 255; SIGNAL v1, v2, v3: signed (7 downto 0); SIGNAL v4: signed (8 downto 0); Valores <= valores + 1; v1 <= v2 + v3; v4 <= '0'v2 + v3; -- para guardar el acarreo de la suma Los operadores de multiplicacin y divisin son * y / respectivamente. Los dos operandos tienen el mismo orden de precedencia al igual que los operandos MOD y REM. Estn definidos para utilizarlos con operandos del mismo tipo, que pueden ser enteros o bit_vector. El objeto que recibe el resultado deber ser del mismo tipo que los operandos. La operacin REM es una divisin entera entre operandos del tipo entero y se define como se muestra a continuacin. El resultado de la operacin tendr el signo del operando A: A REM B = A-(A/B)*B La operacin MOD calcula el mdulo de dos nmeros. Se define como:

160

A MOD B = A-B*N El valor N es un entero. El resultado toma el signo de B. d. Operadores de Asignacin Los operadores de asignacin en VHDL son "<=" y ":=". El operador ":=" se utiliza para asignar un valor inicial a constantes, variables y seales en el momento de la declaracin. Para el resto de una descripcin se utilizar el operador ":=" solamente con variables y el operador "<=" se usar con seales. Asignacin a variables nombre_variable := expresin; Asignacin a seales nombre_seal <= expresin; Las asignaciones a variables solamente se pueden escribir dentro de los procesos o subrutinas, las asignaciones a seales pueden ocurrir en cualquier lugar dentro de la descripcin. Ejemplos:

TYPE formato IS RECORD operar: bit; valor1: integer; valor2: integer; END RECORD; VARIABLE formato1: formato; SIGNAL vector1, vector2: bit_vector(3 downto 3); vector1 <= ('1', '1', '0', '1'); vector2 <= vector1; formato1 := (1, 15, 28 ); formato1.operar := 0; otra forma de signar por campos del registro

161

e. Operadores de Asociacin Este tipo de operador se usa en diseos jerrquicos donde se requiera el uso de varios componentes, los cuales son entidades con ciertas funciones especficas. La forma de especificar las conexiones entre esos componentes y una entidad principal es mediante el operador de asociacin "=>". Las asociaciones se harn segn el orden en el que se haya declarado los puertos del componente, los puertos asociados debern ser del mismo tipo. Ejemplos de este operador se presentarn en la descripcin de componentes. f. Operadores de Desplazamiento y Rotacin Estos operadores realizan operaciones de desplazamiento o de rotacin con elementos de un vector del tipo signed o unsigned. Tambin son soportados por el tipo bit_vector, dependiendo de la herramienta usada para sntesis. Estn incluidos en los paquetes numeric_std y numeric_bit. Los operadores de desplazamientos lgicos son SLL y SRL. Desplazan los bits de un vector n veces a la izquierda (SLL) o a la derecha (SRL), introduciendo ceros en los lugares que quedan libres. Los operadores de desplazamientos aritmticos son SLA y SRA. Permiten desplazar los bits de un vector n veces a la izquierda (SLA) o a la derecha (SRA), introduciendo ceros en los lugares que quedan libres, pero conservan el signo. Los operadores de rotaciones son ROL y ROR. Desplazan los bits de un vector n veces a la izquierda (ROL) o a la derecha (ROR), introduciendo los bits que son desplazados en los lugares que van quedando libres Ejemplos: Variable V1, V2, V3, V4, V5, V6: signed (7 downto 0); V4 := V1 SRL 3; V5 := V2 SLA 2; V6 := V3 ROL 2; g. Varios En esta categora se encuentran los operadores abs, ** y &. El operador abs devuelve el valor absoluto de un operando del tipo entero. El -- desplaza 3 lugares a la derecha los bits del vector V1 -- desplaza 2 lugares a la izquierda los bits de V2 -- conservando el signo -- rota 2 lugares a la izquierda los bits de V3

162

operador ** se utiliza para elevar el primer operador a una potencia definida por el segundo operando, ambos deben ser del tipo entero. El operador & permite concatenar cadenas de bits obteniendo una de mayor tamao; el objeto que recibe el resultado debe ser de un tamao igual a la suma de las longitudes de las cadenas unidas. Ejemplo: Constant z: integer := 2; Variable m: integer; Signal n1 : bit_vector(7 downto 0); m := m+ r**z; -- a la variable m se le asigna i + z2 n1 <= 1100 & 1101; -- n1 = 11001101 4.3.2.7 Elementos generales de la sintaxis En esta seccin se presenta un resumen de ciertos elementos sintcticos y definiciones de VHDL, para fijar conceptos ya manejados en las secciones explicadas anteriormente. Estos elementos son: a. Identificador: Es un nombre que sirve para identificar diferentes objetos de datos, entidades, arquitecturas, subprogramas y cualquier estructura que sea necesario definir en un diseo en VHDL. Los identificadores como se mencion en la descripcin de entidad, pueden contener letras y nmeros y el carcter de subrayado, el primer carcter del nombre debe ser una letra. Las maysculas y minsculas en los nombres de identificadores se consideran iguales. Una palabra reservada del lenguaje VHDL no se puede usar como identificador. En todos los ejemplos de las secciones explicadas hasta este punto se han utilizado identificadores. b. Comentarios Los comentarios en VHDL son indicados con dos guiones --. Todo lo que se escriba en una lnea despus de dos guiones es un comentario. c. Caracteres Se refiere a cualquier letra o carcter que se escriba entre comillas simples. Ejemplos: 1, 0, a, b.

163

d. Cadenas Son grupos de caracteres encerrados entre comillas dobles. Ejemplo hola. e. Cadenas de bits Son subconjuntos encerrados entre comillas dobles que pueden contener solamente los caracteres 1 y 0 para representar bits. Estas cadenas sirven para representar nmeros del tipo bit_vector, y se pueden escribir con base octal (O), binaria (B) o hexadecimal (X). Ejemplos: O75, B1001, X1C. 4.3.3 DESCRIPCIONES DE ARQUITECTURA

Una vez descritos los elementos sintcticos bsicos sobre los tipos de datos y operadores y la declaracin de entidades y arquitecturas, es importante detallar la forma como se describe una arquitectura, pues a partir de ella se define el funcionamiento de una entidad. En la seccin 4.2.2.3 se defini la forma de declarar una arquitectura: ARCHITECTURE identificador OF nombre_de_entidad IS [declaraciones] BEGIN [sentencias] END [ARCHITECTURE] [identificador]; Antes del BEGIN se escriben todas las declaraciones que se requieran dentro de la descripcin incluyendo constantes, seales, subprogramas, componentes, entre otros. Despus del BEGIN se escriben las sentencias con las cuales se realiza la descripcin del circuito que se est diseando. Una entidad puede tener asociada ms de una arquitectura y en el momento de la compilacin se indicar la arquitectura que se desee utilizar (Torres, 2001), (Carpio, 1997), (Wakerly, 2001), (Gmez, 203), (Ashenden, 1990), (Prez y Fernndez, 2002). Ahora bien, esa descripcin de arquitectura puede realizarse mediante tres estilos diferentes que son los siguientes:
Descripcin de Flujo de Datos Descripcin Estructural

164

Descripcin Comportamental

Cada estilo difiere de los dems y el uso de uno u otro en una descripcin depender del diseo y de la inclinacin del usuario por uno o ms estilos. A continuacin se explican los tres estilos y las instrucciones asociadas en cada uno.

4.3.3.1 Descripcin de Flujo de Datos La descripcin de flujo de datos consiste en especificar la manera como se transfieren los datos de las entradas a las salidas. Este tipo de descripcin tambin es denominada descripcin a nivel de transferencia de registro o RTL (Register Transfer Level). Las instrucciones o sentencias indican bsicamente conexiones entre seales slo mediante asignaciones (<=). Los datos son los que regulan el flujo de ejecucin de las instrucciones. En esta descripcin las instrucciones son concurrentes, es decir se ejecutan continuamente, haciendo la similitud con una instruccin de un programa que siempre estuviera activa. Si alguna de las seales incluidas en las asignaciones cambia, entonces todas las instrucciones asociadas a esa seal tambin cambian. Las asignaciones en una descripcin de flujo de datos se indican mediante expresiones donde se especifique la forma como cambian los puertos de salida de la entidad en funcin de los puertos de entrada; esas expresiones pueden ser asignaciones condicionales con instrucciones concurrentes o ecuaciones. Para la descripcin o diseo de flujo de datos se dispone de diversas estructuras de ejecucin concurrente. Primero se presentar un concepto de instrucciones concurrentes para luego describir las estructuras de ejecucin concurrente que permiten realizar una descripcin de flujo de datos. Un punto a resaltar es que generalmente es ms sencillo llevar a cabo la sntesis de un circuito descrito con flujo de datos que uno descrito en forma estructural o comportamental. La razn es que la mayor parte de las estructuras en flujo de datos estn asociadas de una forma muy cercana con conexiones fsicas, lo que facilita la sntesis para su posterior implementacin. a. Instrucciones concurrentes En los programas de ejecucin serie (Pascal, C, Delphi, Java, etc.), las instrucciones se ejecutan una despus de la otra en orden (secuenciales). En una arquitectura en VHDL no existe un orden determinado para la ejecucin de las

165

asignaciones. El orden de ejecucin de las instrucciones en VHDL viene dado por los eventos que ocurran en las seales. Esto es lo que se denomina instrucciones concurrentes, porque las mismas se ejecutan en todo momento. La instruccin fundamental para la ejecucin concurrente es la asignacion entre seales (smbolo <=). Cuando en VHDL se desea utilizar instrucciones serie o secuenciales, se cuenta con otro tipo de estructura llamada PROCESS, donde se pueden definir este tipo de instrucciones. Las instrucciones concurrentes se escriben fuera del PROCESS, dicho bloque ser explicado posteriormente. b. Estructuras de ejecucin concurrente Las siguientes son las estructuras de ejecucin concurrente que pueden utilizarse en una descripcin de flujo de datos. i. Asignacin condicional WHEN... ELSE Esta estructura asigna un valor a una seal dependiendo de cul condicin se cumple entre una lista de casos. Las condiciones debern ser excluyentes, es decir no cumplirse ms de una a la vez porque genera conflictos para la asignacin de un nico valor a una seal. La condicin siempre debe finalizar con un ELSE para cubrir as todos los posibles casos de cambio en la seal. La sintaxis del WHEN ELSE es la siguiente:

Nombre de la seal <= valor_a WHEN condicin1 ELSE valor_b WHEN condicin2 ELSE valor_c WHEN condicin3 ELSE valor_d WHEN condicin4 ELSE valor_n WHEN condicin_n ELSE otro_valor; Los elementos valor_a, valor_b y sucesivos pueden ser un valor o una expresin, que debern ser de un tipo compatible con la seal. Los elementos condicin1, condicin2 y siguientes son expresiones booleanas. En estas expresiones booleanas se pueden utilizar variables booleanas y compraciones con los operadores relacionales explicados anteriormente con los tipos de datos (= /=, >, >=, <, >=). Ejemplo:

166

Signal Valor: bit_vector(0 to 1); Valor <= "00" WHEN estado = 0 ELSE "01" WHEN estado = 1 ELSE "11" WHEN estado = 2 ELSE "10"; ii. Asignacin WHIT... SELECT... WHEN Es una asignacin condicional con seleccin. Se asemeja a las estructuras case o switch de lenguajes de programacin de alto nivel. La asignacin de valor para una seal se realiza dependiendo del contenido de un objeto de dato o del resultado de una expresin. La sintaxis del WHIT... SELECT... WHEN es la siguiente: WITH identificador SELECT Nombre de la seal <= expresin o valor_a WHEN valor1, expresin o valor_b WHEN valor2, expresin o valor_c WHEN valor3, expresin o valor_n WHEN OTHERS ; El identificador corresponde al nombre de un objeto de datos o a una expresin que se evale. A la seal se le asignar un valor dependiendo de cual valor a su vez tome el identificador (valor1, valor2, valor3, etc.) Cuando el identificador tiene el valor1, a la seal se le asigna un primer valor, si el identificador es igual a valor2, se asigna otro elemento a la seal y as sucesivamente. Las opciones dadas con los valores para el identificador deben ser excluyentes entre s e incluir todos os casos. Si no se especifican todos los posibles valores del identificador con WHEN, se debe entonces escribir la clusula WHEN OTHERS para as cubrir todos los posibles casos. Las lneas de cada WHEN llevarn coma, excepto la ltima que tendr un punto y coma. Ejemplo: WITH dato1 SELECT instru <= "0000" WHEN 001, "0001" WHEN 000, "0010" WHEN 011, "1111" WHEN OTHERS;

167

iii. Ecuaciones booleanas Las ecuaciones booleanas no son estructuras como las anteriores, pero forman parte de las instrucciones de ejecucin concurrente disponibles. Su sintaxis es: Nombre de la seal <= ecuacin_booleana; Ejemplos: y <= a and b; z <= (x xor y) and t ) or w ; m <= not b or not c or not d; En el ltimo ejemplo de expresin booleana se aprecia que no se utilizan parntesis, esto se debe a que el operador not tiene en las expresiones lgicas la ms alta precedencia, es decir primero se evala el negado del operando que lo acompae antes de evaluar el siguiente operador, en este caso or. 4.3.3.2 Descripcin Estructural En la descripcin o diseo estructural se especifican los componentes del sistema diseado junto con sus interconexiones precisas. Una descripcin estructural equivale a un esquema o una lista de red para el circuito, y sirve para facilitar la descripcin de diseos jerrquicos que estn compuestos por varios mdulos. Este tipo de descripcin tambin utiliza instrucciones concurrentes, de manera que si se cambia el orden de las instrucciones en la descripcin de la estructura, la operacin y la sntesis del circuito ser la misma, porque lo que se especifica son conexiones. En esta descripcin se utiliza un tipo de entidad que se denomina componente. A continuacin se presentan las instrucciones concurrentes relacionadas con la descripcin estructural. a. Componente Un componente es una entidad previamente declarada en un diseo o librera, til para describir diseos jerrquicos. Para usar un componente dentro de un diseo se debe hacer referencia a la librera y el paquete dentro del cual fue declarado dicho componente. El paquete es un archivo que contiene definiciones de objetos que se pueden usar en otros programas. La declaracin de un componente se hace dentro de un paquete o en la parte declarativa de una arquitectura. Se recomienda realizar la declaracin preferiblemente

168

en paquetes, pues estos son archivos y de esta manera son reutilizables en cualquier diseo. La sintaxis para la declaracin de un componente es la siguiente: COMPONENT identificador PORT( seal { , seal}: modo tipo; seal { , seal}: modo tipo; seal: { , seal}: modo tipo ); END COMPONENT; En la sintaxis anterior, se aprecia que la declaracin comienza con la palabra reservada COMPONENT. A continuacin se escribe el identificador del componente y de inmediato se definen sus puertos formados por seales. Los componentes son conectados y evaluados instantneamente por medio de seales. Igual que en las entidades, para cada seal se especifica el modo de puerto y el tipo de dato asociado. Se finaliza con las palabras END COMPONENT. El siguiente es un ejemplo de declaracin de componente: COMPONENT compuerta_or PORT ( a, b : IN std_logic; y : OUT std_logic); END COMPONENT; b. Declaracin de entidades y componentes con genricos Otra forma de declarar tanto las entidades en general como los componentes es con la instruccin GENERIC. Las declaraciones genricas permiten definir una o ms constantes genricas en una declaracin de entidad antes de los puertos. Las constantes definidas se pueden usar dentro de la arquitectura para la entidad, y el valor de la constante no requiere ser escrito en la declaracin genrica sino que se asigna cuando la entidad sea instanciada con una instruccin de componente. La declaracin de componentes con genricos se realiza con la siguiente sintaxis: COMPONENT identificador GENERIC ( genrico{ , genrico }: [ modo ] tipo [ := valor ]; genrico{ , genrico }: [ modo ] tipo [ := valor ] ); PORT ( seal { , seal}: modo tipo;

169

seal { , seal}: modo tipo; seal: { , seal}: modo tipo ); END COMPONENT; En la seccin de GENERIC se declaran las constantes genricas con su nombre, el modo (opcional), el tipo de constante (necesario) y su valor (tambin opcional). Despus de las declaraciones genricas se definen normalmente los puertos del componente. Ejemplo: COMPONENT sumador GENERIC(N: integer); -- declaracin genrica PORT(a, b: IN std_logic_vector(3 DOWNTO 0); acarreo_1: IN std_logic; suma: OUT std_logic_vector (3 DOWNTO 0 ); acarreo_2: OUT std_logic ); END COMPONENT; En la seccin donde se explic el concepto de entidad (seccin 4.3.2.2) se mostr que GENERIC tambin se puede usar en la definicin de entidades principales de un diseo, es decir, que no sean componentes. La sintaxis es la misma del componente, lo que cambia es la palabra COMPONENT por ENTITY.

ENTITY nombre de entidad IS GENERIC ( genrico{ , genrico }: [ modo ] tipo [ := valor ]; genrico{ , genrico }: [ modo ] tipo [ := valor ] ); PORT ( seal { , seal}: modo tipo; seal { , seal}: modo tipo; seal: { , seal}: modo tipo ); END nombre de entidad;

170

c. Instanciacin de componentes La instanciacin de componentes es una instruccin concurrente con la cual se especifica cmo se interconectan las seales de un componente dentro del diseo en donde se est utilizando. La instanciacin es la forma de conectar el nombre y seales de un componente previamente definido con la arquitectura que se est usando. Una instancia es un nombre de entidad que se crea cuando se invoca o se hace referencia al nombre del componente. Cada vez que haga referencia al componente se crea una instancia nueva y la misma tendr una etiqueta nica. Existen dos formas de hacer la instanciacin de componentes: por asociacin de identificadores o asociacin por posicin. i. Asociacin por identificadores Para esta instanciacin se debe utilizar el operador de asociacin "=>" para indicar la conexin de los puertos del componente con los puertos o seales de la arquitectura donde se est utilizando ese componente. Por ejemplo para la asociacin " x => y ", "x" pertenece al componente mientras que "y" es una seal o una variable perteneciente a la arquitectura del diseo, y tambin puede ser una ecuacin booleana. La sintaxis general para la instanciacin por asociacin de identificadores es la siguiente: Etiqueta : nombre del componente PORT MAP (puerto1 => seal1, puerto2 => seal2, , puerto_n =>seal_n); Lo primero que lleva la sintaxis es la etiqueta o nombre de la instancia para identificar a la entidad asociada al componente. Luego de los dos puntos se escribe el nombre del componente. Lo siguiente son las palabras reservadas PORT MAP y con ellas se escribe a continuacin una lista para asociar cada puerto del componente con las seales de la arquitectura en uso para el diseo. Cada puerto se conecta con una seal con el operador de asociacin =>, las asociaciones pueden realizarse en cualquier orden. Una especificacin ms detallada de la sintaxis anterior es la siguiente: Etiqueta : nombre del componente PORT MAP ( puerto_componente => seal, puerto_componente => variable,

171

puerto_componente => expresin, puerto_componente => OPEN, puerto_componente => seal ); En la sintaxis detallada se indica que los puertos del componente tambin pueden asociarse a variables y a expresiones. La palabra reservada OPEN sirve para sealar cuando un puerto de salida del componente no se conecta a ningn objeto o expresin en la arquitectura utilizada. En el siguiente ejemplo se tiene una arquitectura llamada dos_sumadores y se asocian las seales de la arquitectura (entidad ejemplo) con los puertos de un componente llamado sumador. Se asocian dos instancias, por tanto se definen dos etiquetas diferentes, Suma1 y Suma2. Del lado izquierdo del operador => se escriben los puertos del componente sumador y a la derecha de dicho smbolo aparecen las seales conectadas a dichos puertos del componente. ARCHITECTURE dos_sumadores OF ejemplo IS SIGNAL cin1, cin2: std_logic; SIGNAL cout1, cout2: std_logic; SIGNAL dato1, dato2, dato3, dato4: std_logic_vector (3 DOWNTO 0); SIGNAL salida1, salida2: std_logic_vector (3 DOWNTO 0); BEGIN Suma1: sumador PORT MAP ( a => dato1, b => dato2, acarreo_1 => cin1, suma => salida1, acarreo_2 => cout1 ); Suma2: sumador PORT MAP ( a => dato3, b => dato4, acarreo_1 => cin2, suma => salida2, acarreo_2 => cout2 ); END dos_sumadores; Asociacin por identificadores con Genricos

172

La siguiente sintaxis corresponde a la asociacin de componentes por identificadores cuando se declaran genricos. Se escribe igualmente la etiqueta de la instancia y el nombre del componente. A continuacin aparecen las palabras reservadas GENERIC MAP y la lista de constantes genricas con su asociacin respectiva a una seal, variable o expresin, o sin conexin (OPEN). Despus de las asociaciones de las constantes genricas se escriben las asociaciones de puertos. Etiqueta : nombre del componente GENERIC MAP ( identificador_generico => seal, identificador_generico => variable, identificador_generico => expresin, identificador_generico => OPEN, identificador_generico => seal ); PORT MAP( puerto_componente => seal, puerto_componente => variable, puerto_componente => expresion, puerto_componente => OPEN, puerto_componente => seal ); Ejemplo: ARCHITECTURE sumador3 OF ejemplo IS SIGNAL cin1, cout1: std_logic; SIGNAL dato1, dato2, salida : std_logic_vector (3 DOWNTO 0); BEGIN Suma: sumador GENERIC MAP ( N => 7); PORT MAP ( -- conexiones de puertos ); END sumador3; ii. Asociacin por posicin En este tipo de instanciacin no es necesario nombrar los puertos del componente. Slo se colocan las seales, variables, o expresiones en el lugar donde desea realizar la conexin. Para esta asociacin s es importante tomar en cuenta el

173

orden en el que se declaren los puertos del componente porque dicho orden se debe utilizar para la instanciacin del componente. La sintaxis de la asociacin por posicin es la siguiente: Etiqueta : nombre del componente PORT MAP (seal1, seal2, ..., seal_n ); Si se considera que pueden existir tambin expresiones y variables, la sintaxis ms detallada ser: Etiqueta : nombre del componente PORT MAP (seal, variable, OPEN, seal, variable, OPEN, ..., seal ); Ejemplo: Partiendo del mismo ejemplo de la arquitectura dos_sumadores, la asociacin por posicin se hara de la siguiente forma: ARCHITECTURE dos_sumadores OF ejemplo IS SIGNAL cin1, cin2: std_logic; SIGNAL cout1, cout2: std_logic; SIGNAL dato1, dato2, dato3, dato4: std_logic_vector (3 DOWNTO 0); SIGNAL salida1, salida2: std_logic_vector (3 DOWNTO 0); BEGIN Suma1: sumador PORT MAP (dato1, dato2, cin1, salida1, cout1); Suma2: sumador PORT MAP (dato3, dato4, cin2, salida2, cout2); END dos_sumadores;

Asociacin por posicin con Genricos

La siguiente sintaxis corresponde a la asociacin de componentes por identificadores cuando se declaran genricos. Se escribe igualmente la etiqueta de la instancia y el nombre del componente. A continuacin aparecen las palabras reservadas GENERIC MAP y la lista de constantes genricas con su asociacin respectiva a una seal, variable o expresin, o sin conexin (OPEN). Despus de las asociaciones de las constantes genricas se escriben las asociaciones de puertos. Etiqueta : nombre del componente GENERIC MAP ( seal, variable, seal, expresin, OPEN, ..., seal); PORT MAP ( seal, variable, OPEN, seal, variable, ..., seal);

174

En el siguiente ejemplo, se asigna el valor 7 a una constante genrica que debe estar declarada previamente en el componente llamado sumador. ARCHITECTURE un_sumador OF ejemplo2 IS SIGNAL cin1, cout1 : std_logic; SIGNAL dato1, dato2, salida1 : std_logic_vector (3 DOWNTO 0); BEGIN Suma: sumador GENERIC MAP (7); PORT MAP (dato1, dato2, cin1, salida1, cout1); END un_sumador; d. Sentencias de generacin Las sentencias de generacin son otro tipo de instruccin concurrente utilizada en las descripciones estructurales. Las sentencias de generacin de componentes sirven para crear una o ms copias de una determinada estructura dentro de una arquitectura. Esto resulta muy til para facilitar el diseo de circuitos complejos con descripciones estructurales. Se pueden crear copias de componentes o de otras entidades y estructuras en general. Existen dos sentencias para generacin de estructuras, bien sea componentes u otro tipo de entidades: el FOR GENERATE y el IF GENERATE. En las dos sentencias, la instruccin GENERATE permite crear estructuras repetitivas sin tener que especificar todas las instancias individuales de un diseo ms grande. i. Sentencia FOR.. GENERATE Esta sentencia genera un nmero finito de conexiones o de instrucciones concurrentes mediante un rango discreto. La sintaxis es la siguiente: Etiqueta : FOR identificador de ndice IN rango GENERATE { instucciones_concurrentes } END GENERATE; Se escribe la etiqueta con dos puntos, y a continuacin la palabra FOR acompaada del identificador de ndice cuyo tipo de dato sea coincidente o compatible con el rango. Se escribe la palabra reservada IN, el rango discreto de las copias que se quieren generar y la palabra GENERATE. Luego se indica la instruccin o instrucciones concurrentes que se desean generar. Las instrucciones concurrentes que se indiquen se ejecutarn una vez para cada valor del ndice dentro del intervalo especificado. Se puede utilizar el identificador del ndice en las

175

instrucciones concurrentes dentro de GENERATE. El identificador no requiere ser declarado previamente. El siguiente ejemplo asigna los valores de un arreglo de cuatro bits a las posiciones pares de un arreglo de 8 bits. SIGNAL V1 : bit_vector (3 DOWNTO 0); SIGNAL V2 : bit_vector (7 DOWNTO 0); ... Ejemplo1 : FOR k IN 3 DOWNTO 0 GENERATE V2(2*k) <= V1(k); END GENERATE; El FOR GENERATE se suele utilizar para crear mltiples copias de componentes y procesos. A continuacin se muestra un ejemplo de generacin de componentes: COMPONENT compuerta_not PORT ( x : IN bit; y : OUT bit); END COMPONENT; SIGNAL m, n : bit_vector (15 DOWNTO 0); ... Comienza: FOR i IN m'RANGE GENERATE Compo_nuevo: compuerta_not PORT MAP (x => m(i), y => n(i) ); END GENERATE Comienza; En el ejemplo anterior se tiene un componente compuerta_not. Con el FOR GENERATE se crea un nuevo componente llamado Compo_nuevo formado por diecisis componentes del tipo compuerta_not. Son diecisis pues el intervalo del FOR fue especificado a partir del atributo rango (RANGE) de uno de los vectores (m) utilizados en la generacin de las copias del componente original. Si se desea se puede escribir al final el nombre de la etiqueta (opcional). ii. Sentencia IF GENERATE La sentencia IF... GENERATE realiza la instruccin de instanciacin o la instruccin concurrente slo si la condicin de prueba es vlida. La sintaxis es la siguiente:

176

Etiqueta : IF condicin GENERATE { instucciones_concurrentes } END GENERATE; Esta sentencia (concurrente) se utiliza de forma parecida la instruccin secuencial IF... THEN, la diferencia es que en esta no se pueden utilizar la condiciones ELSE o ELSIF. Ejemplo: ARCHITECTURE un_sumador OF ejemplo3 IS SIGNAL cin1, cout1 : std_logic; SIGNAL dato1, dato2, salida1 : std_logic_vector (3 DOWNTO 0); Variable bandera : bit; BEGIN Prueba : IF bandera = 1 GENERATE Suma: sumador GENERIC MAP (7); PORT MAP (dato1, dato2, cin1, salida1, cout1); END GENERATE; END un_sumador; En el ejemplo anterior, se crea una instancia llamada Suma a partir del componente sumador, slo si se cumple que la variable bandera es igual a 1. 4.3.3.3 Descripcin Comportamental Las descripciones comportamentales son descripciones con un alto nivel de abstraccin similar a los lenguajes de programacin de alto nivel. Se trata de describir el comportamiento de un sistema sin necesidad de conocer su estructura interna. Una descripcin comportamental est formada en VHDL por un conjunto de instrucciones que se ejecutan de forma secuencial y modelan el funcionamiento de un circuito. En este tipo de descripcin no se requiere saber cmo se interconectan las seales internas del circuito diseado. Por tratarse de ejecuciones secuenciales, se requerir al menos de un bloque PROCESS.

177

a. Instrucciones secuenciales Las instrucciones secuenciales son aquellas que son ejecutadas serialmente, una despus de otra. En VHDL las instrucciones secuenciales slo pueden aparecer dentro del bloque PROCESS. b. Procesos Un proceso es el bloque bsico para ejecucin secuencial en VHDL y consta de un conjunto de instrucciones secuenciales que permiten modelar el funcionamiento de un circuito. Aun cuando las instrucciones dentro de l se ejecutan en forma secuencial, un bloque de proceso es visto dentro de la arquitectura como una sola instruccin concurrente que se puede ejecutar en paralelo con otras instrucciones concurrentes. El bloque de proceso puede ser sintetizado para originar un circuito secuencial o combinacional que responda al comportamiento descrito de un sistema. Un proceso (process) se puede usar en cualquier arquitectura, y tendr sus regiones de declaraciones y de instrucciones secuenciales. El proceso reconocer los objetos de datos y subprogramas que estn declarados dentro de la arquitectura donde se encuentre, y podr tener adems sus propias variables, constantes y subprogramas locales en la regin de declaraciones. La sintaxis para declarar un bloque de procesos utiliza la instruccin process y es la siguiente: PROCESS ( lista sensible de seales ) Declaraciones de tipos Declaraciones de variables Declaraciones de constantes Definiciones de funciones Definiciones de procedimientos BEGIN Instrucciones secuenciales END PROCESS; Luego de la palabra PROCESS se escribe entre parntesis la lista sensible que contienen la seal o seales que determinan cuando se comienzan a ejecutar las instrucciones del proceso. Los cambios en alguna de las seales provocan que el proceso sea llamado. Cuando un proceso no posee lista sensible, se debe utilizar una instruccin WAIT para especificar cuando deben ser ejecutadas las instrucciones dentro del

178

bloque PROCESS. La mayora de las herramientas de sntesis tienen problemas si la lista sensible no est completamente especificada. Una lista sensible est parcialmente especificada cuando alguna de las seales utilizadas en el lado derecho de una ecuacin o de alguna instruccin secuencial no aparece dentro de la lista. Una lista incompleta implica que no se pueda especificar todo el comportamiento de un diseo y ocasionar que no se obtengan las ecuaciones del sistema durante la etapa de sntesis. Despus de la lista sensible se encuentra la regin de declaraciones para tipos, variables, constantes, funciones y procedimientos. Dentro de las declaraciones de un proceso solamente pueden incluirse objetos de tipo variables o constantes, no se deben declarar seales en un proceso. Las declaraciones de esta regin son locales y slo son visibles dentro del proceso. Las variables de un proceso se declaran de forma similar a las variables de una arquitectura segn la sintaxis explicada en los Objetos de datos (seccin 4.3.2.4): VARIABLE identificador de la variable: tipo [ := expresin ] ; Las instrucciones secuenciales dentro del procesos se ejecutarn slo cuando cualquiera de las seales indicadas en la lista sensible (puede haber inclusive una sola seal) cambie de valor. Cuando se activa la ejecucin de un proceso, lo que resulte de este procesamiento se asignar nicamente al final del bloque. Se pueden manejar las seales y estas slo sern actualizadas cuando se ejecute todo el proceso. Las variables en cambio s cambian de inmediato cuando se modifica su valor. Un proceso se puede utilizar para describir circuitos secuenciales o combinacionales. Cuando se trata de circuitos combinacionales no se requiere de seal de reloj, slo cambios en la lista sensible. Si se especifica alguna seal de reloj, entonces el proceso se ejecutar cuando ocurran transiciones en esa seal. Un proceso puede estar en ejecucin o suspendido. Si una seal de la lista sensible cambia debido a las instrucciones del propio proceso, ste se ejecutar de nuevo. Para la simulacin la ejecucin de las instrucciones secuenciales del proceso ocurren en un tiempo simulado de cero para que el bloque completo sea visto como concurrente (ejecucin paralela dentro de la arquitectura). Un proceso escrito correctamente se suspender despus de una o ms ejecuciones. Un proceso incorrecto puede no suspenderse nunca si la seal o seales de la lista sensible siempre cambian, las herramientas de simulacin por lo general pueden detectar este funcionamiento inadecuado. En las instrucciones secuenciales se pueden usar instrucciones de asignacin de seal secuencial e instrucciones de asignacin de variable.

179

Las instrucciones de asignacin de seal secuencial ocurren dentro del proceso y su sintaxis es: Nombre de la seal < = expresin; Las instrucciones de asignacin de variable tambin pueden ocurrir dentro del proceso y sus sintaxis es: Nombre de la variable : = expresin; A continuacin se presenta un ejemplo de un bloque de proceso dentro de una declaracin de arquitectura. La lista sensible esta completamente especificada, la seal salida depende nicamente de cunto vale la seal a para tomar uno de cuatro posibles valores. La estructura utilizada fue el IFTHEN y las cuatro condiciones planteadas con excluyentes entre s. ENTITY operaciones IS PORT( a: IN bit_vector (1 DOWNTO 0); salida: OUT bit_vector (1 DOWNTO 0); END operaciones; ARCHITECTURE ejemplo_1 OF operaciones IS BEGIN PROCESS (a) BEGIN IF a = 00 THEN salida <= '11'; END IF; IF a = 01 THEN salida <= '10'; END IF; IF a = 10 THEN salida <= '01'; END IF; IF a = 11 THEN salida <= '00'; END IF; END PROCESS; END ejemplo_1;

180

c. Diferencias entre seal y variable Dado que en los procesos se manejan seales y variables, es importante recalcar las diferencias entre ellas; ya en la seccin 4.3.2.4 se definieron estos objetos de datos. Las seales pueden ser sintetizadas en elementos lgicos y en conexiones fsicas, mientras que una variable no se puede sintetizar para implementarla fsicamente. Las seales indican puntos de conexin entre elementos lgicos de un circuito. Un aspecto clave es que una seal que se utilice dentro de un proceso no recibe inmediatamente el valor asignado, slo hasta el final del mismo. Una variable que sea utilizada dentro de un proceso s recibe el valor de forma inmediata, por ello son tiles para poder obtener el estado de salida deseado para alguna seal de salida. La variable actualiza su valor igual que las variables de un programa en alto nivel, mientras que la seal tendr un valor actual y un valor futuro que se le asignar al final del bloque de proceso. Fuera del proceso el valor de la seal que se utiliza es el actual. Otro punto que debe tomarse en cuenta para la sntesis, es que el valor actual de una seal no puede ser cambiado ms de una vez dentro de la arquitectura, porque las seales representan nodos de conexin y esto sera equivalente a unir dos cables, ocasionando errores de compilacin. A continuacin se presentan tres ejemplos, dos con asignaciones no vlidas para seales y otro con asignaciones vlidas. ARCHITECTURE mala1 OF ejemplo1 IS SIGNAL y, a, b : bit; BEGIN y <= a or b; -- no es vlida porque se hacen dos asignaciones a y y <= not a; END mala1; ARCHITECTURE mala2 OF ejemplo2 IS SIGNAL y, m, n, w : bit; BEGIN PROCESS (m, n, y) BEGIN y <= n or m; y < = m xor n; w <= m and y; END PROCESS;

-- no es tomada en cuenta -- se mantiene -- se mantiene -- finalizado el proceso,

181

w <= m xor y; END mala2

-- error, se vuelve a modificar w

ARCHITECTURE buena OF ejemplo3 IS SIGNAL y, m, n, w : bit; BEGIN PROCESS (m, n) BEGIN Variable x : bit; x <= n or m; -- inmediata porque es una variable y < = m xor n; -- se mantiene w <= m and x ; -- se mantiene END PROCESS; END buena; d. Estructuras de ejecucin secuencial Para la ejecucin secuencial se cuenta con varias estructuras, estas slo podrn aparecer dentro de un bloque PROCESS. A continuacin se explican estas estructuras. i. Estructura IF - THEN ELSE Es la estructura bsica para realizar una accin u otra de acuerdo a una expresin booleana. Esta estructura tiene la posibilidad de anidar IFs consecutivos con la palabra ELSIF, as se evita tener que poner al final de cada IF un END IF. La sintaxis es la siguiente: IF condicin THEN Sentencias ELSIF condicin THEN Sentencias ELSIF condicin THEN Sentencias END IF; El ELSE y el ELSIF son opcionales, aunque conviene siempre poner un ELSE al final de la estructura de manera que se contemplen todos los casos posibles, esto ayudar a la sntesis a obtener un circuito ms ptimo que cuando no se especifican todas las posibles opciones. Ejemplo: SIGNAL valor: bit_vector (1 DOWNTO 0);

182

SIGNAL dato: unsigned (3 DOWNTO 0); IF valor = 11 THEN dato <= dato - 1; ELSIF valor = 00 THEN dato <= dato + 1; ELSE dato <= x0; END IF; ii. Estructura CASE WHEN Esta estructura permite ejecutar una cosa u otra dependiendo del resultado de una expresin. Su sintaxis es la siguiente: CASE expresin IS WHEN alternativa1 => Instrucciones WHEN alternativa2 => Instrucciones ... WHEN OTHERS => Instrucciones END CASE; La expresin de seleccin debe ser un tipo discreto o un arreglo unidimensional de caracteres. Dependiendo del valor de la expresin se ejecutarn ciertas instrucciones. Las alternativas debe se mutuamente excluyentes para que no ocurran errores. Se deben cubrir todos los valores posibles de la expresin. Para cubrir los casos que no se consideren, puede utilizarse la palabra OTHERS, para indicar que se ejecuten ese conjunto de instrucciones si la expresin toma un valor no contemplado en las alternativas anteriores. Las alternativas se pueden indicar con valores simples, con un rango (con TO o DOWNTO), o con una lista de valores separados entre s con el smbolo |. Ejemplo: CASE EDAD OF WHEN 1 TO 10 => info <= "Nino"; WHEN 11 TO 16 => info <= "Adolescente"; WHEN 17 TO 22 => info <= "Joven"; WHEN 23 TO 50 => info <= " Adulto"; WHEN OTHERS => info <= "Mayor";

183

END CASE; iii. Estructura FOR LOOP En VHDL existen dos estructuras para lazos, la tipo FOR y la tipo WHILE. La parte repetitiva del lazo siempre viene especificada por la palabra clave LOOP...END LOOP. La sintaxis general de una estructura repetitiva es: Etiqueta: Tipo de iteracin LOOP Instrucciones; END LOOP; El tipo de iteracin ser WHILE o FOR. Si no se indica ninguna de las dos, entonces se tendr un lazo infinito. Si se dese se puede colocar una etiqueta a la sentencia. Para el caso de la sentencia FOR, su sintaxis detallada es: FOR identificador IN rango LOOP Instrucciones; END LOOP; En el FOR, el lazo se repite para cada valor del identificador especificado en el rango. Esto quiere decir que el tipo del identificador debe ser discreto: un entero o un enumerado. El identificador no requiere ser declarado. El siguiente es un ejemplo de FOR: SIGNAL x, y: bit_vector(7 downto 0); FOR i IN 0 TO 7 LOOP -- i no necesita ser declarada IF x ( i ) = '0' THEN y ( i ) <= '1'; END IF; END LOOP; iv. Estructura WHILE LOOP El lazo en la sentencia WHILE se repite mientras la condicin sea cierta, si no lo es deja de repetirse. La sintaxis detallada del WHILE es: WHILE condicin LOOP Instrucciones;

184

END LOOP; El siguiente es un ejemplo de WHILE: Variable entrada: integer RANGE 1 to 15000; Variable valor1, valor2, Auxiliar: integer; valor1 := 0; Auxiliar:= 0; WHILE valor1 < 25 LOOP valor1 := valor1 + 1; Auxiliar := Auxiliar + entrada; END LOOP; Valor2 <= Auxiliar;

v. Estructura WAIT La instruccin WAIT es utilizada en procesos que no tienen una lista sensible. Existen tres (3) formas de utilizar la instruccin WAIT, las cuales se muestran a continuacin: Esta sintaxis espera los cambios de las seales especificadas: WAIT ON Esta sintaxis espera que se cumpla la condicin especificada: WAIT UNTIL Esta sintaxis detiene la simulacin durante un determinado tiempo: WAIT FOR La instruccin WAIT ON no es soportada por la mayora de las herramientas de sntesis, WAIT FOR slo se utiliza para simulaciones. La nica forma en que se puede usar la instruccin WAIT en sntesis sin conflictos es con la sintaxis WAIT UNTIL. Es preferible evitar el WAIT y usar lista sensible siempre que se pueda. Un proceso debe tener una lista sensible o al menos una sentencia WAIT, de lo contrario, el proceso se ejecutar siempre. Si el proceso tiene una lista sensible no se puede utilizar la sentencia WAIT en el interior de ese proceso, ni en subprogramas que se pudieran llamar desde ese proceso. En un mismo proceso puede haber varias sentencias WAIT con varias condiciones diferentes.

185

Ejemplos: PROCESS (b) -- ejemplo 1 BEGIN a<= b + 1; WAIT ON b; -- espera los cambios en la seal b END PROCESS; PROCESS -- ejemplo 2 de una compuerta and BEGIN y<='0'; WAIT UNTIL (a='1' and b='1'); y<='1'; WAIT UNTIL (a='0' or b='0'); END PROCESS; PROCESS -- ejemplo 2 de una compuerta and BEGIN -- Instrucciones WAIT FOR 2 ns; -- espera dos nanosegundos antes de ejecutar END PROCESS; -- de nuevo el proceso 4.3.4 SUBPROGRAMAS

Los subprogramas son secuencias independientes de cdigo que pueden ser llamadas en repetidas ocasiones dentro de una arquitectura, proceso, o cuerpo de un paquete en VHDL. Existen dos tipos de subprogramas: funciones y procedimientos. (Torres, 2001) Una llamada a un subprograma es similar a la instanciacin de un componente, con la diferencia que el subprograma sintetizado generalmente es un nico circuito combinacional, mientras que la instanciacin requiere de sintetizar uno o ms circuitos de un componente. Los subprogramas se declaran normalmente en paquetes y los cuerpos de esos subprogramas se implementan en el cuerpo del paquete donde se declaren. Tambin se pueden declarar en arquitecturas y procesos pero es menos comn, cada herramienta de sntesis particular puede restringir o no la declaracin de los subprogramas slo en paquetes. (Torres, 2001)

186

A continuacin se describe la forma de declarar las funciones y procedimientos. 4.3.4.1 Funciones Una funcin es un subprograma que retorna un nico valor y puede tener o no parmetros de entrada (Torres, 2001). Las funciones se usan con frecuencia para convertir datos de un tipo a otro y como funciones simples para realizar operaciones definidas por el usuario dentro de un diseo. Los parmetros de una funcin siempre son del modo IN (entrada) y deben ser seales o constantes. Las variables declaradas en una funcin slo son visibles dentro de la funcin. Una funcin lleva una declaracin y un cuerpo. (Carpio, 1997), (Wakerly, 2001). La sintaxis para declarar una funcin es la siguiente: FUNCTION identificador (lista de parmetros) RETURN tipo; La forma de escribir el cuerpo de la funcin se muestra a continuacin: -- Cuerpo de la funcin: FUNCTION identificador (lista de parmetros) RETURN tipo IS -- declaraciones BEGIN -- instrucciones secuenciales END identificador; Las funciones, por devolver un valor, se pueden usar en expresiones. La lista de parmetros es opcional y si no se especifica la lista entonces se obvian los parntesis. Los parmetros que se admiten en una funcin son las constantes y las seales, no se pueden usar variables. La lista de parmetros formales se declara de forma similar a los puertos en una entidad: tipo del objeto, nombre y tipo de puerto. Como en la funcin slo se declaran constantes y seales como parmetros formales, y el nico puerto permitido es el de entrada, se pueden omitir ciertas partes en la declaracin. Si el puerto es IN no hace falta escribir la palabra CONSTANT pues se sobreentiende que es una constante. Si no se escribe el tipo de puerto se entender que es de tipo IN. Las funciones deben indicar en RETURN el tipo de objeto que devuelven. La instruccin RETURN siempre deber aparecer en el cuerpo de la funcin. La palabra RETURN indica cundo la funcin debera regresar al punto desde donde fue llamada.

187

Las declaraciones dentro de una funcin pueden incluir las mismas de un proceso, ya que ella tambin es un bloque de ejecucin serie. Las instrucciones del cuerpo de la funcin sern de tipo secuencial. Una sintaxis ms detallada para el cuerpo de la funcin queda de la siguiente manera: FUNCTION identificador ( Nombre de seal : tipo de seal; Nombre de seal : tipo de seal; Nombre de seal : tipo de seal ) RETURN tipo IS Declaraciones de tipos Declaraciones de constantes Declaraciones de variables Definiciones de funciones Definiciones de procedimientos BEGIN -- Instrucciones secuenciales END identificador; En la sintaxis anterior se observa que se obvia el tipo de objeto y el modo pues se consideran que son todas seales y de tipo entrada; slo se escribe el nombre, los dos puntos y el tipo de dato. Dentro de la funcin s se pueden declarar variables. Ejemplo: FUNCTION compara (dato1, dato2: integer) RETURN integer IS VARIABLE valor: integer := 0; BEGIN IF dato1 = dato2 THEN Valor : = 1; END IF; IF dato1 > dato2 THEN Valor : = 2; END IF; IF dato1 < dato2 THEN Valor : = 3; END IF; RETURN valor; END compara;

188

4.3.4.2 Procedimientos Un procedimiento es un tipo de subprograma que puede devolver uno o ms valores, y puede o no tener parmetros. Se suelen utilizar para descomponer descripciones comportamentales grandes en mdulos ms pequeos que puedan emplearse en varios procesos de un diseo (Torres, 2001). Los parmetros de los procedimientos deben ser constantes, seales o variables. Debe especificarse tambin el modo de puerto de cada parmetro (IN, OUT o INOUT). Un parmetro se considera siempre como una constante si es de modo IN, a menos que se especifique lo contrario. Si se usa un modo OUT o INOUT, y no se especifica el tipo de objeto, el parmetro ser por defecto una variable. (Carpio, 1997). Los procedimientos pueden utilizarse dentro y fuera de los procesos. Si uno de los parmetros es un variable, entonces el procedimiento deber ser utilizado slo en forma secuencial, esto es debido a que las variables solamente pueden ser declaradas dentro de procesos, procedimientos y funciones. En este caso, el procedimiento slo puede ser invocado dentro del proceso en el que se encuentra declarada dicha variable. (Wakerly, 2001) La sintaxis para la declaracin de un procedimiento es la siguiente: PROCEDURE procedimiento (lista de parmetros ); La forma de escribir el cuerpo del procedimiento se muestra a continuacin: -- Cuerpo del procedimiento: PROCEDURE procedimiento (lista de parmetros) IS -- declaraciones: Declaraciones de tipos Declaraciones de constantes Declaraciones de variables Definiciones de funciones Definiciones de procedimientos BEGIN -- Instrucciones secuenciales END procedimiento; Una llamada a un procedimiento puede ser utilizada en lugar de una funcin. Los parmetros de un procedimiento se pueden modificar si son del tipo OUT o

189

INOUT, por lo que se debe tener cuidado de hacer cambios slo si se desea. Adems el procedimiento puede producir efectos sobre las seales externas declaradas en la arquitectura aun cuando no se especificaran en la lista de argumentos. Ejemplo de declaracin de un procedimiento dentro de un paquete: PACKAGE ejemplo IS -- declaracin de procedimiento PROCEDURE primero (x: IN bit_vector (0 to 3) ; y: OUT bit_vector (0 to 3)); END primero; PACKAGE BODY ejemplo IS -- cuerpo del procedimiento PROCEDURE primero ( x: IN bit_vector (0 to 3); y: OUT bit_vector (0 to 3)) IS BEGIN y := not x ; END; END ejemplo; 4.3.4.3 Llamadas a funciones La llamada a una funcin se hace por su nombre y utiliza los parmetros que le son dados. (Torres, 2001). Las funciones regresan un nico valor. La sintaxis para la llamada a una funcin es la siguiente: identificador_funcin ( [ identificador => ] expresin { , [ identificador => ] expresin}) }; Al igual que en la instanciacin de componentes, se pueden especificar los parmetros mediante asociacin de nombres, o asociacin por posiciones. Ejemplo: SIGNAL x: bit_vector(0 to3); FUNCTION negado ( a: bit_vector(0 to3) ) RETURN bit_vector(0 to 3) IS BEGIN RETURN ( not a ) ; END; ... PROCESS(x) VARIABLE v1, v2, v3: bit_vector(0 to3);

190

BEGIN v1 := 1010 or x; v2 := negado (v1) xor x ; -- llamada a la funcin v3 := negado(0000) and x; -- llamada a la funcin END PROCESS; 4.3.4.4 Llamadas a procedimientos Las llamadas a procedimientos se realizan por su nombre y este utiliza los parmetros listados en su declaracin. (Torres, 2001). La sintaxis para la llamada a un procedimiento es la siguiente: identificador_procedimiento ( [ identificador => ] expresin { , [ identificador => ] expresin})}; Cada expresin puede ser el identificador de una seal, variable, o alguna operacin. Al igual que en la instanciacin de componentes, la asociacin de los parmetros puede ser por el nombre o por posiciones. Ejemplo: ENTITY ejemplo55 IS PORT( ent1: IN bit_vector(3 DOWNTO 0); ent2: IN bit_vector(3 DOWNTO 0); salida: OUT bit_vector(3 DOWNTO 0)); END ejemplo55; ARCHITECTURE ejemplo OF ejemplo55 IS PROCEDURE procedimiento2 (a: IN bit_vector (3 DOWNTO 0); b: IN bit_vector (3 DOWNTO 0); c: OUT bit_vector (3 DOWNTO 0)) IS BEGIN c := a or b ; -- al no especificarse como seales los parmetros OUT -- son variables por omisin END; BEGIN -- llamada al procedimiento procedimiento2 (a => ent1, b => ent2, c => salida); END ejemplo;

191

4.3.4.5 Sobrecarga de operadores La sobrecarga de operadores consiste en definir, para un operador que ya tiene una determinada funcin, nuevas funciones para utilizarlo con tipos de datos para los que no estaba definido anteriormente el operador. Esto permite que el usuario pueda especificar una funcin que sea llamada para usar un smbolo de un operador predefinido (and, not, or, etc.) con diversos tipos de datos. Un mismo smbolo de operador puede tener asociadas varias definiciones (sobrecarga) y el compilador determinar la definicin adecuada al tipo de dato manejado en cada caso. (Torres, 2001), (Carpio, 1997), (Wakerly, 2001). Por ejemplo, el operador AND no est definido predefinido para ser utilizado con los tipos std_logic_vector, unsigned y signed. Entonces dentro de los paquetes std_logic_1164, numeric_std, y numeric_bit, se definen estos tipos de datos, y se sobrecarga el operador AND para poder utilizarlo con dichos elementos. Cuando se sobrecarga un operador en VHDL, el nombre del operador se escribe entre comillas dobles " " para que el programa de sntesis lo interprete como operador. Si no se escriben las comillas se asocia a la funcin predefinida y no se toma en cuenta como operador sobrecargado. En el siguiente ejemplo se redefine la operacin and, definida para bits, para que retorne tambin el valor x (desconocido). TYPE un_bit IS ('0', '1', 'x') ; -- tipo de datos definido por el usuario FUNCTION "AND" (dato1, dato2: IN un_bit) -- sobrecarga de operador and RETURN un_bit; -- cuerpo de la funcin SIGNAL x, y, w: un_bit; x <= y and w; 4.3.5 PAQUETES Un paquete es un conjunto de declaraciones realizadas en un archivo que pueden ser utilizadas por mltiples descripciones en VHDL (Torres, 2001). Las definiciones que se realicen en un paquete son visibles en cualquier programa que utilice la clusula USE con el nombre del paquete. El paquete est formado por dos secciones: la declaracin del paquete y el cuerpo del paquete. La sintaxis para la declaracin del paquete es la siguiente:

192

PACKAGE identificador IS -- Declaracin de subprograma -- Declaracin de tipo de datos -- Declaracin de subtipos -- Declaracin de constantes -- Declaracin de seales -- Declaracin de componentes -- Declaracin de atributos -- Especificacin de atributos -- Instruccin USE END identificador; La sintaxis para el cuerpo del paquete es la siguiente: PACKAGE BODY identificador IS -- Declaracin de subprograma -- Cuerpo del subprograma -- Declaracin de tipo de datos -- Declaracin de subtipos -- Declaracin de constantes -- Instruccin USE END identificador; En la declaracin del paquete se declaran tipos de datos, interfaces y funciones, similar a la declaracin de una entidad. El cuerpo del paquete incluye definiciones adicionales y la descripcin completa de funciones y procedimientos declarados previamente en el paquete. El cuerpo del paquete es similar a la declaracin de una arquitectura. Para incluir un paquete en otra descripcin se utiliza la siguiente sintaxis: USE libreria .identificador_paquete.{ALL | ITEM} ; Se utiliza la clusula USE acompaada del nombre de la librera donde se adicion el paquete, seguido de un punto y el identificador del paquete. Sigue otro punto acompaado del tem que se va a utilizar. En caso de especificarse ALL, se estar indicando que se desea incluir todas las declaraciones de funciones, componentes, tipos de datos, subtipos de datos, procedimientos, etc. que encuentren en el paquete. Para usar esta clusula se requiere que el paquete sea compilado previamente dentro de una librera, y debe colocarse antes de la declaracin de la entidad de la arquitectura. De esta forma el contenido del paquete es visible en el diseo. (Gmez, 2003).

193

A continuacin se presenta un ejemplo de un paquete: PACKAGE compuerta IS COMPONENT Negar PORT (x: IN std_logic; y: OUT std_logic); END COMPONENT; END compuerta; PACKAGE BODY compuerta IS -- declaraciones necesaria END compuerta; Para utilizar este paquete en un diseo se hara de la siguiente forma: USE milibreria.compuerta.ALL; En caso que el paquete del ejemplo tuviera varios componentes y slo se quiera utilizar el componente Negar, se escribira de la siguiente manera: USE milibreria.compuerta.Negar; Al incluir un paquete con la clasula USE en un diseo, se puede hacer uso de recursos, y si se trata de componentes puede hacerse la instanciacin. Un ejemplo de paquete predefinido es el std_logic 1164 de la IEEE. Para utilizar la librera y el paquete se escribe al inicio de un diseo en VHDL las clusulas LIBRARY y USE: LIBRARY ieee; USE ieee.std_logic_1164.ALL; 4.3.6 LIBRERAS Una librera o biblioteca es un conjunto de unidades de diseo que pueden ser incluidas es otras descripciones mediante el llamado a la respectiva librera (Gmez, 2003). Para incluir una librera se utiliza la siguiente sintaxis: LIBRARY identificador_librera; La clusula LIBRARY permite utilizar la librera especificada slo en la unidad de diseo donde se declara. Una unidad de diseo es una entidad, paquete,

194

arquitectura, o cuerpo de un paquete. Si la clusula LIBRARY se escribe antes de la declaracion de una entidad, se podr utilizar en todo el diseo. Ejemplo: LIBRARY ieee; LIBRARY milibreria; 4.3.7 CONFIGURACIN

En las secciones anteriores se explicaron cuatro de las cinco unidades de un programa en VHDL: entidad, arquitectura, paquete y cuerpo del paquete. La unidad que falta para cerrar esta descripcin es la configuracin. En esta parte del cdigo se le indica al compilador de VHDL la asociacin de una entidad con una determinada arquitectura y que la unin de esos dos elementos forma un solo diseo. La configuracin es el nico objeto en VHDL que puede ser simulado sintetizado. En la simulacin, el proceso de configuracin se puede controlar manualmente, mientas que la sntesis ser realizada siguiendo las reglas de asociacin fijadas en la configuracin. (Gmez, 2003), (Carpio, 1997). La sintaxis para la configuracin es la siguiente: CONFIGURATION nombre_configuracin OF nombre_de_entidad IS [Parte declarativa de la configuracin] Bloque de configuracin END [CONFIGURATION] [nombre]; La parte declarativa de la configuracin puede contener: | Clusula use | Especificacin de atributos | Declaracin de grupos Bloque de configuracin: Contiene una estructura como la siguiente: FOR nombre_de_arquitectura [Reglas de configuracin] END FOR; En detalle la configuracin queda as:

195

CONFIGURATION nombre_configuracin OF nombre_de_entidad IS | Clusula use | Especificacin de atributos | Declaracin de grupos FOR nombre_de_arquitectura [Reglas de configuracin] END FOR; END [CONFIGURATION] [nombre]; En el siguiente ejemplo no se declararon componentes internos y por tanto no se poseen reglas de configuracin: CONFIGURATION configura OF ejemplo IS FOR descripcin END FOR; END configura; La configuracin vaca como la del ejemplo anterior es la configuracin por defecto que el compilador VHDL asignar al diseo, por lo que puede ser omitida. Ejemplo de una configuracin no vaca: CONFIGURATION nuevo OF ejemplo_n IS FOR arquitectura_asociada FOR N1, N2: Nombre de objeto USE ENTITY work.Nombre_objeto(arquitectura_objeto); END FOR; END FOR; END nuevo;

196

You might also like