You are on page 1of 22

VI.

Especificacin del Comportamiento

Introduccin
El objetivo de un sistema electrnico es transformar datos de entradas en resultados como salidas, esta clase de actividad es conocida como Comportamiento o Funcionalidad del sistema.
La especificacin del comportamiento consiste en una lista de operaciones que han de ejecutarse para obtener el resultado esperado.

Comportamiento de la Mquina: If hay_moneda then botones := habilitados If pres_kiwi then salida <= jugo_kiwi
KIWI FRUTAS LIMON

Else if pres_frutas then salida <= jugo_frutas


Else salida <= jugo_limon Botones := deshabilitado

El funcionamiento del distribuidor de bebidas depende de una secuencia de operaciones. Esto es comn en muchos sistemas.
2

Procesos
Un proceso es una manera formal de hacer una lista de operaciones secuenciales. Tiene un formato muy estructurado, an as representa el comportamiento de una pequea seccin de un diseo. Reglas para escribir un proceso: Un proceso se especifica con la palabra reservada Process. Opcionalmente se le puede asignar un nombre, ste debe ir antes de process seguido de dos puntos. El fin del proceso se indica con end process y luego puede repetirse el nombre del proceso. El cuerpo del proceso est formado por una lsta de proposiciones que debe iniciar con la palabra reservada begin, la lista termina con el fin del proceso. La declaracin de variables o constantes se debe hacer antes de la palabra begin. Plantilla : nom_op : process declaracin de variables o constantes begin proposiciones secuenciales end process nom_op;
3

Procesos . . .
EJEMPLO :
SEL

A Y B

Puesto que VHDL es para representar sistemas, la terminacin de un proceso se debe analizar a detalle. Un sistema no realiza sus funciones slo una vez y termina; ms bien debe repetir sus actividades en un lazo infinito. Por eso, un proceso asegura que terminada la ejecucin de la ltima proposicin, inmediatamente iniciar nuevamente con la primera. Como resultado Un proceso Nunca Termina.
SomeProcess : Process Begin Some Statement1; Some Statement2; Some Statement3; Some Statement4; End process SomeProcess
4

MUX2_TO1 : process Constant High : Bit := 1; begin Y <= A; if SEL = High then Y <= B; end if; End process MUX2TO1;

Necesidad de Suspender y Reanudar un Proceso


Los dispositivos electrnicos operan en un lazo infinito; despus de su activacin ejecutan una lista de tareas para despus regresar a esperar una condicin de repeticin.
En otras palabras, los dispositivos suspenden su operacin cuando completan sus tareas y las reanudan cuando se dan nuevamente las condiciones.

KIWI

FRUTAS

LIMON

La insercin de una moneda dar inicio a las actividades de la mquina, que se suspendern despus de que la mquina proporcione el jugo deseado. Las actividades se reanudarn cuando ocurra nuevamente la insercin de la moneda.

Esta suspencin temporal en VHDL se puede realizar con la sentencia wait. La sentencia wait sirve para suspender un proceso una vez que una tarea sea completada y reanudarlo cuando la condicin de espera sea alcanzada.
5

Sentencia Wait
Wait puede usarse para: - Detener incondicionalmente la ejecucin temporal de un proceso. - Listar las condiciones necesarias para que el proceso se reanude. Cmo funciona? Si un proceso contiene una sentencia Wait, ejecutar todas sus propocisiones hasta que el wait sea encontrado, ah esperar hasta que se cumplan las condiciones establecidas en el wait. Tipos de Wait : 1.- Wait for cierto_tiempo : Suspende el proceso por una cantidad especfica de tiempo, el tiempo se puede expresar explicitamente: Wait for 10 ns; O bien como una expresin: Wait for CLK_Periodo / 2;

