Está en la página 1de 23

CONTENIDO

INTRODUCCIN 2. UNIDADES BSICAS DE DISEO 2.1. CMO SE DECLARE UNA ENTIDAD 2.2. COMO SE DECLARA UNA ARQUITECTURA 2.2.1. ESTILO ALGORTMICO 2.2.2. ESTILO FLUJO DE DATOS 2.2.3. ESTILO ESTRUCTURAL 2.2.4. ESTILO MIXTO 2.3. PAQUETES 2.4. LIBRERIAS 3. OBJTOS, TIPOS DE DATOS Y OPERACIONES 3.1. OBJETOS 3.2. IDENTIFICADORES 3.3. PALABRAS RESERVADAS 3.4. SIMBOLOS ESPECIALES 3.5. TIPOS DE DATOS 3.6. EXPRESIONES Y OPERADORES 4. LGICA COMBINACIONAL 5. PROCESOS SECUENCIALES

INTRODUCCIN

En 1983, IBM, Intermetrics y Texas Instruments empezaron a trabajar en el desarrollo de un lenguaje de diseo que permitiera la estandarizacin, facilitando con ello, el mantenimiento de los diseos y la depuracin de los algoritmos, para ello el IEEE propuso su estndar en 1984. Tras varias versiones llevadas a cabo con la colaboracin de la industria y de las universidades, que constituyeron a posteriori etapas intermedias en el desarrollo del lenguaje, el IEEE public en diciembre de 1987 el estndar IEEE std 10761987 que constituy el punto firme de partida de lo que despus de cinco aos sera ratificado como VHDL. Esta doble influencia, tanto de la empresa como de la universidad, hizo que el estndar asumido fuera un compromiso intermedio entre los lenguajes que ya haban desarrollado previamente los fabricantes, de manera que ste qued como ensamblado y por consiguiente un tanto limitado en su facilidad de utilizacin haciendo dificultosa su total comprensin. Este hecho se ha visto incluso ahondado en su revisin de 1993. Pero esta deficiencia se ve altamente recompensada por la disponibilidad pblica, y la seguridad que le otorga el verse revisada y sometida a mantenimiento por el IEEE. La independencia en la metodologa de diseo, su capacidad descriptiva en mltiples dominios y niveles de abstraccin, su versatilidad para la descripcin de sistemas complejos, su posibilidad de reutilizacin y en definitiva la independencia de que goza con respecto de los fabricantes, han hecho que VHDL se convierta con el paso del tiempo en el lenguaje de descripcin de hardware por excelencia.

2. UNIDADES DE DISEO BSICO 2.1. COMO SE DECLARA UNA ENTIDAD

En la declaracin de entidades, se definen las entradas, salidas y tamao de un circuito, explicitando cuales son, de qu tamao (de 0 a n bits), modo (entrada, salida, ...) y tipo (integer, bit,...) . Las entidades pueden definir bien las entradas y salidas de un diseo ms grande o las entradas y salidas de un chip directamente. La declaracin de entidades es anloga al smbolo esquemtico de lo que queremos implementar, el cual describe las conexiones de un componente al resto del proyecto, es decir, si hay una entrada o puerto de 8 bits, o dos salidas o puertos de 4 bits, etc. La declaracin de entidades tiene la siguiente forma:
entity circuito_a is port( port ----puertos puertos puertos puertos de de de de entradas salidas I/O buffers Cabecera del programa Se indica que a continuacin viene los puertos (o grupos seales) de entrada y/o salida Aqu se declaran las entradas y/o salidas con la sintaxis que se ver a continuacin. Las lneas empezadas por dos guiones son ignoradas por el compilador. As mismo, recordamos que el compilador no distingue las maysculas de las minsculas Se indica que se ha acabado la declaracin de puertos de entrada y/o salida, y que se ha acabado la entidad

); end circuito_a;

Como hemos dicho, cada seal en una declaracin de entidad est referida a un puerto (o grupo de seales), el cual es anlogo a un(os) pin(es) del smbolo esquemtico. Un puerto es un objeto de informacin, el cual, puede ser usado en expresiones y al cual se le pueden asignar valores. A cada puerto se le debe asignar un nombre vlido. A continuacin se exponen algunos ejemplos:
nombre_variable: modo tipo; Puertoa: in bit; bit Puertob: in bit_vector(0 to 7); bit_vector Forma genrica de designar un puerto El primer puerto es un bit de entrada, y su nombre es "puertoa" El segundo puerto es un vector de 8 bits de entrada siendo el MSB el puertob(0) y el LSB el puertob(7) El tercer puerto es un vector de 4 bits de salida siendo el MSB el puertoc(3) y el LSB

Puertoc: out bit_vector(3 downto 0); bit_vector

el puertoc(0) El cuarto puerto es un buffer de un solo bit, cuyo nombre es "puertod" El quinto puerto es una entrada/salida del tipo estndar logic de un solo bit

Puertod: buffer bit; bit Puertoe: inout std_logic; std_logic

