Está en la página 1de 61

TEMAS 4-5: Lenguaje de

Descripción del Hardware (VHDL)

SISTEMAS DIGITALES II
HDL: Lenguaje de Descripción
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 estándares IEEE: VHDL (Very High
Speed Integrated Circuit Hardware Description Lenguage)
y Verilog HDL.
■ El VHDL es más 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 estandarización en 1984 que luego se
aprobó en 1987 con el número 1076.
■ En 1994 el IEEE publicó la revisión del estandar IEEE Std
1076-1993 que es la que se encuentra vigente.
VHDL
■ Trabaja con diseño jerárquico: top – down o down - top.
■ Independencia tecnológica que permite diseñar circuitos
cuya descripción no depende de la forma de
implementación física posterior.
■ Universalidad, es decir compatibilidad con un gran
número de herramientas CAD.
■ Diferentes tipos de Descripciones: Sistema, algorítmico,
RTL, Lógico, Conmutación, Eléctrico, Físico.
■ Características: Se declara una caja negra (entity) con
un identificador para el circuito, y sus terminales de
entrada y salida. También 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 descripción difiere según 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 más comprensible y que sea fácil de probar y de dar
mantenimiento. En VHDL, cada porción del diseño 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 entidad 3

Bloque 2 Bloque 3 arquitectura 2 Arquitectura 3

entidad 4
Bloque 4
arquitectura 4
Ejemplo de entidad y arquitectura
ENTITY nand2 IS A
PORT(I1,I2: IN BIT; F
O: OUT BIT); B

END nand2;

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

Adicionalmente el archivo de texto creado se graba con extensión vhd.


