You are on page 1of 11

VHDL COMANDOS - SENTENCIAS

Descripcin de flujo de datos.-


A la hora de plantearse crear un programa en VHDL no hay que pensar
como si fuera un programa tpico para ordenador. No hay que olvidar que en
VHDL hay que describir un hardware, algo que no se hace en un programa
para ordenador.
Un circuito electrnico puede tener muchos elementos que estn ejecutando
acciones a la vez, por ejemplo en un circuito puede tener una entrada que
se aplique a dos puertas lgicas y de cada una obtener una salida, en este
caso tendra dos caminos en los que se ejecutaran acciones de forma
paralela. Esto es lo que se llama concurrencia.
VHDL es un lenguaje concurrente, como consecuencia no se seguir el orden
en que estn escritas las instrucciones a la hora de ejecutar el cdigo. De
hecho, si hay dos instrucciones, no tiene porqu ejecutarse una antes que
otra, pueden ejecutarse a la vez.

Sentencias Concurrentes.-
La instruccin bsica de la ejecucin concurrente es la asignacin entre
seales a travs del smbolo <=. Para facilitar la asignacin de las seales
VHDL incluye elementos de alto nivel como son instrucciones condicionales,
de seleccin, etc, que se vern a continuacin.

WHEN ... ELSE.- Sentencia de seleccin mltiple. En hardware es necesario


incluir todas las opciones posibles. En este caso es obligatorio siempre acabar
la expresin con un ELSE.

<seal> <= <asignacin1> WHEN <condicin1> ELSE


<asignacin2> WHEN <condicin2> ELSE
...
<asignacinN> WHEN <condicinN> ELSE
<asignacinM>;

Sistemas Electronicos 1
Un posible ejemplo de este tipo de sentencias podra ser la siguiente.

s <= "00" WHEN a = b ELSE


"01" WHEN a > b ELSE
"11";

Siempre es obligatorio asignar algo, aunque es posible no realizar accin


alguna, para ello se utiliza la palabra reservada UNAFFECTED. De esta forma
se asignar el mismo valor que tena la seal.

s1 <= d1 WHEN control = '1' ELSE UNAFFECTED;


s2 <= d2 WHEN control = '1' ELSE s2;

Las dos sentencias anteriores parecen iguales, pero en la segunda se


produce una transaccin, aspecto que en la primera no sucede.

WITH... SELECT... WHEN.- Es similar a las sentencias CASE o SWITCH de C. La


asignacin se hace segn el contenido de un objeto o resultado de cierta
expresin.

WITH <seal1> SELECT


<seal2> <= <asignacin1> WHEN <estado_seal1>,
<asignacin2> WHEN <estado_seal2>,
...
<asignacinN> WHEN OTHERS;

Un ejemplo de esta sentencia es la siguiente.

WITH estado SELECT


semaforo <= "rojo" WHEN "01",
"verde" WHEN "10",
"amarillo" WHEN "11",
"roto" WHEN OTHERS;

La clusula WHEN OTHERS especifica todos los dems valores que no han sido
contemplados. Tambin es posible utilizar la opcin que se contempl en el
caso anterior (UNAFFECTED).

Sistemas Electronicos 2
BLOCK.- En ocasiones interesa agrupar un conjunto de sentencias en
bloques. Estos bloques permiten dividir el sistema en mdulos, estos mdulos
pueden estar compuestos de otros mdulos. La estructura es la siguiente:

block_id: BLOCK(expresin de guardia)


declaraciones
BEGIN
sentencias concurrentes
END BLOCK block_id;

El nombre del bloque es opcional (block_id), al igual que la expresin de


guardia. Un ejemplo de esto podra ser el siguiente.

latch: BLOCK(clk='1')
BEGIN
q <= GUARDED d;
END BLOCK latch;

Sistemas Electronicos 3
Descripcin de comportamiento.-
Como la programacin concurrente no siempre es la mejor forma de
describir ideas, VHDL incorpora la programacin serie, la cual se define en
bloques indicados con la sentencia PROCESS. En un mismo diseo puede
haber varios bloques de este tipo, cada uno de estos bloques corresponder
a una instruccin concurrente. Es decir, internamente la ejecucin de las
instrucciones de los PROCESS es serie, pero entre los bloques es concurrente.
A continuacin se vern las estructuras ms comunes de la ejecucin serie y
sus caractersticas.

