ELEMENTOS LEXICOS

Anuncio
ELEMENTOS LEXICOS
• Comentarios: cualquier texto que empiece por ‘--’
-- esto sería un comentario
• Identificadores: dan nombre a los elementos del VHDL. Reglas para formar
un identificador:
- No tienen longitud máxima.
- puede contener caracteres del a ‘A’ a la ‘Z’, de la ‘a’ a la ‘z’, caracteres
numéricos de ‘0’ al ‘9’ y el carácter subrayado ’_’.
- No se diferencia entre mayúsculas y minúsculas (CONTADOR,
contador y ConTadoR son el mismo identificador.)
- Debe empezar por un carácter alfabético, no puede terminar con un
subrayado, ni puede tener dos subrayados seguidos.
- Existen los identificadores extendidos (VHDL93): admiten cualquier
carácter y diferencian mayúsculas de minúsculas si se encuentran
entre dos caracteres ’\’.
- No puede usarse como identificador una palabra reservada
Correctos: Puerta_and_7_entradas, REloj, salida_2
Incorrectos: puerta__and, clock$entrada, 6inputs, sal_
Extendidos correctos: \puerta__and\, \clock$entrada\,\6inputs\,\sal_\
ELEMENTOS LEXICOS
• Palabras reservadas:
abs, access, after, alias, all, and, architecture, array, assert,
attribute, begin, block, body, buffer, bus, case, component,
configuration, constant, disconnect, downto, else, elsif, end, entity,
exit, file, for, function, generate, generic, group, guarded, if, impure,
in, inertial, inout, is, label, library, linkage, literal, loop, map, mod,
nand, new, next, nor, not, null, of, on, open, or, others, out, package,
port, postponed, procedure, process, pure, range, record, register,
reject, rem, report, return, rol, ror, select, severity, shared, signal,
sla, sll, sra, srl, subtype, then, to, transport, type, unaffected, units,
until, use, variable, wait, when, while, with, xnor, xor
• Delimitadores:
Se utilizan en operaciones y sentencias:
Simples: & ‘ ( ) * + , - . / : ; < = > |
Dobles: => ** := /= >= <= <>
ELEMENTOS LÉXICOS
Números:
Enteros literales (su valor se obtiene directamente de su representación
literal):
45 0 129
el -5 no es un entero literal, es una combinación de not y 5
En coma flotante:
29E2 5e4 12e00
Reales literales:
64.9 0.0 3.14159
En coma flotante
23.87e-2 419.133E12
Representación en otras bases (entre 2 y 16):
Enteros
2#11101001# 16#e2f1a# 8#7105#
Reales
2#11.1# 16#3e4.a#
En coma flotante
2#11#e2 16#4#E2 10#1024#e0
ELEMENTOS LÉXICOS
Caracteres:
Se escriben entre comillas simples: ‘a’, ‘Z’, ‘9’, ‘’’
Cadenas:
Se escriben entre comillas dobles: “Cadena”, “Se
puede escribir cuaquier cosa !”%&/()=$.....”,
“Una cadena dentro de una cadena: “”cadena””.”
“Si tuviesemos que escribir una cadena más larga
que una línea”
& “la podemos concatenar con el carácter &”
ELEMENTOS LÉXICOS
Bits Strings:
Secuencia de valores que representan bits (en base 2,
8 o 16):
Ejem:
B”100100110”
b”110111001111”
o”371”
O”1346”
x”AD1”
X”1f”
OBJETOS EN VHDL
•Un objeto en VHDL es un elemento que tiene asignado un valor
determinado.
•Tienen que declararse previamente para ser utilizados.
•Hay cuatro clases de objetos: constantes, variables, señales y
ficheros.
•Las constantes son objetos que mantienen su valor inicial , no pudiendo ser
modificadas una vez que se han creado.
•Proporcionan modelos más inteligibles.
•Proporcionan versatilidad: cambiando la asignación de la constante se actualiza en
todo el modelo
declaracion_constante::=
constant identificador{,...}: subtipo [:=expresion ] ;
constant PI : real := 3.141592 ;
constant CYCLE_TIME : time := 100 ns;
constant num_bits : integer := 8*num_bytes;
OBJETOS EN VHDL
Las variables pueden cambiar de valor en cualquier momento mediante una sentencia
de asignación.
declaracion_variable::=
[shared]variable identificador{,...}:subtipo [:=expresion];
asignacion_variable::=
[label:] identificador:=expresion;
Signo de igual para la
asignación de variables
variable maximo,mínimo:real;
variable indice1,indice2: integer := 0;
variable inicio:time;
Ejemplos de asignación de variables:
indice:=indice+1;
inicio:=2ns;
OBJETOS EN VHDL
•Las señales pueden cambiar de valor en cualquier momento, pero a diferencia de
las variables guardan una analogía con el Hw.
•Se pueden considerar una abstracción de conexiones físicas o buses.
declaracion_señal::=
signal identificador{,...}:subtipo[tipo_señal][:=expresion ];
tipo_señal::= register|bus
Signo de asignación para
señales
asignacion_señal ::=
[label]identificador<=[mecanismo_retardo]forma_de_onda;
forma_de_onda::=(expresion [after expr_tmp]){,...}
signal net1,net2: bit;
signal enable:integer:=0;
reloj<= ‘1’ after t_pw,’0’ after 2*t_pw;
y<= not or_a_b after 5ns;
OBJETOS EN VHDL
•Los ficheros pueden comunicar un diseño con un entrono externo.
•Un uso habitual es almacenar la información de los vectores de prueba en una
simulación y/o almacenar los resultados de la misma .
•En el paquete textio y en la biblioteca standard se definen tipos de datos,
operaciones, tipos de acceso etc. para trabajar con ficheros de texto.
declaracion_fichero::=
file identificador{,...}:tipo[[open tipo_acceso] is “nombre”];
file vectores_in:bit open read_mode is “datos.in”;
file salida:integer open write_mode is “resultados.txt”;
TIPOS DE DATOS EN VHDL
•El VHDL es un lenguaje fuertemente tipado: un objeto solo puede asumir valores
del tipo en que ha sido declarado.
•Incorpora unos tipos predefinidos (incluidos en la biblioteca standard), ejem:
BOOLEAN, BIT, CHARACTER, INTEGER, REAL, TIME, BIT_VECTOR, STRING,
etc.
•Se pueden crear subtipos como subconjuntos de un tipo determinado
•Se pueden declarar nuevos tipos:
declaracion_tipo::=type identificador is definición_tipo;
TIPOS DE DATOS EN VHDL
Tipos de datos escalares:
Son aquellos cuyos valores están formados por una sola unidad indivisible
(enteros, reales, enumerados y físicos)
Tipos enteros y reales:
Predefinidos INTEGER comprendido entre -231+1 y 231-1 y REAL
comprendido entre -1.0E38 y 1.0E38 con un mínimo de seis dígitos decimales.
Estos rangos pueden aumentar en alguna implementación del lenguaje.
Se puede declarar un nuevo tipo:
nuevo_tipo::= type identificador is range expr_simple
to|downto expr_simple;
type dia is range 1 to 31;
variable dia_hoy:dia:=18;
type nota is range 1.0 to 10.0;
constant num_bits:integer:=16;
type bit_index is range num_bits-1 downto 0;
TIPOS DE DATOS EN VHDL
Tipos físicos:
•Representan medidas del mundo real.
•Llevan asociados una unidad primaria y el resto se definen como múltiplos de ella.
•Se puede declarar un nuevo tipo:
tipo_físico::=
type identificador is range
expr_simple to|downto expr_simple;
units
identificador;
{identificador=literal_físico;}
end units [identificador};
TIPOS DE DATOS EN VHDL
Tipos físicos:
Predefinido TIME (el femto segundo es la mayor resolución):
type TIME is range 0 to segúnimplementacion (1E20)
units
fs; -- femtosegundo
ps = 1000 fs; -- picosegundo
ns = 1000 ps; -- nanosegundo
¡ATENCIÓN!
us = 1000 ns; -- microsegundo
ms = 1000 us; -- milisegundo
sec = 1000 ms; -- segundo
min = 60 sec; -- minuto
hr = 60 min; -- hora
end units;
variable duracion :time:= 3sec;
duración:=duracion*4; -- 12 segundos
TIPOS DE DATOS EN VHDL
Tipos físicos:
Ejemplo:
type resistencia is range 0 to 1e9
units
ohmio;
Kohmio =1000 ;
Mohmio =1000 Kohmio ;
end units resistencia;
TIPOS DE DATOS EN VHDL
Tipos enumerados:
•Se indica un conjunto de valores posibles del tipo especificado mediante una lista
que contiene todos los valores.
•Proporciona gran nivel de abstracción al permitir codificar valores de señales.
•Se puede declarar un nuevo tipo:
tipo_enumerado::=
type identificador is (identificador|carácter{,...});
type funcion_alu is (sumar,restar,multiplicar,or_exclusiva);
variable operacion:funcion_alu;
operacion:=restar;
type piso is (‘1’,primero,’2’,segundo);
TIPOS DE DATOS EN VHDL
Tipos enumerados:
Predefinidos:
type
type
type
type
type
type
boolean is (false,true);
bit is (‘0’,’1’);
severity_level is (note,warning,error,failure);
file_open_kind is (bibliografía...);
file_open_status is (bibliografía...);
character is (... '@','A','B','C‘,'D','E‘, 'F',
...'j','k', 'l', 'm', 'n', 'o',...);
TIPOS DE DATOS EN VHDL
Lógica multivaluada:
•El tipo bit representa los circuitos digitales desde un punto de vista abstracto, aunque no recoge todas situaciones que hay que considerar al
modelar un circuito digital real.
•El IEEE introdujo en 1993 el paquete «std_logic_1164», conocido como
paquete de lógica multivaluada.
type std_ulogic is (‘U’, -- No inicializado
‘X’, -- desconocido fuerte
‘0’, -- cero fuerte
‘1’, -- uno fuerte
‘Z’, -- alta impedancia
Estado lógico de los nodos
‘W’, -- desconocido débil
que no han evolucionado
‘L’, -- cero débil
desde el comienzo de la
‘H’, -- uno débil
simulación
‘-’); -- indiferente
Útil para síntesis
TIPOS DE DATOS EN VHDL
Lógica multivaluada:
Vc=1
Pta Transmisión R≈0
Vout=Vinv
Vin=0; Vinv=0
Vin=1;
=1 fuerte
Vin
Vdd
Vc
i
Vc=0
Pta Transmisión R≈∞
Vout=Z
Vout
v
Corte
Saturado
R pequeña:
I máxima
Vc
Saturado
Corte
R pequeña:
I máxima
X: En un nodo una salida está a 1
y otra a 0
TIPOS DE DATOS EN VHDL
Vcc
Lógica multivaluada:
Vcc
Vin=0
Trt corte
Vin=1
débil
TrtVout=1
saturado
Vout=0 débil
Vout
Vin
W: En un nodo una salida está a L
y otra a H
Como este tipo de datos no esta predefinido en VHDL, hay que incluir en el
diseño el paquete std_logic_1164:
library IEEE;
use IEEE.std_logic_1164.all;
Literales sobrecargados
•Existen literales que están incluidos en varios tipos enumerados, como por ejemplo el ‘0’ que puede ser un elemento
del tipo character, bit, std_ulogic, etc.
•Normalmente se conoce el tipo por el contexto en el que se
está utilizando el literal.
•Para evitar confusiones se puede utilizar la calificación de
tipos :
character’(‘0’) bit'(‘0’) std_ulogic’(‘0’)
SUBTIPOS DE DATOS
Se pueden declarar subconjuntos de valores de un determinado tipo: subtipos
declaracion_subtipo::=
subtype identificador is id_tipo
[range expr_simple to|downto expr_simple];
Ejemplos:
subtype DiaMes is integer 1 to 31;
subtype digito is character ‘0’ to ‘9’ ;
variable mes:integer range 1 to 12;-- declaración implícita
Subtipos predefinidos en VHDL:
subtype natural is integer 0 to entero_mayor;
subtype positive is integer 1 to entero_mayor;
SUBTIPOS DE DATOS
Ejemplo:
type entero_corto is range -128 to 127;
variable parametro:integer;
variable ajuste:entero_corto;
...
parametro:=parametro+ajuste;-- error
Ejemplo:
subtype entero_corto is integer range -128 to 127;
variable parametro:integer;
variable ajuste:entero_corto;
...
parametro:=parametro+ajuste;-- correcto
...
ajuste:=ajuste+parametro;-- ¡cuidado!
TIPOS DE DATOS EN VHDL
Tipos compuestos:
• Consisten en colecciones de datos cuyos elementos pueden ser tratados
individualmente
• Formados por elementos del mismo tipo (vectores) o de distinto (registros).
• Al declarar un objeto compuesto cada elemento se inicializará por defecto según
las reglas que correspondan a su tipo.
Vectores:
tipo_vector::=
type identificador is array (rango_discreto {,...}) of
tipo_objeto;
rango_discreto::=
idicacion_discreta_tipo
| expr_simple (to|downto) expr_simple
TIPOS DE DATOS EN VHDL
Vectores unidimensionales:
Ejemplos:
type byte is array (0 to 7) of bit;
type word is array (15 downto 0) of std_ulogic;
variable dato1,dato2: byte;
variable codigo:word;
dato1:=“11100100”;
codigo (15 to 13):=“0Z0”; -- ’array slice’
dato2:=dato1;
subtype ocho_bits is integer range 0 to 7;
type byte is array (ocho_bits) of bit;
variable salida:byte;
salida(5):=‘0’
TIPOS DE DATOS EN VHDL
Vectores unidimensionales:
Ejemplos:
type modo_contolador is
(inicio,espera,incremento,decremento,error);
type estado_controlador is array (espera to error) of natural;
-- otra forma más clara, al no sobrecargar espera,incremento,etc..
type estado_controlador is array
(modo_controlador range espera to error) of natural;
variable control_ascensor:estado_controlador;
control_ascensor(incremento):=5;
TIPOS DE DATOS EN VHDL
Vectores multidimensionales:
Ejemplos:
type memoria is array (31 downto 0, 0 to 127) of bit;
variable ram,rom:memoria;
ram:=rom;
rom(15,9):=‘1’;
Agregados:
Permiten asignar valores a conjuntos de datos en los vectores:
agregado::= ([posicion{|...}=>]expresion{,...})
type point is array (1 to 3) of real;
variable aux:point:=(1.0,2.3,4.5);
aux:=(1.9,1.2,1.5);
Signo de asignación de
aux:=(1=>5.67,3=>4.9,2=>9.0);
agregados
aux:=(3|2=>4.5,others=>5.6);
TIPOS DE DATOS EN VHDL
Vectores no restringidos:
Son vectores en los que se especifica el rango cuando se declara un objeto (en
una declaración implícita o con subtype).
type identificador is array
(tipo_indice range<>) of tipo_objeto;
type coleccion is array (natural range<>) of integer;
variable datos:coleccion(63 downto 0);
subtype registro is coleccion(0 to 255);
variable buffer_entrada,buffer_salida:registro;
TIPOS DE DATOS EN VHDL
Vectores predefinidos :
type string is array (positive range<>) of character;
constant LCD_display_len:positive:=40;
subtype LCD_dato is string (1 to LCD_display_len);
variable contenido_LCD:LCD_dato:=(others=>’ ‘);
type bit_vector is array(natural range<>) of bit;
subtype byte is bit_vector(7 downto 0);
variable bus1:bit_vector(0 to 31);
type std_ulogic_vector
is array(natural range<>) of std_ulogic;
-- usar library IEEE;use IEEE.std_logic_1164.all;
TIPOS DE DATOS EN VHDL
Registros :
Tipo de datos compuesto formado por elementos de diferentes tipos:
type identificador is record
identificador{,...}:tipo
{...}
end record [identificador];
type tiempo is record
segundos:integer range 0 to 59;
minutos:integer range 0 to 59;
horas:integer range 0 to 23;
end record;
variable inicio,fin:tiempo;
inicio.segundos:=12; -- acceso a un elemento del registro
-- usando agregados
inicio:=(12,7,22);
fin:=(segundos=>45,minutos=>18,horas=>4);
ATRIBUTOS
Es una característica asociada a un elemento del lenguaje (tipos de datos,
señales, procedimientos, entidades,...) que permite extraer información
adicional del mismo.
Identificador’atributo
Atributos de los tipos escalares:
T'base
Tipo base de T.
T'left
Valor más a la izquierda de T.
T'right
Valor más a la derecha de T.
T'low
Valor mínimo de T.
T'high
Valor máximo de T.
T'ascending Verdadero si T riene rango ascendente.
T'image(x) String correspondiente al valor x.
T'value(s) Valor en T representado por el string s.
T'succ(x)
Valor de la posición siguiente a x en T.
T'pred(x)
Valor de la posición anterior a x en T.
T'leftof(x) Valor de la posición izquierda a x en T.
T'rightof(x) Valor de la posición derecha a x en T.
ATRIBUTOS
Ejemplos:
type resistencia is range 0 to 1e9
units
ohm;
Kohm =1000 ohm;
Mohm=1000 kokm;
end units resistencia;
resistencia’left=0
resistencia’right=1e9
resistencia’low=0
resistencia’high=1e9
resistencia’ascending=true
resistencia’image(2 kohm )=“2000 ohm”
resistencia’value(“5 Mohm”)=5_000_000
Ejemplos:
ATRIBUTOS
type indice is range 21 downto 11;
type nivel_logico is (desconocido,bajo,alta_impedancia,alto);
indice’left=21
indice’right=11
indice’low=11
indice’high=21
indice’ascending=false
indice’image(14)=“14”
indice’value(“20”)=20
nivel_logico’left=desconocido
nivel_logico’right=alto
nivel_logico’low=desconocido
nivel_logico’high=alto
nivel_logico’ascending=true
nivel_logico’image(alto)=“alto”
nivel_logico’value(“bajo”)=bajo
nivel_logico’pos(desconocido)=0
nivel_logico’val(3)=alto
nivel_logico’succ(deconocido)=bajo --T’succ(alto): error ...
nivel_logico’pred(alta_impedancia)=bajo
ATRIBUTOS
Atributos de VECTORES:
A'left(n)
A'right(n)
A'low(n)
A'high(n)
A‘range(n)
A‘reverse_range(n)
A‘length(n)
A‘ascending(n)
Valor izquierdo del índice n de A.
Valor derecho del índice n de A.
Valor mínimo del índice n de A.
Valor máximo del índice n de A.
Rango del indice n de A.
Rango del indice n de A invertido.
Número de valores del rango n de A.
Verdadero si el rango del índice de
n de A es ascendente.
type A is array (1 to 4,31 downto 0) of boolean;
A’left(1)=1
A’right(2)=0
A’range(1) is 1 to 4
A’length(1)=4
A’ascending=true
A’left(1)≡ A’left
A’low(1)=1
A’high(2)=31
A’reverse_range(2) is 0 to 31
A’length(2)=32
A’ascending=false
ATRIBUTOS
Atributos definidos por el usuario:
Consiste en asociar nuevos atributos a cualquier elemento del lenguaje:
En primer lugar se declara el atributo:
declaracion_atributo::=
attribute identificador:tipo;
En segundo lugar se asocia al elemento y su valor:
especificacion_atributo::=
attribute identificador of
id_elemento:clase_elemento is expresion;
clase_elemento::=
entity
| architecture
| procedure | function
| constant | signal
| component | label
| group
|
|
|
|
configuration
type
variable
literal
|
|
|
|
package
subtype
file
units
ATRIBUTOS
attribute Num_pin:natural;
attribute codigo:bit_vector;
attribute delay:time;
signal reloj:std_logic;
type operacion is (suma.resta,multiplicacion,division);
attribute
attribute
attribute
attribute
attribute
attribute
Num_pin of reloj: signal is 14;
delay of reloj: signal is 30ns;
codigo of suma : literal is “00”;
codigo of resta : literal is “01”;
codigo of multiplicacion : literal is “10”;
codigo of division : literal is “11”;
retraso:=t_delay+reloj’delay;
variable accion:bit_vector(1 downto 0):=resta’codigo;
EXPRESIONES Y OPERADORES
EXPRESIONES Y OPERADORES
EXPRESIONES Y OPERADORES
Definición de módulo:
a= b*N+(a mod b), con N entero tal que |a mod b| < |b|
signo de (a mod b) = signo de b
Definición de resto:
a=(a/b)*b +(a rem b)
signo de (a rem b) = signo de a
EXPRESIONES Y OPERADORES
A
0
1
2
3
4
5
0
-1
-2
-3
-4
-5
0
1
2
3
4
5
0
-1
-2
-3
-4
-5
B
5
5
5
5
5
5
5
5
5
5
5
5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
-5
A
m o d
0
1
2
3
4
0
0
4
3
2
1
0
0
-4
-3
-2
-1
0
0
-1
-2
-3
-4
0
B
A
re m
0
1
2
3
4
0
0
-1
-2
-3
-4
0
0
1
2
3
4
0
0
-1
-2
-3
-4
0
B
Descargar