Documente Academic
Documente Profesional
Documente Cultură
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
Son sentencias de control de flujo de programa, parecidas a las de cualquier lenguaje software, que se utilizan para modelar la funcionalidad de un componente. Tipos:
Sentencias de sincronizacin: wait Sentencias de asignacin: seales, variables Sentencias condicionales: if-then-else Sentencias iterativas: loop, exit, next O Otras sentencias: assert, report, null , p , Llamadas a subprogramas
Entorno c concurrente
end;
METODOLOGAS Y HERRAMIENTAS PARA EL DISEO DE SISTEMAS DIGITALES
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
PROCESO
Es una sentencia concurrente en cuyo interior las sentencias se ejecutan secuencialmente en tiempo cero. Su sintasis es:
[etiqueta :] process (lista de sensibilidad) {zona de declaracin} begin {algoritmo de procesamiento} end process [etiqueta]; Lista de sensibilidad (optativa). Conjunto de seales que provocan la activacin del proceso Zona de declaracin. Se declaran objetos locales al mismo (tpicamente variables) Algoritmo de procesamiento. Se construye con sentencias similares a los lenguajes de alto nivel (C/C++/ADA).
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
Los procesos se ejecutan (se disparan) cuando se producen eventos en las seales para los que son sensibles. Un proceso es sensible a las seales incluidas en la lista de sensibilidad o alternativamente a las seales que aparecen en sentencias wait dentro del proceso (son formas excluyentes). Cada vez que en una de las seales a la que es sensible un proceso ocurre un evento, se produce la siguiente ejecucin:
Con lista de sensibilidad, se ejecutan todas las sentencias incluidas en l, suspendindose la ejecucin al alcanzarse la ltima sentencia del proceso. Con sentencia wait, se ejecutan las sentencias que sigan a sta hasta alcanzar una nueva sentencia wait.
process begin g Ejecucin sent_1; . Suspenso wait on a,b; sent_i; Despierta sent_N; end process;
Evento a, b
process (a b) (a,b) Despierta begin sent_1; Ejecucin Evento a, b . sent_N; Suspenso end process;
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
SENTENCIA wait it
Se utiliza para la suspensin de un proceso Sintaxis:
[ q [etiqueta :] wait [ on seal {,}] ] { }] [ until expresin_booleana] [ for expresin_tiempo]
Formas de uso:
Sin ningn tipo de condicin: cuando el proceso llega a la sentencia wait se suspende indefinidamente.
process begin sentencias_secuenciales wait; end process;
Con lista de seales: esta forma establece las seales a las que es sensible el proceso. Cuando en alguna de las seales se produce un evento el proceso despierta.
process begin c<=a and b; wait on a, b; end process;
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES C di i de reactivacin condicional: wait until, se Condicin d i i di i l i i suspende el proceso hasta que se verifique la condicin anexa.
process begin q<=d; wait until reloj=1; -- equivale a wait on reloj until reloj=1; end process;
Condicin de reactivacin por tiempo: wait for, se especifica el tiempo que va a estar dormido el proceso.
process begin Reloj <= not Reloj; wait for 10 ns; end process;
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
entity reloj is port (clk:buffer bit); end reloj; architecture rtl of reloj is begin process begin wait for 200 ns; clk <= not clk; end process; end rtl;
400 ns
clk
0 200 600 1000
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
entity reloj is port (clk:buffer bit); end reloj; architecture rtl of reloj is begin p process (clk) ( ) begin clk <= not clk after 200 ns; end process; end rtl;
400 ns
c clk
0 200 600 1000
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
ASIGNACIN A SEAL
Se proyecta un valor en la cola de eventos y se asigna cuando todos los procesos estn suspendidos/inactivos. Cola de eventos: lista con los valores futuros a asignar a la seal ordenados por tiempo.
t 10 ns 20 ns 25 ns 35 ns 40 ns 0 1 0 0 1
Seal
Sintaxis:
[etiqueta:] nombre_seal <= valor {after expresin_tiempo}
Ejemplo:
process begin a <=b; c <=a; wait on a, b, c; end process; Inicio : a=2, b=3, c=1;
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
En asignaciones posteriores al ltimo evento de la cola se mantiene la anterior. Si la asignacin es anterior a la que hay en la cola se elimina la posterior. Ejemplo de modelo transporte:
process begin s <= transport 0 after 10 ns; 0 s <= transport 1 after 20 ns; wait; end process; p process begin s <= transport 1 after 20 ns; s <= transport 0 after 10 ns; wait; end process; Cola de eventos de s t v t v t v t v 10 ns 0 10 ns 0 20 ns 1 20 ns 1 10 ns 0
9
20 ns 1
Cola de eventos de s
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
Cola de eventos de s t v t v 20 ns 1 20 ns 1 10 ns 0
10
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
0 ns
20 ns
40 ns
a
b(inercial) b(transporte)
0 ns
20 ns
40 ns
11
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
El retardo inercial es ms real que el de transporte, ya que los circuitos reales filtran las seales de entrada, pero no es cierto que tengan que estar estables un tiempo igual al de propagacin, sino que ste es algo menor. Para simular este comportamiento se usa:
b<= reject 10 ns inertial not a after 12 ns;
Duracin mnima del pulso que pasa Tiempo de propagacin
La sentencia de asignacin permite especificar en una nica sentencia un conjunto de pares (valor, tiempo): (valor
Sintaxis: seal <= [transport] {valor [expresin_tiempo],} Ejemplo:
process begin Operando <= 0 after 10 ns, 10 after 20 ns, 100 after 30 ns; wait; end process;
12
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
ASIGNACIN A VARIABLE
Se usan para reemplazar el valor actual de la variable por el valor especificado por una expresin. Sintaxis:
[etiqueta:] nombre_variable := expresin;
La asignacin a variable no tiene ningn retardo asociado: la variable toma el valor en el momento de la asignacin. asignacin Consideraciones:
Las variables son locales a los procesos o subprogramas donde se declaran (entornos secuenciales). Las variables declaradas en un proceso nunca se reinicializan reinicializan. Las variables definidas en un subprograma se reinicializan cada vez que se llame al subprograma. En VHDL-93 se definen variables compartidas: equivale a una variable global donde distintos procesos o subprogramas pueden realizar asignaciones sobre ella. Sintaxis: shared variable nombre_variable: tipo_variable;
13
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
--clk seal definida en la entidad architecture ejemplo2 of entidad is signal a, b, x, y : integer; begin p2: process (clk) variable c : integer; clk begin g c:= a; x <= c+2; c := b; y <= c+2; end process p2; end ejemplo2;
14
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
LA SENTENCIA if
Se utiliza para escoger en funcin de alguna condicin la sentencia que debe ejecutarse. Sintaxis:
if condicin_booleana then sentencias_secuenciales {elsif condicin_booleana then sentencias_secuenciales} [else sentencias_secuenciales] end if;
Formas de utilizacin:
Evaluacin de una nica condicin que permite o no la ejecucin de una instruccin (o conjunto de ellas). Ejemplo: latch con entrada de datos (Dato) y seal de carga (Carga)
entity latch is port (Carga, Dato : in bit; Salida : out bit); end latch; architecture ejemplo of latch is begin g Dato process begin Carga if Carga = 1 then Salida <= Dato; end if; wait on Carga, Dato; end process; end ejemplo;
Latch
Salida
15
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES S l i entre dos grupos de sentencias a ejecutar Seleccin d d i j dependiendo de una condicin. Ejemplo: Modelado de un buffer triestado.
library ieee; use ieee.std_logic_1164.all; entity triestado is y port (Habilitacion, Entrada : in std_logic; Salida : out std_logic); end triestado; architecture ejemplo of triestado is begin process begin g if Habilitacion = 1 then Salida <= Entrada; else Salida <= Z; end if; wait on Habilitacion, Entrada; end process; end ejemplo;
Entrada Habilitacion
Salida
Seleccin entre dos o ms conjuntos de sentencias, cada una de ellas en funcin de distintas condiciones. Ejemplo: Latch anterior con seal de reset (Reset).
process begin if Reset = 0 then Salida <= 0; elsif Carga =1 then Salida <= Dato; end if; wait on Reset, Carga, Dato; end process;
Latch
Salida
16
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
SENTENCIA case
Se utiliza para escoger el grupo de sentencias que deben ejecutarse entre un conjunto de posibilidades, en funcin de los valores de una determinada expresin. Sintaxis: i i
[etiqueta :] case expresion is when valor => sentencias_secuenciales; {when valor => sentencias_secuenciales; } end case;
8 8 8 8
Mux4a1 8 bits
Salida
S1 S0
17
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
S puede especificar dos o ms valores dentro del rango de Se d ifi d l d t d l d posibles valores que puede tomar la expresin de seleccin usando la unin lgica (|). Ejemplo: Mux3a1.
process begin case S l i is Seleccion when 00 | 01 => Salida <= E1; when 10 => Salida <= E2; when 11 => Salida <= E3; end case; wait on Seleccion, E1, E2, E3; end process;
E1 E2 E3
8 8 8
Mux3a1 8 bits
Salida
S1 S0
Se puede especificar un rango dentro de los posibles valores que puede tomar la expresin de seleccin mediante t d t l i d l i di t to. Ejemplo: Mux2a1
process begin case Seleccion is when 00 to 10 => 00 10 Salida <= E1; when 11 => Salida <= E2; end case; wait on Seleccion, E1, E2; end process;
E1 E2
8 8
Mux2a1 8 bits
Salida
S1 S0
18
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
Se puede especificar como valor de seleccin la palabra clave others que debe ser la ltima.
process begin case Seleccion is when 00 to 10 => Salida < E1; <= when others => Salida <= E2; end case; wait on Seleccion, E1, E2; end process;
Los valores especificados para la seleccin de la sentencia case deben cumplir dos condiciones:
La interseccin entre el rango de valores especificados en las distintas opciones de la sentencia case debe ser nula. La unin de todos los valores especificados debe cubrir todos los l l valores posibles que pueda tomar la variable de seleccin. ibl d t l i bl d l i
process begin case Seleccion is when 00 => Salida <= E1; when 01 => Salida <= E2; when 10 => Salida <= E3; when 11 => Salida <= E4; when others => Salida <= 00000000; end case; wait on Seleccion, E1, E2, E3, E4; end process; 19
Ejemplo: Mux4a1 con datos del tipo std_logic_vector : no td l i t hay que olvidar los valores que pueden tomar este tipo de datos.
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
SENTENCIA loop
Se utiliza para ejecutar un grupo de sentencias repetidamente. Sintaxis:
[etiqueta :] [while condicin booleana | for control repeticion] condicin_booleana control_repeticion] loop sentencias_secuenciales end loop [etiqueta];
Uso como bucle infinito. Ejemplo: contador de 4 bits con valor inicial.
entity contadorl is port (reloj : in bit; cuenta : out natural); end contador1; architecture primera of contador1 is signal contador:natural; begin process begin contador<=0; loop wait until reloj='1'; it til l j '1' contador<=(contador+1) mod 16; end loop; end process; cuenta<=contador; end primera; entity contador2 is port (reloj : in bit; cuenta : inout natural); end contador2; architecture primera of contador2 is begin process begin cuenta <=0; loop wait until reloj='1'; reloj 1 ; cuenta <=(cuenta+1) mod 16; end loop; end process; end primera;
20
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
Para controlar el nmero de iteraciones de la sentencia loop se puede utilizar la sentencia for control_repeticin
Ejemplo: contador anterior usando for
process begin contador<=0; for I in 0 to 15 loop p wait until reloj='1'; contador<= contador+1; end loop; end process;
21
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
SENTENCIA exit
Se utiliza para terminar la ejecucin de un bucle. Sintaxis:
[etiqueta :] exit [etiqueta_loop] [when condicin_booleana]
Presenta 2 opciones: i
Expresa una condicin que si se cumple, finaliza la ejecucin del lazo y pasa a ejecutar la primera sentencia que se encuentre a continuacin Ejemplo: contador mdulo 16 con seal de inicializacin (inicio)
entity contador0_15 is port (reloj, inicio : in bit; cuenta : out natural); end contador0_15; ; architecture ejemplo of contador0_15 is signal contador : natural; begin process begin contador<=0; loop wait until (reloj='1 and relojevent) or inicio=0; exit when inicio=0; contador<=(contador+1) mod 16; end loop; end process; cuenta<=contador; end ejemplo;
METODOLOGAS Y HERRAMIENTAS PARA EL DISEO DE SISTEMAS DIGITALES
22
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES La segunda opcin permite especificar la etiqueta de la sentencia loop de forma que la ejecucin de exit fuerza la terminacin del bucle correspondiente a la etiqueta. Ejemplo: contador de 16 bits con inicio y carga
process begin contador<=0; carga_datos : loop incremento : loop wait until (reloj='1 and relojevent) or carga=1 or inicio=0; carga 1 inicio 0 ; exit carga_datos when inicio=0; exit incremento when carga=1; contador<=(contador+1) mod 16; end loop incremento; wait until reloj=1; if carga=1 then g contador <= datos; end if; end loop carga_datos; end process;
23
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
SENTENCIA next
Se utiliza para detener la ejecucin de una sentencia loop y pasar a la siguiente iteracin de la misma. Sintaxis:
[etiqueta ] [ ti t :] next [ ti t l t [etiqueta_loop] [when condicin_booleana] ][ h di i b l ]
Opciones:
Se especifica la condicin para la cual pasa a ejecutarse la siguiente iteracin de la sentencia l i i t it i d l t i loop. Se especifica una etiqueta que hace referencia a qu sentencia loop debe realizar ese salto de una iteracin.
Ejemplo: modificacin del contador mdulo 16 para que no j l difi i d l d d l cuente el valor 8.
process begin contador<=0; ; for I in 0 to 15 loop next when I=8; contador<= I; wait until reloj=1; end loop; end process;
24
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
SENTENCIA assert
Permite reportar mensajes en funcin de si una determinada condicin se cumple o no, tambin permite interrumpir la simulacin en funcin de dicha condicin. Si Sintaxis: i
[etiqueta :] assert expresin_booleana [report cadena_caracteres] [expresin_severidad]
La utilidad principal de esta sentencia consiste en ayudar a depurar un modelo en tiempo de simulacin. Funciona de la siguiente forma: en caso de no cumplirse la condicin se enva la cadena de caracteres especificada al dispositivo de salida y dependiendo del nivel de severidad indicado i di d se puede o no interrumpir la simulacin. d i t i l i l i La expresin de severidad debe ser del tipo severity_level definido en el paquete standard. Este tipo enumerado puede tomar cuatro valores: note, warning, error, failure. E caso de no especificar el nivel de severidad el de por En d ifi l i ld id d l d defecto es error.
25
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
VHDL-93 ofrece una variacin de assert sin condicin. report cadena_caracteres [expresin_severidad]
Ejemplo: report paso por aqu; -- es equivalente a assert FALSE report paso por aqu severity note;
METODOLOGAS Y HERRAMIENTAS PARA EL DISEO DE SISTEMAS DIGITALES
26
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
SENTENCIA return
Se utiliza para terminar la ejecucin de un subprograma. Sintaxis:
[etiqueta :] return [ expresin];
27
Microelectrnica
ITT-Sistemas Electrnicos
EL LENGUAJE VHDL
SENTENCIAS SECUENCIALES
LA SENTENCIA null
Se utiliza para indicar que no se debe realizar ninguna operacin. Sintaxis: [etiqueta:] null; Ejemplo de la sentencia null complementando a la sentencia case.
case valor is when 0 | 1 => null; when others => Valor := Valor mod 2; end case;
28