Está en la página 1de 63

Captulo 3: Lenguaje de

Descripcin del Hardware (VHDL)


SISTEMAS DIGITALES I

HDL: Lenguaje de Descripcin


del Hardware

Similar a un lenguaje de computadora excepto que un


HDL describe Hardware que luego de simulado puede
ser construido.
Existen 2 HDL que son estndares IEEE: VHDL (Very
High Speed Integrated Circuit Hardware Description
Lenguage) y Verilog HDL.
El VHDL es ms popular pero ambos se usan a nivel
industrial.
Inicio en 1980 en el Departamento de Defensa (DoD).
Luego en 1983 formalmente empezaron el proyecto
VHDL con: Intermetrics, Texas Instruments e IBM.
IEEE empez la estandarizacin en 1984 que luego se
aprob en 1987 con el nmero 1076.
En 1994 el IEEE public la revisin del estandar IEEE Std
1076-1993 que es la que se encuentra vigente.

VHDL

Trabaja con diseo jerrquico: top down o down - top.


Independencia tecnolgica que permite disear circuitos
cuya descripcin no depende de la forma de
implementacin fsica posterior.
Universalidad, es decir compatibilidad con un gran
nmero de herramientas CAD.
Diferentes tipos de Descripciones: Sistema, algortmico,
RTL, Lgico, Conmutacin, Elctrico, Fsico.
Caractersticas: Se declara una caja negra (entity)
con un identificador para el circuito, y sus terminales de
entrada y salida. Tambin se declaran las direcciones de
los terminales (in, out) y el tipo de datos que admiten.
Luego se describe el circuito en s dentro del cuerpo de
una arquitectura. Esta descripcin difiere segn el
nivel.

Estructura de un programa en
VHDL
Cuando se utiliza VHDL, un sistema digital se divide en varios bloques para
efectuar el proceso lo ms comprensible y que sea fcil de probar y de dar
mantenimiento. En VHDL, cada porcin del diseo es considerado un
bloque, que es descrito en el lenguaje, mediante una entidad y una
arquitectura.
La entidad me describe el exterior de mi circuito y la arquitectura
su comportamiento interno.
entidad 1

Bloque 1

arquitectura 1
entidad 2

Bloque 2

Bloque 3

Bloque 4

entidad 3

arquitectura 2

Arquitectura 3
entidad 4

arquitectura 4

Ejemplo de entidad y arquitectura


ENTITY nand2 IS
PORT(I1,I2:
O:
END nand2;

IN BIT;
OUT BIT);

I1

I2

ARCHITECTURE C1 OF nand2 IS
BEGIN
O<=NOT(I1 AND I2);
END C1;

Adicionalmente el archivo de texto creado se graba con extensin vhd.


Para nuestro ejemplo: nand2.vhd

Estructura Bsica de un programa VHDL.


Se inicia declarando las bibliotecas que se usarn en el
programa.
Ej:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
Luego se indica la entidad con sus entradas, salidas y los
modos y tipos de datos.
Modo: IN
OUT
BUFFER
INOUT
Entrada Salida Salida realimentada Bidireccional
Tipo: BIT, STD_LOGGIC, STD_LOGIC_VECTOR
Despus se lista la arquitectura.

Estructura Bsica de un programa VHDL.


LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY <nombre_entidad> IS
PORT(<nombre_pin>:
<modo><tipo>;
<nombre_pin>: <modo><tipo>);
END <nombre_entidad>;
ARCHITECTURE <nombre_arquitectura> OF <nombre_entidad> IS
BEGIN
<sentencia>; <comentario>
<sentencia>; <comentario>
END <nombre_arquitectura>;

Tipos de datos

Ejemplos de tipos de datos


BIT: describe valores binarios. Rango: 0, 1
Ejemplo:
ENTITY nand2 IS
PORT(A,B:
IN BIT;
F:
OUT BIT);
END nand2;

BIT_VECTOR: describe cadenas de bits. Rango: conjunto de


bits. Se escribe entre comillas: 1010
Ejemplo:
ENTITY manejador IS
PORT (S: IN BIT_VECTOR (3 DOWNTO 0);
X: OUT BIT_VECTOR (1 TO 7));
END manejador;

Ejemplos de tipos de datos


CHARACTER: describe caracteres. Rango:
son los 256 caracteres del estandar ISO
8859-1: 1987 los 128 primeros son los
caracteres ASCII.
a
STRING: describe cadenas de caracteres.
Rango: conjunto de caracteres.
abcde