Para nuestro ejemplo: nand2.vhd
Estructura Básica de un programa VHDL.
■ Se inicia declarando las bibliotecas que se usarán 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
■ Después se lista la arquitectura.
Estructura Básica 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 ARCHITECTURE nombre_arq OF nombre_ent IS
tiene dos partes: La
región de las declaraciones [Declaración de señales]
[Declaración de tipos]
y el cuerpo de la [Declaración de variables]
arquitectura. [Declaración de constantes]
[Declaración de componentes]
■ La región de declaraciones [Especificación de atributos]
precede la palabra clave
BEGIN
BEGIN. Puede ser usada
para declarar señales, {Instanciación de componentes}
variables y constantes. {Enunciado concurrente}
{Enunciado secuencial [Proceso]}
También puede ser usada
para declarar componentes END nombre_arq;
y especificar atributos.
Tipos de descripciones dentro
de la arquitectura
■ Estructural o lógica: Descripción exacta
del esquema lógico que resuelve la
función objeto del diseño.
■ De flujo de datos o RTL.
■ Comportamental o algorítmica
(descripción funcional).
Descripción Estructural o lógica
■ En la descripción estructural el cuerpo
de la arquitectura se transforma en una component nombre_componente
descripción exacta del esquema lógico.
■ Para la descripción estructural el VHDL port (señales_entrada: modo tipo;
se apoya en las declaraciones de
señales_salida: modo tipo);
componentes
■ La cantidad de declaraciones de
componentes debe de corresponder con end component;
la cantidad de componentes distintas
que formarán parte del circuito físico
que realiza la función lógica a diseñar.
■ La declaración component posee una
estructura similar a la de una entidad,
pero no tiene la misma connotación.
Descripción Estructural o lógica
■ En la sección de declaraciones de la
arquitectura (región ubicada entre la ARCHITECTURE nombre_arq OF nombre_ent IS

palabra reservada architecture y la [Declaración de tipos]


palabra begin) puede existir la necesidad [Declaración de señales]
[Declaración de variables]
de realizar algunas declaraciones de [Declaración de constantes]
señales internas, las cuales intervienen [Declaración de componentes]
[Especificación de atributos]
en la descripción del circuito, pero que
no tienen acceso a los terminales BEGIN
externos del diseño (no están declaradas Instanciación de componentes
en la entidad.
. ..
■ Aparecen en mayúsculas las palabras
Instanciación de componentes
reservadas del lenguaje VHDL para
resaltarlas, pero no es necesario ya que END nombre_arq;
el VHDL no es sensible al tipo de letra
Descripción Estructural o lógica
■ Ej: Realizar la
descripción en VHDL de A

tipo estructural de la B
Y

operación EXOR
■Y = AB + AB

ENTITY XOR IS
PORT (A,B: IN BIT;
Y: OUT BIT);
END XOR;
Descripción Estructural o lógica
La arquitectura puede ser la siguiente:
Architecture XOR1 of XOR is
-- declaración de señales
signal AN, BN : bit;
signal ANB, ABN : bit;
- - declaración de componentes
A AN
component INV ANB
port (I: in bit; B
Y
O: out bit);
end component;
component AND2
port (I1, I2: in bit; ABN
O: out bit); BN
end component;
component OR2
port (I1, I2: in bit;
O: out bit);
end component;
Descripción Estructural o lógica
■ Estamos usando 3 tipos begin
de componentes: un -- instanciación de componentes
inversor (declarado INV), U1: INV port map (A,AN);
una compuerta AND de U2: INV port map (B,BN);
dos entradas (declarada U3: AND2 port map (AN,B,ANB);
AND2) y una compuerta U4: AND2 port map (A,BN,ABN);
OR de dos entradas U5: OR2 port map (ANB,ABN,Y);
(declarada OR2). end XOR1;
■ Para la descripción de la
función lógica XOR se
emplearon dos instancias,
U1 y U2 de INV; dos
instancias U3 y U4 de
AND2 y una instancias U5
de OR2.
Descripción Estructural o lógica
■ En la asociación nominal o component OR2
explícita se vuelve port (I1, I2: in bit;
O: out bit);
irrelevante el orden de los end component;
parámetros, por cuanto
dentro del paréntesis se begin
indican explícitamente las ...
señales que se conectan a - - asociación explícita
los terminales de las
U5: OR2 port map(O=>Y, I1=>ANB,
componentes, mediante el I2=>ABN);
símbolo => de asignación
end XOR1;
Descripción Estructural o lógica

ENTITY XOR IS component AND2


PORT (A, B: IN BIT; port (I1, I2: in bit;
Y: OUT BIT); O: out bit);
END XOR; end component;
component OR2
Architecture XOR1 of XOR is port (I1, I2: in bit;
-declaración de señales O: out bit);
signal AN, BN : bit; end component;
signal ANB, ABN : bit; begin
- declaración de componentes - instanciación de componentes
U1: INV port map(A,AN);
component INV U2: INV port map(B,BN);
port (I: in bit; U3: AND2 port map(AN,B,ANB);
O: out bit); U4: AND2 port map(A,BN,ABN);
end component; 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 pequeños, por lo que si
el circuito es grande su escritura puede ser tediosa y propensa a
cometer errores.
Descripción Estructural o lógica
■ Uno de los tipos de señales
con que trabaja en VHDL es
el arreglo de señales, tanto
del tipo bit_vector, como del
tipo std_logic_vector. Esto
permite escribir de forma
más compacta los diseños en
VHDL.
■ Ellos representan un arreglo
de bits y se utilizan con
dispositivos multiterminales.
Descripción Estructural o lógica
■ Ej: Realizar la
descripción VHDL de
tipo estructural de un
decodificador de 2
entradas y 4 salidas,
activadas con el nivel
bajo, y una entrada
de habilitación,
también activa en el
nivel bajo.
Descripción Estructural o lógica
■ Lo primero es realizar la architecture decod_a of decod2x4 is
declaración de la entidad. La
-- declaración de señales
declaración de la arquitectura signal AN(1),AN(0), EN: bit;
del decodificador, en su
-- declaración de componentes
primera parte, corresponde a
la declaración de los component INV
diferentes tipos de port (I: in bit;
O: out bit);
componentes. Se usan dos end component;
tipos de componentes: INV,
component NAND3
un inversor y NAND3, una port (I1, I2, I3: in bit;
compuerta NAND de 3 O: out bit);
end component;
entradas.
Descripción Estructural o lógica
begin
--instanciación de componentes

■ En el cuerpo de la U1: INV port map (A(0),AN(0));

arquitectura se observa la U2: INV port map (A(1),AN(1));


instanciación de los 7 U3: INV port map (NEN,EN);
componentes, los cuales U4: NAND3 port map (EN, AN(1), AN(0), NY(0));
son conectados usando la U5: NAND3 port map (EN, AN(1), A(0), NY(1));
cláusula port map con U6: NAND3 port map (EN, A(1), AN(0), NY(2));
asociación implícita. U7: NAND3 port map (EN, A(1), A(0), NY(3));
end decod_a;
Descripción por flujo de datos
o RTL
■ En la descripción por flujo de datos, la
arquitectura describe como fluyen las
señales de entrada por el circuito hacia
los terminales de salida.
■ Este estilo de escritura de la
arquitectura es llamada descripción de
transferencia de registros RTL (Register
Transfer Language).
Descripción por flujo de datos
o RTL
Ejemplo: La arquitectura por descripción
■ En la aproximación por flujo de de flujo de datos de una compuerta XOR
de dos entradas es:
datos se utilizan declaraciones
architecture XOR2 of XOR is
de asignación de señales, así
begin
como operadores lógicos que
--asignación de señales
no se emplean en el estilo de Y <= (not A and B) or (A and not B);
escritura estructural. end XOR2;
■ Los operadores lógicos que A
tiene el VHDL en sus librerías B
Y
son: not, and, or, nand, nor,
xor y xnor.
Descripción por flujo de datos
o RTL
■ La forma de descripción de la
arquitectura mediante la Ejemplo: La existencia del operador XOR
aproximación por flujo de datos compacta extraordinariamente el cuerpo
simplifica los diseños VHDL, pues de la arquitectura de la entity XOR
los hace más compactos. Architecture XOR3 of XOR is
■ Después de la palabra clave begin Begin
se produce la asignación del flujo - asignación de señales
de datos de las señales del
Y <= A xor B;
miembro de la derecha hacia la
señal Y, del miembro de la End XOR3
izquierda (salida).
■ El miembro de la derecha del
operador de asignación <= se le
conoce como expresión, cuyo valor
se obtiene evaluándola completa.
Descripción por flujo de datos
o RTL
■ El VHDL, como otros Lógicos: AND, OR, XOR, NOT, NAND,
lenguajes de programación NOR y XNOR
posee un conjunto de Aritméticos: +, -, * (multiplicación solo
operadores que se usan con por 2)

las señales o con las De relación: =, /=, <, >, <=, >=
variables declaradas en sus
De concatenación: &
diseños.
Descripción por flujo de datos
o RTL
■ La tabla presentada a Operadores Definidos para los tipos
continuación contiene
una clasificación de los
operadores definidos en Bit, Boolean, Bit_vector,
el lenguaje VHDL, así Lógicos: std_logic y std_logic_vector
como los tipos de datos De relación: Integer, Bit, y Bit_vector
sobre los que se pueden
operar los mismos. Aritméticos: Integer
■ Los operadores lógicos
han sido extendidos al Concatenación: Bit, Bit_vector y para las
cadenas
uso en cualquier tipo de
señal lógica, ya sea
bit_vector, std_logic, o
std_logic_vector.
Descripción por flujo de datos
o RTL
■ Cuando los operadores lógicos
se usan con los tipos de
señales std_logic o bit, ellos
poseen su significado usual. Un ejemplo de operaciones lógicas con el
tipo de datos vector es el siguiente:
Los valores '0' y '1' son valores
constantes y deben estar ’’01100101’’xor’’10101101’’=’’11001000’’

encerrados entre apóstrofes.


■ Cuando el tipo de señal usada
es declarada std_logic_vector
o bit_vector, entonces los
valores deben estar encerrados
entre comillas.
Descripción por flujo de datos
o RTL
Ejemplo: Sean las siguientes
■ Existe un operador interno del declaraciones:
VHDL, que es el signo & y que
Signal a: bit_vector(1 to 4);
realiza la concatenación de
señales o variables de distinta Signal b: bit_vector(1 to 8);
“longitud”. b<=’’0000’’&a;

En el ejemplo para concatenar la señal 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 símbolo & añade el vector a (de 4 bits) al
final de una secuencia de 4 ceros “0000” para realizar
exitosamente la asignación al vector b, que fue declarado
como un vector de 8 bits.
Descripción por flujo de datos
o RTL
■ En el cuerpo de la arquitectura de un -- asignación de señales
diseño VHDL por RTL se usan, Nombre de la señal<=expresion;
sentencias concurrentes de asignación
-- asignación condicional de señales
de señales, cuyo formato se presenta
Nombre de la señal<=expresión
a continuación. when expresión booleana else
■ En una descripción RTL, el valor de la Nombre de la señal<=expresión
expresión del miembro de la derecha when expresión booleana else
de la asignación de señales ( <= ), se …
lo transfiere al nombre de la señal del Nombre de la señal<=expresión
miembro de la izquierda. when expresión booleana else
Expresión;
■ Ambos miembros deben ser del
mismo tipo, para que no existan
incompatibilidades.
Descripción por flujo de datos
o RTL
Ejemplo 8:
Entity comp is
■ Realice una descripción en VHDL de
Port (a, b: in bit_vector (3 downto 0);
la arquitectura de un comparador E: out bit);
de dos entradas, a y b, de 4 bits End comp;
cada una y una salida E de 1 bit.
Architecture comparador_1 of comp is
■ En esta arquitectura se describe
cómo los datos se mueven desde Begin
los terminales de entrada, de señal --asignación de señales
en señal, hasta la salida.
E<= not(a(0)xorb(0))
■ Se necesita del conocimiento del
and not(a(1)xorb(1))
circuito lógico del comparador, del and not(a(2)xorb(2))
cual obtener la función E de salida: and not(a(3)xorb(3))
end comparador_1;
■ E=(a0b0)(a1b1)(a2b2)(a3b3)
Descripción por flujo de datos
o RTL
Library ieee;
Ejemplo 8: Use ieee.std_logic_1164.all;
■ Realice una descripción en
VHDL de la arquitectura de Entity comp is
un comparador de dos Port (a, b: in bit_vector(3 downto 0);
entradas, a y b, de 4 bits E: out bit);
cada una y una salida E de 1 End comp;
bit.
Architecture comparador_2 of comp is
■ Otra solución más compacta
Begin
se puede construir usando la --asignación de señales
estructura when – else. Esta
solución no necesita del E<=‘1’ when (a=b) else ‘0’;
conocimiento del circuito
end comparador_2;
lógico del comparador.
Descripción por flujo de datos
o RTL
■ En VHDL, cuando una señal 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
asignación). De esta manera se actualizan los valores de
las señales.
■ En el ejemplo anterior, un cambio en las entradas a o b,
o en ambas provocará un cambio en la expresión. Este
cambio es asignado a la señal de salida E, actualizando
su valor.
E <= '1' when (a=b) else '0';
Descripción por flujo de datos
o RTL
■ Otro tipo de sentencia de asignación
concurrente usada en la descripción
por flujo de datos es la asignación --asignación de señal seleccionada
de señal seleccionada, cuya sintaxis
se expresa a continuación. Este tipo with expresión select
de declaración de asignación utiliza
la estructura with – select – when señal <= valor1 de la señal when alternativa 1,
■ En esta estructura se evalúa la valor2 de la señal when alternativa 2,
expresión que acompaña a la ...
declaración with y cuando el valor valorn de la señal when alternativa n;
coincide con una de las alternativas
señaladas después de la palabra
clave when, entonces el valor
correspondiente a esta alternativa se
lo asigna al nombre de la señal.
Descripción por flujo de datos
o RTL
■ Las alternativas contenidas Valor de la señal when alternativa1 |
después de la palabra clave
when pueden ser varias o una alternativa2 | alternativa3 | …..
sola. Si son varias, las | alternativaN,
alternativas deben ser todas
Las barras verticales (|) tienen el
distintas y cubrir todos los
mismo significado que la operación OR
posibles valores de éstas.
Cuando el valor de la señal
para varias alternativas es el
mismo, pueden ser
expresadas como una lista de
valores separados por barras
verticales ( | )
Descripción por flujo de datos
o RTL
■ Cuando no se cubren todos
los posibles valores de las --asignación de señal seleccionada
alternativas, se debe usar la
with expresión select
palabra clave de VHDL
others, con el último when señal <= valor1 de la señal when alternativa 1,
en este tipo de asignación valor2 de la señal when alternativa 2,
...
de señales. valorn de la señal when others;
■ Este tipo de declaración de
asignación utiliza la
estructura with – select –
when others
Descripción por flujo de datos
o RTL
Ejemplo 9: Entity circuito is
port (m: in integer range (31 downto 0);
■ Escriba en VHDL una
T: out std_logic);
descripción de la
siguiente función: End circuito;
Architecture RTL of circuito is
T(x,y,z,u,v) =
Σ(0,4,18,19,22,23,25,29) + Begin
φΣ (14,16,20,24) -- asignación de señal 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;
Descripción por flujo de datos
o RTL
Ejemplo 10: entity detector is
port (N: in integer range (15 downto 0);
■ Escriba en VHDL la P: out std_logic);
end detector;
descripción de un circuito
combinacional, el cual recibe architecture num_par of detector is
Begin
en sus entradas los dígitos del -- asignación de señal seleccionada
sistema decimal codificados with N select
P <= ‘1’ when 0 | 2 | 4 | 6 | 8,
en NBCD y tiene una salida P, ‘0’ when 1 | 3 | 5 | 7 | 9,
que va a ‘1’ cuando se detecta ‘-’ when others; -- opcionales
end num_par;
en sus entradas un dígito par.
Descripción por flujo de datos
o RTL
Ejemplo 11:
■ Realizar la descripción por
flujo de datos de un MUX
4 a 1.
Descripción por flujo de datos
o RTL
architecture MUX1 of MUX is

