VHDL/Elementos básicos del lenguaje
De Wikilibros, la colección de libros de texto de contenido libre.
Tabla de contenidos |
Antes de comenzar es preciso conocer algunos elementos básicos del lenguaje VHDL.
[editar] Comentarios
Los comentarios van precedidos de dos guiones. En una línea se ignorará todo aquello que vaya después de dos guiones seguidos. Ejemplo:
--Esto es un comentario
[editar] Señales, variables y constantes
[editar] Tipos de datos
Además del tipo BIT visto antes, los datos pueden ser:
- Escalares: enumerados, enteros, flotantes, físicos
- Compuestos: matrices, records
- Ficheros
[editar] Ejemplos de escalares enumerados
TYPE std_logic IS ('X','0','1','Z','U');
El tipo std_logic es uno de los más usados en VHDL, una señal de este tipo podría tener varios estados, mientras que si fuera de tipo bit sólo podría tener dos, algunos de estos estados extra se usan para indicar valor desconocido (X), no inicializado (U) o alta impedancia (Z). Para conocer el resto de estados se puede consultar el paquete Standard Logic.
Subtipos:
SUBTYPE temperatura IS RANGE -25 TO 45 OF INTEGER
La palabra reservada TO indica que el rango comienza por -25 y va aumentando hasta llegar a 45, su complementaria sería DOWNTO para indicar que disminuye.
La declaración para usarlo sería:
a: IN temperatura;
La palabra reservada IN quiere decir que la señal a será de entrada, por lo tanto dentro del módulo donde sea declarada no podrá ser escrita. OUT, lógicamente, indica que es de salida. También se pueden usar INOUT para una señal de entrada y salida y BUFFER también para entrada y salida, pero usando un buffer.
[editar] Ejemplos de flotantes
TYPE real IS RANGE -1.0E38 TO +1E38; TYPE voltaje IS RANGE 5.5 TO 14;
[editar] Ejemplos de tipo físico
--definición TYPE distancia IS RANGE 0 TO 1E16 UNITS A; nm=10A; um=1000nm; mm=1000um; cm=10mm; m =1000mm; km=1000m; END UNITS --utilización a<=10cm; b<=1m; c<=a+b; --c valdría 110cm
El usar unidades no tiene mucho sentido en los tipos de descripción vistos anteriormente. Pero si son muy útiles a la hora de las simulaciones y para ayudar a la depuración.
[editar] Ejemplos de tipos compuestos
Un array sería:
TYPE bus_direcciones IS ARRAY (0 TO 63) OF BIT;
Una matriz:
TYPE matriz IS ARRAY (1 TO 10, 1 TO 20) OF REAL; ... m1:matriz; ... m1(7,1)<=3.3;
Un record:
TYPE fecha is RECORD dia: INTEGER RANGE 1 TO 31; mes: INTEGER RANGE 1 TO 12; otro: BIT; END RECORD;
La declaración sería:
ayer, hoy: fecha;
Su uso dentro del programa sería:
hoy.dia<=20; hoy.mes<=12; ... ayer<=(10,12,'0'); ... hoy<= (otro=>'0', dia=>21, mes=>11); --esto permite asignaciones desordenadas ... ayer<=(otro=>'0', OTHERS=>9); --dia y mes valdrían 9
[editar] Bases
Para escribir un número se puede hacer en binario, octal, decimal y hexadecimal.
- Para vectores de bits:
- "01111" binario
- O"17" octal
- X"F" hexadecimal
- Para enteros y reales:
- 2#1100# binario
- 12 decimal
- 16#C# hexadecimal
[editar] Operadores
Los operadores que proporciona el lenguaje son:
- Lógicos
- AND
- OR
- NAND
- NOR
- XOR
- XNOR
- NOT
- Relacionales
- == igualdad
- /= distinto
- > mayor que
- >= mayor o igual
- < menor que
- <= menor o igual (también puede ser asignación de señales)
- Sumandos
- + suma
- - resta
- & concatenación
- Desplazamientos (incluidas en la revisión de 1993)
- SLL shift left logic, desplazamiento lógico a la izquierda
- SRL shift right logic, desplazamiento lógico a la derecha
- SLA shift left arithmetic, desplazamiento aritmético a la izquierda
- SRA shift right arithmetic, desplazamiento aritmético a la derecha
- ROL rotate left, rotación a la izquierda
- ROR rotate right, rotación a la derecha
- Multiplicando
- *
- /
- MOD
- REM
- Otros
- ABS valor absoluto
- ** exponente
Hay que decir que no todos los operadores pueden funcionar sobre todos los tipos de datos. También hay operadores que en determinadas circunstancias no pueden ser utilizados, por ejemplo al hacer código sintetizable no es recomendable usar multiplicadores.
A continuación se muestran ejemplos sobre los operadores de desplazamiento:
--inicialmente a vale 1100 1101 a ssl 4 --el resultado es 1101 0000 a sla 4 --el resultado es 1101 1111 (extensión del último bit) a srl 4 --el resultado es 0000 1100 a sra 4 --el resultado es 1111 1100 a rol 4 --el resultado es 1101 1100 (los primeros 4 bits pasan a la última posición) a ror 4 --el resultado es 1101 1100
El orden de preferencia, de mayor a menor es:
- **, ABS, NOT
- *, /, MOD, REM
- +, - (signo)
- +, -, & (operaciones)
- =, /=, <, <=, >, >=
- AND, OR, NAND, NOR, XOR

