vi. especificación del comportamiento
TRANSCRIPT
1
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.
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;
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
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.
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
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;
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;
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;
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
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.
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.
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.
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.
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
. . . .
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;
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
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
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
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 :
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;
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;