Sei sulla pagina 1di 14

Bloque 3

SENTENCIAS SECUENCIALES SENTENCIAS CONCURRENTES Y SUBPROGRAMAS EN VHDL

SENTENCIAS
Las Sentencias: => Tipos de sentencia: - Sentencias concurrentes: - Se ejecutan al mismo tiempo (en paralelo). - No hay prioridad entre unas y otras. - Describen paralelismo. - El comportamiento es independiente del orden en el que son escritas. - Las sentencias concurrentes equivalen a procesos. - Forman el cuerpo de las arquitecturas y bloques y pueden aparecer en las entidades. - Sentencias secuenciales: - Se ejecutan ordenadamente, una despus de otra. - El orden de las sentencias es relevante. - Las sentencias que se encuentran dentro de los procesos son secuenciales. => Palabras clave de VHDL k son como se agrupan y tal (No puesto en los apuntes)

- Palabra clave:
No soportada en sntesis

- Palabra clave:
Ignorada en sntesis

* Aadidas en VHDL 93

Contar lo de las etiquetas


1

1. SENTENCIAS SECUENCIALES
- Permiten describir un modelo de forma algortmica. - Slo pueden utilizarse en procesos o en los cuerpos de subprogramas. - Se ejecutan secuencialmente, una sentencia se ejecuta completamente antes de pasar a la siguiente. - VER AL FINAL DE ESTE APARTADO EL FUNCIONAMIENTO DE UN PROCESO Sentencias Secuenciales: Wait Asignaciones: De seal. De variable. Sentencias de control: If Case loop, next,exit. Assert Report

1.1 Sentencia Wait.


- Permite determinar el punto donde debe suspenderse la ejecucin de un proceso y en qu condiciones se debe reactivar. Cuando se cumple la condicin, se reactiva y continua ejecutndose desde el wait - En un proceso pueden existir varias sentencias wait (incompatible con lista de sensibilidad) - Modos de uso: wait; wait on seal_1 {seal_2, ...} ; wait for expresin_temporal; wait until condicin_booleana 1) wait Suspende el proceso para siempre. 2) wait on + lista de seales. El proceso se suspende hasta que aparece un evento en una o varias seales de la lista. Lista de sensibilidad dinmica. Las seales determinan la sensibilidad del proceso. No sintetizable 3) wait until + expresin_booleana. El proceso se suspende hasta que la condicin pase de falso a cierto. Se emplea para modelar circuitos secuenciales activos por flanco. Si aparecen varias de estas sentencias en un mismo proceso todas ellas deben ser idnticas (modelado FSMs). Es soportado en sntesis. 4) wait for + expresin_temporal El proceso se suspende durante el tiempo indicado. til para modelado de estmulos en bancos de prueba. Es ignorado por la sntesis.

1.2 Asignaciones
- Asignar un valor a una seal es darle un valor a la misma Sintaxis:
nombre_seal <= [ transport] forma_de_onda {after expresion tiempo};

Se puede indicar la cantidad de tiempo que debe transcurrir antes de que la seal tome el valor. Este retardo puede modelarse de tres formas distintas: Delta: Modo por defecto si no se especifica ningn tiempo. Transporte: indica el retardo de propagacin solamente. Inercial: indica el retardo de propagacin y la anchura de pulso mnima. 1) Retardo delta. Es el modo de retardo de propagacin en las asignaciones a seal por defecto La seal toma el valor aplicado despus de un retardo delta. Delta es una unidad de tiempo infinitesimal. Las asignaciones de seal NO tienen lugar inmediatamente. Un retardo delta no implica actualizar el tiempo de simulacin pero si realizar un nuevo ciclo de simulacin. Da soporte al modelado de ejecucin concurrente. Permite obtener el valor que toman las seales independientemente del orden de ejecucin de los procesos. Output <= not Input; 2) Retardo transporte. El retardo transporte debe especificarse explcitamente por medio de la palabra clave transport. La seal tomar el nuevo valor despus del tiempo indicado. Output <= transport not (Input) after 10 ns; 3) Retardo inercial. Se indica el tiempo de propagacin y la anchura del pulso: seal <= [reject expresin_temporal] inertial forma_de_onda;

Output <= not Input after 10 ns;

- Ejemplo de inversor con inercia menor que el retardo de propagacin Output <= reject 5 ns inertial not (Input) after 10 ns;

El inversor tiene un tiempo de propagacin de 10 ns eliminando los pulsos deduracin inferior a 5 ns. En sintesis: - After y Transport se ignoran - Reject y Inertial no estn soportados

La asignacin del valor a una variable es inmediata


3

1.3 Sentencias de Control