Como se puede deducir de los ejemplos anteriores, seguido del nombre del puerto y separado de ste por dos puntos, se debe indicar el tipo de puerto. El modo describe la direccin en la cual la informacin es transmitida a travs del puerto: in, out, buffer e in/out. Si no se especifica nada, se asume que el puerto es del modo in.
Modo in: Un puerto es de modo in si la informacin correspondiente al mismo, entra a la entidad y se suele usar para relojes, entradas de control (como las tpicas load, reset y enable), y para datos de entrada unidireccionales. Modo out: Un puerto es de modo out si la informacin fluye hacia fuera de la entidad. Este modo no permite realimentacin ya que al declarar un puerto como out estamos indicando al compilador que el estado lgico en el que se encuentra no es leble. Esto le da una cierta desventaja pero a cambio consume menos recursos de nuestros dispositivos lgicos programables. Modo buffer: Es usado para una realimentacin interna ,es decir, para usar este puerto como un driver dentro de la entidad. Este modo es similar al modo out, pero adems, permite la realimentacin y no es bidireccional, y solo puede ser conectado directamente a una seal interna, o a un puerto de modo buffer de otra entidad. Una aplicacin muy comn de este modo es la de salida de un contador, ya que debemos saber la salida en el momento actual para determinar a salida en el momento siguiente. Modo inout: Es usado para seales bidireccionales, es decir, si necesitamos que por el mismo puerto fluya informacin tanto hacia dentro como hacia afuera de la entidad. Este modo permite la realimentacin interna y puede reemplazar a cualquiera de los modos anteriores, pudindose usar este modo para todos los puertos, pero reduciremos la lectura posterior del cdigo por otra persona, y reduciendo los recursos disponibles del dispositivo.

Como se ha comentado ms arriba, el lenguaje slo admite cuatro modos para los puertos, pero puede haber tantos tipos de seales como queramos, ya que los podemos crear nosotros mismos. VHDL incorpora varios tipos de forma estndar (por haber sido creado as), pudiendo usar otros definidos en libreras normalizadas, y las creados por el usuario. La norma internacional IEEE 1076/93 define cuatro tipos nativos para VHDL como son:
Tipo boolean : puede tomar dos valores: verdadero/true o falso/false. Un ejemplo tpico es la salida de un comparador que da verdadero si los nmeros comparados son iguales y falso si no lo son:

equal:out boolean; out boolean

Slo puede tomar dos valores: verdadero o falso, y es de salida (darle mas operatividad a la salida de un comparador sera superfluo) Tipo bit: Puede tomar dos valores: 0 1 ( o tambin "low" o "high", segn se prefiera). Es el tipo ms usado de los nativos.

Tipo bit_vector: Es un vector de bits. Debemos tener cuidado al definir el peso de los bits que lo integran, ya que segn pongamos la palabra reservada downto o to estaremos diciendo que el bit ms significativo es el nmero ms alto o el ms bajo del vector, respectivamente. numero : bit_vector (0 to 7); Numero : bit_vector (7 downto 0); En este caso el MSB es numero(0) y numero(7) el LSB En este caso el MSB es numero(7) y numero(0) el LSB

Tipo integer: Para manejar nmeros enteros. Hay que advertir que el uso de enteros consume muchos recursos del dipositivo de lgica programable, siempre y cuando sea sintetizable, debido a que est prcticamente creado para la simulacin.

Pero ante la necesidad de ampliar la operatividad del tipo bit, la norma IEEE 1164, defini un nuevo tipo llamado std_logic, std_ulogic, y sus derivados tales como std_logic_vector y std_ulogic_vector. Como su nombre pretende indicar, es el tipo de tipo lgico estndar, que es el ms usado en la actualidad, as como en la mayora de ejemplos de este libro. Como ejemplo, a continuacin se incluye la declaracin de una entidad correspondiente a un multiplexor de 2x1 de cuatro bits, con entrada de habilitacin o enable. El multiplexor necesita las entradas de informacin, la seal de seleccin, la de enable y las salidas de informacin.
entity multi is port ( Cabecera ya estudiada arriba, en la que multi es el nombre de la entidad Enable es un bit de entrada (suficiente para habilitar o no) selec es otro bit de entrada, que selecciona la entrada in1 o in2, ambas de 4 bits out1 es de salida, que lgicamente, debe ser de la misma longitud que in1 e in2 Ntese que el ltimo puerto no lleva punto y coma al final de la lnea. Si lo llevase estara incorrecto

Enable: in bit; selec: in bit; in1: in bit_vector(3 downto 0); bit_vector in2: in bit_vector(3 downto 0); bit_vector out1:out bit_vector(3 downto 0) out bit_vector

); end multi;

A continuacin se muestra otro ejemplo correspondiente a la entidad para un comparador:


entity compa is port ( a,b: in bit_vector(3 downto 0); bit_vector igual: out bit ; ); end compa; Cabecera de la entidad, cuyo nombre es compa a y b son las entradas de cuatro bits igual es la salida de un slo bit Se finaliza la entidad con la palabra clave end y el nombre de la misma (compa).

Debemos recordar dos puntos ms a la hora de dar el nombre a algn puerto, que se tratarn ms adelante en el apartado de objetos:

VHDL no distingue las letras maysculas de las minsculas, por lo que un puerto llamado por nosotros "EnTraDA" ser equivalente a otro que se llame "ENTRADA" o "entrada". El primer carcter de un puerto slo puede ser una letra, nunca un nmero. As mismo, no pueden contener caracteres especiales como $, %, ^, @, ... y dos caracteres de subrayado seguidos.

2.2 CMO SE DECLARA UNA ARQUITECTURA

