VI. Especificación del Comportamiento

22
1 VI. Especificación del Comportamiento

Transcript of VI. Especificación del Comportamiento

Page 1: VI. Especificación del Comportamiento

1

VI. Especificación del Comportamiento

Page 2: VI. Especificación del Comportamiento

2

Introducción

El objetivo de un sistema electrónico es transformar datos de entradas en resultados

como salidas, esta clase de actividad es conocida como Comportamiento o

Funcionalidad del sistema.

La especificación del comportamiento consiste en una lista de operaciones que han de

ejecutarse para obtener el resultado esperado.

KIWI FRUTAS LIMON

Comportamiento de la Máquina:

If hay_moneda then botones := habilitados

If pres_kiwi then salida <= jugo_kiwi

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 común en muchos sistemas.

Page 3: VI. Especificación del Comportamiento

3

Procesos

Un proceso es una manera formal de hacer una lista de operaciones secuenciales.

Tiene un formato muy estructurado, aún así representa el comportamiento de una

pequeña sección de un diseño.

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 lísta de proposiciones que debe iniciar con

la palabra reservada begin, la lista termina con el fin del proceso.

La declaración de variables o constantes se debe hacer antes de la palabra begin.

Plantilla : nom_op : process

declaración de variables o constantes

begin

proposiciones secuenciales

end process nom_op;

Page 4: VI. Especificación del Comportamiento

4

Procesos . . .

MUX2_TO1 : process

Constant High : Bit := „1‟;

begin

Y <= A;

if SEL = High then

Y <= B;

end if;

End process MUX2TO1;

A

B

Y

SEL

EJEMPLO :Puesto que VHDL es para representar sistemas, la

terminación de un proceso se debe analizar a

detalle. Un sistema no realiza sus funciones sólo

una vez y termina; más bien debe repetir sus

actividades en un lazo infinito.

Por eso, un proceso asegura que terminada la

ejecución de la última proposición,

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

Page 5: VI. Especificación del Comportamiento

5

Necesidad de Suspender y Reanudar un Proceso

Los dispositivos electrónicos operan en un lazo infinito; después de su activación

ejecutan una lista de tareas para después regresar a esperar una condición de

repetición.

En otras palabras, los dispositivos suspenden su operación cuando completan sus

tareas y las reanudan cuando se dan nuevamente las condiciones.

KIWI FRUTAS LIMON

La inserción de una moneda dará inicio a las

actividades de la máquina, que se “suspenderán”

después de que la máquina proporcione el jugo

deseado.

Las actividades se “reanudarán” cuando ocurra

nuevamente la inserción de la moneda.

Esta suspención 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 condición de espera sea alcanzada.

Page 6: VI. Especificación del Comportamiento

6

Wait puede usarse para:

- Detener incondicionalmente la ejecución temporal de un proceso.

- Listar las condiciones necesarias para que el proceso se reanude.

¿Cómo 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 específica de tiempo,

el tiempo se puede expresar explicitamente:

Wait for 10 ns;

O bien como una expresión:

Wait for CLK_Periodo / 2;

Sentencia Wait

Page 7: VI. Especificación del Comportamiento

7

Sentencia Wait

2.- Wait until condición : El proceso se suspende hasta que una condición llega a ser

verdadera, debido a algún cambio en las señales 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 señales que integran la lista de sensitividad

Ejemplos: Wait on CLK;

Wait on Enable, Data;

4.- Wait complejo : Contiene una combinación de más de uno de los 3 tipos mensionados

anteriormente.

Ejemplos: Wait on Data until CLK = „1‟;

Wait until CLK = „1‟ for 10 ns;

Page 8: VI. Especificación del Comportamiento

8

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 más frecuente de reanudar

procesos en VHDL, es por eso que el lenguaje permite colocar la lista de sensitividad entre

paréntesis justo después 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 señales;

End process;

Process ( señales )

Begin

proposiciones 1;

proposiciones 2;

proposiciones 3;

End process;

Page 9: VI. Especificación del Comportamiento

9

Un proceso puede tener múltiples wait‟s, pero si tiene una lista de sensitividad, no es

necesario que tenga un wait explícito para suspender su ejecución.

Cuando la ejecución de un proceso inicia, la ejecución se realiza una vez, posteriormente el

proceso es suspendido hasta que alguna señal en su lista de sensitividad cambie de valor.

Aunque sólo una de las señales de la lista cambie, con ello todas las proposiciones del

proceso se ejecutan en forma secuencial, no solo aquellas que involucran a la señal que

cambió.

Process ( signal1, signal2, signal3 )

Begin

signal1 <= expresion 1 ;

signal2 <= expresion 2;

signal3 <= expresion 3;

End process;

Page 10: VI. Especificación del Comportamiento

10

El propósito básico de una implementación en VHDL es describir la reacción de las salidas

ante las entradas. Tanto entradas como salidas son señales, de modo que tal reacción

básicamente esta dada por asignamientos de señales.

Las señales y sus asignamientos se manejan en procesos, sin embargo, su uso está

gobernado por 3 restricciones:

Señales en Procesos

1. Las señales no pueden declararse dentro de procesos.

2. Cualquier asignamiento de señal tomará efecto cuando el proceso se suspende.

Mientras esto no ocurra, todas las señales mantendrán sus previos valores.

3. Sólo el último asignamiento a una señal dentro de un proceso es efectivo. Entonces

no tiene sentido asignar mas de un valor a una señal en un proceso dado.

Ejemplo: Process ( signal1, signal2, signal3 )

Begin

Proposición 1;

Proposición 2;

signal3 <= signal1 + 3;

End process;

Signal1 = 0 -> 1

Signal2 = 0

Signal3 = 5