1.3.1 Sentencia if - Permite desviar el flujo de la ejecucin. - Sintaxis: if condicin_booleana then sentencias_secuenciales elsif condicin then sentencias_secuenciales else sentencias_secuenciales end if; Admite 0 o ms clusulas elsif. Se permite el anidamiento. 1.3.2 Sentencia case. - Permite seleccionar el grupo de sentencias que deben ejecutarse entre un conjunto de posibilidades. Sintaxis: case expresin is when eleccin => sentencias_secuenciales when eleccin => sentencias_secuenciales end case; Las alternativas son excluyentes (slo se debe satisfacer una). 1.3.3 Sentencia loop. Permite ejecutar un grupo de sentencias secuenciales de forma repetitiva. La sentencia bsica es loop. Hay tres formas de crear un bucle. Con loop: siempre se obtiene un bucle infinito. Con for: siempre se obtiene un bucle finito. Con while: el bucle puede ser finito o infinito segn la sentencia asociada. Sintaxis: [for control_repeticion][while condicin] loop secuencia_de_sentencias end loop ; - Bucle con for Sintaxis. for indice in rango loop secuencia_de_sentencias end loop - Permite ejecutar un bucle un nmero determinado de veces. - El ndice es una variable discreta (enumerada o entera) que no se declara y que cambia en una unidad por cada ejecucin del bucle a lo largo del rango especificado. - En sntesis slo estn soportados los bucles for con rango entero y esttico. Indice y rango deben ser enteros genricos, constantes.

- Bucle con while Sintaxis: while condicin_booleana loop secuencia_de_sentencias end loop; El bucle se ejecuta mientras la condicin booleana sea cierta. No resulta ventajoso respecto a for-loop.

Sentencia exit. Sintaxis: [label:] exit [etiqueta_bucle ] [ when condicin ] ; Permite finalizar la ejecucin de un bucle. Si existen varios bucles anidados exit sale del bucle ms interno en el que se encuentre o del bucle cuya etiqueta se especifique. Se puede utilizar en cualquiera de los tres tipos de bucles. Sentencia next. Sintaxis. [label:] next [etiqueta_bucle ] [ when condicin ] ; Permite saltar a la siguiente iteracin dentro de un bucle. Se puede utilizar en cualquiera de los tres tipos de bucles. La condicin y la etiqueta tienen el mismo uso que en exit.

1.4 Sentencia assert.


- Se emplea para comprobar condiciones y generar informes en funcin de su cumplimiento. - Se utiliza tanto en estructuras concurrentes como secuenciales. - Utilidades: - Permiten mostrar informacin durante la simulacin: - Comprobar las violaciones de tiempos en los circuitos. - S la condicin_booleana no se cumple se enva la expresin_del_informe. - Sintaxis:
assert condicin_booleana report[expresin del informe][severity valor];

- El nivel de severidad: note, warning, error, failure (error por defecto) - Segn el grado de severidad se puede interrumpir la simulacin. - S no se usa report el mensage es Assertion violation
C <= A after t_delay when (S='0') else B after t_delay; assert (S='0' or S='1') report Valor desconocido en S" severity error;

1.5 Sentencia report.


- Slo se utiliza en estructuras secuenciales. - Por defecto el valor de severidad es note. [etiqueta:] report expresin [ severity expresin ] - Sentencia null: - Se utiliza para indicar que no se debe realizar ninguna accin - Sintaxis. [ label:] null
5

1.6 PROCESOS
Son sentencias concurrentes que definen su comportamiento a travs de sentencias secuenciales. Las instrucciones dentro del proceso se ejecutan secuencialmente, una detrs de otra, pero sin dar lugar a que avance el tiempo durante su ejecucin
[etiqueta: ] [postponed] process [( lista_sensibilidad) ] [ is ] declaracin_subprogramas cuerpo_subprogramas declaracion_tipos declaracion_subtipos declaracin_constantes declaracin_variables declaracin_ficheros declaracin_alias declaracion_atributos especificacion_atributos clausula use declaracin_plantilla_grupos declaracin_grupos begin {sentencias_secuenciales}; end [postponed] process [ etiqueta] ;

Los procesos se disparan (su cdigo se ejecuta) cuando cambia alguna de las seales en su lista de sensibilidad Conjunto de seales que al producirse un evento en ellas puede lanza el proceso - El tiempo slo avanza cuando el proceso se suspende, es decir, cuando termina o llega a un wait. La sentencia wait suele fijar las condiciones para despertar al proceso. No pueden coexistir la lista de sensibilidad y la sentencia wait - Cuando un proceso se suspende: Se vuelve a ejecutar cuando haya otro evento en una de sus seales de la lista de sensibilidad o cuando se cumpla la condicin del wait (se sigue ejecutando a partir del wait) - Las seales modelan hilos del circuito, slo pueden cambiar de valor si se deja que avance el tiempo y como el tiempo solo pasa cuando se suspende un proceso Las seales solo pueden cambiar cuando se suspende el proceso

