VHDL / Arquitectura / Diseño secuencial
De Wikilibros, la colección de libros de texto de contenido libre.
Contenido |
[editar] PROCESS
Un PROCESS, como se ha dicho antes, es una sentencia concurrente en el sentido de que todos los PROCESS y todas las demás sentencias concurrentes se ejecutarán sin un orden establecido. No obstante las sentencias que hay dentro del PROCESS se ejecutan de forma secuencial.
Por lo tanto se puede decir que una estructura secuencial va en el interior de un PROCESS.
La estructura genérica de esta sentencia es:
PROCESS [lista de sensibilidad] [declaración de variables] BEGIN [sentencias secuenciales] END PROCESS;
[editar] Lista de sensibilidad
La lista de sensibilidad es una serie de señales que, al cambiar de valor, hacen que se ejecute el PROCESS.
Un ejemplo sería:
PROCESS(señal1, señal2) ...
El PROCESS anterior sólo se ejecutará cuando señal1 o señal2 cambien de valor.
[editar] Variables
Hay que distinguir las señales y de variables. Las señales se declaran entre ARCHITECTURE y su correspondiente BEGIN mientras que las variables se declaran entre PROCESS y su BEGIN. Dentro de un PROCESS pueden usarse ambas, pero hay una diferencia importante entre ellas: las señales sólo se actualizan al terminar el proceso en el que se usan mientras que las variables se actualizan instantáneamente, es decir, su valor cambia en el momento de la asignación.
Unos ejemplos son:
ENTITY ejemplo
PORT (c: IN std_logic;
d: OUT std_logic);
END ENTITY;
ARCHITECTURE ejemplo_arch OF ejemplo IS
SIGNAL a,b: std_logic;
BEGIN
PROCESS(c)
VARIABLE z: std_logic;
BEGIN
a<= c and b; --asignación de señales: después de ejecutarse esta línea a seguirá valiendo lo mismo, sólo se actualiza al acabar el PROCESS
z:= a or c; --asignación de variables: en el momento de ejecutarse esta línea z valdrá a or c (el valor que tenía a cuando empezó el PROCESS)
END PROCESS;
END ARCHITECTURE;
[editar] Statements
[editar] IF
Permite la ejecución de un bloque de código dependiendo de una o unas condiciones.
IF <condición1> THEN [sentencias 1] ELSIF <condición2> THEN [sentencias 2] ELSE [sentencias N] END IF;
Un ejemplo es:
IF (reloj='1') THEN salida<=entrada; ELSE salida<='0'; END IF;
[editar] CASE
Es parecido al anterior porque también ejecuta un bloque de código condicionalmente, pero en esta ocasión se evalúa una expresión en vez de una condición.
CASE <expresión> IS WHEN <valor1> => [sentencias1] WHEN <valor2> => [sentencias2] WHEN <rango de valores> => [sentenciasN] WHEN OTHERS => [sentenciasM] END CASE;
Un ejemplo es:
CASE a IS WHEN 0 => B:=0; WHEN 1 to 50 => B:=1; WHEN 99 to 51 => B:=2; WHEN OTHERS => B:=3; END CASE;
[editar] LOOP
LOOP es la forma de hacer bucles en VHDL. Sería el equivalente a un FOR o WHILE de un lenguaje convencional.
Su estructura es:
[etiqueta:] [WHILE <condición> | FOR <condición>] LOOP [sentencias] [exit;] [next;] END LOOP [etiqueta];
Un ejemplo de bucles anidados es:
bucle1: LOOP
a:=A+1
b:=20;
bucle2: LOOP
IF b < (a*b) THEN
EXIT bucle2;
END IF;
b:=b+a;
END LOOP bucle2;
EXIT bucle1 WHEN a>10;
END LOOP bucle1;
Otro ejemplo, este con FOR es:
bucle1: FOR a IN (1 TO 10) LOOP
b:=20;
bucle2: LOOP
IF b<(a*a) THEN
EXIT bucle2;
END IF;
b:=b-a;
END LOOP bucle2;
END LOOP bucle1;
[editar] EXIT
Como se puede suponer, la sentencia EXIT hace que se salga del bucle superior al que se ejecuta.
Se puede ver su uso en los ejemplos del apartado anterior.
[editar] ASSERT
Se usa para verificar una condición y, en caso de que proceda, dar un aviso.
La sintáxis es:
ASSERT <condición> [REPORT <expresión>] [SEVERITY <expresión>];

