VI.

Especificación del Comportamiento

1

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.

Comportamiento de la Máquina: 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 común en muchos sistemas.
2

El fin del proceso se indica con end process y luego puede repetirse el nombre del proceso. Plantilla : nom_op : process declaración de variables o constantes begin proposiciones secuenciales end process nom_op. Tiene un formato muy estructurado. aún así representa el comportamiento de una pequeña sección de un diseño. la lista termina con el fin del proceso. Opcionalmente se le puede asignar un nombre. El cuerpo del proceso está formado por una lísta de proposiciones que debe iniciar con la palabra reservada begin. éste debe ir antes de process seguido de dos puntos.Procesos Un proceso es una manera formal de hacer una lista de operaciones secuenciales. La declaración de variables o constantes se debe hacer antes de la palabra begin. Reglas para escribir un proceso: Un proceso se especifica con la palabra reservada Process. 3 .

Un sistema no realiza sus funciones sólo una vez y termina. Some Statement2.Procesos . un proceso asegura que terminada la ejecución de la última proposición. SomeProcess : Process Begin Some Statement1. Some Statement4. EJEMPLO : SEL A Y B Puesto que VHDL es para representar sistemas. if SEL = High then Y <= B. más bien debe repetir sus actividades en un lazo infinito. end if. End process MUX2TO1. . Some Statement3. la terminación de un proceso se debe analizar a detalle. End process SomeProcess 4 MUX2_TO1 : process Constant High : Bit := „1‟. . . begin Y <= A. Como resultado Un proceso Nunca Termina. inmediatamente iniciará nuevamente con la primera. Por eso.

que se “suspenderán” después de que la máquina proporcione el jugo deseado. Esta suspención temporal en VHDL se puede realizar con la sentencia wait. 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. 5 . después de su activación ejecutan una lista de tareas para después regresar a esperar una condición de repetición. 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. Las actividades se “reanudarán” cuando ocurra nuevamente la inserción de la moneda. En otras palabras.Necesidad de Suspender y Reanudar un Proceso Los dispositivos electrónicos operan en un lazo infinito.

Detener incondicionalmente la ejecución temporal de un proceso. Tipos de Wait : 1. ¿Cómo funciona? Si un proceso contiene una sentencia Wait..Wait for cierto_tiempo : Suspende el proceso por una cantidad específica de tiempo. ahí esperará hasta que se cumplan las condiciones establecidas en el wait. 6 .Listar las condiciones necesarias para que el proceso se reanude. O bien como una expresión: Wait for CLK_Periodo / 2. ejecutará todas sus propocisiones hasta que el wait sea encontrado. el tiempo se puede expresar explicitamente: Wait for 10 ns.Sentencia Wait Wait puede usarse para: . .

Wait until CE and (not RESET).. Wait until CLK = „1‟ for 10 ns. Wait until IntData > 16. Data.Wait complejo : Contiene una combinación de más de uno de los 3 tipos mensionados anteriormente. 3. Ejemplos: Wait on Data until CLK = „1‟... debido a algún cambio en las señales involucradas.Wait until condición : El proceso se suspende hasta que una condición llega a ser verdadera.Sentencia Wait 2. Ejemplos: Wait until CLK = „1‟.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. 4. Wait on Enable. 7 .

proposiciones 3. proposiciones 2. 8 . Process Begin wait on sigA. es por eso que el lenguaje permite colocar la lista de sensitividad entre paréntesis justo después de la palabra process. Process Begin proposiciones 1. wait on sigB. proposiciones 3. proposiciones 3. wait on señales. proposiciones 2. proposiciones 2. Process ( señales ) Begin proposiciones 1. Su funcionamiento es similar a un wait on lista al final del proceso. End process. en realidad depende del comportamiento deseado. End process. proposiciones 2. proposiciones 1. End process. proposiciones 3. Process Begin proposiciones 1. End process.La sentencia wiat puede ubicarse en cualquier parte del proceso. El wait sobre la lista de sensitividad es probablemente la forma más frecuente de reanudar procesos en VHDL.