signal x: bit_vector(3 downto 0);

Begin
--asignación de señales

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


X(2) <= S(1) and not S(0) and D(2);
X(1) <= not S(1) and S(0) and D(1);
X(0) <= 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 lógicos necesita del circuito final de este MUX
Descripción por flujo de datos
o RTL
Ejemplo 12: Otra solución usando architecture mux2 of mux is
with – select.
■ Como se observa, esta begin
descripción de la arquitectura
-- asignación de señal seleccionada
es más simple que la anterior y
no necesita del conocimiento with S select
de la lógica interna del circuito. F <= D(0) when “00”,
D(1) when “01”,
D(2) when “10”,
D(3) when “11”;
end mux2
Descripción por flujo de datos
o RTL
■ Ejemplo 13: Diseñe un
buffer con tercer estado
cuyo circuito se --file: ejemplo13.vhd
muestra. 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;
Descripción por flujo de datos
o RTL
■ Ejemplo 14: Diseñe un --file: ejemplo14.vhd
library ieee;
circuito que multiplique use ieee.std_logic_1164.all;
dos números enteros use ieee.std_logic_unsigned.all;
positivos de dos bits cada entity ejemplo14 is
uno. Debe tener además port (EN_L: in bit;
una entrada habilitadora A, B: in std_logic_vector(1 downto 0);
P: out std_logic_vector(3 downto 0));
EN_L activa en nivel bajo, end ejemplo14;
tal que la salida esté en
architecture producto of ejemplo14 is
un tercer estado de alta begin
impedancia si EN_L = H with EN_L select
P <= A*B when ‘1’,
’’ZZZZ’’ when ‘0’;
end producto;
Descripción por flujo de datos
o RTL
■ Ejemplo 15: library ieee;
use ieee.std_logic_1164.all;
Empaquetar el diseño
del buffer con tercer PACKAGE bufferPCK is
estado cuyo circuito se component ejemplo13
muestra en la figura. port( EN_L, A: in std_logic;
Y: out std_logic);
end component;
end bufferPCK;