PROCESS.-
Un PROCESS, como se ha dicho antes, es una sentencia concurrente en el
sentido de que todos los PROCESS y todas las dems sentencias concurrentes
se ejecutarn 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 genrica de esta sentencia es:

PROCESS [lista de sensibilidad]


[declaracin de variables]
BEGIN
[sentencias secuenciales]
END PROCESS;

La lista de sensibilidad es una serie de seales que, al cambiar de valor,


hacen que se ejecute el PROCESS.

Un ejemplo sera:

PROCESS(seal1, seal2)
...

El PROCESS anterior slo se ejecutar cuando seal1 o seal2 cambien de


valor.

Sistemas Electronicos 4
Variables y Seales.-
Hay que distinguir las seales y las variables, las seales 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 seales slo se actualizan al terminar el proceso en
el que se usan, mientras que las variables se actualizan instantneamente, es
decir, su valor cambia en el momento de la asignacin.

Unos ejemplos son:

ENTITY ejemplo IS
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; --asignacin de seales: despus de
ejecutarse esta lnea, "a" seguir valiendo lo mismo, slo se
actualiza al acabar el PROCESS
z:= a or c; --asignacin de variables: en el momento de
ejecutarse esta lnea z valdr "a or c" (el valor que tena a cuando
empez el PROCESS)
END PROCESS;
END ARCHITECTURE;

Sistemas Electronicos 5
Sentencias secuenciales.-
IF... THEN... ELSE.- Permite la ejecucin de un bloque de cdigo
dependiendo de una o varias condiciones.

IF <condicin1> THEN
[sentencias 1]
ELSIF <condicin2> THEN
[sentencias 2]
ELSE
[sentencias N]
END IF;

Un ejemplo es:

IF (reloj='1' AND enable='1') THEN


salida<=entrada;
ELSIF (enable='1') THEN
salida<=tmp;
ELSE
salida<='0';
END IF;

CASE.- Es parecido al anterior porque tambin ejecuta un bloque de cdigo


condicionalmente, pero en esta ocasin se evala una expresin en vez de
una condicin. Se debe recordar que se deben tener en cuenta todos los

casos, es decir, incluir como ltima opcin la sentencia WHEN OTHERS.

CASE <expresin> IS
WHEN <valor1> => [sentencias1]
WHEN <valor2> => [sentencias2]
WHEN <rango de valores> => [sentenciasN]
WHEN OTHERS => [sentenciasM]
END CASE;

Sistemas Electronicos 6
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;

LOOP.- es la forma de hacer bucles en VHDL. Sera el equivalente a


un FOR o WHILE de un lenguaje convencional.

Su estructura es:

[etiqueta:] [WHILE <condicin> | FOR <condicin>] 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;

Sistemas Electronicos 7
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;

Otro ms con WHILE

cuenta := 10;
bucle1: WHILE cuenta >= 0 LOOP
cuenta := cuenta + 1;
b:=20;
bucle2: LOOP
IF b<(a*a) THEN
EXIT bucle2;
END IF;
b := b-a;
END LOOP bucle2;
END LOOP bucle1;

NEXT y EXIT.-
NEXT permite detener la ejecucin actual y seguir con la siguiente.

[id_next:]
NEXT [id_bucle] [WHEN condicin];

La sentencia EXIT hace que se salga del bucle superior al que se ejecuta.

[id_exit:]
EXIT [id_bucle] [WHEN condicin];

Se puede ver su uso en los ejemplos del apartado anterior.

Sistemas Electronicos 8
ASSERT.-
Se usa para verificar una condicin y, en caso de que proceda, dar un aviso.
La sintaxis es:

ASSERT <condicin>
[REPORT <expresin>]
[SEVERITY <expresin>];

Este comando se estudiar en el subcaptulo de notificaciones, en la seccin


de bancos de prueba. Puesto que el uso de este comando se realiza
nicamente en la simulacin de circuitos.

WAIT.- La ejecucin de un bloque PROCESS se realiza de forma continuada,


