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
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
beginprocess (a, b, sel)
beginif sel='0' then mux <= a;
else mux <= b;
end if;end process;
end;
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
beginprocess (x)
begincase 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;
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
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
…End loop
exit proximo when condicion;
…
…
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
…End loop;
if not condición then …;
end if;
……
Loop
…End loop
Next when condición;
…
…
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;
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
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
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)
Beginif x > y then y <= x;
else x <= y;
End if;End process;
Identico: Process
Beginwait on x, y;
if x > y then y <= x;
else x <= y;
End if;End process;