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 |
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 |
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:
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.
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.
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.
Los identificadores pueden contener caracteres numéricos del '0' al '9', sin que éstos puedan aparecer al principio.
No puede usarse como identificador una palabra reservada por VHDL.
| Palabras reservadas |
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 |
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 |
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:
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.
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.
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 |
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 |
| OPERADORES RELACIONALES | = / < <= > >= | Tipo de operador: cualquier
tipo |
| 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 |
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:
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 |
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 |
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. |
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. |