como si de un bucle infinito se tratara (se ejecutan todas las sentencias y se
vuelven a repetir). Esto no tiene mucho sentido, puesto que continuamente
se ejecutara lo mismo una y otra vez, sera interesante poder parar la
ejecucin. Una forma de hacerlo es mediante las listas de sensibilidad, las
cuales se han visto anteriormente, aunque existe otra forma de hacerlo
mediante la sentencia WAIT, pero es algo ms complejo.

WAIT ON lista_sensible UNTIL condicion FOR timeout;

La lista_sensible es un conjunto de seales separadas por comas.


La condicin es una sentencia que activar de nuevo la ejecucin.
El timeout es el tiempo durante el cual la ejecucion esta detenida.

No es necesario utilizar las tres opciones, en caso de hacerlo la primera


condicin que se cumpla volver a activar la ejecucin.

WAIT ON pulso;
WAIT UNTIL counter = 5;
WAIT FOR 10 ns;
WAIT ON pulso, sensor UNTIL counter = 5;
WAIT ON pulso UNTIL counter = 5 FOR 10 ns;

Sistemas Electronicos 9
Si se utiliza una lista de sensibilidad no es posible utilizar la sentencia WAIT, sin
embargo si es posible utilizar varias sentencias WAIT cuando esta acta como
condicin de activacin. Este comando se estudiar en el subcaptulo de
retrasos, en la seccin de bancos de prueba.

Operadores.-
Los operadores que proporciona el lenguaje son:

Aritmticos:
+ (Suma o signo positivo): Sirve para indicar una suma entre dos nmeros.
Tambin puede actuar como smbolo si se sita delante de una expresin.
- (resta o signo negativo): Sirve para indicar la resta entre dos nmeros. Si va
delante de una expresin modifica el signo de la expresin.
* (Multiplicacin): Multiplica dos nmeros de cualquier tipo.
/ (Divisin): Divide dos nmeros de cualquier tipo.
** (Exponencial): Eleva un nmero a una potencia. El nmero de la izquierda
puede ser entero y real, pero el de la derecha slo puede ser entero.
Ejemplo: 4**2 sera 4.
ABS() (valor absoluto): Devuelve el valor absoluto de su argumento.
MOD (mdulo): Calcula el mdulo de dos nmeros.
REM (resto): Calcula el resto de la divisin.

Relacionales: Siempre devuelven un valor booleano (true o false).


==, /= (igualdad): El primero devuelve verdadero si los operando son
iguales y falso en caso contrario. El segundo indica desigualdad,
funcionando al revs que el anterior.
>, >=, <, <= (menor mayor): Poseen el significado habitual (mayor que,
mayor o igual que, menor que, menor o igual que, respectivamente).
La diferencia con los anteriores reside en su uso, en este caso los tipos
de datos que pueden manejar son siempre de tipo escalar o matrices.

Sistemas Electronicos 10
Lgicos: Actan sobre los tipos bit, bit_vector y boolean. En el caso de
utilizar este tipo de operadores en un vector, la operacin se realizar bit a
bit. Operadores: AND, OR, NAND, NOR, XOR, XNOR y NOT.

Desplazamientos:
SLL (Shift Left Logic) y SRL (Shift Right Logic), desplazamiento lgico a la
izquierda y desplazamiento lgico a la derecha, respectivamente,
rellenando de ceros los huecos.
SLA (Shift Left Arithmetic) y SRA (Shift Right Arithmetic), desplazamiento
aritmtico a la izquierda y derecha respectivamente.
ROL (ROtate Left) y ROR (ROtate Right), rotacin a la izquierda y a la
derecha respectivamente. En este caso los huecos son ocupados por
los bits que van quedando fuera.

A continuacin se muestran ejemplos sobre los operadores de


desplazamiento:

-- Inicialmente a vale 1100 1101


a sll 4 -- El resultado es 1101 0000
a sla 4 -- El resultado es 1101 1111 (extensin del ltimo bit)
a srl 4 -- El resultado es 0000 1100
a sra 4 -- El resultado es 1111 1100
a rol 4 -- El resultado es 1101 1100 (los primeros 4 bits pasan a la
ltima posicin)
a ror 4 -- El resultado es 1101 1100

Otros:
& (concatenacin): Concatena vectores de manera que la dimensin
de la matriz resultante es la suma de las dimensiones de las matrices
con las que se opera.

Sistemas Electronicos 11

You might also like