La arquitectura indica el tipo de procesado que se realiza con la informacin correspondiente a las seales de entrada, (declarados previamente en la entidad) para llegar a tener los puertos de salida (tambin declarados en la entidad). En la declaracin de arquitecturas es donde reside todo el funcionamiento de un circuito, ya que es ah donde se indica que hacer con cada entrada, para obtener la salida. Si la entidad es vista como una "caja negra", para la cual lo nico importante son las entradas y las salidas, entonces, la arquitectura es el conjunto de detalles interiores de la caja negra. La declaracin de arquitectura debe constar de las siguientes partes como mnimo, aunque suelen ser ms:
Cabecera de la arquitectura. En sta, archpro es un nombre cualquiera (suele empezar por "arch", aunque no es necesario) y programa es el nombre de una entidad existente en el mismo fichero Declaraciones de apoyo, que se vern en la pgina siguiente Se da comienzo al programa Conjunto de sentencias, bucles, procesos, funciones,... que dan operatividad al programa. Fin del programa

architecture archpro of programa is

-- declaracin de seales y otros accesorios Begin -- ncleo del programa end archpro;

Como podemos apreciar, es una estructura muy sencilla, y que guarda alguna relacin con Turbo Pascal. Las sentencias entre begin y end son las que describen el circuito, y es en lo que se centra tanto este libro electrnico como cualquier otro que trate sobre VHDL. A continuacin, se muestra el cdigo fuente de un programa en VHDL de un multiplexor (esta es una de las mltiples formas de implementar un multiplexor en VHDL), el cual debe ir unido a la entidad expuesta en el apartado de la declaracin de entidades, ya que una parte sin la otra carecen de sentido.
Cabecera de la arquitectura. En esta ocasin el nombre de la arquitectura es archimulti, y el de la entidad es multi, la cual est definida anteriormente.
En este programa no se necesitan seales

architecture archimulti of multi is

-- seales Begin

Comienza al programa

process(enable,in1,in2) process begin if enable='0' then out1<="1111"; elsif enable='1' then if(selec = '0') then out1<=in1; if elsif(selec = '1') then elsif out1<=in2; end if; if end if; if end process; process end archimulti;

Sentencias que hacen que la entidad definida como multiplexor realice la funcin propia de su nombre. Solo hay que entender la estructura de las arquitecturas en estos momentos, por lo que este cdigo no debe ser objeto de preocupacin. Fin del programa

Para describir una arquitectura podremos usar cuatro estilos, teniendo cada uno, su propio nivel de abstraccin. Los estilos son:
Estilo Algortmico: define la funcionalidad del dispositivo mediante un algoritmo ejecutado secuencialmente, de forma muy parecida a como lo hace cualquier programa escrito en un lenguaje de programacin comn, como puede ser C o Pascal. architecture behavioral of compa is begin comp: process (a, b) begin if a= b then igual<='1'; else igual<='0'; end if; if end process comp; end behavioral; behavioral

Como se puede apreciar en este ejemplo se utilizan los clsicos if then else de cualquier lenguaje de programacin, y adems las asignaciones son secuenciales. Esto es lo que hace esta arquitectura algortmica.

Estilo dataflow o flujo de datos: Este estilo podremos encontrarlo de dos formas similares, pero ambas implican cmo la informacin ser transferida de seal a seal y de la entrada a la salida sin el uso de asignaciones secuenciales, sino concurrentes. Es decir, en este estilo no se pueden usar los procesos. El comparador descrito de forma algortmica se puede escribir usando el estilo dataflow de cualquiera de las dos formas siguientes: architecture dataflow1 of compa is begin igual<='1' when (a=b) else '0'; end dataflow1; architecture dataflow2 of compa is begin igual<= not(a(0) xor b(0)) not and not(a(1) xor b(1)) not and not(a(2) xor b(2)) not and not(a(3) xor b(3)); not end dataflow2; Esta arquitectura es del estilo dataflow porque se especifica como la informacin pasar a la salida sin usar sentencias secuenciales

Aqu de nuevo las asignaciones son concurrentes, no secuenciales.

Estilo structural o estructural: En l se describe un "netlist" de VHDL, en los cuales los componentes son conectados y evaluados instantneamente mediante seales. No se suele usar este estilo nicamente en una arquitectura ya que resulta muy lioso y difcil de modificar, siendo de verdadera utilidad cuando debemos crear una estructura grande y deseamos descomponerla en partes para manejarla mejor, y para hacer la simulacin de cada parte ms sencilla. Se suele requerir el uso de seales auxiliares, y adems paquetes y libreras accesorios, lo cual, recordemos, debe estar declarado al comienzo de la entidad.

architecture struct of compa is signal x: bit_vector(0 to 3); begin u0: xnor2 port map (a(0),b(0),x(0)); u1: xnor2 port map (a(1),b(1),x(1)); u2: xnor2 port map (a(2),b(2),x(2)); u3: xnor2 port map (a(3),b(3),x(3)); u4: and4 port map (x(0),x(1),x(2),x(3),igual); end struct;

Aqu solo se interconexionan salidas con entradas de componentes. La salida viene dada por la operatividad de los componentes, la cual no se puede saber si no conocemos el paquete del cual ha sido leda.

Estilo mixto: Es el estilo que est compuesto en mayor o menor medida de dos o ms de los estilos descritos anteriormente.