Page 11: VI. Especificación del Comportamiento

11

Las restricciones en el uso de señales tienen un impacto serio en sus aplicaciones prácticas.

Dado que sólo pueden almacenar el valor de su última asignaión, 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 sólo al suspender el

proceso, el análsis 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 señales es que se pueden

utilizar donde una señal no es aplicable.

Page 12: VI. Especificación del Comportamiento

12

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 señal tiene 3 propiedades asociadas: Tipo, valor y tiempo. Con una relación cerrada

entre valor y tiempo, ya que cada señal tiene una trayectoria cerrada de valores a través del

tiempo.

Una variable sólo tiene 2 propiedades: tipo y valor, por lo que solo se puede conocer su valor

actual.

Si las señales y variables son del mismo tipo, ellas pueden asignarse una a otra.

Page 13: VI. Especificación del Comportamiento

13

SEÑALES VARIABLES

Se declaran como puertos en las entidades o en

las partes declarativas de las arquitecturas, pero

no en los procesos.

Como tienen carácter local, solo pueden

declararse en procesos o subprogramas. No

fuera de ellos.

La asignación de un nuevo valor a una señal

solo tiene efecto cuando el proceso es

suspendido. Por lo que solo el último

asignamiento es válido. Los auto-asignamientos

como:

Sig1 <= Sig1 + 1

Están prohibidos en ciclos repetitivos.

Toman sus nuevos valores inmediatamente.

Todos son efectivos, de modo que en un

proceso puede haber múltiples asignamientos a

una variable. Los auto-asignamientos como:

Var1 := Var1 + 1

Son válidos y muy usados en ciclos repetitivos.

Es posible retrazar el asignamiento de una señal

(con la cláusula after ), hay dos tipos de

retrazos: El retrazo inercial y el de transporte.

No es posible hacer asignamientos con

retardos.

Page 14: VI. Especificación del Comportamiento

14

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 elección múltiple: Case . . . . Is

when . . . .

-Ciclos repetitivos: While . . . . Loop . . . . ( Lazo condicional )

for . . . . Loop . . . . ( Lazo con contador )

Con estas estructuras de control el flujo de la ejecución de las instrucciones ya no sólo es

secuencial.

Page 15: VI. Especificación del Comportamiento

15

ExProc : Process ( Lista_de_sensitividad )

Begin

if Cond1 then

. . . .

case Cond2 is

when val1 => . . . .

when val2 => . . . .

when others =>

for l in 1 to 4 loop

. . . .

end loop;

end case;

else

while Cond3 loop

. . . .

end loop;

. . . .

end if;

. . . .

End process

. . . .

End process

if Cond1

. . .

case Cond2 is

val1 val2

for l in 1 to 4 loop . . . .

others

. . . . . . . .

end case;

end if;

while Cond3 loop . . .

then else

. . . .

Page 16: VI. Especificación del Comportamiento

16

Ejemplo: Estructura if - then

D

CLK

Q

FLIP FLOP TIPO D

-- Descripción de la Entidad

Entity Flip_flop_D is

port (

D : in Bit;

CLK : in Bit;

Q : out Bit

);

End Flip_flop_D;

-- Descripción de la Arquitectura

Architecture unica of Flip_flop_D is

Begin

process ( D, CLK )

begin

if CLK = „0‟ and CLK‟event then

Q <= D;

end if;

end process;

End unica;

Page 17: VI. Especificación del Comportamiento

17

Ejemplo: Estructura if – then – elsif

-- Descripción de la Entidad

Entity FF_D_RST is

port (

D, RST, CLK : in Bit;

Q : out Bit

);

End FF_D_RST;

-- Descripción 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 CLK‟event then

Q <= D;

end if;

end process;

End unica;

D

CLK

Q

FLIP FLOP TIPO D

RST

Page 18: VI. Especificación del Comportamiento

18

Ejemplo: Estructura de múltiples decisiones

-- Descripción 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;

-- Descripción 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;

Dato1

Salida

Dato2

Modo

COMPUERTA PROGRAMABLE

Modo Salida

0 0 0 Dato1 AND Dato2

0 0 1 Dato1 OR Dato2

0 1 0 Not ( Dato1 AND Dato2)

0 1 1 Not ( Dato1 OR Dato2)

1 0 0 Not ( Dato1 )

1 0 1 Not ( Dato 2 )

1 1 0 o 1 1 1 0

Page 19: VI. Especificación del Comportamiento

19

Ejemplo: Lazo Condicional

-- Descripción 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;

-- Descripción 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;

Un contador de Pulsos cuya salida (en

binario) indique cuantos pulsos ocurrieron

mientras una señal (Level) estuvo en alto.

CLK

Level

Contador de Pulsos

Q(0)

Q(1)

Q(2)

Q(3)

0

1

0

0

Page 20: VI. Especificación del Comportamiento

20

Ejemplo: Lazo con Contador

-- Descripción de la Entidad

library IEEE;

use IEEE.std_logic_1164.all;

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;

-- Descripción 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;

Circuito que invierte un vector (Bit por Bit)

7 - 0 7 - 0

Ent Sal

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

Ent :

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

Sal :

Page 21: VI. Especificación del Comportamiento

21

Ruptura de Lazos

Los lazos while y for ejecutarán sus propocisiones siempre que sus condiciones de

evaluación sean verdaderas. Sin embargo, en ocaciones es deseable una salida obligada

del lazo o bien saltarse una iteración 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 iteración siguiente, esto se hace con la cláusula

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;

Page 22: VI. Especificación del Comportamiento

22

Cuando lo que se quiere es terminar con el lazo, la cláusula a usar es exit.

En el proceso mostrado en el anterior ejemplo, si se quisieran contar los 1‟s 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;