File: bufferPCK.vhd
Sentencias Concurrentes

Introducción
Las sentencias concurrentes son aquellas que se
ejecutan simultáneamente en la simulación. 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 señal
■ Llamadas concurrentes o procedimientos
■ Instanciaciones de componentes
Sentencia when - else
Permite realizar asignaciones condicionales de valores, expresiones u
objetos o señales. Su sintaxis de declaración es:

[etiqueta:] señal <= valor_1 when condición_1 else


valor_2 [when condición_2] [else
… ] [else
valor_n when condición_n] [else unaffected];

La señal recibe una asignación u otra (valor_1…valor_n) en función de


las condiciones que aparecen tras when. Para la opción de no
asignación puede (no cambio en la función) utilizarse la keyword
unaffected
Ejemplo de sentencia when - else
Modelo de un sumador de un bit con retención 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 <= “00”when (A=‘0’ and B= ‘0’ and ENABLE = ‘1’) else
“01”when (A=‘1’ and B= ‘0’ and ENABLE = ‘1’) else
“01”when (A=‘0’ and B= ‘1’ and ENABLE = ‘1’) else
“10”when (A=‘1’ and B= ‘1’ and ENABLE = ‘1’) else
unaffected;
end CON_WHEN
Sentencia with-select
Su sintaxis es la siguiente:

