Beruflich Dokumente
Kultur Dokumente
VHDL
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
IN BIT;
OUT BIT);
I1
I2
ARCHITECTURE C1 OF nand2 IS
BEGIN
O<=NOT(I1 AND I2);
END C1;
Tipos de datos
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.
END nombre_arq;
component nombre_componente
port (seales_entrada: modo tipo;
seales_salida: modo tipo);
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
...
Instanciacin de componentes
END nombre_arq;
A
B
A
B
AN
ANB
BN
ABN
begin
-- instanciacin de componentes
AN
U3
ANB
U5
U4
U2
BN
ABN
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;
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;
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.
component INV
port (I: in bit;
O: out bit);
end component;
component NAND3
port (I1, I2, I3: in bit;
O: out bit);
end component;
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));
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;
--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;
| alternativaN,
Las barras verticales (|) tienen el
mismo significado que la operacin OR
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
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,
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;
end MUX1;
--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.
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
] [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
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:
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];