Estructura de un programa
escrito en VHDL

En
VHDL
una
arquitectura tiene dos
partes: La regin de las
declaraciones
y
el
cuerpo de la arquitectura.
La
regin
de
declaraciones precede
la palabra clave BEGIN.
Puede ser usada para
declarar seales, variables
y constantes.
Tambin
puede ser usada para
declarar componentes y
especificar atributos.

ARCHITECTURE nombre_arq OF nombre_ent IS


[Declaracin de seales]
[Declaracin de tipos]
[Declaracin de variables]
[Declaracin de constantes]
[Declaracin de componentes]
[Especificacin de atributos]
BEGIN
{Instanciacin de componentes}
{Enunciado concurrente}
{Enunciado secuencial [Proceso]}

END nombre_arq;

Tipos de descripciones dentro


de la arquitectura

Estructural o lgica: Descripcin


exacta del esquema lgico que resuelve
la funcin objeto del diseo.
De flujo de datos o RTL.
Comportamental o algortmica
(descripcin funcional).

Descripcin Estructural o lgica

En la descripcin estructural el cuerpo


de la arquitectura se transforma en una
descripcin exacta del esquema
lgico.
En la descripcin estructural VHDL usa
las declaraciones de componentes
La cantidad de declaraciones de
componentes debe de corresponder con
la cantidad de componentes distintas
que formarn parte del circuito fsico
que realiza la funcin lgica a disear.
La declaracin component posee una
estructura similar a la de una entidad,
pero no tiene la misma connotacin.

component nombre_componente
port (seales_entrada: modo tipo;
seales_salida: modo tipo);
end component;

Descripcin Estructural o lgica

