Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Digitales Capitulo 3
Digitales Capitulo 3
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
Entity comp is
Port (a, b: in bit_vector (3 downto 0);
E: out bit);
End comp;
Architecture comparador_1 of comp is
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)
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
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;
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.
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 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
--asignacin de seal seleccionada
with expresin select
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.
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
Valor de la seal when alternativa1 |
alternativa2 | alternativa3 | ..
| alternativaN,
Las barras verticales (|) tienen el
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 ( | )
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
--asignacin de seal seleccionada
with expresin select
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
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:
Entity circuito is
port (m: in integer range (31 downto 0);
T: out std_logic);
End circuito;
siguiente funcin:
T(x,y,z,u,v) =
(0,4,18,19,22,23,25,29) +
(14,16,20,24)
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
entity detector is
port (N: in integer range (15 downto 0);
P: out std_logic);
end detector;
architecture num_par of detector is
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.
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. 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
La arquitectura basada en flujo de datos utilizando
operadores lgicos necesita del circuito final de este MUX
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;
Descripcin por flujo de datos
o RTL
Ejemplo 12: Otra solucin usando
with select.
Como se observa, esta
descripcin de la arquitectura
architecture mux2 of mux is
begin
-- asignacin de seal seleccionada
descripcin de la arquitectura
es ms simple que la anterior y
no necesita del conocimiento
de la lgica interna del circuito.
-- 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
Ejemplo 13: Disee un
buffer con tercer estado
cuyo circuito se
muestra.
--file: ejemplo13.vhd
library ieee;
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;
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
--file: ejemplo14.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ejemplo14 is
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
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
library ieee;
use ieee.std_logic_1164.all;
PACKAGE bufferPCK is
component ejemplo13
estado cuyo circuito se
muestra en la figura.
component ejemplo13
port( EN_L, A: in std_logic;
Y: out std_logic);
end component;
end bufferPCK;
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 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 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)); 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[, 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 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 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 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 [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 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 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 [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 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 [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];