Debemos tener en cuenta que el cdigo VHDL que escribamos no siempre va a describir una funcin de forma ptima, la cual no siempre va a poder ser reducida por la herramienta de compilacin. Esto se traduce en un peor aprovechamiento de los recursos de las PLD's. Por lo tanto, diferentes diseos producen diferentes, aunque equivalentes, ecuaciones de diseo, pudindose dar, sin embargo, disposiciones diferentes de los recursos. Es habitual el usar el estilo estructural para descomponer un diseo en unidades manejables, siendo cada unidad diseada por equipos de trabajo distintos. El estilo estructural se usa adems para tener un grado de control alto sobre la sntesis. Para concluir el apartado dedicado a las arquitecturas slo resta el recordar que tanto la entidad y la arquitectura deben ir unidas en el mismo fichero, ya que una parte carece de sentido sin la otra.

2.3. PAQUETES

Un diseador de Hardware que utilice frecuentemente la misma tecnologa de diseo ha de hacerse, con el paso del tiempo, con una resea amplia de procedures, funciones, puertas y, en general, de componentes que emplear con frecuencia. Los packages permiten agrupar un conjunto de declaraciones para que puedan ser usadas en el diseo de diferentes circuitos sin ser repetidas en la declaracin de cada uno. La estructura bsica en la declaracin de un paquete est dividida en dos partes claramente diferenciadas:
La declaracin del paquete, package: donde obtenemos una visin externa y simplificada del componente. La declaracin del paquete va precedida por la palabra reservada package y finaliza con end. En el cuerpo de la declaracin nos encontramos con procedures, funciones, componentes, etc. tal y como apareceran en la parte de la declaracin de una entidad.

package nombre_del_package is -- declaracin de procedures Esta parte es a una entidad, lo mismo que un -- declaracin de funciones -- declaracin de tipos, etc... paquete es a un programa normal en VHDL. end nombre_del_package; La declaracin del cuerpo del paquete, package body: especifica el funcionamiento de procedures, funciones, tipos, etc. que nos permite su implementacin, de forma similar a la arquitectura. Debe llevar las palabras reservadas package body. package body nombre_del_package is -- definicin de procedures -- definicin de funciones -- definicin de tipos, etc. end nombre_del_package; Esta parte se corresponde con una arquitectura.

Todo esto hace posible que una vez declarados los subprogramas dentro de un package, podamos utilizarlos haciendo nicamente uso de una llamada al proceso, asignndole un nombre y la lista de parmetros necesarios. Para poder usar o llamar a un package que ha sido descrito anteriormente, debemos incluir la clusula use antes del cuerpo de la arquitectura.
use work.nombre del package.nombre del componente; work

Para esto se deben especificar tres cosas:


El nombre del paquete

El nombre de la librera donde se encuentra el paquete

El nombre del componente que se desee habilitar

Hay ocasiones en las que deseamos habilitar todos los componentes declarados en un paquete, ya sea por comodidad o por no saber exactamente donde se encuentra el recurso que deseamos usar. En tal caso, haramos uso de la palabra all de la siguiente forma:
use work.nombre del package.all; work all;

Como ejemplo se muestra a continuacin la declaracin de un package que contiene a dos componente, un contador y un decodificador.
--Primero se declaran las libreras que se van a emplear -library ieee; use ieee.std_logic_1164.all; all; use work.std_arith.all work all; --Empieza la declaracin del package "UNO" package uno is component count port ( clk,reset:in bit; in bit conta :buffer std_logic_vector(1 downto 0)); buffer end component; component decoder port ( seleccion :in std_logic_vector(1 downto 0); in enable1,enable2:in bit; in bit salida :out std_logic_vector(3 downto 0)); out end component; end package; package

--Declaracin de las estidades library ieee; use ieee.std_logic_1164.all ; all use work.std_arith.all all; use work.uno.all all; entity count is port ( clk,reset:in bit; in conta:buffer std_logic_vector(1 downto 0)); buffer end count; architecture archicount of count is begin contador :process (clk,reset) process begin if (reset='1') then conta <= (others => '0') ; elsif clk'event and clk='1' then conta <= conta + 1; event end if; if end process contador; end archicount; --Declaracin de las arquitecturas --Descripcion del decodificador 3/8 (74ls138) library ieee; use ieee.std_logic_1164.all ; all use work.uno.all work all; entity decoder is port ( seleccion :in std_logic_vector(1 downto 0); in enable1,enable2:in bit; in salida :out std_logic_vector(3 downto 0)); out end decoder; --Descripcin del decodificador architecture archidecoder of decoder is begin decodificador:process process(seleccion,enable1,enable2) begin if enable2='1' then salida<=(others others=>'0'); elsif enable2='0' and enable1='0' then salida<=(others => '0'); others elsif(enable1='1') then elsif case seleccion is when "00" => salida <= "0001"; when "01" => salida <= "0010"; when "10" => salida <= "0100"; when "11" => salida <= "1000"; when others => salida <="1111"; end case; case end if; if end process decodificador; end archidecoder;

Para poder hacer uso, de cualquier componente de el package "uno" (el decodificador o el contador), es necesario que primero se incluya la sentencia:
use work.uno.all; all;

2.4. LIBRERIAS