signal3 <= expresion 3. pero si tiene una lista de sensitividad. signal2. no es necesario que tenga un wait explícito para suspender su ejecución. Cuando la ejecución de un proceso inicia.Un proceso puede tener múltiples wait‟s. End process. 9 . signal3 ) Begin signal1 <= expresion 1 . con ello todas las proposiciones del proceso se ejecutan en forma secuencial. Process ( signal1. no solo aquellas que involucran a la señal que cambió. Aunque sólo una de las señales de la lista cambie. posteriormente el proceso es suspendido hasta que alguna señal en su lista de sensitividad cambie de valor. la ejecución se realiza una vez. signal2 <= expresion 2.

todas las señales mantendrán sus previos valores. Signal1 = 0 -> 1 Signal2 = 0 Signal3 = 5 10 . End process. Las señales y sus asignamientos se manejan en procesos. 3. 2.Señales en Procesos El propósito básico de una implementación en VHDL es describir la reacción de las salidas ante las entradas. Mientras esto no ocurra. signal3 <= signal1 + 3. su uso está gobernado por 3 restricciones: 1. Proposición 2. Entonces no tiene sentido asignar mas de un valor a una señal en un proceso dado. de modo que tal reacción básicamente esta dada por asignamientos de señales. Cualquier asignamiento de señal tomará efecto cuando el proceso se suspende. Tanto entradas como salidas son señales. Ejemplo: Process ( signal1. sin embargo. Las señales no pueden declararse dentro de procesos. Sólo el último asignamiento a una señal dentro de un proceso es efectivo. signal2. signal3 ) Begin Proposición 1.

End process. no pueden usarse para almacenamientos intermedios o de datos temporales (dentro de un proceso). E <= A*2. Ejemplo: Process ( C. Otro incoveniente es el siguiente. D ) Begin A <= 2. Dado que sólo pueden almacenar el valor de su última asignaión. 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. como los nuevos valores se asignan sólo al suspender el proceso. cuya única diferencia con las señales es que se pueden utilizar donde una señal no es aplicable. el análsis llega a ser complicado.Las restricciones en el uso de señales tienen un impacto serio en sus aplicaciones prácticas. Estos objetos son las variables. 11 . A <= D + 1. B <= A + C.

B <= Bv. BV := Av + C. Ev : integer := 0. Si las señales y variables son del mismo tipo. ya que cada señal tiene una trayectoria cerrada de valores a través del tiempo. E <= Ev. Begin Av := 2. valor y tiempo. por lo que solo se puede conocer su valor actual. A <= Av. Ev <= Av*2. Con una relación cerrada entre valor y tiempo. Una variable sólo tiene 2 propiedades: tipo y valor. Bv. Av <= D + 1. 12 . 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. D ) variable Av. ellas pueden asignarse una a otra.Ejemplo: Process ( C. End process.

Todos son efectivos. La asignación de un nuevo valor a una señal solo tiene efecto cuando el proceso es suspendido. pero declararse en procesos o subprogramas. solo pueden las partes declarativas de las arquitecturas. retrazos: El retrazo inercial y el de transporte.SEÑALES VARIABLES Se declaran como puertos en las entidades o en Como tienen carácter local. Es posible retrazar el asignamiento de una señal No es posible hacer asignamientos con (con la cláusula after ). hay dos tipos de retardos. de modo que en un proceso puede haber múltiples asignamientos a una variable. Toman sus nuevos valores inmediatamente. Por lo que solo el último asignamiento es válido. 13 . fuera de ellos. Los auto-asignamientos como: Sig1 <= Sig1 + 1 Están prohibidos en ciclos repetitivos. Los auto-asignamientos como: Var1 := Var1 + 1 Son válidos y muy usados en ciclos repetitivos. No no en los procesos.

. Loop . . . . . . . . . .Condicionales con alternativas: If . . If .Control de Flujo Para el control de flujo VHDL tiene las siguientes proposiciones : . . Then . . . . Then . . . Loop . . . . . . . ( Lazo con contador ) Con estas estructuras de control el flujo de la ejecución de las instrucciones ya no sólo es secuencial. . . . Then . . -Ciclos repetitivos: While . . . . . . . . . . Elsif . . . . . Else . ( Lazo condicional ) for . . 14 . . . . Is when . .Condicionales : If .De elección múltiple: Case .

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

end process.Ejemplo: Estructura if . Q : out Bit ). End Flip_flop_D.Descripción de la Entidad Entity Flip_flop_D is port ( D : in Bit. End unica. CLK ) begin if CLK = „0‟ and CLK‟event then Q <= D. CLK : in Bit. FLIP FLOP TIPO D D Q CLK 16 .Descripción de la Arquitectura Architecture unica of Flip_flop_D is Begin process ( D. -.then -. end if.

-. End unica. elsif CLK = „0‟ and CLK‟event then Q <= D. Q : out Bit ). 17 FLIP FLOP TIPO D D Q CLK RST . RST. end if. End FF_D_RST.Descripción de la Entidad Entity FF_D_RST is port ( D. CLK : in Bit. CLK ) begin if RST = „1‟ then Q <= „0‟.Descripción de la Arquitectura Architecture unica of FF_D_RST is Begin process ( D.Ejemplo: Estructura if – then – elsif -. end process.

-. Dato2 : in Bit. End Gate_Prog. when “101” => Salida <= not Dato2. when “011” => Salida <= Dato1 nor Dato2.Descripción de la Entidad Entity Gate_Prog is port ( Dato1. when others => Salida <= „0‟. Salida : out Bit ). 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: Estructura de múltiples decisiones COMPUERTA PROGRAMABLE Dato1 Salida Dato2 Modo -. End Gate_Prog. Dato1.Descripción de la Arquitectura Architecture Gate_Prog of Gate_Prog is Begin process ( Modo. end case. Dato2 ) begin case Modo is when “000” => Salida <= Dato1 and Dato2. when “100” => Salida <= not Dato1. when “010” => Salida <= Dato1 nand Dato2. Modo : in Bit_Vector ( 2 downto 0 ). end process. when “001” => Salida <= Dato1 or Dato2.

if level = „1‟ then cuenta := cuenta + 1.Descripción de la Entidad Entity Conta_Pulsos is port ( CLK : in STD_LOGIC.Ejemplo: Lazo Condicional -. -. Contador de Pulsos CLK Level Q(0) Q(1) Q(2) Q(3) 0 1 0 0 . end if. while level = „1‟ loop wait until clk = „1‟. cuenta := “0000”. Q : out STD_LOGIC_VECTOR ( 3 downto 0 ) ).Descripción de la Arquitectura Architecture Conta_Pulsos of Conta_Pulsos is Begin process Variable cuenta : STD_LOGIC_VECTOR (3 downto 0) := “0000”. Level : in STD_LOGIC. wait until level = „0‟. begin Q <= cuenta. wait until level = „1‟. End Conta_Pulsos. end loop. End Conta_Pulsos. end process. 19 Un contador de Pulsos cuya salida (en binario) indique cuantos pulsos ocurrieron mientras una señal (Level) estuvo en alto.

Ejemplo: Lazo con Contador -.Descripción de la Arquitectura Architecture inv_vec of inv_vec is begin process ( ent ) variable cont : integer.1 loop sal( cont ) <= ent (ancho_bus . Circuito que invierte un vector (Bit por Bit) Ent 7-0 Sal 7-0 entity inv_vec is generic ( ancho_bus : integer := 8 ). end loop.std_logic_1164. end inv_vec.1 downto 0) ). use IEEE. 7 Ent : 6 5 4 3 2 1 0 0 1 0 0 1 1 0 1 7 Sal : 6 5 4 3 2 1 0 0 1 0 0 1 1 0 1 20 .Descripción de la Entidad library IEEE.cont . end inv_vec. begin for cont in 0 to ancho_bus . sal: out STD_LOGIC_VECTOR (ancho_bus . port ( ent: in STD_LOGIC_VECTOR (ancho_bus . end process.all.1 downto 0). -.1).

NumOfOnes := NumOfOnes + 1. 21 . end loop. esto se hace con la cláusula next : process ( DataBus ) variable NumOfOnes : integer := 0. inmediatamente se puede pasar a la iteración siguiente. begin for Cont in 0 to 7 loop next when DataBus( Cont ) = „0‟. Por ejemplo. Ones <= NumOfOnes. end process.Ruptura de Lazos Los lazos while y for ejecutarán sus propocisiones siempre que sus condiciones de evaluación sean verdaderas. en un contador de bits con valor „1‟ en un vector. End unica. si el bit a evaluar contiene cero. en ocaciones es deseable una salida obligada del lazo o bien saltarse una iteración e ir a la siguiente. Sin embargo.

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

Sign up to vote on this title
UsefulNot useful