Una arquitectura puede tener tantos procesos como queramos, y todos se van a ejecutar en paralelo - Esta es la manera que tiene VHDL de expresar la concurrencia inherente al hardware - Los simuladores VHDL slo trabajan con procesos. Las declaraciones realizadas en los procesos son locales. - Las variables declaradas en un proceso no pierden su valor una vez finalizado el proceso. - Las variables slo se inicializan al comienzo de la simulacin. - Lista de sensibilidad: Conjunto de seales que pueden despertar al proceso cuando se produce un evento en alguna de ellas. - En modelos de circuitos combinacionales se deben incluir todas las seales de entrada. - En circuitos secuenciales se deben incluir la seal de reloj y las seales asncronas. Si la lista de sensibilidad est incompletamente definida los resultados de simulacin y sntesis pueden ser distintos.

2. SENTENCIAS CONCURRENTES
Permiten modelar el paralelismo del hardware. Tipos: Asignaciones concurrentes a seal. Procesos (ya estudiados). Instanciacin de componentes. Sentencia generate. Bloques. Sentencia assert concurrente.

2.1 Asignacin concurrente a seal


En una asignacin concurrente la seal que est a la izquierda de la asignacin es evaluada siempre que alguna de las seales de la derecha modifiquen su valor Pero no actualiza su valor de forma inmediata. Sintaxis:
nombre_seal <= [ transport] forma_de_onda {after expresin tiempo};

- Ejemplo sumador elemental s<= a xor b xor c_in; c_out<= (a and b) or (a and c_in) or (b and c_in); => Asignaciones a seal en la sntesis. Las asignaciones concurrentes de seal tienen restricciones: Toda clusula after ser ignorada. No se permiten mltiples formas de onda. No se permiten especificaciones de deteccin de flancos de reloj. La clusula unaffected no est soportada. Las clusulas transport, guarded y otros mecanismos de retardo se ignoran. Se permiten asignaciones concurrentes: Condicionales: equivalen a un proceso con sentencias if. Con seleccin: equivalen a un proceso con sentencias case. => Asignacin a seal concurrente condicional: Asigna el valor a la seal cuando se cumple la condicin booleana Se usa mediante when nombre_seal <= [ transport] {forma_de_onda when expresin_booleana else} [forma_de_onda when expresin_booleana ]; => Asignacin a seal concurrente con seleccin. Asigna el valor a la seal cuando se cumple la expresion Se usa mediante when with expresin select nombre_seal <= [ transport] forma_de_onda when valor forma_de_onda when valor; Cuando valor = expresin asigna la forma de onda correspondientes

2.2 Componentes
Representa una entidad declarada en un diseo o librera. Para poder utilizar la entidad es necesario llamar a la librera y al paquete dentro del cual se encuentra. Permiten realizar descripciones estructurales. Sintaxis de la declaracin de componentes. component identificador [is] [ genenic (lista_genricos);] [ port (lista_puertos);] end component [identificador]; - Sirve para declarar una entidad que vamos a usar de otra librera para luego instanciarla => Instanciacin: Una vez declarado el componente de una entidad de una librera, podemos utilizar dicha entidad en nuestro cdigo instancindola cuantas veces queramos (Descripcin estructural) Instanciacin de componentes: Es una instruccin concurrente que especifica la interconexin de las seales del componente dentro del diseo en el que est siendo utilizado. Sintaxis. etiqueta_referencia: nombre_componente [ genenic map lista_asociacin]; [ port map lista_asociacin]; - Ejemplo:

- VHDL- 93 permite referenciar un componente sin haberlo declarado con anterioridad. No hace falta declarar la entidad con la sentencia component Para ello escribimos: a1: entity puerta_y generic map (14 ns); port map (s2,din,ctrla);

2.3 Sentencia Generate.


La sentencia generate sirve para generar trozos de cdigo concurrentes muchas veces Facilita la creacin de estructuras regulares de componentes. Permite reducir porciones de cdigo repetitivas o dependientes de una condicin. Permite realizar mltiples copias de elementos iguales. Puede incluir otras sentencias concurrentes, incluyendo otras sentencias generate. Admite dos modalidades: Bucles for. Condiciones if. => Modo for. Todos los objetos creados son similares El rango (especificacin_for) debe ser discreto y no es visible fuera de esta sentencia. Los bucles NO pueden interrumpirse. for especificacin_for generate [ parte_declarativa] begin sentencias concurrentes end genetate ; Dentro de las sentencias concurrentes podremos instanciar componentes o cualquier otro tipo de sentencias concurrentes Ejemplo: => Modo if. La instruccin se realiza si la condicin de prueba es cierta. Permite la creacin condicional de componentes. No se pueden emplear clusulas else o elsif dentro del esquema condicional. Sintaxis. if expresin_booleana generate [ parte_declarativa] begin sentencias concurrentes end genetate;

