VHDL / Arquitectura / Diseño secuencial

De Wikilibros, la colección de libros de texto de contenido libre.

← Apéndices / Diseño concurrente Diseño secuencial Apéndices / Diseño estructural →


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>];

[editar] WAIT
Herramientas personales
Create a book
  • Add wiki page
  • Collections help