La LPM fue propuesto en 1990 como una extensin del estndar Electronic Design Interface Format (EDIF) para permitir al diseador crear un circuito completo con independencia de la arquitectura, separando las partes fsicas y lgicas del diseo Cada componente en la librera esta definido por unos parmetros, que le permiten al diseador de hardware representar una amplia variedad de variables lgicas, evitando la repeticin del trabajo. Un diseo basado en la utilizacin de la librera LPM (library of parametrized modules) combina simultneamente, los aspectos propios de un diseo en alto nivel, con las mejoras propias de la sntesis en bajo nivel. Debido a que los componentes descritos en esta librera son aceptados por lo fabricantes, su consumo de los recurso internos viene previamente optimizado. La librera LPM System Library, en la cual se nos ofrecen mltiples mdulos, ya creados, puede facilitarnos enormemente nuestro trabajo, ya que incluye desde el generador de constantes ms sencillo hasta contadores y multiplicadores con todas las caractersticas opcionales posibles. La lista de componentes incluida en esta es la siguiente:
Nombre del paquete Nombre del componente MCCSTNT Mdulo de constantes MINV Mdulo de inversores MAND Mdulo de AND's MOR Mdulo de OR's MXOR Mdulo de XOR's MBUSTRI Mdulo de bus triestado MMUX Mdulo de multiplexores MDECODE Mdulo de decodificador MADD_SUB Mdulo de sumadores/restadores

MCOMPARE Mdulo de comparadores MMULT Mdulo de multiplicadores MCOUNTER Mdulo de contadores MLATCH Mdulo de latches MFF Mdulo de flip-flops

MSHFTREG Mdulo de registros

Para usar cualquiera de stos mdulos, slamente deberemos incluir en nuestro fichero de cdigo la siguiente lnea, encima de la declaracin de entidades y de arquitecturas:
use work.lpmpkg.all work all;

Como ejemplo crearemos un multiplicador de 4 bits (a y b), cuyo resultado, obviamente, debe se de 8 bits (p), y que nos permite adems sumarle otro nmero de ocho bits (s) al resultado. Para ello deberemos invocar previamente a la librera lpmpkg tal y como habamos dicho:
library ieee; ieee use ieee.std_logic_1164.all ; ieee all use work.lpmpkg.all work all; entity multi_lpm is port( port a,b: in std_logic_vector(3 downto Llamamos a lpmpkg 0); s: in std_logic_vector(7 downto Vamos a multiplicar a y b Y vamos a sumar s 0); p: out std_logic_vector(7 downto El resultado es p 0) ); end multi_lpm; Llamamos a lpmpkg use work.lpmpkg.all work all; architecture archimulti of multi_lpm is begin a0: mmult generic map(4,4,8,8) map port map(a,b,s,p); map end archimulti;

Usamos el mdulo mmult

En este ejemplo hemos hecho uso del mdulo mmult, el cual nos exige no slo introducirle las seales con las cuales operar (con la sentencia port map) sino tambin su dimensin (sentencia generic map). Como cada mdulo tiene unas especificaciones de entradas, salida y dimensiones distintas, tendremos que consultar el manual de la librera lpmpkg para conocer que entradas y salidas necesita cada mdulo.

3. OBJETOS, TIPOS DE DATOS Y OPERACIONES 3.1. OBJETOS En un lenguaje de descripcin de software (SDL) una variable contiene un valor y puede aceptar un nuevo valor a travs de una asignacin secuencial. Por otro lado, las constantes tienen valores prefijados a lo largo de toda la ejecucin del programa. Sin embargo, en VHDL se hace necesaria la utilizacin de un nuevo tipo de objeto que puede emular las asignaciones concurrentes propias de los circuitos elctricos reales; este nuevo tipo de objeto son las seales. Un objeto en VHDL es un elemento que tiene asignado un valor de un tipo determinado. Segn sea el tipo de dato, el objeto poseer un conjunto de operaciones que se le podrn aplicar. En general, no ser posible realizar operaciones entre dos objetos de distinto tipo, a menos que definamos previamente un programa de conversin de tipos. 3.2. IDENTIFICADORES

Los identificadores son un conjunto de caracteres dispuestos de una forma adecuada y siguiendo unas normas propias del lenguaje, para dar un nombre a los elementos en VHDL, por lo que es aconsejable elegir un nombre que sea representativo y que facilite la comprensin del cdigo. Las reglas a tener en cuenta a la hora de elegir un identificador son: + Los identificadores deben empezar con un carcter alfabtico, no pudiendo terminar con un carcter subrayado, ni tener dos o ms de estos caracteres subrayados seguidos. + VHDL identifica indistintamente tanto las maysculas como las minculas, pudindose emplear por igual el identificador "sumador" o "SUMADOR". + El tamao o extensin del identificador no est fijado por VHDL, siendo recomendable que el usuario elija un tamao que confiera sentido y

significado al identificador, excesivamente largas.

sin

llegar

alcanzar

longitudes

+ Los identificadores pueden contener caracteres numricos del '0' al '9', sin que stos puedan aparecer al principio. + No puede usarse como identificador una palabra reservada por VHDL. 3.3. PALABRAS RESERVADAS Las palabras reservadas son un conjunto de identificadores que tienen un significado especfico en VHDL. Estas palabras son empleadas dentro del lenguaje a la hora de realizar un diseo. Por esta razn y buscando obtener claridad en el lenguaje, las palabras reservadas no pueden ser empleadas como identificadores definidos por el usuario. Las palabras reservadas por VHDL son:
abs Access After Alias All And Architecture Array Asser attribute begin block body buffer bus case component configuration constant disconnect downto Else Elsif End Entity Exit File For Function Generate Generic Guarded If In Inout Is Label Library Linkage Loop Map Mod nand new next nor not null of on open or others out package port procedure process range record register rem report return select severity signal subtype then to transoprt type units until use variable wait when while with xor