Sentencia Wait
2.- Wait until condicin : El proceso se suspende hasta que una condicin llega a ser verdadera, debido a algn cambio en las seales involucradas. Ejemplos: Wait until CLK = 1; Wait until CE and (not RESET); Wait until IntData > 16; 3.- Wait on lista_de_sensitividad : El proceso se suspende hasta que ocurra un evento en cualquiera de las seales que integran la lista de sensitividad Ejemplos: Wait on CLK; Wait on Enable, Data; 4.- Wait complejo : Contiene una combinacin de ms de uno de los 3 tipos mensionados anteriormente. Ejemplos: Wait on Data until CLK = 1; Wait until CLK = 1 for 10 ns;

La sentencia wiat puede ubicarse en cualquier parte del proceso, en realidad depende del comportamiento deseado.
Process Begin wait on sigA; proposiciones 1; proposiciones 2; proposiciones 3; End process; Process Begin proposiciones 1; proposiciones 2; proposiciones 3; wait on sigB; End process;

El wait sobre la lista de sensitividad es probablemente la forma ms frecuente de reanudar procesos en VHDL, es por eso que el lenguaje permite colocar la lista de sensitividad entre parntesis justo despus de la palabra process. Su funcionamiento es similar a un wait on lista al final del proceso.
Process Begin proposiciones 1; proposiciones 2; proposiciones 3; wait on seales; End process; Process ( seales ) Begin proposiciones 1; proposiciones 2; proposiciones 3; End process;
8

Un proceso puede tener mltiples waits, pero si tiene una lista de sensitividad, no es necesario que tenga un wait explcito para suspender su ejecucin. Cuando la ejecucin de un proceso inicia, la ejecucin se realiza una vez, posteriormente el proceso es suspendido hasta que alguna seal en su lista de sensitividad cambie de valor. Aunque slo una de las seales de la lista cambie, con ello todas las proposiciones del proceso se ejecutan en forma secuencial, no solo aquellas que involucran a la seal que cambi.
Process ( signal1, signal2, signal3 ) Begin signal1 <= expresion 1 ; signal2 <= expresion 2; signal3 <= expresion 3; End process;

Seales en Procesos
El propsito bsico de una implementacin en VHDL es describir la reaccin de las salidas ante las entradas. Tanto entradas como salidas son seales, de modo que tal reaccin bsicamente esta dada por asignamientos de seales. Las seales y sus asignamientos se manejan en procesos, sin embargo, su uso est gobernado por 3 restricciones:

1. 2.
3.

Las seales no pueden declararse dentro de procesos. Cualquier asignamiento de seal tomar efecto cuando el proceso se suspende. Mientras esto no ocurra, todas las seales mantendrn sus previos valores. Slo el ltimo asignamiento a una seal dentro de un proceso es efectivo. Entonces no tiene sentido asignar mas de un valor a una seal en un proceso dado.
Ejemplo: Process ( signal1, signal2, signal3 ) Begin Proposicin 1; Proposicin 2; signal3 <= signal1 + 3; End process;
Signal1 = 0 -> 1 Signal2 = 0 Signal3 = 5

10

Las restricciones en el uso de seales tienen un impacto serio en sus aplicaciones prcticas. Dado que slo pueden almacenar el valor de su ltima asignain, no pueden usarse para almacenamientos intermedios o de datos temporales (dentro de un proceso).

Otro incoveniente es el siguiente, como los nuevos valores se asignan slo al suspender el proceso, el anlsis llega a ser complicado.
Ejemplo: Process ( C, D ) Begin A <= 2; B <= A + C; A <= D + 1; E <= A*2; End process;
A=1 B=1 C=1 D=1 E=1

Si D cambia a 2 Qu pasa?

Es necesario contar con otro tipo de objetos que permitan almacenar datos temporales. Estos objetos son las variables, cuya nica diferencia con las seales es que se pueden utilizar donde una seal no es aplicable.

11

Ejemplo:

Process ( C, D ) variable Av, Bv, Ev : integer := 0; Begin Av := 2; BV := Av + C; Av <= D + 1; Ev <= Av*2; A <= Av; B <= Bv; E <= Ev; End process;

