Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Digitales Capitulo 3 PDF
Digitales Capitulo 3 PDF
VHDL
n
n
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
entidad 3
arquitectura 2
Arquitectura 3
entidad 4
Bloque 4
arquitectura 4
I1
IN BIT;
OUT BIT);
O
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
Tipos de datos
a
STRING: describe cadenas de caracteres.
Rango: conjunto de caracteres.
abcde
n
Estructura de un programa
escrito en VHDL
n
n
n
component nombre_componente
end component;
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
A
B
AN
ANB
BN
ABN
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;
En la asociacin nominal o
se
vuelve
explcita
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;
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;
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.
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.
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.
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.
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.
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
Lgicos:
De relacin:
Aritmticos:
Integer
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;
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;
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;
Entity circuito is
T(x,y,z,u,v) =
(0,4,18,19,22,23,25,29) +
(14,16,20,24)
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;
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;
<=
<=
<=
<=
--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;
--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;
Ejemplo
15:
Empaquetar el diseo
del buffer con tercer
estado cuyo circuito se
muestra en la figura.
library ieee;
use ieee.std_logic_1164.all;
PACKAGE bufferPCK is
component ejemplo13
port( EN_L, A: in std_logic;
Y: out std_logic);
end component;
end bufferPCK;
File: bufferPCK.vhd
Sentencias Concurrentes
Introduccin
n
n
n
n
] [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
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.
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
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
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
[etiqueta:] loop
sentencias secuenciales
end loop [etiqueta];