Instrucciones secuenciales


Conjunto de instrucciones secuenciales

· Declaración y asignación de variables (se realiza dentro de un process)
· If-Then-Else
· Case-When
· Loop
· Exit
· Next
· Null
· For-Loop
· While-Loop
· Wait

Instrucciones que pueden ser utilizadas tanto en procesos concurrentes como secuenciales:

· Llamadas a procedimientos y funciones
· Instrucción Assert

Instrucción if...then...else

Formato de la instrucción

if <condición> then <secuencia de instrucciones>;
[elsif <condición> then <secuencia de instrucciones> ...];
[else <secuencia de instrucciones>];
end if;

Ejemplo:

Architecture bhr of MuxBhr is
begin

process (a, b, sel)
begin

if sel='0' then mux <= a;
else mux <= b;
end if;

end process;

end;

Instrucción case...when

Formato de la instrucción

Case <expresión> is

When <elección> => <conjunto de instrucciones>;
When ...
[When others => conjunto de instrucciones];

End case;

<expresión> deber ser de tipo enumerado

Valores de la sentencia case

Deben cubrir todo el rango de valores de la expresión de selección
Deben ser de tipo discreto o array unidimensional de caracteres (bit_vector, string, etc…)

Especificación de rangos en la sentencia case

Pueden unirse valores con el operador de unión: "00" | "01"
El rango de valores posibles sólo se aplica a tipos enteros o enumerados
Se puede utilizar rangos del tipo: a to c (incluye los valores enumerados a, b i c)
Puede utilizarse when others que implica a todos los casos no considerados. De aparecer sólo puede haber uno, y debe ser la última opción

Ejemplo:

Architecture bhr of MuxBhr is
begin

process (x)
begin

case x is

when 1 => z <= 1;
when 2 | 11 => z <= 2;
when 3 to 10 => z <= 3;
when others => z <= 0;

end case;

end process;

end;

Instrucción loop

Formato de la instrucción

Loop

<sentencia secuencial>;

End loop;

Comentarios

Loop representa el bucle infinito
Aunque no es deseable en programación (software), a nivel de sistema digital un bucle infinito puede representar una acción que no termina hasta que se reinicia el sistema

Ejemplo: Contador

El ejemplo muestra el diseño de un contador empleando la instrucción loop. Es un ejemplo: el diseño del contador suele ser más simple utilizando la instrucción if

Cuidado en el ejemplo: cualquier instrucción fuera del bucle no se ejecutará, puesto que el programa no sale nunca de él

Instrucción exit

Termina la ejecución de un bucle

Para terminar la ejecución debe cumplirse la condición
Cuando se usa la expresión etiqueta_de_bucle se finaliza el bucle coincidente con el nombre de la etiqueta, si no se finaliza el bucle actual

Formato de la instrucción

Exit [etiqueta] [when expresión booleana];

Ejemplo:


If condicion then
exit;
End if;


Loop

exit proximo when condicion;
End loop

Instrucción next

Detiene la ejecución del bucle y pasa a la siguiente iteración

Para terminar la ejecución debe cumplirse la condición especificada en la instrucción

Formato de la instrucción

Next [etiqueta] [when expresión booleana];

Ejemplo: Los dos programas siguientes realizan la misma acción. Next realiza la función de salto de acción en el bucle actual

Loop

if not condición then …;
end if;
End loop;


Loop

Next when condición;
End loop

Instrucción null

Indica que no se realiza ninguna acción.

Es una forma de indicar al código que, aunque no se realice ninguna acción, los valores considerados tienen un valor definido y mantienen el estado en el que se encuantre el circuito

Formato de la instrucción

[etiqueta]: null;

Ejemplo:

case valor is

when 0 | 1 => null;
when others => a <= a mod b;

end case;

Instrucción for...loop

Formato de la instrucción

For identificador in rangoDiscreto loop

<sentencia secuencial>

End loop;

Ejemplo: Codificador

Es un ejemplo interesante de aplicación de la instrucción for...loop.
Debe observarse que no es necesario definir la variable i de iteración de bucle
La figura siguiente muestra un resultado de simulación

Instrucción while...loop

Formato de la instrucción

while expresión_booleana loop

<sentencia secuencial>

End loop;

Ejemplo: Codificador1

Nueva versión del codificador pero utilizando la instrucción while...loop.
En este caso sí debe declararse la variable i de iteración de bucle puesto que debe incrementarse en una sentencia interna

Instrucción wait

Es una instrucción de paro de la simulación

Puede especificarse con duración temporal o sin duración temporal

Es la instrucción básica de paro de simulación y se utiliza en la construcción de la señal de reloj en circuitos secuenciales

Tiene distintas funcionalidades según la aserción que se utiliza en ella

Formato de la instrucción

Wait [on nombreSeñal{, …}] [until expresionBooleana] [for expresionTemporal];

donde

on introduce la lista de sensibilidad de la instrucción. El proceso responde ante cambios en ella
until implica una condición que debe cumplirse para continuar
for es la especificación de tiempo de suspensión del proceso

Ejemplo:

Se presenta un ejemplo característico de uso de la instrucción wait: como instrucción de sensibilización de una instrucción process

Hasta ahora se había considerado que el process evoluciona ante cambios en las señales de su lista de sensibilización -> Programa de la izquierda

Wait hace las veces de la lista de sensibilización. Utilizando la construcción wait on ... (como en el proceso Identico siguiente) queda especificado que el proceso evolucionará ante cambios en las señales de la lista de sensibilización de la instrucción wait

Process (x, y)
Begin

if x > y then y <= x;
else x <= y;
End if;

End process;

Identico: Process
Begin

wait on x, y;
if x > y then y <= x;
else x <= y;
End if;

End process;

 

Anterior
Volver a inicio curso
Volver a inicio capítulo
Siguiente


WcN - Joan Oliver. Diseño de circuitos digitales con VHDL: Síntesis secuencial