3.4. SIMBOLOS ESPECIALES Adems de las palabras reservadas empleadas como identificadores predefinidos, VHDL utiliza algunos smbolos especiales con funciones diferentes y especficas, tales como el smbolo "+" se utiliza para representar la operacin suma y, en este caso, es un operador. El smbolo "- -" es empleado para los comentarios realizados por el usuario, de tal forma que el programa al encontrar una instruccin precedida por "- -" la saltar ignorando su contenido. De esta forma, el programador puede hacer ms comprensible el cdigo del programa. Los smbolos especiales en VHDL son:
+ - / ( ) . , : ; & ' < > = | # <= => := --

Para finalizar, recordar que el smbolo ms empleado por un programador es el " ; ", smbolo que debe finalizar todas y cada una de las lneas del cdigo dando por terminada dicha sentencia en el programa.

3.5. TIPOS DE DATOS El tipo de datos es un elemento bsico en VHDL, ya que delimita que valores puede tener un objeto y que operaciones podemos realizar con l. Aparte de los tipos ya creados, podemos crear nuevos tipos y subconjuntos de tipos. La declaracin de un tipo de datos es la sentencia VHDL utilizada para introducir un nuevo tipo. Esta declaracin est formada por un identidificador que nos permitir usar el nuevo tipo al llamarlo y la descripcin del conjunto de valores que forman el tipo de datos. Para ello usamos la palabra reservada type. La declaracin puede tener varios formatos como por ejemplo:
type longitud_maxima is range 2 to 50 type estados is (estado_a, estado_b, estado_c);

Una vez declarado el nuevo tipo podremos usarlo para declarar objetos de este tipo, como por ejemplo:
variable est: estados; port (entrada: in estados; salida: out longitud_maxima);

Cada tipo es diferente e incompatible con los dems, aunque estn declarados de la misma forma, por lo cual no podemos asignar a una seal de un tipo otra de otro tipo distinto, a menos que definamos una funcin de transformacin. Los tipos pueden ser clasificados segn las caractersticas de lo que van a determinar: Tipos enumerados: En ste se define el conjunto de posibles valores del tipo especificado, presentando una lista que contiene a todos los valores. El primer identificador es el nombre del tipo y sirve para referenciarlo, y entre parntesis y separados por comas se adjuntan todos los valores legales del tipo.
type vocales ('a', 'e', 'i', 'o', 'u'); type direcciones is (izquierda, derecha, arriba, abajo, centro);

Si no est especificado ningn valor inicial, el objeto se inicializa con el valor ms a la izquierda de los especificados en la declaracin del tipo. Es decir, un objeto del tipo "vocales" toma el valor 'a' por defecto. Tipos enteros / reales: Esta modalidad de tipo sirve apra definir un objeto con valores reales y enteros. En VHDL vienen definidos el tipo integer, que puede ir desde -2147483647 hasta 2147483647, y el tipo real, quepuede ir

desde -1.0e38 hasta 1.0e38. Para definir un tipo de esta naturaleza hay que especificar el rango de valores que puede llegar a tener asignado un objeto, como en los ejemplos siguientes
type edad is range 0 to 150; type dias is range 31 downto 0;

Si no est especificado ningn valor inicial, el objeto se inicializa con el valor ms a la izquierda de los especificados en la declaracin del tipo. Deberemos tener cuidado si hemos usado la palabra to o la palabra downto para definir el tipo, ya que se asignar un valor por defecto u otro. En el ejemplo se da por defecto a un objeto del tipo "edad" el valor 0, y a otro del tipo "dias", el valor 31. Error!Marcador no definido.Tipos fisicos: Sirven para representar magnitudes del mundo real como el tiempo, peso, capacidad,... por lo que llevan, aparte de un literal numrico, la magnitud fsica a medir. Podemos asignar unidades auxiliares a la predefinida.
type time is range 0 to 1e20; units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 us; sec = 1000 ms; min = 60 sec; hr = 60 min; end units;

Si no est especificado ningn valor inicial, el objeto se inicializa con el valor ms a la izquierda de los especificados en la declaracin del tipo. Deberemos tener cuidado si hemos usado la palabra to o la palabra downto para definir el tipo, ya que se asignar un valor por defecto u otro. En el ejemplo se da por defecto a un objeto del tipo "edad" el valor 0, y a otro del tipo "dias", el valor 31. 3.6. EXPRESIONES Y OPERADORES La metodologa de programacin de un componente, basada en la descripcin por comportamiento (behavioral), puede emplear en su diseo la mayora de operadores que se encuentran habitualmente tiles en los SDL's ( software design languages) En el cuadro adjunto se puede ver una relacin de los operadores predefinidos ms empleados en VHDL, as mismo se aprecia que su clasificacin atiende al tipo de dato que vaya a manejar:
OPERADORES LGICOS NOT, AND, OR, NAND, NOR, XOR Tipo de operador: boolean Tipo de resultado: boolean

OPERADORES RELACIONALES OPERADORES ARITMTICOS

= / < <= > >= + - * / ** MOD, REM, ABS

Tipo de operador: cualquier tipo Tipo de resultado: boolean Tipo de operador: integer, real, signal tipo de resultado: integer, real,signal Tipo de operador: array tipo de resultado: array

OPERADOR CONCADENACIN &

Los operadores lgicos, pueden ser empleados con los tipos predefinidos, BIT y BOOLEAN, dndonos como resultado un valor booleano del mismo tipo que los operadores.