Ejemplo:

2.4 BLOQUES. La sentencia block es una forma de reunir o agrupar sentencias concurrentes. Proporcionan un mecanismo de particionar una arquitectura. Favorecen la legibilidad y estructuracin de los diseos. Los objetos slo son visibles por las sentencias englobadas en la sentencia block. Los bloques se pueden anidar para definir una particin jerrquica. Sintaxis: identificador: block [condicion_guarda] [is] [parte_declarativa] begin {sentencias concurrentes} end block [ indentificador]; Ejemplo:

10

3. SUBPROGRAMAS
- Se utilizan para escribir algoritmos reutilizables. - Permite agrupar cdigo para no repetirlo muchas veces. - Ayudan a mejorar la descripcin y legibilidad de los modelos. - Son similares a los subprogramas de los lenguajes software. - Pueden estar en los paquetes y en la parte declarativa de las arquitecturas. - Tipos: Funciones. Procedimientos.

3.1 FUNCIONES
No se pueden modificar seales o variables externas a la funcin. Slo puede leer los parmetros que se le pasan. Siempre han de devolver un valor. Se ejecutan en tiempo nulo No transcurre tiempo entre la llamada a la funcin y la devolucin del resultado. Los parmetros se asocian por posicin. Puede contener mltiples sentencias return. En la parte declarativa se declaran constantes y variables. Cuando se ejecuta la funcin se inicializan las variables. Sintaxis. Declaracion de la funcin. function nombre_funcin [(lista_parametros)]return tipo_retorno; Definicin del cuerpo de la funcin. function nombre_funcin [(lista_parametros)]return tipo_retorno is;
{parte declarativa} begin {sentencias secuenciales} end [function][nombre_funcion];

Ejemplo: function add_bits (a, b : in bit) return bit is variable result : bit; begin result := (a xor b); return result; end add_bits2;

11

3.2 PROCEDIMIENTOS
Pueden modificar datos (parmetros o datos externos). Puede retornar mltiples valores. Los parmetros formales que se pasan pueden ser de tres tipos: In solo pueden leerse. Out (seales y variables) slo se puede hacer una asignacin sobre ellos. Inout (seales y variables) se pueden leer y variar su valor. En la parte declarativa se declaran constantes y variables. Cuando se ejecuta el procedimiento se inicializan. Asociacin de parmetros por posicin o nombre. Pueden utilizar return, sin ir acompaado de una expresin. Sintaxis. - Declaracion del procedimiento. procedure nombre_procedimiento [(lista_parametros)] ; - Definicin del cuerpo del procedimiento procedure nombre_ procedimiento [(lista_parametros)] is; {parte declarativa} begin {sentencias secuenciales} end [procedure ][nombre_ procedimiento ]; - Ejemplo

12

3.3 SOBRECARGA DE SUBPROGRAMAS. Dos subprogramas estn sobrecargados cuando tienen el mismo nombre y diferentes perfiles (nmero, orden y tipo de sus parmetros). Ejemplo: FUNCTION "and" ( l,r : std_logic_vector ) RETURN std_logic_vector; FUNCTION "and"( l,r : std_ulogic_vector ) RETURN std_ulogic_vector; function "+" (A, B: integer) return integer; function "+" (A, B: bit_vector) return bit_vector; VHDL permite declarar varios subprogramas con diferentes parmetros Se dice que el subprograma est sobrecargado El lenguaje usa un subprograma u otro, dependiendo de los parmetros y tipos usados. Todos los operadores predefinidos estn sobrecargados. VHDL no permite que se realicen mltiples asignaciones concurrentes a una seal OBVIO !! - Si pueden ser mltiples asignaciones secuenciales. VHDL permite definir seales que pueden tomar su valor de diferentes fuentes (resolved signals). Son las que tienen una funcin de resolucin (resolution function).

- Una funcin de resolucin es aquella que: 1- Toma como entrada un vector unidimensional no restringido con los valores de todas las fuentes de la seal resuelta y 2 - devuelve el valor que debe recibir la seal. Cada vez que se hace una asignacin a esa seal se llama a la funcin. El nmero de elementos del vector es igual al nmero de fuentes que tenga la seal. Las fuentes de una seal vienen determinadas por las sentencias de asignacin y por las salidas de los componentes conectados a la seal.

13

- Se puede asignar una funcin de resolucin a un subtipo de datos, de forma que las seales de este subtipo no deben especificar la funcin de resolucin.

(El siguiente apartado no se a cuento de que viene) ALIAS


Permiten dar nombres alternativos a un objeto o a una parte de l. alias identificador:indicacin_de_subtipo is nombre;

14

Potrebbero piacerti anche