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