architecture archisumador of sumador is begin process (a,b,cin) variable aux:std_logic_vector(4 downto 0); begin aux:=('0' & a) + ('0' & b); if cin='1' then aux:=aux+1; elsif cin='0' then null; null end if; sum<=aux; end process; process end archisumador; archisumador

En este ejemplo se aprecia una concatenacion del elemento "a" (que previamente debe de haber sido definido como un std_logic_vector), con un "0", dandonos como resulytado un array en el que la primera poscicion la ocupa el "0" y despues va el elemento "a"

Este mismo ejemplo nos servira para graficar la utilizacin del operador suma "+", que lo empleamos para incrementar a la variable aux, en caso de que cin valga uno.

Los operadores relacionales tambin nos generaran un resultado de tipo booleano sin importar el tipo de operando con el que lo empleemos, como nota comentar que el operador "diferente que" viene dado por la combinacin " /= ". Los operandos de tipo aritmticos estn en la obligacin de ser empleados con elementos del mismo tipo y de devolver un resultado que a su vez este contenido en el mismo tipo que los operandos.EL signo "+", "-" dar como resultado sumas de unidades es decir que al elemento sumado le aade uno,(como se aprecia en el anterior ejemplo). El operador concadenacon es empleado para concadenar arrays de bits, como muestra se grafca este operador con el siguiente ejemplo.
aux:=('0' & a)

Los elementos a concadenar deben de ser del mismo tipo. Este tipo de operador es muy empleado a la hora de trabajar con buses o registros. El resultado que nos devuelve este operador es un array de los elementos de los operandos concatenados. En nuestro ejemplo, si "a" es un array de cuatro bits, la variable "aux", pasara a tener en su primera poscicion el valor "0" y a continuacion tendra el valor de los elementos de "a", de forma que "aux" pasa a tener dimension cinco.

4. LGICA COMBINACIONAL
Para iniciarnos correctamente en el aprendizaje y manejo de VHDL es importante que comprendamos diferencia entre concurrente y secuencial. El concepto de concurrencia, se ve claramente graficado en los circuitos electrnicos donde los componentes se encuentran siempre activos, existiendo una asociacin intrnseca, entre todos los eventos del circuito; ello hace posible el hecho de que si se da algn cambio en una parte del mismo, se produce una variacin (en algunos casos casi instntanea) de otras seales. Esta comportamiento de los circuitos reales obliga a que VHDL soporte estructuras especficas para el modelado y diseo de este tipo de especificaciones de tiempos y concurrencias en el cambio de las distintas seales digitales de los diseos. Por el contrario, los asignamientos secuenciales, son ms bien propios de los SDL (soft design lenguage) en los que la programacin tiene un flujo natural secuencializado, siendo propio de este tipo de eventos las sentencias case, if, while, loop, etc ms propias de estas sintaxis. Las construcciones concurrentes del lenguaje son usadas dentro de estructuras concurrentes, por ejemplo una arquitectura tiene una naturaleza eminentemente concurrente (es decir que est activo todo el tiempo), mientras que el cuerpo de un process es en principio eminentemente secuencial. La asignacion de eventos secuenciales dentro de una estructura concurrente se ejecutar de forma concurrente, es decir, al mismo tiempo que las dems sentencias. VHDL soporta con este motivo, tres tpos de objetos, las variables, las constantes y las seales . Como las variables y las seales pueden variar su valor mientras ejecutamos un programa, sern stas las encargadas de almacenar dichos datos, asimismo sern los portadores de la informacin. nicamente las seales pueden tener la connotacin de globalidad dentro de un programa, es decir, que pueden ser empleadas dentro de cualquier parte del programa a diferencia de las variables que solo tienen sentido en el interior de un process . Los process son estructuras concurrentes constituidas por sentencias de ejecucin secuencial, esto provocar que dentro de un process nos encontremos con sentencias similares a las de los SDL (lenguajes de descripcin de software) que nos llevan a emplear VHDL como si de otro lenguaje comn se tratara. Dentro de un process nos podemos encontrar con la declaracin y utilizacin de las variables como parmetros locales al process . De ejecucin secuencial, las variables evaluan su valor dentro del cuerpo del proceso de forma inmediata, sin consumir tiempo de ejecucin, pero como estn dentro de un process, que es una estructura concurrente, este valor no ser asumido, sino hasta el final de la ejecucin de dicho process.

Hacer los bloques combinacionales con construcciones concurrentes, o bien con proceso en los que no aparezca reloj. Esto hace que la herramienta de sntesis produzca un hardware ms eficiente en cuanto a rea se refiere.
e ntity pl is port( sel1, sel2 : in bit;

rw reset_N clk datoin

: : : :

in in in in

bit; bit; bit; bit;

datoout : out bit); end pl; architecture a2 of pl is signal dato1, dato2, read1, read2, write1, write2 : bit; begin --parte combinacional read1 <= rw and sel1; read2 <= rw and sel2; write1<= not (rw) and sel1; write2<= not (rw) and sel2;

--seal --seal --seal --seal

de de de de

lectura de dato1 lectura de dato2 escritura de dato1 escritura de dato2

--salida combinacional datouot <= dato1 when read1 = '1' else dato2 when read2 = '1' else '0'; --parte secuencial principal : process ( rest_N, sel1, sel2, rw, datoin, clk) begin if reset_N = '0' then dato1 <= '0' ; dato2 <= '0' ; elsif clk' event and clk = '1' then if write1 = '1' then dato1 <= datoin ; end if; if write = '1' then dato2 <= datoin; end if; end if; end process principal; end a2