A=1 B=1 C=1 D=1 E=1 Av = 0 Bv = 0 Ev = 0

Si D cambia a 2 Qu pasa?

Una seal tiene 3 propiedades asociadas: Tipo, valor y tiempo. Con una relacin cerrada entre valor y tiempo, ya que cada seal tiene una trayectoria cerrada de valores a travs del tiempo.

Una variable slo tiene 2 propiedades: tipo y valor, por lo que solo se puede conocer su valor actual.
Si las seales y variables son del mismo tipo, ellas pueden asignarse una a otra.

12

SEALES

VARIABLES

Se declaran como puertos en las entidades o en Como tienen carcter local, solo pueden las partes declarativas de las arquitecturas, pero declararse en procesos o subprogramas. No no en los procesos. fuera de ellos. La asignacin de un nuevo valor a una seal solo tiene efecto cuando el proceso es suspendido. Por lo que solo el ltimo asignamiento es vlido. Los auto-asignamientos como: Sig1 <= Sig1 + 1 Estn prohibidos en ciclos repetitivos. Toman sus nuevos valores inmediatamente. Todos son efectivos, de modo que en un proceso puede haber mltiples asignamientos a una variable. Los auto-asignamientos como: Var1 := Var1 + 1 Son vlidos y muy usados en ciclos repetitivos.

Es posible retrazar el asignamiento de una seal No es posible hacer asignamientos con (con la clusula after ), hay dos tipos de retardos. retrazos: El retrazo inercial y el de transporte.

13

Control de Flujo
Para el control de flujo VHDL tiene las siguientes proposiciones : - Condicionales : If . . . . Then . . . . . - Condicionales con alternativas: If . . . . Then . . . . . Else . . . If . . . . Then . . . . . Elsif . . . - De eleccin mltiple: Case . . . . Is when . . . . -Ciclos repetitivos: While . . . . Loop . . . . ( Lazo condicional ) for . . . . Loop . . . . ( Lazo con contador ) Con estas estructuras de control el flujo de la ejecucin de las instrucciones ya no slo es secuencial.

14

if Cond1 ExProc : Process ( Lista_de_sensitividad ) then else Begin if Cond1 then . . . . . . . while Cond3 loop . . . case Cond2 is case Cond2 is when val1 => . . . . when val2 => . . . . val1 val2 others when others => . . . . for l in 1 to 4 loop . . . . for l in 1 to 4 loop . . . . . . . . end loop; end case; . . . . else end case; while Cond3 loop . . . . end loop; . . . . end if; end if; . . . . . . . .

End process

End process

15

Ejemplo: Estructura if - then


-- Descripcin de la Entidad Entity Flip_flop_D is port ( D : in Bit; CLK : in Bit; Q : out Bit ); End Flip_flop_D; -- Descripcin de la Arquitectura Architecture unica of Flip_flop_D is Begin process ( D, CLK ) begin if CLK = 0 and CLKevent then Q <= D; end if; end process; End unica;

FLIP FLOP TIPO D

CLK

16

Ejemplo: Estructura if then elsif


-- Descripcin de la Entidad Entity FF_D_RST is port ( D, RST, CLK : in Bit; Q : out Bit ); End FF_D_RST; -- Descripcin de la Arquitectura Architecture unica of FF_D_RST is Begin process ( D, CLK ) begin if RST = 1 then Q <= 0; elsif CLK = 0 and CLKevent then Q <= D; end if; end process; End unica;
17

FLIP FLOP TIPO D

CLK RST

Ejemplo: Estructura de mltiples decisiones


COMPUERTA PROGRAMABLE

Dato1 Salida Dato2 Modo