En la seccin de declaraciones de la
arquitectura (regin ubicada entre la
palabra reservada architecture y la
palabra begin) puede existir la necesidad
de realizar algunas declaraciones de
seales
internas,
las
cuales
intervienen en la descripcin del circuito,
pero que no tienen acceso a los
terminales externos del diseo (no
estn declaradas en la entidad.
Aparecen en maysculas las palabras
reservadas del lenguaje VHDL para
resaltarlas, pero no es necesario ya que
el VHDL no es sensible al tipo de
letra

ARCHITECTURE nombre_arq OF nombre_ent IS


[Declaracin de tipos]
[Declaracin de seales]
[Declaracin de variables]
[Declaracin de constantes]
[Declaracin de componentes]
[Especificacin de atributos]
BEGIN
Instanciacin de componentes

...
Instanciacin de componentes

END nombre_arq;

Descripcin Estructural o lgica


Ej: Realizar la
descripcin en VHDL
de tipo estructural de
la operacin EXOR
Y = AB + AB
ENTITY XOR IS
PORT (A,B: IN BIT;
Y: OUT BIT);
END XOR;

A
B

A
B

Descripcin Estructural o lgica


La arquitectura puede ser la siguiente:
Architecture XOR1 of XOR is
- - declaracin de seales
signal AN, BN : bit;
signal ANB, ABN : bit;
- - declaracin de componentes
component INV
port (I: in bit;
O: out bit);
end component;
component AND2
port (I1, I2: in bit;
O: out bit);
end component;
component OR2
port (I1, I2: in bit;
O: out bit);
end component;

AN

ANB

BN

ABN

Descripcin Estructural o lgica

Estamos usando 3 tipos


de componentes: un
inversor (declarado INV),
una compuerta AND de
dos entradas (declarada
AND2) y una compuerta
OR de dos entradas
(declarada OR2).
Para la descripcin de la
funcin lgica XOR se
emplearon
dos
instancias, U1 y U2 de
INV; dos instancias U3
y U4 de AND2 y una
instancia U5 de OR2.

begin

-- instanciacin de componentes

U1: INV port map (A,AN);


U2: INV port map (B,BN);
U3: AND2 port map (AN,B,ANB);
U4: AND2 port map (A,BN,ABN);
U5: OR2 port map (ANB,ABN,Y);
end XOR1;
U1
A

AN

U3

ANB

U5

U4

U2

BN

ABN

Descripcin Estructural o lgica

En la asociacin nominal o
explcita
se
vuelve
irrelevante el orden de
los
parmetros,
por
cuanto
dentro
del
parntesis
se
indican
explcitamente las seales
que se conectan a los
terminales
de
las
componentes, mediante el
smbolo
=>
de
asignacin

component OR2
port (I1, I2: in bit;
O: out bit);
end component;
begin
...
- - asociacin explcita
U5: OR2 port map(O=>Y, I1=>ANB,
I2=>ABN);
end XOR1;

Descripcin Estructural o lgica


ENTITY XOR IS
PORT (A, B: IN BIT;
Y: OUT BIT);
END XOR;
Architecture XOR1 of XOR is
- declaracin de seales
signal AN, BN : bit;
signal ANB, ABN : bit;
- declaracin de componentes

component INV
port (I: in bit;
O: out bit);
end component;

component AND2
port (I1, I2: in bit;
O: out bit);
end component;
component OR2
port (I1, I2: in bit;
O: out bit);
end component;
begin
- instanciacin de componentes
U1: INV port map(A,AN);
U2: INV port map(B,BN);
U3: AND2 port map(AN,B,ANB);
U4: AND2 port map(A,BN,ABN);
U5: OR2 port map(ANB,ABN,Y);
end XOR1;

Evidentemente, el estilo estructural de la escritura de una


arquitectura es extenso, incluso para circuitos relativamente
pequeos, por lo que si el circuito es grande su escritura puede ser
tediosa y propensa a cometer errores.

Descripcin Estructural o lgica

Uno de los tipos de seales


con que trabaja en VHDL es
el arreglo de seales,
tanto del tipo bit_vector,
como
del
tipo
std_logic_vector.
Esto
permite escribir de forma
ms compacta los diseos en
VHDL.
Ellos representan un arreglo
de bits y se utilizan con
dispositivos multiterminales.

Descripcin Estructural o lgica

Ej:
Realizar
la
descripcin VHDL de
tipo estructural de un
decodificador de 2
entradas y 4 salidas,
activadas con el nivel
bajo, y una entrada
de
habilitacin,
tambin activa en el
nivel bajo.

Descripcin Estructural o lgica

Lo primero es realizar la
declaracin de la entidad.
La
declaracin
de
la
arquitectura
del
decodificador, en su primera
parte, corresponde a la
declaracin de los diferentes
tipos de componentes. Se
usan
dos
tipos
de
componentes:
INV, un
inversor y NAND3, una
compuerta
NAND
de
3
entradas.

architecture decod_a of decod2x4 is


-- declaracin de seales
signal AN(1),AN(0), EN: bit;
-- declaracin de componentes

component INV
port (I: in bit;
O: out bit);
end component;
component NAND3
port (I1, I2, I3: in bit;
O: out bit);
end component;

Descripcin Estructural o lgica


begin

En el cuerpo de la
arquitectura se observa la
instanciacin de los 7
componentes, los cuales
son conectados usando la
clusula port map con
asociacin implcita.

--instanciacin de componentes
U1: INV port map (A(0),AN(0));
U2: INV port map (A(1),AN(1));
U3: INV port map (NEN,EN);
U4: NAND3 port map (EN, AN(1), AN(0), NY(0));

U5: NAND3 port map (EN, AN(1), A(0), NY(1));


U6: NAND3 port map (EN, A(1), AN(0), NY(2));

U7: NAND3 port map (EN, A(1), A(0), NY(3));


end decod_a;

Descripcin por flujo de datos


o RTL

En la descripcin por flujo de datos, la


arquitectura describe como fluyen
las seales de entrada por el circuito
hacia los terminales de salida.
Este estilo de escritura de la
arquitectura es llamada descripcin de
transferencia de registros RTL (Register
Transfer Language).

Descripcin por flujo de datos


o RTL

En la aproximacin por flujo de


datos se utilizan declaraciones
de asignacin de seales, as
como operadores lgicos
que no se emplean en el
estilo
de
escritura
estructural.
Los operadores lgicos que
tiene el VHDL en sus libreras
son: not, and, or, nand, nor,
xor y xnor.

Ejemplo: La arquitectura por descripcin


de flujo de datos de una compuerta XOR
de dos entradas es:
architecture XOR2 of XOR is
begin
--asignacin de seales
Y <= (not A and B) or (A and not B);
end XOR2;
A
B

Descripcin por flujo de datos


o RTL

La forma de descripcin de la
arquitectura
mediante
la
aproximacin por flujo de datos
simplifica los diseos VHDL,
pues los hace ms compactos.
Despus de la palabra clave
begin se produce la asignacin
del flujo de datos de las
seales del miembro de la
derecha hacia la seal Y, del
miembro de la izquierda (salida).
El miembro de la derecha del
operador de asignacin <= se le
conoce como expresin, cuyo valor
se obtiene evalundola completa.

Ejemplo: La existencia del operador XOR


compacta extraordinariamente el cuerpo
de la arquitectura de la entity XOR
Architecture XOR3 of XOR is
Begin
- asignacin de seales
Y <= A xor B;
End XOR3

Descripcin por flujo de datos


o RTL

El
VHDL,
como
otros
lenguajes de programacin
posee un conjunto de
operadores que se usan
con las seales o con las
variables declaradas en sus
diseos.

Lgicos: AND, OR, XOR, NOT, NAND,


NOR y XNOR
Aritmticos: +, -, * (multiplicacin solo
por 2)
De relacin: =, /=, <, >, <=, >=
De concatenacin: &

Descripcin por flujo de datos


o RTL

La tabla presentada a
continuacin
contiene
una clasificacin de los
operadores definidos
en el lenguaje VHDL, as
como los tipos de datos
sobre los que se
pueden
operar
los
mismos.
Los operadores lgicos
han sido extendidos al
uso en cualquier tipo
de seal lgica, ya sea
bit_vector, std_logic, o
std_logic_vector.

Operadores

Definidos para los tipos

Lgicos:

Bit, Boolean, Bit_vector,


std_logic y std_logic_vector

De relacin:

Integer, Bit, y Bit_vector

Aritmticos:

Integer

Concatenacin: Bit, Bit_vector y para las


cadenas

Descripcin por flujo de datos


o RTL

Cuando los operadores lgicos


se usan con los tipos de
seales std_logic o bit, ellos
poseen su significado usual.
Los valores '0' y '1' son valores
constantes y deben estar
encerrados entre apstrofes.
Cuando el tipo de seal usada
es
declarada
std_logic_vector
o
bit_vector,
entonces
los
valores deben estar encerrados
entre comillas.

Un ejemplo de operaciones lgicas con el


tipo de datos vector es el siguiente:
01100101xor10101101=11001000

Descripcin por flujo de datos


o RTL

Existe un operador interno del


VHDL, que es el signo & y que
realiza la concatenacin de
seales o variables de distinta
longitud.

Ejemplo: Sean las siguientes


declaraciones:
Signal a: bit_vector(1 to 4);
Signal b: bit_vector(1 to 8);
b<=0000&a;

En el ejemplo para concatenar la seal a, a la mitad de la


derecha del vector b y no tener incongruencias en los
resultados con vectores se realizan las asignaciones
siguientes. El smbolo & aade el vector a (de 4 bits)
al final de una secuencia de 4 ceros 0000 para
realizar exitosamente la asignacin al vector b, que fue
declarado como un vector de 8 bits.

Descripcin por flujo de datos


o RTL

En el cuerpo de la arquitectura de un
diseo VHDL por RTL se usan,
sentencias
concurrentes
de
asignacin de seales, cuyo
formato se presenta a continuacin.
En una descripcin RTL, el valor de la
expresin del miembro de la derecha
de la asignacin de seales ( <= ), se
lo transfiere al nombre de la seal del
miembro de la izquierda.
Ambos miembros deben ser del
mismo tipo, para que no existan
incompatibilidades.

-- asignacin de seales
Nombre de la seal<=expresion;
-- asignacin condicional de seales
Nombre de la seal<=expresin1
when expresin booleana else
expresin2
Nombre de la seal<=expresin1
when expresin booleana else

Nombre de la seal<=expresin1
when expresin booleana else
Expresin2;

Descripcin por flujo de datos


o RTL
Ejemplo 8:
Realice una descripcin en VHDL de
la arquitectura de un comparador
de dos entradas, a y b, de 4 bits
cada una y una salida E de 1 bit.
En esta arquitectura se describe
cmo los datos se mueven desde
los terminales de entrada, de seal
en seal, hasta la salida.
Se
necesita del conocimiento del
circuito lgico del comparador, del
cual obtener la funcin E de salida:

E=(a0b0)(a1b1)(a2b2)(a3b3)

Entity comp is
Port (a, b: in bit_vector (3 downto 0);
E: out bit);
End comp;

Architecture comparador_1 of comp is


Begin

--asignacin de seales
E<= not(a(0)xorb(0))
and not(a(1)xorb(1))
and not(a(2)xorb(2))
and not(a(3)xorb(3));
end comparador_1;

Descripcin por flujo de datos


o RTL
Ejemplo 8:
Realice una descripcin en
VHDL de la arquitectura de
un comparador de dos
entradas, a y b, de 4 bits
cada una y una salida E de 1
bit.
Otra
solucin
ms
compacta
se
puede
construir usando la estructura
when else. Esta solucin
no
necesita
del
conocimiento del circuito
lgico del comparador.

Library ieee;
Use ieee.std_logic_1164.all;
Entity comp is
Port (a, b: in bit_vector(3 downto 0);
E: out bit);
End comp;

Architecture comparador_2 of comp is


Begin
--asignacin de seales
E<=1 when (a=b) else 0;
end comparador_2;

Descripcin por flujo de datos


o RTL

En VHDL, cuando una seal cambia de valor se dice


que se ha producido un evento. La existencia de
eventos da lugar a otro evento (cambio de valores en
las expresiones en los miembros de la derecha de los
operadores de asignacin). De esta manera se actualizan
los valores de las seales.
En el ejemplo anterior, un cambio en las entradas a o b,
o en ambas provocar un cambio en la expresin. Este
cambio es asignado a la seal de salida E, actualizando
su valor.
E <= '1' when (a=b) else '0';

Descripcin por flujo de datos


o RTL

Otro tipo de sentencia de asignacin


concurrente usada en la descripcin
por flujo de datos es la asignacin
de seal seleccionada, cuya sintaxis
se expresa a continuacin. Este tipo
de declaracin de asignacin utiliza
la estructura with select when
En esta estructura se evala la
expresin que acompaa a la
declaracin with y cuando el valor
coincide
con
una de
las
alternativas sealadas despus de
la palabra clave when, entonces el
valor correspondiente a esta
alternativa se lo asigna al nombre
de la seal.

--asignacin de seal seleccionada


with expresin select

seal <= valor1 de la seal when alternativa 1,


valor2 de la seal when alternativa 2,
...
valorn de la seal when alternativa n;

Descripcin por flujo de datos


o RTL

Las alternativas contenidas


despus de la palabra clave
when pueden ser varias o
una sola. Si son varias, las
alternativas deben ser todas
distintas y cubrir todos los
posibles valores de stas.
Cuando el valor de la seal
para varias alternativas es el
mismo,
pueden
ser
expresadas como una lista
de valores separados por
barras verticales ( | )

Valor de la seal when alternativa1 |


alternativa2 | alternativa3 | ..

| alternativaN,
Las barras verticales (|) tienen el
mismo significado que la operacin OR

Descripcin por flujo de datos


o RTL

Cuando no se cubren
todos los posibles valores
de las alternativas, se
debe usar la palabra clave
de VHDL others, con el
ltimo when en este tipo de
asignacin de seales.
Este tipo de declaracin de
asignacin
utiliza
la
estructura with select
when others

--asignacin de seal seleccionada


with expresin select

seal <= valor1 de la seal when alternativa 1,


valor2 de la seal when alternativa 2,
...
valorn de la seal when others;

Descripcin por flujo de datos


o RTL
Ejemplo 9:
Escriba en VHDL una
descripcin de la
siguiente funcin:
T(x,y,z,u,v) =
(0,4,18,19,22,23,25,29) +
(14,16,20,24)

Entity circuito is
port (m: in integer range (31 downto 0);
T: out std_logic);
End circuito;
Architecture RTL of circuito is
Begin
-- asignacin de seal seleccionada

With m select
T <= 1 when 0 | 4 | 18 | 19 | 22 | 23 |25 | 29,

- when 14 | 16 | 20 | 24, -- opcionales


0 when others;
end RTL;

Descripcin por flujo de datos


o RTL
Ejemplo 10:
Escriba
en
VHDL
la
descripcin de un circuito
combinacional, el cual recibe
en sus entradas los dgitos
del
sistema
decimal
codificados en NBCD y tiene
una salida P, que va a 1
cuando se detecta en sus
entradas un dgito par.

entity detector is
port (N: in integer range (15 downto 0);
P: out std_logic);
end detector;
architecture num_par of detector is
Begin
-- asignacin de seal seleccionada
with N select
P <= 1 when 0 | 2 | 4 | 6 | 8,
0 when 1 | 3 | 5 | 7 | 9,
- when others; -- opcionales
end num_par;

Descripcin por flujo de datos


o RTL
Ejemplo 11:
Realizar la descripcin por
flujo de datos de un MUX
4 a 1.

Descripcin por flujo de datos


o RTL
architecture MUX1 of MUX is
signal x: bit_vector(3 downto 0);
Begin
--asignacin de seales
X(3)
X(2)
X(1)
X(0)

<= S(1) and S(0) and D(3);


<= S(1) and not S(0) and D(2);
<= not S(1) and S(0) and D(1);
<= not S(1) and not S(0) and D(0);

F <= x(3) or x(2) or x(1) or x(0);

end MUX1;

La arquitectura basada en flujo de datos utilizando


operadores lgicos necesita del circuito final de este MUX

Descripcin por flujo de datos


o RTL
Ejemplo 12:
Otra solucin
usando with select.
Como
se
observa,
esta
descripcin de la arquitectura
es ms simple que la anterior y
no necesita del conocimiento
de la lgica interna del circuito.

architecture mux2 of mux is


begin

-- asignacin de seal seleccionada


with S select
F <= D(0) when 00,
D(1) when 01,
D(2) when 10,
D(3) when 11;
end mux2

Descripcin por flujo de datos


o RTL
EN_L

Ejemplo 13: Disee un


buffer con tercer
estado cuyo circuito se
muestra.

--file: ejemplo13.vhd
library ieee;
use ieee.std_logic_1164.all;

entity ejemplo13 is
port (EN_L, A: in std_logic;
Y : out std_logic);
end ejemplo13;
architecture buffer of ejemplo13 is
begin
Y <= A when EN_L = 1 else Z;
end buffer;

Descripcin por flujo de datos


o RTL

Ejemplo 14: Disee un


circuito que multiplique
dos nmeros enteros
positivos de dos bits
cada uno. Debe tener
adems
una
entrada
habilitadora EN_L activa
en nivel bajo, tal que la
salida est en un tercer
estado
de
alta
impedancia si EN_L =
H

--file: ejemplo14.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ejemplo14 is
port (EN_L: in bit;
A, B: in std_logic_vector(1 downto 0);
P: out std_logic_vector(3 downto 0));
end ejemplo14;
architecture producto of ejemplo14 is
begin
with EN_L select
P <= A*B
when 1,
ZZZZ when 0;
end producto;

Descripcin por flujo de datos


o RTL

Ejemplo
15:
Empaquetar el diseo
del buffer con tercer
estado cuyo circuito se
muestra en la figura.
bufferPCK

PACKAGE bufferPCK is
component ejemplo13
port( EN_L, A: in std_logic;
Y: out std_logic);
end component;
end bufferPCK;

EN_L
A

library ieee;
use ieee.std_logic_1164.all;

Y
File: bufferPCK.vhd

Sentencias Concurrentes
Introduccin

Las sentencias concurrentes son aquellas que se


ejecutan simultneamente en la simulacin. Se
utilizan para el modelado del hardware, deben formar
parte siempre del cuerpo de arquitecturas o de bloques y
son las siguientes:
Procesos
Asignaciones concurrentes a seal
Llamadas concurrentes o procedimientos
Instanciaciones de componentes

Sentencia when - else


Permite realizar asignaciones condicionales de valores, expresiones u
objetos o seales. Su sintaxis de declaracin es:
[etiqueta:] seal <= valor_1 when condicin_1 else
valor_2 [when condicin_2] [else

] [else
valor_n when condicin_n] [else unaffected];
La seal recibe una asignacin u otra (valor_1valor_n) en funcin de
las condiciones que aparecen tras when. Para la opcin de no
asignacin puede (no cambio en la funcin) utilizarse la keyword
unaffected

Ejemplo de sentencia when - else


Modelo de un sumador de un bit con retencin de la suma
entity SUMADOR is:
port(A, B: in bit; ENABLE: in bit ;
SUMA: out bit_vector (1 downto 0));
end SUMADOR;
architecture CON_WHEN of SUMADOR is
begin
SUMA <=
00when (A=0 and B= 0 and ENABLE = 1) else
01when (A=1 and B= 0 and ENABLE = 1) else
01when (A=0 and B= 1 and ENABLE = 1) else
10when (A=1 and B= 1 and ENABLE = 1) else
unaffected;
end CON_WHEN

Sentencia with-select
Su sintaxis es la siguiente:
[etiqueta:] with expresin select
seal <= valor_1 when resultado_1[,
valor_2 when resultado_2] [,
..] [,
valor_n when resultado_n] [,
unaffected when others];
El valor asignado depende de la evaluacin de la expresin que aparece
entre las palabras reservadas with y select. El resultado se compara con
los valores tras when y se ejecuta la asignacin que resulta verdadera.

Ejemplo de sentencia with-select


El sumador anterior puede ser descrito tambin del siguiente modo:
architecture CON_WITH_SELECT of SUMADOR is
begin
with (ENABLE & A & B ) select
SUMA <=
00 when 100,
01 when 101,
01 when 110,
10 when 111,
unaffected when others;
end CON_WITH_SELECT;

Sentencias Secuenciales
Introduccin
Las sentencias secuenciales son aquellas que
solamente pueden aparecer dentro de procesos
y subprogramas. Se ejecutan ordenadamente, de
tal manera que el simulador finaliza completamente
una sentencia antes de pasar a la siguiente.
Todo lo contrario de lo que ocurre en las sentencias
concurrentes en donde no importa el orden.

Sentencia wait
Es una de las ms utilizadas en el modelado de circuitos sncronos,
wait detiene la ejecucin de un proceso o un procedimiento
en espera de que se satisfaga una determinada condicin. Su
sintaxis es la siguiente:
[etiqueta:] wait [on seal_1, seal_2,..]
[until condicin]
[for expresin_temporal];
Por tanto puede haber tres tipos de argumentos de ellos, o bien
ninguno. En este ltimo caso el proceso queda detenido hasta el final
de la simulacin.

Sentencia Wait on
Wait on produce el mismo efecto que la lista de sensibilidad de un
proceso. Por ejemplo:

PROCESO_1: process(A,B)
begin

end process PROCESO_1;


PROCESO_2: process
begin

wait on A,B;
end process PROCESO_2

Case - when
La sentencia case-when permite seleccionar una entre varias
alternativas excluyentes entre s de una expresin determinada, su
sintaxis general es la siguiente:
[etiqueta:] case expresin is
when caso_1[ caso_2 ] => sentencias secuenciales
....
end case [etiqueta];
De este modo una arquitectura alternativa para el mismo sumador
anterior podra ser como se muestra a continuacin.

Ejemplo de Case-When
architecture CON_CASE of SUMADOR is
begin
process
variable X: bit_vector(2 downto 0);
begin
X<= ENABLE & A & B;
case X is
when 100=> SUMA <=00;
when 101| 110 => SUMA <=01;
when 111 => SUMA <= 10;
when others => null;
end case;
end process;
end CON_CASE

Bucles
Para la ejecucin de bucles en VHDL se utiliza la palabra reservada
loop. Existen tres formas de definir un bucle:
- Con for-loop siempre se hace referencia a un bucle finito,
-Con while-loop a uno finito o infinito (depende de la condicin) y
-Con simplemente loop a uno infinito
A continuacin analizaremos estas tres opciones.

For - Loop
Esta sentencia causa la ejecucin de un bucle un numero fijo de veces,
su sintaxis es la siguiente:
[etiqueta:] for indice in rango loop
sentencias secuenciales
end loop [etiqueta];
Es necesaria las indicaciones de un ndice y un rango. El ndice es una
variable discreta, enumerada o entera, que no es preciso declarar y que
cambia su valor en una unidad por cada ejecucin del bucle a lo largo
del rango especificado.

Ejemplo For-loop
Contar el numero de unos de una seal binaria de 32 bits.
.
for I in 0 to 31 loop
if SENAL (I)=1 then NUMERO_UNOS:= NUMERO_UNOS+1;
end if;
end loop;
.

While - Loop
El siguiente tipo de bucle utiliza la palabra reservada while para
imponer la condicin de repeticin. Su sintaxis es la siguiente:

[etiqueta:] while condicin loop


sentencias secuenciales
end loop [etiqueta];
El bucle se repite en tanto que la condicin que aparece tras while sea
verdadera.

Ejemplo While-loop

.
I:=0;
while (I>32) loop
if SEAL (I)=1 then NUMERO_UNOS:= NUMERO_UNOS+1;
end if
I:= I+1;
end loop;
....
Ahora si se nesecita declarar una variable (I) para poder establecer la
condicin del bucle, no resulta ventajosa con respecto a for loop.

Loop
Ejecuta un bucle infinito y su sintaxis es as:

[etiqueta:] loop
sentencias secuenciales
end loop [etiqueta];