[etiqueta:] with expresión select


señal <= valor_1 when resultado_1[,
valor_2 when resultado_2] [,
……..] [,
valor_n when resultado_n] [,
unaffected when others];

El valor asignado depende de la evaluación de la expresión que aparece


entre las palabras reservadas with y select. El resultado se compara con
los valores tras when y se ejecuta la asignación que resulta verdadera.
Ejemplo de sentencia with-select
El sumador anterior puede ser descrito también 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

Introducción
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 más utilizadas en el modelado de circuitos síncronos,


wait detiene la ejecución de un proceso o un procedimiento en
espera de que se satisfaga una determinada condición. Su sintaxis es
la siguiente:

[etiqueta:] wait [on señal_1, señal_2,…..]


[until condición]
[for expresión_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 simulación.
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 expresión determinada, su
sintaxis general es la siguiente:

[etiqueta:] case expresión is


when caso_1[ caso_2 ……] => sentencias secuenciales
....
end case [etiqueta];

De este modo una arquitectura alternativa para el mismo sumador


anterior podría ser como se muestra a continuación.
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 ejecución 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 condición) y
-Con simplemente loop a uno infinito

A continuación analizaremos estas tres opciones.


For - Loop

Esta sentencia causa la ejecución 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 ejecución del bucle a lo largo
del rango especificado.
Ejemplo For-loop

Contar el numero de unos de una señal 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 condición de repetición. Su sintaxis es la siguiente:

[etiqueta:] while condición loop


sentencias secuenciales
end loop [etiqueta];

El bucle se repite en tanto que la condición que aparece tras while sea
verdadera.
Ejemplo While-loop

….
I:=0;
while (I>32) loop
if SEÑAL (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
condición 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];

También podría gustarte