Tener cuidado con el uso de sentencias if-then-elseif: no hacer nunca excliuyentes bloques combinacionales independientes, ya que el hardware resultante es ms complejo.
Forma correcta ----------if write1 = '1' then dato1 <= datoin; end if; if write2 = '1' then dato2 <= datoin; end if; ----------Forma incorrecta: tal y como se ha hecho la descripcin, nunca se puede producir el caso en el que write1 y write2 estn activos a la vez. ------------

if write1 = '1' then dato1 <= datoin; elsif write2 = '1' then dato2 <= datoin; end if; ------------

Para permitir que la herramienta de sntesis optimice bloques combinacionales, se puede utilizar el valor "-" del tipo std_logic. -asignacin combinacional -----------salida <= "000" when entrada = "00" else "001" when entrada = "01" else "101" when entrada = "01" else "---"; --------------

En procesos que describen lgica combinacional, asegurar que las salidas toman un valor, sea cual sea el camino de control. En muchos casos, la manera ms conveniente de hacer esto es hacer, al principio del proceso secuencial, una asignacin de valores por defecto de todas las salidas.
--se quiere que salida sea 0000 cuando no sea ninguna opcin vlida ----------salida <= (others => '0'); if opcion = "10" then salida <= "1010"; end if; if opcion = "01" then salida <= "0101"; end if; -----------

En otros casos se puede usar la sentencia else, siempre que haya desiciones excluyentes con if-then-elseif: --Es diferente el valor que tome salida si no vale ninguna opcin.
----------if primeraopcion = "10" then salida <= "1010"; elsif segundaopcion = "01" then salida <= "0101"; else salida <= (others = '-'); end if; -----------

4. PROCESOS SECUENCIALES Hacer los bloques secuenciales con la construccin if clk'event and clk = '1' (o '0'), no pudiendo aparecer ninguna otra condicin en dicha construccin. En casos muy especiales se pueden usar otras construcciones. --Forma correcta : biestable con enable.
-----------p1 : process (reset_N, d, e, clk) begin if reset_n = '0' then 1 <= '0'; elsif clk'event and clk = '1' then if e= '0' then q<= d; end if; end if; end process p1; ------------

La mayora de las herramientas slo pwermiten el uso de un reloj en cada proceso secuencial. En el caso de tener varios relojes en el sistema, o los dos flancos de un mismo reloj, utilizar procesos distintos para cada reloj. Si es necesaria la comunicacin, implementarla.
-----------P1 : process (rest_N, datoInt, clk1); begin if reset_N = '0' then datoInt <= '0'; elsif clk1'event and clk1 = '1' then datoInt <= datoInt; end if; end process p1; P2 : process (rest_N, datoOut, clk2); begin if reset_N = '0' then datoOut <= '0'; elsif clk2'event and clk2 = '1' then datoOut <= datoInt; end if; end process p2; ------------

No escribir el cdigo de manera que la construccin if clk'event and clk = '1' (o '0') est englobada en otra construccin if-then-else o en un bucle for. S se pueden usar, sin embargo, bucles while.

--Forma incorrecta: la linea donde se usa el reloj est en un bucle

-------------for i in 0 to 7 loop if reset_N = '0' then if b(i) = '1' and c(i) = '0' then dato(i) <= '0'; else dato(i) <= '1'; end if; elsif clk'event and clk = '1' then if DireccionCorrecta (address, mascara, muestra) then dato(i) <= datoin(i); end if; end if; end loop; --------------

--Forma correcta: la lnea donde se usa el reloj est fuera del -----bucle

-----------if reset_N = '0' then for i in 0 to 7 loop if b(i) = '1' and c(i) = '0' then dato(i) <= '0'; else dato(i) <= '1'; end if; elsif clk'event and clk = '1' then for i in 0 to 7 loop if DireccionCorrecta (address, mascara, muestra) then dato(i) <= datoin(i); end if; end if; end loop; -----------

Usar funciones para reducir la complejidad del cdigo. En algunas descripciones puede ser necesaria una gran cantidad de decisiones ates de realizar una accin determinada. El enblobar esto en una funcin o procedimiento permite que el cdigo sea ms fcil de leer y hace que la herramienta de sntesis cuente con un particionado que facilita la optimizacin.
----------if reset_N = '0' then dato <= (others 0> '0'); elsif clk'event and clk = '1' then if DireccionCorrecta (address, mascara, muestra) then dato <= datoin; end if; end if; ----------

No introducir cdigo que pueda generar lgica combinacional en processos secuenciales a no ser que se usen variables. --Forma incorrecta: parte combinacional dentro del proceso.
----------

process (reset_N, clk, din, dato_anterior) begin if reset_N = '0' then dato_anterior <= '0'; elsif clk'event and clk = '1' then dato_anterior <= din; end if; if din = '1' and dato_anterior = '0' then dout <= '1'; else dout <= '0'; end if; end process; --------------------------Forma correcta: parte combinacional fuera del proceso. --------------parte secuencial process (reset_N, clk, din) begin if reset_N = '0' then dato_anterior <= '0'; elsif clk'event and clk = '1' then dato_anterior <= din; end if; end process; --parte combinacional dout <= '1' when dato_anterior = '0' and din = '1' else '0';

También podría gustarte