Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sintesis de Circuitos Digitales Utilizando VHDL - Valle
Sintesis de Circuitos Digitales Utilizando VHDL - Valle
CIRCUITOS DIGITALES
UTILIZANDO VHDL
A N T E C E D E N T E S
En los ltimos diez aos la industria
electrnica ha tenido una gran evolucin en el
desarrollo de sistemas digitales; desde
computadoras personales, sistemas de audio y
vdeo hasta dispositivos de alta velocidad para las
comunicaciones. Productos hechos con una alta
tecnologa que permite aumentar la funcionalidad,
disminuir costos, mejorar el aprovechamiento de
la energa, as como una marcada tendencia hacia
la miniaturizacin. Esto ha sido posible gracias a
la implementacin de herramientas de diseo
asistidos por computadora, conocidas como
herramientas CAD (Computer Aided Design),
aunque especficamente se hace uso de
herramientas
EDA
(Electronic
Design
Automation), que es el nombre que se le da a
todas las herramientas CAD para el diseo de
sistemas electrnicos. Este software de diseo
electrnico que facilita a los ingenieros el
desarrollo de circuitos es cada vez mas sofisticado
y, adems, contamos con computadoras cada vez
ms veloces y de mayor capacidad de
procesamiento. Ambos, hardware y software,
constituyen actualmente herramientas muy
importantes que simplifican el trabajo de diseo
electrnico. Adems de facilitar el trabajo, el uso
de herramientas EDA tambin aceler los
procesos de diseo. Esta situacin condujo a
adoptar nuevas metodologas para el diseo y
evaluacin de los circuitos electrnicos. El uso de
las herramientas EDA junto con los dispositivos
lgicos programables, que pueden ser utilizados
en
diferentes
aplicaciones
e
inclusive
reprogramados, cambiaron bastante el concepto
de diseo de circuitos digitales.
N D I C E
ANTECEDENTES
1.
1.1. INTRODUCCIN.
1.3.1.
2.
1.4. VHDL
10
10
2.2.1.
10
11
2.3.1.
11
2.3.2.
BLOQUES LGICOS
11
2.3.3.
DISTRIBUCIN DE PRODUCTOS
12
2.3.4.
MACROCELDAS
12
2.3.5.
CELDA DE ENTRADA/SALIDA
13
CELDAS LGICAS
13
14
17
18
3.1.1.
MULTIPLEXORES
18
3.1.2.
COMPARADORES
19
3.1.3.
20
3.2. IDENTIFICADORES
21
21
3.3.1.
CONSTANTES
21
ii
3.3.2.
VARIABLES
22
3.3.3.
SEALES
22
3.3.4.
ALIAS
22
22
3.4.1.
TIPOS ESCALARES
22
3.4.2.
TIPOS COMPUESTOS
25
3.4.3.
SUBTIPOS
27
3.4.4.
27
3.4.5.
27
3.5. OPERADORES
28
3.5.1.
OPERADORES LGICOS
28
3.5.2.
OPERADORES DE COMPARACIN
28
3.5.3.
OPERADORES DE ADICIN
28
3.5.4.
OPERADORES DE MULTIPLICACIN
29
3.5.5.
OPERADORES MISCELNEOS
29
3.5.6.
OPERADORES DE ASIGNACIN
29
3.5.7.
OPERADORES DE ASOCIACIN
30
3.5.8.
OPERADORES DE CORRIMIENTO
31
3.5.9.
31
3.6. ATRIBUTOS
32
3.7. ENTIDADES
32
3.7.1.
GENRICOS
33
3.7.2.
PUERTOS
33
3.7.3.
MODOS
33
3.8. ARQUITECTURAS
34
34
3.9.1.
INSTRUCCIONES CONCURRENTES
35
3.9.2.
35
3.9.3.
ALU
35
38
38
3.10.2. PROCESOS
38
39
40
42
iii
3.11.1. COMPONENTES
42
43
44
3.12. SUBPROGRAMAS
3.12.1. PROCEDIMIENTOS
47
3.12.2. FUNCIONES
47
48
50
3.13. LIBRERAS
4.
50
50
3.13.2. PAQUETES
52
54
55
57
4.2.1.
PROCESO DE SIMULACIN
57
4.3. COMPARADORES
60
4.4. MULTIPLEXORES
65
4.4.1.
65
4.4.2.
DESCRIPCIN COMPORTAMENTAL
66
4.4.3.
DESCRIPCIN ESTRUCTURAL
67
4.5. SUMADORES
5.
47
68
4.5.1.
SUMADOR TOTAL
68
4.5.2.
69
4.5.3.
SYNTHESIS OFF
70
4.6. REGISTROS
71
4.7. CONTADORES
73
76
4.8.1.
DESCRIPCIN ESTRUCTURAL
77
4.8.2.
DESCRIPCIN COMPORTAMENTAL
78
79
83
5.1. INTRODUCCIN
84
5.2. ANTECEDENTES
84
iv
84
5.3.1.
FILTROS FIR
84
5.3.2.
FILTROS IIR
85
5.3.3.
86
86
86
5.6. RESULTADOS
93
CONCLUSIONES
95
BIBLIOGRAFA
97
I
IEC FRANCISCO JAVIER TORRES VALLE
LENGUAJES DE
DESCRIPCIN DE
HARDWARE
1
1.1
INTRODUCCIN
1.2
EL CONCEPTO DE
HERRAMIENTAS CAD-EDA
SNTESIS
SIMULACIN
FUNCIONAL
ANLISIS
TEMPORAL
FUNCIONA?
FUNCIONA?
II.
si
no
III.
Simulacin de eventos.
si
PROGRAMACIN
DEL
DISPOSITIVO
no
FUNCIONA?
Diagramas esquemticos.
IV.
no
IDEA
DESCRIPCIN
DEL CIRCUITO
I.
PRUEBAS AL DISEO
ELABORACIN
DEL PROTOTIPO
si
FINALIZA EL
PROCESO DE
DISEO
V.
Simulacin funcional.
Simulacin digital.
Simulacin elctrica.
Diseo de PCBs
1.3
LENGUAJES DE
DESCRIPCIN DE
HARDWARE
1.4
VHDL
FLUJO DE DATOS
COMPORTAMENTAL
ESTRUCTURAL
1.5
I.
METODOLOGA DE DISEO
UTILIZANDO VHDL
Definicin de los requerimientos del
sistema.
Sntesis
II
DISPOSITIVOS LGICOS
PROGRAMABLES
2.1
CONCEPTOS
FUNDAMENTALES
FUNCIONALIDAD COMPLETA
Tambin
denominadas
generadores
de
funciones, son bloques lgicos configurados para
procesar cualquier funcin lgica, similares en su
funcionamiento a una memoria. En estas celdas se
almacenan los datos de salida del circuito
combinacional en vez de implementar fsicamente
la ecuacin booleana.
2.2
DISPOSITIVOS LGICOS
PROGRAMABLES
2.2.1
10
2.3
CPLD
2.3.1
MATRIZ DE INTERCONEXIONES
PROGRAMABLES
2.3.2
BLOQUES LGICOS
2.3.3
DISTRIBUCIN DE PRODUCTOS
2.3.4
MACROCELDAS
2.3.5
2.4
Figura 2.8 Macrocelda de entrada en dispositivos
de la familia FLASH 370
IEC FRANCISCO JAVIER TORRES VALLE
CELDA DE ENTRADA/SALIDA
FPGA
2.4.1
CELDAS LGICAS
ANTIFUSE
SRAM
15
16
III
IEC FRANCISCO JAVIER TORRES VALLE
SINTAXIS DEL
LENGUAJE
17
3.1
INTRODUCCIN A LA
DESCRIPCIN EN VHDL DE
CIRCUITOS DIGITALES
3.1.1
z0
MULTIPLEXORES
ENTRADA SALIDA
s0
z0
x0
x1
s0
SALIDA
s0
x0
x1
z0
3.1.2
COMPARADORES
SALIDAS
x_may_y equals x_men_y
x>y
x=y
x<y
ENTITY multiplexor IS
PORT (s0, x0, x1: IN bit;
z0: OUT bit);
END multiplexor;
ARCHITECTURE data_flow OF multiplexor IS
SIGNAL not_s0, and1, and2: bit;
BEGIN
z0 <= and1 OR and2;
and1 <= not_s0 AND x0;
19
3.1.3
EL ESTILO DE PROGRAMACIN
EN VHDL
EJEMPLOS
-- Este es un comentario.
ENTITY contador IS -- comentario al final
-- de una lnea
3.2
3er_Modulo
IDENTIFICADORES
Mi_entidad
Mux4a2
TTL_7490
_salida_x
-- o con el carcter de
-- subrayado
M__24xmax
-- no se permiten dos
-- caracteres de
-- subrayado seguidos
My_design_ -- un identificador no
-- debe terminar con un
-- carcter de subrayado
Unidad&
SIGNAL
3.3
-- el caracter "&", no
-- es un carcter vlido
-- palabra reservada
OBJETOS DE DATOS
3.3.1
CONSTANTES
EJEMPLO
DECLARACIN DE SEALES
SIGNAL identificador: tipo [:=valor];
3.3.2
VARIABLES
EJEMPLO
EJEMPLOS
SIGNAL A, B: bit := '0';
-- el valor
-- inicial es
-- opcional
3.3.4
ALIAS
EJEMPLO
3.3.3
SEALES
3.4
TIPOS DE DATOS
3.4.1
TIPOS ESCALARES
ENTERO
REAL
ENUMERADOS
BIT
El bit es un tipo enumerado que representa
valores binarios: '0' y '1'. Las operaciones lgicas
en las participa este tipo de dato regresan valores
binarios mediante las siguiente funcin.
IF (boolean_var) THEN
bit_var := '1';
ELSE
bit_var := '0';
END IF;
23
CHARACTER
El tipo character es un tipo enumerado que
contiene el conjunto de los smbolos contenido
en el ASCII.
STD_LOGIC
El tipo std_logic es similar al tipo bit pero con
la excepcin que ste no esta definido dentro del
lenguaje. El paquete std_logic_1164 de la IEEE
define al std_logic como un tipo de dato el cual
puede tomar los valores 'U', 'X', '0', '1', 'Z', 'W', 'L',
'H', '-'. Para poder utilizar este tipo de dato es
necesario incluir el paquete dentro de la
descripcin utilizando las siguientes dos lneas
antes de la declaracin de la entidad.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
'X' -- Forcing
'L' -- Weak 0
'0' -- Forcing 0
'H' -- Weak 1
'1' -- Forcing 1
Se indica a que
tipo estamos
haciendo
referencia
D <= '1';
-- En estas dos
-- asignaciones el
-- programa de sntesis
-- identifica de que
-- tipo se trata
FSICOS
25
3.4.2
TIPOS COMPUESTOS
26
inst2 := inst1;
ARREGLOS RESTRINGIDOS
y1 <= B"1011";
x2 <= x"A";
y2 <= x"7";
z_octal <= o"2";
un_bit <= '1';
EJEMPLO:
ARREGLOS INDEFINIDOS
Un arreglo indefinido o sin restricciones
(Unconstrained Array) es aquel que no est
delimitado mediante un rango entero especifico.
Un objeto de datos declarado con arreglo
indefinido deber ser delimitado o de lo contrario
no podr ser sintetizado.
EJEMPLO
TYPE bit_vector IS ARRAY
(integer RANGE <>) OF bit;
VARIABLE v: bit_vector(5 DOWNTO -5);
STD_LOGIC_VECTOR
EJEMPLOS
x1 <= "0001";
27
3.4.3 SUBTIPOS
Un subtipo es un subgrupo de un tipo
predefinido. Los subtipos son tiles para crear
tipos de datos con limitaciones sobre tipos
mayores.
DECLARACIN DE SUBTIPOS
SUBTYPE identif IS tipobase RANGE <rango>;
EJEMPLOS
SUBTYPE byte IS bit_vector (7 DOWNTO 0);
SUBTYPE digito IS integer RANGE (0 TO 9);
3.4.5
- Tipos fsicos
- Tipos reales o flotantes.
- Objetos de datos ACCESS. Un ACCESS
equivale a un apuntador y no es soportado por que
no tiene ningn sentido en hardware.
28
29
3.5
OPERADORES
AND z OR w
esta forma de utilizar los
op. lgicos, es incorrecta y
producir un error cuando sea
compilado el cdigo
x <= y AND ( z OR w )
-- forma correcta de utilizar los
-- op.lgicos
3.5.2
OPERADORES DE COMPARACIN
3.5.1
OPERADORES LGICOS
3.5.3
OPERADORES DE ADICIN
3.5.4
OPERADORES DE MULTIPLICACIN
A REM B = A-(A/B)*B
3.5.5
OPERADORES MISCELNEOS
3.5.6
OPERADORES DE ASIGNACIN
3.5.7
OPERADORES DE ASOCIACIN
EJEMPLO
LIBRARY mi_libreria;
USE mi_libreria.sumadores.ALL;
ENTITY sumador IS
PORT ( ci: IN bit;
x: IN bit_vector(3 DOWNTO 0);
y: IN bit_vector(3 DOWNTO 0);
z: OUT bit_vector(3 DOWNTO 0);
co: OUT bit);
END sumador;
ARCHITECTURE a_sumador OF sumador IS
SIGNAL carry1: bit;
SIGNAL carry2: bit;
SIGNAL carry3: bit;
BEGIN
u0: add PORT MAP ( ci => ci,
x0 => x(0),
y0 => y(0),
z0 => z(0),
co => carry1 );
u1: add PORT MAP ( ci => carry1,
x0 => x(1),
y0 => y(1),
z0 => z(1),
co => carry2 );
u2: add PORT MAP ( carry2, x(2), y(2),
z(2), carry3 );
u3: add PORT MAP ( carry3, x(3), y(3),
z(3), co );
END a_sumador;
3.5.8
OPERADORES DE CORRIMIENTO
ROL
ROR
3.5.9
Todas
las
herramientas
de
sntesis
proporcionan algn tipo de paquete en el que se
encuentre definidas funciones que facilitan la
descripcin del diseo. Dentro de estos paquetes
se encuentran funciones que estn hechas
especficamente para ser utilizadas con vectores y
como por lo general es preferible utilizar vectores
estos paquetes son de gran ayuda.
Synopsys desarroll paquetes basados en el
paquete std_logic_1164, que son utilizados por
varias herramientas de sntesis existentes en el
mercado, como por ejemplo FOUNDATION de
Xilinx, Inc. y MAX+PLUS II de Altera
Corporation. Estos paquetes son:
- std_logic_arith
- std_logic_signed
- std_logic_unsigned
La compaa Actel tambin desarroll su
propio paquete de sntesis:
- asyl.arith
Y los paquetes que fueron desarrollados por la
IEEE especficamente para sntesis de circuitos
digitales.
- numeric_bit
- numeric_std
Adems del paquete que es el ms utilizado por
la mayora de los paquetes de sntesis.
- std_logic_1164
Todos estos paquetes son los ms conocidos y
utilizados para sntesis de circuitos, por lo que
para poder utilizarlos primero debemos de incluir
la librera en que fueron compilados para
posteriormente hacer referencia al paquete que
deseamos utilizar (una librera puede tener ms de
un paquete) como se muestra a continuacin.
EJEMPLO
LYBRARY ieee; -- llamado a la librera
USE ieee.std_logic_1164.ALL; -- referencia
33
----------
3.6
ATRIBUTOS
right
high
low
'lenght
REFERENCIA A ATRIBUTOS
nombre_objeto'nombre_atributo
EJEMPLO
IF ( clk'event and clk = '1' ) THEN
A <= '1' ;
END IF;
EJEMPLOS
TYPE secuencia IS integer RANGE 0 TO 10;
SIGNAL conteo: secuencia;
conteo'left = 0
conteo'rigth = 10
conteo'lenght = 11
conteo'high = 10
conteo'low = 0
3.7
ENTIDADES
34
DECLARACION DE ENTIDADES
ENTITY identificador IS
GENERIC ( cte_1: tipo := valor;
cte_2: tipo := valor;
cte_n: tipo := valor
);
PORT ( puerto_1: modo tipo;
puerto_2: modo tipo;
puerto_n: modo tipo
) ;
END identificador ;
Note que la ultima lnea de declaracin de
puerto o de genricos no lleva punto y coma al
final de la lnea.
EJEMPLO
En este ejemplo se realiza la entidad de un
multiplexor 4 a 1 que se muestra en la figura 3.5.
ENTITY mux_4_1 IS
PORT (a, b, c, d: IN bit;
mux_signal: IN bit_vector(1 DOWNTO 0);
x: OUT bit );
END mux_4_1;
3.7.2
PUERTOS
3.7.3
MODOS
3.7.1
GENRICOS
- BUFFER
Si no se indica ningn modo en la declaracin,
se asume que es del tipo IN. Un puerto del modo
IN describe un pin del circuito que nicamente
puede ser utilizado como entrada por lo que
solamente podremos leer datos de dicho puerto y
nunca escribir sobre l. Por el contrario, un puerto
que sea declarado del modo OUT podr ser
utilizado para escribir datos pero no para ser
ledo, este representa un pin que nicamente es
salida del circuito y que en l no existe ningn
tipo de retroalimentacin hacia dentro del diseo.
Un puerto INOUT indica aquellos puertos que
son pueden ser utilizados bidireccionalmente
mientras que un puerto del modo BUFFER es
utilizado para salidas que tienen retroalimentacin
interna. La diferencia entre el modo BUFFER y el
INOUT, es que el INOUT es retroalimentado
desde el pin de salida del circuito, en tanto que
35
36
3.8
ARQUITECTURAS
EJEMPLO
ENTITY mux_4_1 IS
PORT ( a, b, c, d: IN bit;
mux_signal: IN bit_vector(1 DOWNTO 0);
x: OUT bit );
END mux_4_1;
ARCHITECTURE a_mux_4_1 OF mux_4_1 IS
BEGIN
x <= a WHEN mux_signal = "00" ELSE
b WHEN mux_signal = "01" ELSE
c WHEN mux_signal = "10" ELSE
d WHEN mux_signal = "11";
END a_mux_4_1;
3.9
DESCRIPCIONES DE FLUJO
DE DATOS
37
3.9.1
INSTRUCCIONES CONCURRENTES
EJEMPLO
gray <= "00" WHEN binario = x"0" ELSE
"01" WHEN binario = x"1" ELSE
"11" WHEN binario = x"2" ELSE
"10";
SINTAXIS
WITH identificador SELECT
signal_name1 <= expresin
valor_a WHEN
valor_b WHEN
valor_n WHEN
WHEN valor1,
valor2,
valor3,
OTHERS ;
EJEMPLO
WITH states SELECT
salida <= "000" WHEN state0,
"001" WHEN state1,
"010" WHEN state2,
"100" WHEN state3,
"000" WHEN OTHERS;
ECUACIONES BOOLEANAS
EJEMPLOS
x <= y AND z;
a <= ( b OR c OR d ) AND e ;
-- cuando se utilice ms de un operador
-- lgico es necesario utilizar parntesis
op1 <= op2 NOR op3 NOR op4;
3.9.2
ESTRUCTURAS DE EJECUCIN
CONCURRENTE
SINTAXIS
signal_name <= valor_a WHEN condicin ELSE
valor_b WHEN condicin ELSE
valor_c WHEN condicin ELSE
valor_d WHEN condicin ELSE
valor_n WHEN condicin ELSE
otro_valor;
3.9.3
ALU
s0
SALIDAS
z
co
38
x AND y
x OR y
x XOR y
x + y + ci
acarreo de la suma
CDIGO DE DESCRIPCIN
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY alu IS
PORT ( x, y: IN std_logic;
s0, s1: IN std_logic;
ci: IN std_logic;
z: OUT std_logic;
co: OUT std_logic);
END alu;
ECUACIONES
Summary:
Error Count = 0 Warning Count = 0
Completed Successfully
------------------------------------------
-----------------------------------------UTILIZACIN
Completed Successfully
------------------------------------------
-----------------------------------------PIN OUT
-----------------------------------------PLD Compiler Software: PLA2JED.EXE
02/APR/1999 [v4.02 ] 5.2 IR 17
PINOUT INFORMATION (06:15:24)
Completed Successfully
------------------------------------------
Messages:
Information: Checking for duplicate NODE
logic.
None.
40
3.10
DESCRIPCIONES
COMPORTAMENTALES
3.10.2 PROCESOS
Un proceso es el bloque bsico concurrente de
codificacin secuencial. Contiene una serie de
instrucciones secuenciales que permiten modelar
el comportamiento del circuito, sin embargo, el
bloque PROCESS equivale a una sola instruccin
concurrente. Un proceso puede ser utilizado
dentro de cualquier arquitectura definiendo para si
mismo una regin de declaraciones y otra para la
codificacin
secuencial,
similar
a
una
arquitectura. La regin de codificacin puede
contener nicamente instrucciones secuenciales
(IF, CASE, FOR, etc.) en tanto que la regin de
declaraciones permite designar constantes,
seales, tipos de datos o algn alias.
SINTAXIS
PROCESS ( lista sensible )
-- declaraciones
BEGIN
-- instrucciones secuenciales
END PROCESS;
42
z1 <= z_var;
-- driver de z1 = z_var = x,
-- esto es valido porque son
-- objetos que manejan el mismo
-- tipo de datos
z2 <= z_sig; -- z2 = z_sig = x AND y
END PROCESS; -- finalizado el proceso,
-- valor actual de z1 = x
-- valor actual de z2 = x AND y
z3 <= x OR y;
-- valor actual de z3 = x OR y,
-- en todo momento
END ejemplo_proceso;
43
IF - THEN - ELSE
SINTAXIS
IF condicin THEN
ELSIF condicin THEN
END IF;
EJEMPLO
SIGNAL conteo: unsigned(3 DOWNTO 0);
IF conteo = X"9" THEN
conteo <= ( OTHERS => '0' ) ;
ELSE
conteo <= conteo + 1;
END IF;
CASE - WHEN
CASE expresin IS
WHEN alternativa1 =>
WHEN alternativa2 =>
WHEN OTHERS =>
END CASE;
EJEMPLO
TYPE estados IS (estado1, estado2,
estado3, estado4);
SIGNAL estado_maquina: estados;
SIGNAL motor, alarma: bit;
CONSTANT encendido: bit := '1';
CONSTANT apagado: bit := '0';
CASE estado_maquina IS
WHEN estado0 =>
motor <= apagado;
WHEN estado1=>
motor <= encendido;
WHEN (estado3 OR estado4) =>
alarma <= encendido;
WHEN OTHERS =>
motor <= apagado;
alarma <= apagado;
END CASE;
FOR - LOOP
EJEMPLO
FOR i IN 3 DOWNTO 0 LOOP
-- i es una variable y no necesita ser
-- declarada
IF reset ( i ) = '1' THEN
data_out ( i ) <= '0';
END IF;
END LOOP;
WHILE - LOOP
EJEMPLO
contador := 0;
resultado_tmp := 0;
WHILE contador > 0 LOOP
contador := contador - 1;
resultado_tmp:= resultado_tmp+data_in;
END LOOP;
resultado <= resultado_tmp;
WAIT
-- detiene la simulacin
-- durante el tiempo
-- especificado
44
45
3.11
DESCRIPCIONES
ESTRUCTURALES
3.11.1 COMPONENTES
Un componente representa a una entidad
declarada en un diseo o librera, la utilizacin de
componentes es til en diseos jerrquicos como
se mostr en el ejemplo anterior. Para poder
utilizar una entidad que est dentro de otro
diseo, es necesario llamar la librera y el paquete
dentro del cual se encuentra esta entidad.
Figura 3.11 Descripciones Estructurales
LIBRARY mi_librera;
USE mi_libreria.compuertas.ALL;
ENTITY structural IS
PORT ( x, y: IN bit;
z: OUT bit);
END structural;
ARCHITECTURE estructural OF structural IS
SIGNAL nodo1: bit;
SIGNAL nodo2: bit;
SIGNAL nodo3: bit;
SIGNAL nodo4: bit;
SIGNAL nodo5: bit;
BEGIN
U1: not_gate PORT MAP(x, nodo1);
-- (entrada, salida)
U2: not_gate PORT MAP(y, nodo2) ;
-- (entrada, salida)
U3: and_gate PORT MAP(nodo1, y, nodo3);
-- (entrada, entrada, salida)
U4: and_gate PORT MAP(nodo3, nodo2,
nodo4 );
U5: and_gate PORT MAP(nodo2, x, nodo5);
U6: or_gate PORT MAP(nodo4, nodo5, z);
-- (entrada, entrada, salida)
END estructural;
DECLARACIN DE COMPONENTES
La declaracin de componentes se realiza
dentro de paquetes o en la regin declarativa de
una arquitectura. Es preferible declarar
componentes dentro de los paquetes ya que estos
son reutilizables, y por esta razn slo se vern
declaracin de componentes dentro de paquetes y
no en arquitecturas, aunque tambin sea posible.
A continuacin se muestra la sintaxis de
declaracin de componentes.
SINTAXIS
COMPONENT identificador
PORT( senial { , senial}: modo tipo;
senial { , senial}: modo tipo;
senial: { , senial}: modo tipo
);
END COMPONENT;
EJEMPLO
COMPONENT add
PORT ( a, b, ci: IN std_logic;
suma, co: OUT std_logic);
END COMPONENT;
46
senial: { , senial}: modo tipo
);
END COMPONENT;
EJEMPLO
COMPONENT add_n
GENERICS(w: integer := 8);
PORT(a, b: IN bit_vector(w-1 DOWNTO 0);
ci: IN bit;
suma: OUT bit_vector(w-1 OWNTO 0 );
co: OUT std_logic
) ;
END COMPONENT;
DOWNTO 0);
SIGNAL data_out: std_logic_vector(7
DOWNTO 0);
BEGIN
reg_1: register8 PORT MAP (
clk => clock,
rst => reset,
en => enable,
data => data_in,
q => data_out
);
END a_reg8 ;
EJEMPLO
ARCHITECTURE a_reg8 OF reg8 IS
SIGNAL clock, reset, enable: std_logic;
SIGNAL data_in: std_logic_vector(7
DOWNTO 0);
SIGNAL data_out: std_logic_vector(7
DOWNTO 0);
BEGIN
reg_1: register8 PORT MAP(clock, reset,
47
48
MAP(
OPEN,
OPEN,
seal);
EJEMPLO
ARCHITECTURE a_sum4 OF sumador4 IS
SIGNAL carry_in, carry_out: std_logic;
SIGNAL x, y, z: std_logic_vector(3
DOWNTO 0);
BEGIN
-- add_n es el componente de ejemplo en
-- "declaracin de componentes con
-- genricos"
u1: add_n GENERIC MAP(4);
PORT MAP(x, y, carry_in, z,
carry_out);
END a_reg8;
FOR.. GENERATE
y => b(i));
49
PROCESS(clk, s)
BEGIN
IF clk'EVENT AND clk='1' THEN
convert(i) <= s(i-1);
END IF;
END PROCESS;
END GENERATE;
IF.. GENERATE
ENTITY converter IS
GENERIC(n: integer := 8);
PORT(clk, data:
IN bit;
convert: BUFFER bit_vector(n-1
DOWNTO 0));
END converter;
ARCHITECTURE behavior OF converter IS
SIGNAL s: bit_vector(convert'RANGE);
BEGIN
g: FOR i IN convert'RANGE GENERATE
-----
50
51
3.12
SUBPROGRAMAS
Los
subprogramas
son
secuencias
independientes de instrucciones y declaraciones
que pueden ser llamadas en repetidas ocasiones
dentro de una arquitectura, proceso, o cuerpo de un
paquete en VHDL. Existen dos tipos de
subprogramas: procedimientos y funciones.
Desde el punto de vista del hardware, un
llamado a un subprograma es similar a la
instanciacin de un componente, con la diferencia
que el subprograma forma parte del circuito en el
cual esta siendo utilizado. La instanciacin de un
componente o mdulo, implica la sntesis de dos o
ms niveles de jerarqua en el diseo. Un
subprograma sintetizado generalmente es un nico
circuito combinacional (utilcese un proceso si se
desea crear un circuito secuencial).
Los subprogramas se declaran habitualmente en
paquetes y los cuerpos de dichos subprogramas
son implementados en el cuerpo del paquete en el
que fueron declarados. Aunque es posible definir
los subprogramas dentro de otras estructuras
(arquitecturas y procesos), no es comn que se
haga, adems, que algunos sintetizadores
restringen la utilizacin de ellos slo dentro de
paquetes. Acerca de dichas restricciones en el uso
de subprogramas, consltese los manuales de
referencia de VHDL o manuales de usuario del
sintetizador que se este utilizando.
3.12.1 PROCEDIMIENTOS
EJEMPLO
PACKAGE ejemplo IS
-- declaracin de procedimiento
PROCEDURE procedimiento(a: IN bit ;
b: INOUT bit);
END ejemplo;
3.12.2 FUNCIONES
(2)
CUERPO DE LA FUNCIN
FUNCTION identificador (lista de
parmetros) RETURN tipo IS
-- declaraciones
BEGIN
-- instrucciones secuenciales
END identificador ;
EJEMPLO
FUNCTION cuenta_unos(
vec1: std_logic_vector)
RETURN integer IS
VARIABLE temp: integer := 0;
BEGIN
FOR i IN vec1'low TO vec1'high LOOP
IF vec1 (i) = '1' THEN
temp := temp + 1;
END IF;
END LOOP;
RETURN temp;
END cuenta_unos;
48
EJEMPLO
El siguiente ejemplo muestra un procedimiento
local (declarado dentro de un proceso) llamado
SWAP el cual compara y ordena dos elementos de
un arreglo. El procedimiento es llamado varias
veces para acomodar todos los elementos del
arreglo.
PACKAGE data_types IS
TYPE dat_element IS integer RANGE 0 TO 3;
TYPE data_array IS ARRAY (1 TO 3) OF
dat_element;
END data_types;
USE work.data_types.ALL;
ENTITY sort IS
PORT(in_array:
IN data_array;
out_array: OUT data_array);
END sort;
ARCHITECTURE example OF sort IS
BEGIN
PROCESS(in_array)
PROCEDURE swap(data: INOUT data_array;
low, high: IN integer)
IS
VARIABLE temp: data_element;
BEGIN
IF (data(low) > data(high)) THEN
temp := data(low);
data(low) := data(high);
data(high) := temp;
END IF;
END swap;
VARIABLE my_array: data_array;
BEGIN
my_array := in_array;
swap(my_array, 1, 2);
swap(my_array, 2, 3);
swap(my_array, 1, 2);
out_array <= my_array;
END PROCESS;
END example;
LLAMADO A FUNCIONES
Una funcin es llamada por su nombre y utiliza
los parmetros que le son dados. Las funciones
regresan un nico valor.
SINTAXIS
identificador_funcin (
[ identificador => ] expresin
{ , [ identificador => ] expresin})
};
INSTRUCCIN RETURN
La instruccin RETURN termina un
subprograma. Si el subprograma es una funcin es
necesario utilizar la instruccin RETURN, en el
caso de los procedimientos es opcional. La sintaxis
es la siguiente.
RETURN expresin; -- Funciones
RETURN; -- Procedimientos
49
-- de datos
FUNCTION "AND" (input1, input2: IN mi_bit)
RETURN mi_bit;
FUNCTION "OR" (input1, input2: IN mi_bit)
RETURN mi_bit;
SIGNAL a, b, c: mi_bit;
c <= ( a OR b ) AND c;
3.13
LIBRERAS
EJEMPLO
TYPE mi_bit IS ('0', '1', 'x') ;
-- tipo de datos definido por el usuario
-Sobrecarga de los operadores AND y OR
-- para ser utilizados con el nuevo tipo
50
51
RETURN tempo ;
END;
END swap ;
-- instanciacin de un paquete que se
-- encuentra en el mismo proyecto
USE work.swap.ALL;
ENTITY swap_ent IS
PORT (x:IN bit_vector(3 DOWNTO 0);
y: OUT bit_vector(3 DOWNTO 0));
END swap_ent;
ARCHITECTURE swap_ent OF swap_ent IS
BEGIN
y <= swap4(x) ;
END swap_ent;
3.13.2 PAQUETES
Un paquete en VHDL es una coleccin de
declaraciones que pueden ser utilizadas por otras
descripciones en VHDL. Un paquete en VHDL
consiste de dos secciones: la declaracin del
paquete y el cuerpo del paquete.
Para incluir un paquete en otra descripcin se
sigue la siguiente sintaxis:
USE libreria.identificador_paquete.ALL ;
EJEMPLO
USE work.identificador_paquete.ALL;
PACKAGE identificador IS
-- declaracin de subprograma
-- declaracin de tipo de datos
-- declaracin de subtipos
-- declaracin de constantes
-- declaracin de seales
-- declaracin de componentes
-- declaracin de atributos
-- especificacin de atributos
-- instruccin USE
END identificador;
52
-- declaracin de subtipos
-- declaracin de constantes
-- instruccin USE
END identificador;
EJEMPLO
Para este ejemplo crea un proyecto para
compilar la librera "mi_libreria". Crea un nuevo
archivo de texto y copia la siguiente descripcin en
l.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE multiplexores IS
COMPONENT mux_2_a_1
GENERIC(msb: integer);
PORT( selec: IN std_logic;
x: IN std_logic_vector
(msb DOWNTO 0);
y: IN std_logic_vector
(msb DOWNTO 0);
z: OUT std_logic_vector
(msb DOWNTO 0));
END COMPONENT;
END multiplexores;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY mux_2_a_1 IS
GENERIC ( msb: integer := 3 ) ;
-- debe declararse siempre un valor
-- inicial para que en caso de no ser
-- especificado en el momento de la
-- instanciacin, el componente tome un
-- valor por omisin
PORT(selec: IN std_logic;
x: IN std_logic_vector
(msb DOWNTO 0);
y: IN std_logic_vector
(msb DOWNTO 0);
z: OUT std_logic_vector
(msb DOWNTO 0));
END mux_2_a_1;
ARCHITECTURE a_mux_2_a_1 OF mux_2_a_1 IS
BEGIN
z <= x WHEN selec = '1' ELSE
y WHEN selec = '0';
END a_mux_2_a_1 ;
53
54
IV
IEC FRANCISCO JAVIER TORRES VALLE
DESCRIPCIN DE
CIRCUITOS
DIGITALES
54
4.1
Figura 4.2
3. Posteriormente debe aparecer un cuadro de
dialogo como el que se muestra a continuacin.
Para crear un proyecto con el que quieres
programar un dispositivo debes de seleccionar la
segunda opcin (Project [Target - Device]).
PROCEDIMIENTO
1. Una vez en Windows haz click en el botn de
inicio, selecciona Programas > Warp R5.0 >
Galaxy.
4. Cuando selecciones la opcin de Project
[Target - Device] aparecer una ventana que te
pide que pongas un nombre a tu proyecto, escribe
el nombre de nuevo. En el segundo cuadro de texto
te pide que especifiques el directorio en donde
debe de guardar tu proyecto, puedes hacer un
directorio nuevo desde esa misma ventana con solo
escribir el nombre, por ejemplo c:\nuevo, o puedes
buscar una carpeta ya existente con la opcin
Browse. Cuando hayas terminado de especificar
los nombres haz click en el botn de Siguiente.
Figura 4.1
2. Cuando te encuentres dentro del Galaxy,
selecciona File > New.
Figura 4.3
5. Aparecer una ventana con ttulo Add Files to
Project, esta ventana se usa cuando ya tienes
archivos que quieres agregar a tu proyecto, pero en
esta ocasin por tratarse de un proyecto totalmente
nuevo no es necesario especificar nada dentro de
esta ventana. Solo haz click en el botn de
Siguiente.
55
Figura 4.4
6. La siguiente ventana lleva el ttulo de Select
Target Device, esta ventana es muy importante ya
que es aqu donde debes de especificar el PLD en
el que vas a trabajar. Los PLD's que se usan
cuando se est aprendiendo son los pequeos
(generalmente 16V8, 22V8 22V10), estos PLD's
estn en la ventana como SPLD. Haz doble click
sobre este texto, te aparecer una lista de los
SPLD's ms comunes, selecciona el SPLD que te
interese y nuevamente aparecer una lista donde
hay varios tipos del mismo SPLD, por ejemplo
PALCE16V8-10PC/PI. Esta parte es importante,
ya que debes de seleccionar un SPLD que tenga un
encapsulado de tipo PDIP, para que lo puedas
montar en tu protoboard. En la parte inferior
aparece informacin sobre el SPLD que te interese.
Cuando escojas el SPLD adecuado haz click en
Finalizar.
Figura 4.6
Figura 4.5
Figura 4.7
12. Si la configuracin de colores es la normal,
notars que todas las palabras reservadas se
muestran en color azul y los comentarios en color
rojo. Ahora ya puedes comenzar a hacer tu
descripcin en VHDL.
4.2
SIMULACIN DE
PROYECTOS
Figura 4.8
2. Lo anterior abrir la ventana de opciones de
compilacin, dentro de esta se encuentra una
seccin para elegir el formato de los retardos para
simular el circuito SimulationTiming Model.
Aqu es donde debes de seleccionar el formato
1164/VHDL.
Figura 4.9
3. Asegrate que se encuentre habilitado el
cuadro de Enable Testbench Output.
4.2.1
PROCESO DE SIMULACIN
2. - INICIACIN DE LA SIMULACIN
Para iniciar la simulacin, activa el simulador
utilizando la opcin Initialize Simulation, dentro
del men Simulation. Despus abre una ventana
para el anlisis de seales Waveform Window, si es
que no se encontrara ya una abierta.. Para crear
una nueva ventana de este tipo, haz clic en el icono
dentro de la barra estndar de trabajo o selecciona
File > New Waveform..
3. - AGREGANDO SEALES
El siguiente paso es agregar seales a la ventana
de anlisis, para esto selecciona Add Signals...en el
men Waveform. La ventana para agregar seales
aparecer con una lista de todas las seales de
entrada, salida, entrada/salida y nodos internos de
conexin disponibles en el diseo. Para agregar
alguna de las seales que se encuentran en esta
lista basta con hacer doble clic sobre el nombre de
la seal. Si deseas agregar varias seales al mismo
tiempo, puedes seleccionarlas mediante la tecla
control y haciendo clic sobre cada seal que deseas
agregar para despus hacer clic sobre el botn Add
que se encuentra en la parte inferior de la ventana.
Figura 4.10
Es importante mencionar que el archivo con el
formato 1164/VHDL se crea en el subdirectorio
vhd dentro del directorio de trabajo del proyecto
una vez que ste es compilado. Si se selecciona por
accidente el archivo .vhd creado por el usuario, el
compilador del programa generar varios errores y
no podr ser simulado. Una vez que el archivo
apropiado es cargado, se desplegarn una serie de
mensajes dentro de la ventana de compilacin.
Uno de los mensaje que debera aparecer cuando el
archivo es compilado correctamente es el
siguiente:
Figura 4.11
4. - TIPOS DE SEALES DE ESTIMULACIN
Las seales de estimulacin son utilizadas para
definir diferentes impulsos a los puertos de entrada
del diseo que esta siendo simulado. Para
seleccionar alguno de estos tipos primero
selecciona la seal y despus selecciona Waveform
> Stimulators..., a continuacin se describe
brevemente los diferentes tipos de seales de
estimulacin de Active-HDL Sim.
58
VALOR
Con este tipo de estimulador asignamos un valor
constante a la seal especificada.
HOTKEY
Con este estimulador podemos estar cambiando
el valor de la seal presionando una tecla. Cuando
asignamos este tipo de estimulador es conveniente
asignar una lista de valores. Cada que presionemos
la tecla asignada, estaremos cambiando entre los
valores de esta lista.
Figura 4.12
CLOCK
Sirve para definir seales de reloj definidas con
los siguientes parmetros: frecuencia, valor inicial,
ciclo de trabajo y tiempo de inicio.
CUSTOM
Un estimulador personalizado se crea editando
los valores deseados en la ventana de simulacin.
Estado en el modo de edicin, al estimulador de
entrada se le puede asignar un estado bajo o un
estado alto presionando '1' o '0' respectivamente.
FORMULA
Un estimulador del tipo formula produce una
seal definida por una simple sintaxis. La seal es
definida con secuencias pares de valor - tiempo.
Con la componente tiempo indicamos el momento
en el que la seal asume el valor especificado. La
unidad del tiempo es en picosegundos. Para repetir
durante un periodo especificado, se agrega el
modificador -r. La sintaxis del estimulador tipo
formula se muestra a continuacin.
<valor> <tiempo> [,<valor> <tiempo>,
<valor> <tiempo>, ...] [ -r <periodo>]
EJEMPLO
'0000' 0 ps, '1111' 100000 ps, '0011'
200000 ps -r 300000
PREDEFINIDOS
Los estimuladores predefinidos son una serie de
seales tipo clock con diferentes frecuencias o
seales del tipo formula que pueden ser asignados
a las seales. Para agregar un nuevo estimulador a
esta lista, lo puedes hacer en la misma ventana
dentro del cuadro Predefined.
IEC FRANCISCO JAVIER TORRES VALLE
59
ZOOM
Para aumentar o reducir la escala de tiempo de
la simulacin, selecciona View > Zoom >
In/Out/Full.
BOOKMARKS
Para colocar marcas sobre la ventana de
simulacin primero selecciona Waveform > Select
Mode. Cuando este modo se encuentra
seleccionado, es posible colocar marcas sobre
diferentes puntos de la simulacin para una rpida
referencia a ciertos puntos importantes de la
misma. Para colocarlas primero haz clic con el
botn izquierdo en donde deseas colocar una
marca, despus selecciona Search > Toggle
Bookmark. Utilizando Next/Previous Bookmark
del mismo men puedes cambiar entre una marca y
otra dentro de la simulacin. Las marcas son
desplegadas como un tringulo azul sobre la escala
de tiempo en la ventana de simulacin. Para
eliminar alguna marca selecciona Waveform > Edit
Mode y despus haz clic con el botn izquierdo
sobre la marca que deseas eliminar.
4.3
COMPARADORES
MODO DE MEDICIN
Para entrar al modo de medicin selecciona
Waveform > Measurement Mode. En este modo es
posible desplegar el tiempo exacto entre dos
eventos de la simulacin. Para obtener esta
informacin coloca el puntero sobre una transicin
negativa o positiva, cuando el puntero es colocado
sobre alguna transicin debe cambiar a color
verde, presiona el botn izquierdo sobre la
transicin y arrastra el puntero hasta otra transicin
de cualquier seal dentro de la ventana de
simulacin y entonces suelta el botn. La medida
exacta entre estas dos transiciones se desplegara
como una etiqueta entre las dos transiciones. Si la
etiqueta no es mostrada o no se ve completa,
amplia el alto de la fila haciendo clic con el botn
derecho sobre alguna de las seales que
intervienen en la medicin y despus selecciona
Properties, dentro de la venta de propiedades
aumenta la altura modificando el valor del cuadro
de texto Height. Para eliminar alguna etiqueta de
medicin selecciona Waveform > Edit Mode,
despus seleciona la etiqueta y presiona suprimir
7. - GUARDANDO LA SIMULACIN
Existen dos formas de guardar la simulacin.
Guardar solamente la simulacin de la ventana
activa o guardar todas las simulaciones de las
IEC FRANCISCO JAVIER TORRES VALLE
Figura 4.13
2. Seleccionaremos un 22V10 con empaquetado
tipo DIP para sintetizar el cdigo.
3. Ahora creamos un nuevo archivo de texto
para editar el cdigo (File > New > Text File).
Este archivo debe ser guardado con extensin .vhd
y en la misma carpeta del proyecto. Se sugiere
guardarlo como:
c:\vhdl_proj\comparador_1\comparador1.vhd
4. A continuacin se muestra la tabla de
funcionamiento de este comparador y basndose
en ella haremos el cdigo de descripcin en
VHDL. Primero utilizaremos el estilo de
60
SALIDAS
x<y
x_men_y
'1'
x<y
equals
'0'
x<y
x_may_y
'0'
x=y
x_men_y
'0'
x=y
equals
'1'
x=y
x_may_y
'0'
x>y
x_men_y
'0'
x>y
equals
'0'
x>y
x_may_y
'1'
Figura 4.14
7. Una vez editado y agregado el archivo al
proyecto se procede a sintetizar el cdigo en el
22V10. Seleccionamos Compile > Project o
tambin lo podemos hacer presionado el icono de
compilacin.
Figura 4.15
Si el archivo tiene errores, estos aparecern en
la ventana de salida (Output Window). Dentro de
"Errors & Warnings" en la ventana de salida se
61
Figura 4.17
10. Una vez iniciado el simulador, ahora
abrimos el archivo .vhd de postsntesis como se
explica a continuacin. Primero seleccionamos
File > Open VHDL.
Figura 4.16
En el archivo .rpt se muestra un informe de los
resultados de la compilacin. En ste se encuentran
IEC FRANCISCO JAVIER TORRES VALLE
62
Figura 4.18
Para despus abrir el archivo .vhd de
postsntesis, el cual debera estar (si seguiste
correctamente todos los pasos) en el subdirectorio:
c:\vhdl_proj\comparador_1\vhd\comparador1.
vhd
Figura 4.19
11. Hecho lo anterior ahora agregamos las
seales y/o puertos que deseamos simular.
Seleccionamos Waveform > Add Signals...
Figura 4.21
Figura 4.20
Ahora seleccionamos los puertos como se
explic en el tema 4.2. En este ejercicio
seleccionaremos solamente los puertos declarados
en la entidad, tal y como se muestra en la figura
4.22
12. Lo siguiente es asignar seales de estimulo a
los puertos de entrada. Al bus "x" le asignaremos
un estimulador tipo formula usando la siguiente
formula.
0000 0 ns, 0001 1 us, 0010 2 us, 0011 3
us, 0100 4 us, 0101 5 us, 0110 6 us, 0111
Figura 4.22
Figura 4.23
Figura 4.24
IEC FRANCISCO JAVIER TORRES VALLE
64
4.4
00
01
10
11
USE work.std_arith.ALL;
MULTIPLEXORES
SIMULACIN
4.4.1
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
LIBRARY cypress;
USE cypress.std_arith.ALL ;
ENTITY multiplexor IS
PORT(a, b, c, d: IN std_logic_vector
(3 DOWNTO 0);
selec: IN std_logic_vector
(1 DOWNTO 0);
salida: OUT std_logic_vector
(3 DOWNTO 0));
END multiplexor;
Figura 4.25
Cada que presiones la tecla "s" el vector s estar
cambiando de valor, por omisin la lista de valores
de asignacin incluye el '0' y el '1' solamente, en
65
4.4.2
DESCRIPCIN COMPORTAMENTAL
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;
Figura 4.26
Ahora puedes correr la simulacin poco a poco
utilizando Simulation > Run For, o presionando la
tecla "F5". Y cada que lo desees presionas la tecla
"s" para cambiar el valor del vector "selec". En la
figura 4.24 se muestran los resultados de la
simulacin.
A continuacin se muestran las ecuaciones
obtenidas utilizando el estilo de descripcin de
flujo de datos. Estas ecuaciones deben ser las
mismas para cualquier estilo que utilicemos, ya
que estamos describiendo el mismo multiplexor
slo que de manera diferente y esto no implica que
las ecuaciones vayan a ser distintas. Cuando
compiles este multiplexor, en cualquiera de los tres
estilos, consulta las ecuaciones dentro del archivo
.rpt y verifica que sean iguales.
ENTITY multiplexor IS
PORT(a: std_logic_vector
(3 DOWNTO 0);
b: std_logic_vector
(3 DOWNTO 0);
c: std_logic_vector
(3 DOWNTO 0);
d: std_logic_vector
(3 DOWNTO 0);
selec: std_logic_vector
(1 DOWNTO 0);
salida: OUT std_logic_vector
(3 DOWNTO 0));
END multiplexor;
ARCHITECTURE behavorial OF multiplexor IS
BEGIN
PROCESS(selec, a, b, c, d)
VARIABLE selec_int: integer;
BEGIN
selec_int := to_integer(selec);
CASE selec_int IS
WHEN 0 =>
salida <= a ;
WHEN 1 =>
salida <= b ;
WHEN 2 =>
salida <= c ;
WHEN 3 =>
salida <= d ;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END behavorial;
66
Figura 4.27
4.4.3
DESCRIPCIN ESTRUCTURAL
Figura 4.28
Para realizar descripciones estructurales lo
recomendable es utilizar varios archivos .vhd, cada
uno para una entidad o paquete en particular. Crea
un proyecto para la descripcin estructural del
multiplexor 4 a 1. Ahora crea un nuevo archivo de
texto y copia la siguiente descripcin.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE multiplexor IS
COMPONENT mux_2_a_1
PORT( in1: IN std_logic_vector
(3 DOWNTO 0);
in2: IN std_logic_vector
(3 DOWNTO 0);
sel: IN std_logic;
out1: OUT std_logic_vector
(3 DOWNTO 0));
67
END COMPONENT;
END multiplexor;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY mux_2_a_1 IS
PORT (in1, in2: IN std_logic_vector
(3 DOWNTO 0);
sel: IN std_logic;
out1: OUT std_logic_vector
(3 DOWNTO 0));
END mux_2_a_1;
ARCHITECTURE data_flow OF mux_2_a_1 IS
BEGIN
out1 <= in1 WHEN sel = '0' ELSE
in2;
END data_flow;
Figura 4.29
Una vez que has compilado y simulado este
multiplexor utilizando los tres estilos podrs ver
que no hay ninguna diferencia entre usar un estilo
u otro. Lo importante es describir el mismo
funcionamiento para obtener los mismo resultados.
De hecho, mientras estemos describiendo
exactamente lo mismo no importa el nmero de
lneas que se hagan, porque VHDL no es un
lenguaje de programacin de software.
4.5
SUMADORES
4.5.1
SUMADOR TOTAL
ci
0
1
0
1
0
1
0
1
SALIDAS
co
suma
0
0
0
1
0
1
1
0
0
1
1
0
1
0
1
1
4.5.2
ENTITY full_adder IS
PORT(ci: IN std_logic;
a, b: IN std_logic;
sum: OUT std_logic;
co: OUT std_logic);
END full_adder;
ARCHITECTURE data_flow OF full_adder IS
SIGNAL entradas: std_logic_vector
(2 DOWNTO 0);
SIGNAL salidas: std_logic_vector
(1 DOWNTO 0);
BEGIN
entradas <= a&b&ci ;
salidas <= "00" WHEN entradas = 0 ELSE
"01" WHEN entradas = 1 ELSE
"01" WHEN entradas = 2 ELSE
"10" WHEN entradas = 3 ELSE
"01" WHEN entradas = 4 ELSE
Figura 4.31
Abre un nuevo archivo de texto y copia en l la
siguiente descripcin.
-- sumador de 4 bits utilizando
-- un sumador total
69
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE work.std_arith.ALL;
USE work.adder.ALL;
ENTITY sumador IS
PORT (ci: IN std_logic;
a, b: IN std_logic_vector
(3 DOWNTO 0);
sum: OUT std_logic_vector
(3 DOWNTO 0);
co: OUT std_logic);
END sumador;
ARCHITECTURE structural OF sumador IS
SIGNAL c1, c2, c3: std_logic;
BEGIN
u1: full_adder PORT MAP (ci, a(0), b(0),
sum(0), c1 ) ;
u2: full_adder PORT MAP (c1, a(1), b(1),
sum(1), c2 ) ;
u3: full_adder PORT MAP (c2, a(2), b(2),
sum(2), c3);
u4: full_adder PORT MAP (c3, a(3), b(3),
sum(3), co);
END structural;
4.5.3
SYNTHESIS OFF
y = a * b + c
4.6
REGISTROS
. . .
END IF;
END PROCESS;
EJEMPLOS
A continuacin realice la descripcin de los
siguientes registros de acuerdo con su tabla de
funcionamiento.
72
REGISTRO NO. 1
Elabore la descripcin del registro utilizando un
22V10 y posteriormente trate de implementar la
descripcin en un 16V8, simule la descripcin y
obtenga sus conclusiones.
TABLA DE FUNCIONAMIENTO
ENTRADAS
reset d
SALIDAS
clk
0 transicin positiva
1 transicin positiva
ENTITY reg1 IS
PORT(reset: IN bit;
d: IN bit;
clk: IN bit;
q: OUT bit);
END reg1;
REGISTRO NO. 3
Elabore la descripcin del siguiente registro
utilizando un 22V10, simule la descripcin y
obtenga sus conclusiones.
TABLA DE FUNCIONAMIENTO
ENTRADAS
enable d
REGISTRO NO. 2
Elabore la descripcin del registro utilizando un
22V10 y posteriormente utilice un 16V8, simule la
descripcin en ambos casos y obtenga sus
conclusiones.
SALIDAS
clk
0 transicin positiva
1 transicin positiva
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY reg2 IS
PORT(enable: IN std_logic;
d: IN std_logic;
clk: IN std_logic;
q: OUT std_logic);
END reg2;
ARCHITECTURE areg2 OF reg2 IS
SIGNAL q_tmp: std_logic;
BEGIN
TABLA DE FUNCIONAMIENTO
ENTRADAS
reset d
clk
SALIDAS
q
0 transicin positiva
1 transicin positiva
- transicin positiva
ENTITY reg2 IS
PORT(reset, d,clk: IN bit;
q: OUT bit);
END reg2;
-- lgica registrada
PROCESS(clk, reset, d)
BEGIN
IF clk'event AND clk = '1' THEN
q_tmp <= d;
END IF;
END IF;
END PROCESS;
-- buffer
q <= q_tmp WHEN enable = '1' g
'Z';
END areg2;
73
4.7
CONTADORES
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY counter IS
PORT (clk, load, reset: IN std_logic;
data: IN unsigned(3 DOWNTO 0);
count: BUFFER unsigned(3 DOWNTO 0));
END counter;
ARCHITECTURE archcounter OF counter IS
BEGIN
PROCESS(clk, reset, load, count, data)
BEGIN
IF ( clkevent AND clk= '1' ) THEN
IF reset = '1' THEN
count <= (OTHERS => '0');
ELSIF load = '1' THEN
count <= data;
ELSE
count <= count + 1;
END IF;
END IF;
END PROCESS;
END archcounter;
74
END ldcnt;
Figura 4.32
A continuacin se elabore la descripcin en
VHDL para los siguientes contadores de cuatro
bits de acuerdo a su tabla de funcionamiento y
posteriormente realice las simulaciones. Elija el
dispositivo que ms convenga.
CONTADOR NO. 1
ENTRADAS
reset up_down
1
SALIDAS
clk
conteo
ENITTY counter IS
PORT(reset: IN bit;
ud: IN bit;
clk: IN bit;
conteo: INOUT integer RANGE 0 TO 15
);
END counter;
ARCHITECTURE counter OF counter IS
BEGIN
PROCESS(reset,ud,clk)
BEGIN
IF reset = '1' THEN
conteo <= 0;
ELSIF (clk'event AND clk = '1') THEN
IF ud = '1' THEN
conteo <= conteo + 1;
ELSE
conteo <= conteo - 1;
END IF;
END IF;
END counter;
CONTADOR NO. 2
ENTRADAS
reset up_down
clk
SALIDAS
conteo
transicin positiva
ENITTY counter IS
PORT(reset: IN bit;
ud: IN bit;
clk: IN bit;
conteo: INOUT integer RANGE 0 TO 15
);
END counter;
ARCHITECTURE counter OF counter IS
BEGIN
PROCESS(reset,ud,clk)
BEGIN
IF (clk'event AND clk = '1') THEN
IF reset = '1' THEN
conteo <= 0;
ELSIF ud = '1' THEN
conteo <= conteo + 1;
ELSE
conteo <= conteo - 1;
END IF;
END IF;
END counter;
75
CONTADOR NO. 3
ENTRADAS
reset oe up_down
SALIDAS
clk
conteo
** NOTA
Aunque se encuentre la salida del circuito en
alta impedancia, el conteo y reset asncrono deben
seguir funcionando internamente.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENITTY counter IS
PORT(reset: IN std_logic;
ud: IN std_logic;
oe: IN std_logic;
clk: IN std_logic;
conteo: INOUT unsigned (3 DOWNTO 0)
);
END counter;
ARCHITECTURE counter OF counter IS
SIGNAL count_tmp: unsigned(3 DOWNTO 0);
BEGIN
PROCESS(reset,ud,clk)
BEGIN
IF reset = '1' THEN
count_tmp <= (OTHERS => '0');
ELSIF (clk'event AND clk = '1') THEN
IF ud = '1' THEN
count_tmp <= count_tmp + 1;
ELSE
count_tmp <= count_tmp - 1;
END IF;
END IF;
-- instanciacin de los buffers
conteo <= count_tmp WHEN oe = '1' ELSE
(OTHERS 'Z');
END counter;
CONTADOR NO. 4
ENTRADAS
reset oe up_down
1
SALIDAS
clk
conteo
transicin
positiva
ascendente
0-9
transicin
positiva
descendente
9-0
** NOTA
Aunque se encuentre la salida del circuito en
alta impedancia, el conteo y reset asncrono deben
seguir funcionando internamente. En el momento
de cambio de sentido ascendente/descendente, el
contador no debe de iniciar la cuenta, por ejemplo:
si el contador est funcionando ascendentemente y
se encuentra en el nmero 5 cuando se cambia a
descendente, en la siguiente transicin positiva se
debe continuar la cuenta con un 4, despus un 3...
etc.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENITTY counter IS
PORT(reset: IN std_logic;
ud: IN std_logic;
oe: IN std_logic;
clk: IN std_logic;
conteo: INOUT unsigned (3 DOWNTO 0)
);
END counter;
ARCHITECTURE counter OF counter IS
SIGNAL count_tmp: unsigned(3 DOWNTO 0);
BEGIN
PROCESS(reset,ud,clk)
BEGIN
IF reset = '1' THEN
count_tmp <= (OTHERS => '0');
ELSIF (clk'event AND clk = '1') THEN
IF ud = '1' THEN
count_tmp <= count_tmp + 1;
IF count_tmp = 9 THEN
count_tmp <= (OTHERS => '0');
END IF;
ELSIF ud = '0' THEN
count_tmp <= count_tmp - 1;
IF count_tmp = 0 THEN
count_tmp <= "1001";
END IF;
END IF;
END IF;
-- instanciacin de los buffers
conteo <= count_tmp WHEN oe = '1' ELSE
(OTHERS 'Z');
END counter;
76
4.8
clk
SALIDAS
oe output
cout
transicin
positiva
a AND
b
transicin
positiva
0 a OR b
transicin
positiva
a XOR
b
transicin
positiva
0 NOT a
transicin
positiva
a+0
transicin
positiva
a+b
acarreo de
la suma
transicin
positiva
a + b'
acarreo de
la suma
transicin
positiva
a-1
** NOTA
b' = NOT b
MDULO
LIBRARY ieee ;
USE ieee.std_logic_1164.ALL;
ENTITY modulo IS
PORT (in1: IN std_logic;
in2: IN std_logic;
cin: IN std_logic;
clk: IN std_logic;
reset: IN std_logic;
selec: IN std_logic_vector(2 DOWNTO 0);
cout: OUT std_logic ;
salida_r: INOUT std_logic);
END modulo;
ARCHITECTURE a_modulo OF modulo IS
SIGNAL salida_comb: std_logic ;
BEGIN
PROCESS(in2, in1, selec, cin)
77
PAQUETE
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
PACKAGE modulo_alu IS
COMPONENT modulo
PORT(in1: IN std_logic;
in2: IN std_logic ;
cin: IN std_logic ;
clk: IN std_logic ;
reset: IN std_logic ;
selec: IN std_logic_vector(2 DOWNTO 0);
cout: OUT std_logic ;
salida_r: INOUT std_logic ) ;
END COMPONENT;
END modulo_alu;
4.8.2
DESCRIPCIN
COMPORTAMENTAL
LIBRARY ieee ;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY aluIS
PORT (in1: IN unsigned(3 DOWNTO 0);
in2: IN unsigned(3 DOWNTO 0);
cin, clk: IN std_logic;
oe: IN std_logic;
reset: IN std_logic;
selec: IN integer RANGE 0 TO 7;
cout: OUT std_logic ;
salida: INOUT unsigned(3 DOWNTO 0);
);
END alu;
ARCHITECTURE alu OF alu IS
SIGNAL comb, reg: unsigned(3 DOWNTO 0);
SIGNAL c: unsigned(4 DOWNTO 0);
SIGNAL c1,c2,c3
ATTRIBUTE synthesis_off OF c1, c2, c3:
SIGNAL IS true
BEGIN
c(0) <= cin;
cout <= c(4);
c1 <= c(1);
c2 <= c(2);
c3 <= c(3);
PROCESS(in2, in1, selec, cin)
CONSTANT uno: unsigned:= "0001";
BEGIN
FOR i IN in1'range LOOP
CASE selec IS
WHEN 0 =>
comb(i) <= in1(i) AND in2(i);
c(i+1) <= '0';
WHEN 1 =>
comb(i) <= in1(i) OR in2(i);
c(i+1) <= '0';
WHEN 2 =>
comb(i) <= in1(i) XOR in2(i);
c(i+1) <= '0';
WHEN 3 =>
comb(i) <= NOT in1(i);
c(i+1) <= '0';
WHEN 4 =>
comb(i) <= in1(i);
c(i+1) <= '0' ;
WHEN 5 =>
comb(i) <= in2(i) XOR in1(i) XOR
c(i);
c(i+1) <= (in1(i) AND c(i)) OR
(in2(i) AND c(i)) OR
(in2(i) AND in1(i);
WHEN 6 =>
comb(i) <= (NOT in2(i)) XOR
in1(i) XOR c(i);
c(i+1) <= (in1(i) AND c(i)) OR
((NOT in2(i)) AND c(i)) OR
((NOT in2(i)) AND in1(i));
WHEN 7 =>
comb(i) <= uno(i) XOR in1(i)
XOR c(i);
c(i+1) <= (in1(i) AND c(i)) OR
78
1.
2.
3.
4.
4.9
MQUINAS DE ESTADO
79
ESTADOS
SECUENCIA
BINARA
ONE HOT
ENCODIG
SECUENCIA
GRAY
S0
000
00000001
000
S1
001
00000010
001
S2
010
00000100
011
S3
011
00001000
010
S4
100
00010000
110
S5
101
00100000
100
S6
110
01000000
101
S7
111
10000000
111
80
EJEMPLO
79
EJEMPLO
Elabore la descripcin en VHDL del siguiente
problema mediante mquina de estados definiendo
su diagrama de estados, frecuencia de trabajo y
dispositivo a utilizar. Se desea disear el circuito
de control para lavadora de la siguiente figura.
Figura 4.36
El ciclo de lavado es de la siguiente manera:
81
-- SIGUIENTE ESTADO
PROCESS(clk, state, sensor)
BEGIN
CASE state IS
WHEN S0 =>
IF sensor='0' THEN
next_state <= S0;
ELSIF sensor='1' THEN
next_state <= S1;
END IF;
WHEN S1 =>
next_state <= S2;
WHEN S2 =>
next_state <= S3;
WHEN S3 =>
next_state <= S4;
WHEN S4 =>
next_state <= S5;
WHEN S5 =>
next_state <= S6;
WHEN S6 =>
next_state <= S7;
WHEN S7 =>
next_state <= S8;
WHEN S8 =>
next_state <= S9;
WHEN S9 =>
next_state <= S10;
WHEN S10 =>
IF inicio = '0' THEN
next_state <= S10;
ELSE
next_state <= S0;
END IF;
WHEN OTHERS =>
NULL;
END CASE;
END IF;
END PROCESS;
82
IMPLEMENTACIN DE
FILTROS DIGITALES
EN FPGA'S
83
5.1
INTRODUCCIN
5.2
ANTECEDENTES
5.3
MARCO TERICO
5.3.1
FILTROS FIR
1)
2)
3)
4)
84
5.3.2
FILTROS IIR
85
5.6
5.4
METODOLOGA DE DISEO
PARA FILTROS DIGITALES
5.5
IMPLEMENTACIN EN
FPGA'S
DISEO DE UN FILTRO
PASA-BAJAS
86
F U N C I N D E T R A N SF E R E N C I A
1 .2
1
|H(F)|
0 .8
0 .6
0 .4
0 .2
0
10
10
10
10
10
10
10
10
3
2
<) H(F)
1
0
-1
-2
-3
10
10
87
FU N C I N D E T R A N SFE R E N C IA
20
18
16
14
|H(F)|
12
10
0
10
10
10
10
Figura 5.4 Respuesta del filtro en magnitud utilizando los coeficientes cuantizados
entity fir is
port(clk,reset,load: in std_logic;
data_in: in signed
(19 downto 0);
data_out: out signed
(19 downto 0));
end fir;
architecture a_fir of fir is
type fifo_array is array
(0 to 10) of signed
(19 downto 0);
signal fifo: fifo_array;
begin
process (reset,clk,fifo,data_in)
begin
if reset = '0' then
for i in 0 to 10 loop
fifo(i) <= (others => '0');
end loop;
elsif clk'event and clk = '1'
then
if load = '1' then
for i in 1 to 10 loop
fifo(i) <= fifo(i-1);
end loop;
fifo(0) <= data_in;
end if;
end if;
end process;
process (fifo)
88
89
92
5.7
RESULTADOS
V o (d b )
5
0
1 .0 0 E + 0 0
1 .0 0 E + 0 1
1 .0 0 E + 0 2
1 .0 0 E + 0 3
1 .0 0 E + 0 4
-5
-1 0
db
-1 5
-2 0
-2 5
-3 0
-3 5
-4 0
-4 5
F r e c u e n c ia (H z )
Frecuencia
Vo (Volts)
Vo
(Hertz)
(db)
1.00E-00
1.03E+03
1.044
0.374009
2.02E+03
0.981
-0.166619
3.02E+03
0.818
-1.744933
5.00E+03
0.475
-6.466127
6.06E+03
0.281
-11.02587
7.09E+03
0.168
-15.49381
1.00E+04
0.01
-40
94
CONCLUSIONES
CONCLUSIONES
IEC FRANCISCO JAVIER TORRES VALLE
95
CONCLUSIONES
CONCLUSIONES
FUNCIONALIDAD COMPLETA
BIBLIOGRAFA
BIBLIOGRAFA
IEC FRANCISCO JAVIER TORRES VALLE
97
BIBLIOGRAFA
KEVIN SKAHILL
XILINX, INC.
1999
ADDISON WESLEY
1996
VHDL
DOUGLAS L. PERRY
CYPRESS SEMICONDUCTOR
1997
MCGRAW HILL
2 EDICIN
DIMITRIS G. MANOLAKIS
MODELADO DE CIRCUITOS
PRENTICE HALL
1992
EDITORIAL RA-MA
1999
R. W. SCHAFFER
XILINX, INC.
PRENTICE HALL
1999
1989
ACTEL CORPORATION
MODELADO DE CIRCUITOS
1999
http://bugs.uv.es/dpt/atc/asignat
uras/ti/curso/curso.html
http://tapec.uv.es/VHDL/libro.ht
ml
http://cseg.inaoep.mx/~ariasm/arqcomp/v
hdlweb/indexiz.htm
98
BIBLIOGRAFA
http://www.eej.ulst.ac.uk/exa/exam.html
NORTHEASTERN UNIVERSITY VHDL DESIGN
& DEVELOPMENT
http://www.ece.neu.edu/info/vhd
l/vhdl.html
http://www.vhdl.org/
http://www.acceda.com/h_intro.htm
VHDL RESOURCE PAGE
DOULOS VHDL TRAINING VERILOG
TRAINING DOULOS HOME PAGE
http://www.doulos.co.uk/thewin
ningedge/index.htm
http://www.ece.uc.edu/~rmiller/
VHDL/intro.html
99
BIBLIOGRAFA
INTECTRA INC.
http://www.intectra.com/
100