Objetos, tipos de datos y operaciones

 

Objetos 1 2 Identificadores
Palabras reservadas 3 4 Símbolos especiales
Tipos de datos 5 6 Expresiones y operadores
Atributos de los vectores 7

 

Objetos

Inicio de la página

    En un lenguaje de descripción de software (SDL) una variable contiene un valor y puede aceptar un nuevo valor a través de una asignación secuencial. Por otro lado, las constantes tienen valores prefijados a lo largo de toda la ejecución del programa. Sin embargo, en VHDL se hace necesaria la utilización de un nuevo tipo de objeto que puede emular las asignaciones concurrentes propias de los circuitos eléctricos reales; este nuevo tipo de objeto son las señales.

    Un objeto en VHDL es un elemento que tiene asignado un valor de un tipo determinado. Según sea el tipo de dato, el objeto poseerá un conjunto de operaciones que se le podrán aplicar. En general, no será posible realizar operaciones entre dos objetos de distinto tipo, a menos que definamos previamente un programa de conversión de tipos.

 

 

Identificadores

Inicio de la página

    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 comprensión del código.

    Las reglas a tener en cuenta a la hora de elegir un identificador son:

item01.gif (370 bytes)Los identificadores deben empezar con un carácter alfabético, no pudiendo terminar con un carácter subrayado, ni tener dos o más de estos caracteres subrayados seguidos.

item01.gif (370 bytes)VHDL identifica indistintamente tanto las mayúsculas como las minúculas, pudiéndose emplear por igual el identificador "sumador" o "SUMADOR". Pulsa aquí para ir a la práctica del sumador, donde se demuestra la indiferencia de mayúsculas y minúsculas.

item01.gif (370 bytes)El tamaño o extensión del identificador no está fijado por VHDL, siendo recomendable que el usuario elija un tamaño que confiera sentido y significado al identificador, sin llegar a alcanzar longitudes excesivamente largas.

item01.gif (370 bytes)Los identificadores pueden contener caracteres numéricos del '0' al '9', sin que éstos puedan aparecer al principio.

item01.gif (370 bytes)No puede usarse como identificador una palabra reservada por VHDL.

 

 

Palabras reservadas

Inicio de la página

    Las palabras reservadas son un conjunto de identificadores que tienen un significado específico en VHDL. Estas palabras son empleadas dentro del lenguaje a la hora de realizar un diseño. Por esta razón 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 else nand return
access elsif new select
after end next severity
alias entity nor signal
all exit not subtype
and file null then
architecture for of to
array function on transoprt
asser generate open type
attribute generic or units
begin guarded others until
block if out use
body in package variable
buffer inout port wait
bus is procedure when
case label process while
component library range with
configuration linkage record xor
constant loop register
disconnect map rem
downto mod report

 

 

Símbolos especiales

Inicio de la página

    Además de las palabras reservadas empleadas como identificadores predefinidos, VHDL utiliza algunos símbolos especiales con funciones diferentes y específicas, tales como el símbolo "+" se utiliza para representar la operación suma y, en este caso, es un operador. El símbolo "- -" es empleado para los comentarios realizados por el usuario, de tal forma que el programa al encontrar una instrucción precedida por "- -" la saltará ignorando su contenido. De esta forma, el programador puede hacer más comprensible el código del programa.

    Los símbolos especiales en VHDL son:

+ - / ( ) . , : ; & ' < > = | # <= => := --

    Para finalizar, recordar  que el símbolo más empleado por un programador es el " ; ", símbolo que debe finalizar todas y cada una de las líneas del código dando por terminada dicha sentencia en el programa.

 

 

Tipos de datos

Inicio de la página

    El tipo de datos es un elemento básico en VHDL, ya que delimita que valores puede tenr un objeto y que operaciones podemos realizar con él. Aparte de los tipos ya creados, podemos crear nuevos tipos y subconjuntos de tipos.

    La declaración de un tipo de datos es la sentencia VHDL utilizada para introducir un nuevo tipo. Esta declaración está formada por un identidificador que nos permitirá usar el nuevo tipo al llamarlo y la descripción del conjunto de valores que forman el tipo de datos. Para ello usamos la palabra reservada type. La declaración 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 demás, aunque estén declarados de la misma forma, por lo cual no podemos asignar a una señal de un tipo otra de otro tipo distinto, a menos que definamos una función de transformación.

    Los tipos pueden ser clasificados según las características de lo que van a determinar:

item01.gif (370 bytes)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 paréntesis 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 ningún valor inicial, el objeto se inicializa con el valor más a la izquierda de los especificados en la declaración del tipo. Es decir, un objeto del tipo "vocales" toma el valor 'a' por defecto.

item01.gif (370 bytes)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 ningún valor inicial, el objeto se inicializa con el valor más a la izquierda de los especificados en la declaración 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.

item01.gif (370 bytes)Tipos fisicos: Sirven para representar magnitudes del mundo real como el tiempo, peso, capacidad,... por lo que llevan, aparte de un literal numérico, la magnitud física 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 ningún valor inicial, el objeto se inicializa con el valor más a la izquierda de los especificados en la declaración 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.

 

Expresiones y operadores

Inicio de la página

    La metodología de programación  de un  componente, basada en la descripción por comportamiento (behavioral), puede emplear en su diseño la mayoría de operadores que se encuentran  habitualmente útiles en los SDL's ( software design languages)

    En el cuadro adjunto se puede ver una relación de los operadores predefinidos más empleados en VHDL, así mismo se aprecia que su clasificación atiende al tipo de dato que vaya a manejar:

OPERADORES LÓGICOS NOT, AND, OR,
NAND, NOR, XOR

Tipo de operador: boolean
Tipo de resultado: boolean

OPERADORES RELACIONALES =  /  <  <=  >  >=

Tipo de operador: cualquier tipo
Tipo de resultado: boolean

OPERADORES ARITMÉTICOS +  -  *  /  **
  MOD, REM, ABS
Tipo de operador: integer, real, signal
tipo de resultado: integer, real,signal
OPERADOR CONCADENACIÓN & Tipo de operador: array
tipo de resultado: array

    Los operadores lógicos, pueden ser empleados con los tipos predefinidos, BIT y BOOLEAN, dándonos como resultado un valor booleano del mismo tipo que los operadores.
    Para graficar un poco la importancia de emplear correctamente los distintos tipos de operadores, a continuación lo ilustramos con la ayuda del diseño de un sumador de cuatro bits mas el carry de la etapa anterior. Pulsa aquí para ir a la práctica del Cuádruple Sumador Total.

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;
end if;
sum<=aux;
end process;
end archisumador;
En este ejemplo se aprecia una concatenacion del lemento "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 utilización del operador suma "+", que lo empleamos para incrementar a la variable aux, en caso de que cin valga uno.

    Los operadores relacionales también 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 combinación "   /=   ".
   Los operandos de tipo aritméticos están en la obligación 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 añade uno,(como se aprecia en el anterior ejemplo).
    El operador concadenacíon es empleado para concadenar arrays de bit´s, como muestra se grafíca 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.

Atributos de los vectores

Inicio de la página

    Un atributo nos proporciona información sobre ciertos elementos como las entidades, arquitecturas, tipos y señales. Hay varios atributos de para señales que son muy útiles en síntesis, y especialmente en el VHDL simulable (no sintetizable). Ai ae trabaja con VHDL sintetizable sólo se pueden utilizar algunos atributos como:

item01.gif (370 bytes)Atributo 'left: se usa para manejar al elemento más a la izquierda de un vector.

if entrada'left='0' then ... Si el elemento más a la izquierda de entrada es '0', entonces se ejecuta lo que sigue al then

item01.gif (370 bytes)Atributo 'right: se usa para manejar al elemento más a la derecha de un vector.

if entrada'right='1' then ... Si el elemento más a la derecha de entrada es '1', entonces se ejecuta lo que sigue al then

item01.gif (370 bytes)Atributo 'length: se usa para manejar la longitud de un vector.

if entrada'lenght=5 then ... Si la longitud de entrada (se supone, lógicamente, que es un array o vector) es 5, entonces se ejecuta lo que sigue al then.

item01.gif (370 bytes)Atributo 'event: se usa para conocer si una variable ha cambiado o no, soliéndose usar como variable booleana:

if entrada'event=5 then ... Si hay un cambio en el nivel lógico de la señal entrada, entonces se ejecuta lo que sigue al then.

 

ÍndiceLección anterior: Unidades básicas de diseñoPrincipio de la páginaLección siguiente: Gramática del lenguaje I