-- Descripcin de la Entidad Entity Gate_Prog is port ( Dato1, Dato2 : in Bit; Modo : in Bit_Vector ( 2 downto 0 ); Salida : out Bit ); End Gate_Prog; -- Descripcin de la Arquitectura Architecture Gate_Prog of Gate_Prog is Begin process ( Modo, Dato1, Dato2 ) begin case Modo is when 000 => Salida <= Dato1 and Dato2; when 001 => Salida <= Dato1 or Dato2; when 010 => Salida <= Dato1 nand Dato2; when 011 => Salida <= Dato1 nor Dato2; when 100 => Salida <= not Dato1; when 101 => Salida <= not Dato2; when others => Salida <= 0; end case; end process; End Gate_Prog; 18

Modo 000

Salida Dato1 AND Dato2

001
010 011 100 101 110 o 111

Dato1 OR Dato2
Not ( Dato1 AND Dato2) Not ( Dato1 OR Dato2) Not ( Dato1 ) Not ( Dato 2 ) 0

Ejemplo: Lazo Condicional


-- Descripcin de la Entidad Entity Conta_Pulsos is port ( CLK : in STD_LOGIC; Level : in STD_LOGIC; Q : out STD_LOGIC_VECTOR ( 3 downto 0 ) ); End Conta_Pulsos; -- Descripcin de la Arquitectura Architecture Conta_Pulsos of Conta_Pulsos is Begin process Variable cuenta : STD_LOGIC_VECTOR (3 downto 0) := 0000; begin Q <= cuenta; wait until level = 1; cuenta := 0000; while level = 1 loop wait until clk = 1; if level = 1 then cuenta := cuenta + 1; end if; wait until level = 0; end loop; end process; End Conta_Pulsos; 19

Un contador de Pulsos cuya salida (en binario) indique cuantos pulsos ocurrieron mientras una seal (Level) estuvo en alto.

Contador de Pulsos

CLK Level

Q(0) Q(1) Q(2) Q(3)

0 1 0 0

Ejemplo: Lazo con Contador


-- Descripcin de la Entidad library IEEE; use IEEE.std_logic_1164.all; Circuito que invierte un vector (Bit por Bit)

Ent 7-0

Sal 7-0

entity inv_vec is generic ( ancho_bus : integer := 8 ); port ( ent: in STD_LOGIC_VECTOR (ancho_bus - 1 downto 0); sal: out STD_LOGIC_VECTOR (ancho_bus - 1 downto 0) ); end inv_vec;
-- Descripcin de la Arquitectura Architecture inv_vec of inv_vec is begin process ( ent ) variable cont : integer; begin for cont in 0 to ancho_bus - 1 loop sal( cont ) <= ent (ancho_bus - cont - 1); end loop; end process; end inv_vec;

7 Ent :

0 1 0 0 1 1 0 1

7 Sal :

0 1 0 0 1 1 0 1

20

Ruptura de Lazos
Los lazos while y for ejecutarn sus propocisiones siempre que sus condiciones de evaluacin sean verdaderas. Sin embargo, en ocaciones es deseable una salida obligada del lazo o bien saltarse una iteracin e ir a la siguiente.

Por ejemplo, en un contador de bits con valor 1 en un vector, si el bit a evaluar contiene cero, inmediatamente se puede pasar a la iteracin siguiente, esto se hace con la clusula next :
process ( DataBus ) variable NumOfOnes : integer := 0; begin for Cont in 0 to 7 loop next when DataBus( Cont ) = 0; NumOfOnes := NumOfOnes + 1; end loop; Ones <= NumOfOnes; end process; End unica;

21

Cuando lo que se quiere es terminar con el lazo, la clusula a usar es exit. En el proceso mostrado en el anterior ejemplo, si se quisieran contar los 1s menos significativos, antes de que aparezca el primer cero, el proceso cambia a :
process ( DataBus ) variable NumOfOnes : integer := 0; begin for Cont in 0 to 7 loop exit when DataBus( Cont ) = 0; NumOfOnes := NumOfOnes + 1; end loop; Ones <= NumOfOnes; end process; End unica;

22

You might also like