Sunteți pe pagina 1din 88

APUNTES DE CIRCUITOS LGICOS Y COMPUTADORAS I CON VHDL Y EJEMPLOS

Ordaz Mata Rubn

ELABORO: RUBN MATA. Ascorbico1793@hotmail.com

ndice:
Introduccin ........................................................................................................ 3 Captulo 1. Compuertas Lgicas Digitales .......................................................... 4 Captulo 2. Lgica Combinacional ..................................................................... 15 Captulo 3. Lgica Secuencial ............................................................................ 36 Apndice A. Introduccin al software Xilinx ISE/WEBPACK ......................... 42 Apndice B. Ejemplos de programas editados, corregidos, compilados y simulados ........................................................................................................... 63 Bibliografa ...................................................................................................... 91

Introduccin
El aprendizaje de los sistemas digitales contempla la tecnologa empleada por los circuitos de lgica programable y alta escala de integracin, as como la metodologa para el diseo de tales circuitos. Actualmente, cualquier metodologa de diseo de circuitos centra su atencin en la especificacin y descripcin del diseo, y se apoya en leguajes para la descripcin de circuitos digitales. De estos lenguajes, VHDL es el que ha alcanzado mayor popularidad gracias a que es un estndar. La metodologa actual de diseo de circuitos digitales, se ha incorporado a la enseanza de VHDL en las U. U. E. E. A. A del rea de Sistemas Digitales y Computadoras de la Licenciatura en Ingeniera Electrnica en la Universidad Autnoma Metropolitana-Azcapotzalco. Si bien es cierto que el material existente sobre estos tpicos es muy amplio y, en muchos casos, de un nivel profundo, para los estudiantes o profesores que apenas inician su camino en estos temas, estos apuntes les sern de mucha utilidad ya que tienen como objetivo servir como gua y referencia del lenguaje. El documento consta de tres captulos. El captulo uno muestra el comportamiento funcional de las compuertas lgicas digitales. Los captulos dos y tres contemplan la descripcin e implementacin con VHDL de circuitos combinacionales: bsicos y algunos empleados en la lgica secuencial, respectivamente. Como complemento en el aprendizaje del VHDL, los apndices A y B introducen al usuario en el uso del software XILINX ISE/WEBPAK y lo proveen de algunos ejemplos ya probados.

CAPTULO 1. COMPUERTAS LGICAS DIGITALES

Las compuertas lgicas son circuitos electrnicos que producen seales equivalentes a 1 lgico y 0 lgico, de acuerdo son sus tablas de verdad respectivas, si se aplican las seales de entrada equivalentes a 1 lgico y 0 lgico [1]. En este captulo se presenta un estudio de las compuertas lgicas ms representativas de la electrnica digital, contemplando elementos tales como forma caracterstica, ecuacin algebraica y tabla de verdad, as como su implementacin en VHDL mediante algoritmos de tipo funcional y de flujo de datos. 1.1 Nombre: AND
La operacin lgica AND se interpreta como: F = 1 si y slo si A = 1 y B = 1; de otra manera, F = 0. Donde A y B son entradas y F la salida. 1.1.1 Forma caracterstica

1.1.2 Ecuacin algebraica

F = AB

1.1.3 Tabla de verdad

A 0 0 1 1

B 0 1 0 1

F 0 0 0 1

1.1.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el comportamiento funcional -- de una compuerta AND de dos entradas -- COMPUERTA AND -- Descripcion: Funcional library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_and is port (

A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_and; -- Declaracin de la arquitectura architecture com_arch of com_and is begin process (A,B) begin if (A='1' and B = '1') then F <= '1'; else F <= '0'; end if; end process; end com_arch; 1.1.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el comportamiento funcional -- de una compuerta AND de dos entradas -- COMPUERTA AND -- Descripcion: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_and is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_and; -- Declaracin de la arquitectura architecture com_arch of com_and is begin F <= '1' when ( A = '1' and B = '1') else '0'; end com_arch;

1.2 Nombre: OR
La operacin lgica OR se interpreta como F = 1 si A = 1 o si B = 1, o si A = 1 y B = 1. F = 0 si y slo si A = 0 y Y = 0. Donde A y B son entradas y F la salida. 1.2.1 Forma caracterstica

1.2.2 Ecuacin algebraica

F = A+ B

1.2.3 Tabla de verdad A 0 0 1 1 B 0 1 0 1 F 0 1 1 1

1.2.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el comportamiento funcional -- de una compuerta OR de dos entradas -- COMPUERTA OR -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_or is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_or; architecture com_arch of com_or is begin process (A,B) begin if (A='0' and B = '0') then F <= '0'; else F <= '1'; end if; end process; end com_arch; 1.2.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el comportamiento funcional -- de una compuerta OR de dos entradas -- COMPUERTA OR -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_or is

port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_or; architecture com_arch of com_or is begin F <= '0' when ( A = '0' and B = '0') else '1'; end com_arch;

1.3 Nombre: NOT


La operacin lgica NOT se interpreta como: si A = 1 entonces F = 0; pero si A = 0, entonces F = 1. NOT es una operacin complemento, ya que cambia 1 por 0 y 0 por 1. Donde A es la entrada y F la salida. 1.3.1 Forma caracterstica

1.3.2 Ecuacin algebraica

A=F

1.3.3 Tabla de verdad A 0 1 F 1 0

1.3.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el comportamiento funcional -- de una compuerta NOT -- COMPUERTA NOT -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_not is port ( A: in std_logic; -- A es la entrada F: out std_logic -- F es la salida ); end com_not;

architecture com_arch of com_not is begin process (A) begin if A='1' then F <= '0'; else F <= '1'; end if; end process; end com_arch;

1.3.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el comportamiento funcional -- de una compuerta NOT -- COMPUERTA NOT -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity com_not is port ( A: in std_logic; -- A es la entrada F: out std_logic -- F es la salida ); end com_not; architecture com_arch of com_not is begin F <= '1' when A = '0' else '0'; end com_arch;

1.4 Nombre: NAND


La operacin lgica NAND se interpreta como F = 1 si A = 0 o si B = 0, o si A = 0 y B = 0. F = 0 si y slo si A = 1 y Y = 1. Donde A y B son las entradas y F la salida. 1.4.1 Forma caracterstica

1.4.2 Ecuacin algebraica

F = A B

1.4.3 Tabla de verdad

A 0 0 1 1

B 0 1 0 1

F 1 1 1 0

1.4.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el comportamiento funcional -- de una compuerta NAND de dos entradas -- COMPUERTA NAND -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_nand is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_nand; architecture com_arch of com_nand is begin process (A,B) begin if (A='1' and B = '1') then F <= '0'; else F <= '1'; end if; end process; end com_arch; 1.4.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el comportamiento funcional -- de una compuerta NAND de dos entradas -- COMPUERTA NAND -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_nand is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_nand; architecture com_arch of com_nand is begin F <= '0' when ( A = '1' and B = '1') else '1'; end com_arch;

1.5 Nombre: NOR La operacin lgica AND se interpreta como F = 1 si y slo si A = 0 y B = 0; de otra manera, F = 0. Donde A y B son las entradas y F la salida. 1.5.1 Forma caracterstica

1.5.2 Ecuacin algebraica

F = A+ B

1.5.3 Tabla de verdad B A 0 0 1 1 0 1 0 1 F 1 0 0 0

1.5.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el comportamiento funcional -- de una compuerta NOR de dos entradas -- COMPUERTA NOR -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_nor is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_nor; architecture com_arch of com_nor is begin process (A,B) begin if (A='0' and B = '0') then F <= '1'; else F <= '0'; end if; end process; end com_arch;

10

1.5.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el comportamiento funcional -- de una compuerta NOR de dos entradas -- COMPUERTA NOR -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_nor is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_nor; architecture com_arch of com_nor is begin F <= '1' when ( A = '0' and B = '0') else '0'; end com_arch;

1.6 Nombre: OR EXCLUSIVO (XOR)


La operacin lgica XOR se interpreta como F = 1 si A es diferente de B; de otra manera, F = 0. Donde A y B son las entradas y F la salida. 1.6.1 Forma caracterstica

1.6.2 Ecuacin algebraica

F = A B + AB = A B

1.6.3 Tabla de verdad A 0 0 1 1 B 0 1 0 1 F 0 1 1 0

1.6.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el comportamiento funcional -- de una compuerta XOR de dos entradas -- COMPUERTA XOR

11

-- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_xor is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_xor; architecture com_arch of com_xor is begin process (A,B) begin if (A = B) then F <= '0'; else F <= '1'; end if; end process; end com_arch; 1.6.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el comportamiento funcional -- de una compuerta XOR de dos entradas -- COMPUERTA XOR -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_xor is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_xor; architecture com_arch of com_xor is begin F <= '0' when A = B else '1'; end com_arch;

1.7 Nombre: NOR EXCLUSIVO (XNOR)


La operacin lgica XNOR se interpreta como F = 1 si A = B; de otra manera F = 0. 1.7.1 Forma caracterstica

12

1.7.2 Ecuacin algebraica

F = AB + AB = A B

1.7.3 Tabla de verdad A B F 0 0 1 0 1 0 1 0 0 1 1 1 1.7.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el comportamiento funcional -- de una compuerta XNOR de dos entradas -- COMPUERTA XNOR -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad entity com_xnor is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_xnor; architecture com_arch of com_xnor is begin process (A,B) begin if A = B then F <= '1'; else F <= '0'; end if; end process; end com_arch; 1.7.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el comportamiento funcional -- de una compuerta XNOR de dos entradas -- COMPUERTA XNOR -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; -- Declaracin de la entidad

13

entity com_xnor is port ( A: in std_logic; -- A, B son las entradas B: in std_logic; F: out std_logic -- F es la salida ); end com_xnor; architecture com_arch of com_xnor is begin F <= '1' when A = B else '0'; end com_arch;

CAPITULO 2. LGICA COMBINACIONAL


La lgica combinacional es un sistema digital cuyas salidas en cualquier momento dependen de la combinacin, mediante operaciones lgicas, del valor actual de cada una de sus entradas. En este captulo se describen circuitos combinacionales bsicos pertenecientes a bloques funcionales que comprenden sumadores, comparadores, decodificadores y multiplexores, y se muestra su implementacin con VHDL mediante algoritmos de tipo funcional, de flujo de datos y estructural. 2.1 Sumadores
2.1.1 Sumador medio 2.1.1.1 Diagrama lgico

2.1.1.2 Funciones caractersticas

S = X Y C = XY
2.1.1.3 Tabla caracterstica X 0 Y 0 S 0 C 0

14

0 1 1

1 0 1

1 1 0

0 0 1

2.1.1.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un sumador -- medio -- MEDIO SUMADOR -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity medio_sumador is port ( X,Y: in std_logic; -- Se requieren dos entradas S,C: out std_logic); -- Se requieren dos salidas; una es la suma end medio_sumador; -- y la otra representa el valor del acarreo. architecture amedio_sum of medio_sumador is begin sumador_medio:process(X,Y) begin if (X= '0' and Y= '0') then S<= '0'; C<= '0'; elsif (X= '1' and Y= '1') then S<= '0'; C<= '1'; else S<= '1'; C<= '0'; end if; end process sumador_medio; end amedio_sumador;

2.1.1.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el diseo de un sumador -- medio -- MEDIO SUMADOR -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity medio_sumador is port ( X,Y: in std_logic; -- Se requieren dos entradas S,C: out std_logic); -- Se requieren dos salidas; una representa end medio_sumador; -- la suma y la otra representa el valor del --acarreo.

15

architecture amedio_sum of medio_sumador is begin S<=X xor Y; C<= X and Y; end amedio_sumador;

2.1.2 Sumador completo 2.1.2.1 Diagrama lgico

2.1.2.2 Funciones caractersticas

S = X Y Z C = XY + ( X Y ) Z
2.1.2.3 Tabla caracterstica X 0 0 0 0 1 1 1 1 Y 0 0 1 1 0 0 1 1 Z 0 1 0 1 0 1 0 1 S 0 1 1 0 1 0 0 1 C 0 0 0 1 0 1 1 1

16

2.1.2.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un sumador -- COMPLETO -- COMPLETO SUMADOR -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity sumador_completo is port ( X,Y,Z: in std_logic; -- Se requieren tres entradas S,C: out std_logic); -- Se requieren dos salidas; una representa end sumador_completo; -- la suma y la otra representa el valor del --acarreo. architecture asumador_completo of sumador_completo is begin sumador_completo:process(X,Y,Z) begin if (X= '0' and Y= '0' Z= '0') then S<= '0', C<= '0'; elsif (X= '0' and Y= '0' Z= '1') then S<= '1', C<= '0'; elsif (X= '0' and Y= '1' Z= '0') then S<= '1', C<= '0'; elsif (X= '0' and Y= '1' Z= '1') then S<= '0', C<= '1'; elsif (X= '1' and Y= '0' Z= '0') then S<= '1', C<= '0'; elsif (X= '1' and Y= '0' Z= '1') then S<= '0', C<= '1'; elsif (X= '1' and Y= '1' Z= '0') then S<= '0', C<= '1'; else S<= '1' and C<= '1'; end if; end process sumador_completo; end asumador_completo; 2.1.2.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el diseo de un sumador -- completo -- SUMADOR COMPLETO -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity sumador_completo is port ( X,Y,Z: in std_logic; -- Se requieren dos entradas S,C: out std_logic); -- Se requieren dos salidas; una es la suma end sumador_completo; -- y la otra representa el valor del acarreo. architecture asumador_completo of sumador_completo is begin S<= X xor Y xor Z; C<= (X and Y) or ((X xor Y) and Z); end asumador_completo; 2.1.2.6 Cdigo en VHDL utilizando un algoritmo estructural

17

-- Este programa describe el diseo de un sumador -- completo -- SUMADOR COMPLETO -- Descripcin: Estructural library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity sumador_completo is port ( X,Y,Z: in std_logic; -- Se requieren dos entradas S,C: out std_logic); -- Se requieren dos salidas; una es la suma end sumador_completo; -- y la otra representa el valor del acarreo. architecture asumador_completo of sumador_completo is signal s1, s2, s3: std_logic; begin s1<= X xor Y; s2<= s1 and Z; s3<= X and Y; S<= s1 xor Z; C<= s2 or s3; end asumador_completo;

2.2 Comparadores
2.2.1 Comparador de igualdad de dos bits Diagrama a bloques

2.2.1.1 Funciones caractersticas

X = Y F = Verdadera

2.2.1.2 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un comparador -- de igualdad de dos bits; es decir que su salida es verdadera -- si y solo si la entradas son iguales. -- COMPARADOR DE IGUALDAD DE DOS BITS -- Descripcin: Funcional

18

library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity comparador_igual is port ( -- Nota: se puede usar la palabra reservada to en vez de downto -- la diferencia radica en el orden de aparicin de los componentes en este caso es descendente. X,Y: in std_logic_vector(1 downto 0); F: out std_logic); end comparador_igual; architecture acomparador_igual of comparador_igual is begin comparador: process(X,Y) begin if (X = Y) then F<='1'; else F<='0'; endif; end process comparador; end comparador_igual;

-- del vector;

2.2.2 Comparador de magnitud de cuatro bits 2.2.2.1 Diagrama lgico

19

2.2.2.2 Diagrama a bloques

[ 3 :0 ]

X X X

= Y > Y < Y

F 1 F 2 F 3

Y [ 3 :0 ]

2.2.2.3 Funciones caractersticas

X = Y F1 = Verdadera X > Y F 2 = Verdadera X < Y F 3 = Verdadera

20

2.2.2.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un comparador -- de magnitud de cuatro bits; tiene de entrada dos nibbles (palabras -- de cuatro bits) y de salida tres bits. -- COMPARADOR MAGNITUD DE 4 BITS -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity comparador_mag is port ( -- Uso de la palabra reservada to X,Y: in std_logic_vector(0 to 3); F1,F2,F3: out std_logic); end comparador_mag; architecture acomparador_mag of comparador_mag is begin process (X,Y) begin if (X=Y) then F1<= '1'; elseif (X >Y) then F2<= '1'; else F3<= '1'; end if; end process; end acomparador_mag; 2.2.2.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el diseo de un comparador -- de magnitud de cuatro bits. -- COMPARADOR MAGNITUD DE 4 BITS -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity comparador_mag is port ( -- Uso de la palabra reservada to X,Y: in std_logic_vector(0 to 3); F1,F2,F3: out std_logic); end comparador_mag; architecture acomparador_mag of comparador_mag is begin F1<= '1' when (X=Y); F2<= '1' when (X<Y); F3<= '1' when (X>Y); end acomparador_mag; 2.2.2.6 Cdigo en VHDL utilizando un algoritmo estructural -- Este programa describe el diseo de un comparador -- de magnitud de cuatro bits. -- COMPARADOR MAGNITUD DE 4 BITS -- Descripcin: Estructural library IEEE; use IEEE.std_logic_1164.all;

21

--Declaracin de la entidad entity comparador_mag is port ( -- Uso de la palabra reservada to X,Y: in std_logic_vector(0 to 3); F1,F2,F3: out std_logic); end comparador_mag; architecture acomparador_mag of comparador_mag is signal A: std_logic_vector (7 downto 0), signal B: std_logic_vector (3 downto 0), signal C: std_logic_vector (5 downto 0); begin A(7)<= (not X(3)) and Y(3); A(6)<= X(3) and (not Y(3)); A(5)<= (not X(2)) and Y(2); A(4)<= X(2) and (not Y(2)); A(3)<= (not X(1)) and Y(1); A(2)<= X(1) and (not Y(1)); A(1)<= (not X(0)) and Y(0); A(0)<= X(0) and (not Y(0)); B(3)<= A(7) nor A(6); B(2)<= A(5) nor A(4); B(1)<= A(3) nor A(2); B(0)<= A(1) nor A(0); C(5)<= B(3) and A(5); C(4)<= B(3) and A(4); C(3)<= B(3) and B(2) and A(3); C(2)<= B(3) and B(2) and A(2); C(1)<= B(3) and B(2) and B(1) and A(1); C(0)<= B(3) and B(2) and B(1) and A(0); F1<= A(7) or C(5) or C(3) or C(1); F2<= A(6) or C(4) or C(2) or C(0); F3<= B(3) and B(2) and B(1) and B(0); end acomparador_mag;

2.3 Decodificadores
2.3.1 Decodificador en lnea de 3 a 8 2.3.1.1 Diagrama lgico

22

2.3.1.2 Diagrama a bloques

2.3.1.3 Tabla de verdad

23

Entradas X2 X1 X 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1

D 0 1 0 0 0 0 0 0 0

D 1 0 1 0 0 0 0 0 0

D 2 0 0 1 0 0 0 0 0

Salidas D D 3 4 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0

D 5 0 0 0 0 0 1 0 0

D 6 0 0 0 0 0 0 1 0

D7 0 0 0 0 0 0 0 1

2.3.1.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un decodificador -- en lnea de 3 a 8 -- DECODIFICADOR EN LNEA DE 3 A 8 -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity deco_3a8 is port ( X: in std_logic_vector(2 downto 0); D: out std_logic_vector(7 downto 0)); end deco_3a8; architecture adeco_3a8 of deco_3a8 is begin process (X) begin if X= 000 then D<= 10000000 ; elseif X= 001 then D<= 01000000 ; elseif X= 010 then D<= 00100000 ; elseif X= 011 then D<= 00010000 ; elseif X= 100 then D<= 00001000 ; elseif X= 101 then D<= 00000100 ; elseif X= 110 then D<= 00000010 ; else D<= 00000001 ; end if; end process; end adeco_3a8;

24

2.3.1.5 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el diseo de un decodificador -- en lnea de 3 a 8 -- DECODIFICADOR EN LNEA DE 3 A 8 -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity deco_3a8 is port ( X: in std_logic_vector(2 downto 0); D: out std_logic_vector(7 downto 0)); end deco_3a8; architecture adeco_3a8 begin D<= o0000000 ; D(0)<= '1' when D(1)<= '1' when D(2)<= '1' when D(3)<= '1' when D(4)<= '1' when D(5)<= '1' when D(6)<= '1' when D(7)<= '1' when end adeco_3a8; of deco_3a8 is X= X= X= X= X= X= X= X= 000 ; 001 ; 010 ; 011 ; 100 ; 101 ; 110 ; 111 ;

25

2.3.2 Decodificador BCD a Decimal 2.3.2.1 Diagrama lgico

2.3.2.2 Diagrama a bloques

26

2.3.2.3 Tabla de verdad Entradas X2 X1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 Salidas E F 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0

X3 0 0 0 0 0 0 0 0 1 1

X0 0 1 0 1 0 1 0 1 0 1

A 1 0 0 0 0 0 0 0 0 0

B 0 1 0 0 0 0 0 0 0 0

C 0 0 1 0 0 0 0 0 0 0

D 0 0 0 1 0 0 0 0 0 0

G 0 0 0 0 0 0 1 0 0 0

H 0 0 0 0 0 0 0 1 0 0

I 0 0 0 0 0 0 0 0 1 0

J 0 0 0 0 0 0 0 0 0 1

2.3.2.4 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un decodificador -- BCD a decimal -- DECODIFICADOR BCD A DECIMAL -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity deco_BCD is port ( X: in std_logic_vector(3 downto 0); A,B,C,D,E,F,G,H,I,J: out std_logic); end deco_3a8; architecture adeco_3a8 of deco_3a8 is

27

begin process (X) begin A<='0'; B<='0'; C<='0'; D<='0'; E<='0'; F<='0'; G<='0'; H<='0'; I<='0'; J<='0'; if X= 0000 then A<= '1'; elseif X= 0001 then B<= '1'; elseif X= 0010 then C<= '1'; elseif X= 0011 then D<= '1'; elseif X= 0100 then E<= '1'; elseif X= 0101 then F<= '1'; elseif X= 0110 then G<= '1'; elseif X= 0111 then H<= '1'; elseif X= 1000 then I<= '1'; elseif X= 1001 then J<= '1'; end if; end process; end adeco_3a8;

2.4 Multiplexores
2.4.1 Multiplexor en lnea 4 a 1 2.4.1.1 Diagrama lgico

28

2.4.1.2 Diagrama de bloque

2.4.1.3 Tabla de funcin S1 S0 0 0 0 1 1 0 1 1 2.4.1.4 Cdigo en VHDL utilizando un algoritmo Y A B C D flujo de datos

-- Este programa describe el diseo de un MULTIPLEXOR -- en lnea de 4 a 1 -- MULTIPLEXOR EN LNEA DE 4 A 1 -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad

29

entity mux4a1 is port ( A,B,C,D: in std_logic; Y: out std_logic; S:in std_logic_vector(1 downto 0) ); end mux4a1; architecture amux4a1 of mux4a1 is begin with S select Y<= A when 00, B when 01, C when 10, D when others; end amux4a1; 2.4.1.5 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un MULTIPLEXOR -- en lnea de 4 a 1 -- MULTIPLEXOR EN LNEA DE 4 A 1 -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity mux4a1 is port ( A,B,C,D: in std_logic; Y: out std_logic; S:in std_logic_vector(1 downto 0) ); end mux4a1; architecture amux4a1 of mux4a1 is begin process (S) begin if S=00 then Y<= A; elseif S=01 then Y<= B; elseif S=10 then Y<= C; else Y<= D; end if; end process; end amux4a1;

2.4.2 Multiplexor cudruples en lnea de 2 a 1 2.4.2.1 Diagrama lgico

30

2.4.2.2 Diagrama de bloque

2.4.2.3 Tabla de funcin E 1 0 0 S X 0 1 Salida Y Todo 0 Seleccin de A Seleccin de B

31

2.4.2.4 Cdigo en VHDL utilizando un algoritmo flujo de datos -- Este programa describe el diseo de un MULTIPLEXOR -- cudruple en lnea de 2 a 1 -- MULTIPLEXOR CUDRUPLE EN LNEA DE 2 A 1 -- Descripcin: Flujo de datos library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity muxc2a1 is port ( E,S: in std_logic; Y: out std_logic_vector(3 downto 0); A,B: in std_logic_vector(3 downto 0) ); end muxc2a1; architecture amuxc2a1 of muxc2a1 is begin Y<= A when (E=0 and S=0) else B when (E=0 and S=1) else 0000 when E=1; end amux4a1;

2.4.2.5 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un MULTIPLEXOR -- cudruple en lnea de 2 a 1 -- MULTIPLEXOR CUDRUPLE EN LNEA DE 2 A 1 -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity muxc2a1 is port ( E,S: in std_logic; Y: out std_logic_vector(3 downto 0); A,B: in std_logic_vector(3 downto 0) ); end muxc2a1; architecture amuxc2a1 of muxc2a1 is

32

begin process (E,S) begin if E=1 then Y<= 0000; else if S=0 then Y<=A; else Y<=B; endif; endif; end process; end amuxc2a1;

CAPTULO 3. Lgica secuencial


La lgica secuencial es un sistema digital cuyas salidas en cualquier momento dependen de la combinacin de los valores actuales y anteriores de cada una de sus entradas. En este captulo se describen circuitos flip-flops y se muestra su implementacin con VHDL mediante un algoritmo funcional. 3.1 Flip-flops
3.1.1 Flip-flop RS temporizado 3.1.1.1 Diagrama lgico

33

3.1.1.2 Diagrama de bloque

3.1.1.3 Ecuacin caracterstica

3.1.1.4 Tabla caracterstica

Q(t + 1) = S + RS SR = 0

Q S R Q(t+1) 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 X 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 X 3.1.1.5 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un flip-flop -- RS -- FLIP-FLOP RS -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity ff_rs is port ( S,R,CLK: in std_logic; Q,Qt: inout std_logic); end ff_rs; --Se utiliza el atributo event para describir el cambio de valor en --CLK architecture aff_rs of ff_rs is begin process(CLK,S,R) begin if (clk event and clk=1) then if (S=0 and R=1) then Q <= 0;

34

Qt <= 1; elseif (S=1 and R=0) then Q <= 1; Qt <= 0; elseif (S=0 and R=0) then Q <= Q; Qt <= Qt; else Q <= -; Qt <= -; endif; endif; endprocess; end aff_rs;

3.1.2 Flip-flop D 3.1.2.1 Diagrama lgico

3.1.2.2 Diagrama de bloque

3.1.2.3 Ecuacin caracterstica

Q(t + 1) = D
Q 0 0 1 1 D 0 1 0 1 Q(t+1) 0 1 0 1

3.1.2.4 Tabla caracterstica

35

3.1.2.5 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un flip-flop -- D -- FLIP-FLOP D -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity ff_d is port ( D,CLK: in std_logic; Q: out std_logic); end ff_d; architecture aff_d of ff_d is begin process (clk) begin if (clk event and clk 1) then Q<=D; endif; end process; endaff_d;

3.1.3 Flip-flop JK 3.1.3.1 Diagrama lgico

3.1.3.2 Diagrama de bloque

36

3.1.3.3 Ecuacin caracterstica

Q(t + 1) = J Q + KQ

3.1.3.4 Tabla caracterstica Q 0 0 0 0 1 1 1 1 J 0 0 1 1 0 0 1 1 K 0 1 0 1 0 1 0 1 Q(t+1) 0 0 1 1 1 0 1 0

3.1.3.5 Cdigo en VHDL utilizando un algoritmo funcional -- Este programa describe el diseo de un flip-flop -- JK -- FLIP-FLOP JK -- Descripcin: Funcional library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity ff_jk is port ( J,K,CLK: in std_logic; Q,Qt: inout std_logic); end ff_jk; --Se utiliza el atributo event para describir el cambio de valor en --CLK architecture aff_jk of ff_jk is begin process(CLK,J,K) begin if (clk event and clk=1) then if (J=0 and K=1) then Q <= 0; Qt <= 1; elseif (J=1 and K=0) then Q <= 1; Qt <= 0; elseif (J=0 and K=0) then Q <= Q; Qt <= Qt; else Q <= not Q;

37

Qt <= not Qt; endif; endif; endprocess; end aff_jk;

3.1.4 Flip-flop T 3.1.4.1 Diagrama lgico

3.1.4.2 Diagrama de bloque

3.1.4.3 Ecuacin caracterstica

Q(t + 1) = T Q + T Q
3.1.4.4 Tabla caracterstica Q 0 0 1 1 T 0 1 0 1 Q(t+1) 0 1 1 0

3.1.4.5 Cdigo en VHDL utilizando un algoritmo funcional ----Este programa describe el diseo de un flip-flop T FLIP-FLOP T Descripcin: Funcional

38

library IEEE; use IEEE.std_logic_1164.all; --Declaracin de la entidad entity ff_t is port ( T,CLK: in std_logic; Q: out std_logic); end ff_t; architecture aff_t of ff_t is begin process (clk) begin if (clk event and clk 1) then if (T=0) Q<= Q; else Q<= not Q; endif; end process; endaff_t;

APNDICE A. INTRODUCCIN AL SOFTWARE XILINX ISE/WEBPACK


El software Xilinx ISE1/WEBPACK es una ambiente de software integrado que permite al usuario simular programas de diseo lgico. Se recomienda que este documento sea consultado mientras el usuario tiene acceso a una computadora y est en ejecucin la herramienta de Xilinx, ya que de esta forma podr observar las pantallas a las que se hace referencia y ejecutar ciertos procesos. A continuacin se explicar el uso de la herramienta Project Navigator. El Navegador de Proyectos El punto de entrada de la herramienta Xilinx ISE o WebPack es el Navegador de Proyectos (Project Navigator). El navegador de Proyectos provee al usuario una interfaz que organiza todos los archivos y programas asociados con un diseo dado. Dicha interfaz est dividida en cuatro paneles como se muestra en la figura 1.

Integrated Software Environment (Ambiente de Software Integrado)

39

Figura 1. Pantalla Principal del Navegador de proyectos El panel Sources in Project muestra todos los archivos fuente asociados con un diseo dado. Dando doble clic con el Mouse sobre el nombre de un archivo que pertenezca a este panel se abrir el archivo con la herramienta de diseo apropiada. El panel Process for Current Source muestra todos los procesos que estn disponibles para un archivo fuente (diferentes archivos tiene diferentes opciones de procesos). Dando doble clic sobre cualquier proceso, causar la ejecucin del proceso. El panel Console muestra el estado de los procesos, incluyendo todas las advertencias y errores que resulten de la ejecucin de un proceso sobre un archivo fuente. El panel editor HDL muestra el cdigo fuente HDL para cualquier archivo fuente HDL seleccionado. El navegador de proyectos abrir otras ventanas como sea necesario para algunas aplicaciones (por ejemplo, la herramienta para capturar el esquemtico se abrir en un ventana por separado).

Nuevo Proyecto

40

Los proyectos nuevos pueden ser definidos desde el Navegador de Proyectos. El Navegador de Proyectos puede ser ejecutado desde el men Inicio de Windows o dando doble clic al icono en el Escritorio. Una vez que el Navegador de Proyectos este abierto, un proyecto nuevo puede ser creado, o puede ser abierto uno ya existente. En general, un proyecto nuevo debe ser generado cada vez que se realice un diseo nuevo. El Navegador de Proyectos puede ser configurado para que automticamente cargue el ltimo proyecto usado cuando se vuelva a ejecutar o cualquier otro proyecto (ver el cuadro de dilogo properties). Para crear un proyecto nuevo hay que seleccionar New Project del men File como se muestra en la figura 2.

Figura 2. Comenzando un proyecto nuevo. A continuacin se desplegar un cuadro de dilogo donde se capturar toda la informacin acerca del nuevo proyecto. Se capturar el nombre del proyecto en Project Name, se definir la localizacin apropiada del directorio del proyecto en Project Location. Este directorio almacenar todos los archivos de diseo y archivo intermedios.

41

Se escoger la apropiada familia de dispositivos y el apropiado tipo de dispositivo. Finalmente se escoger XST VHDL de la opcin Design Flow y se le dar clic en el botn OK. Ver figura 3. El mismo procedimiento har de realizarse si se requiere de otro nuevo proyecto.

Figura 3. Definiendo nombre, localizacin y tipo de proyecto nuevo.

La Herramienta VHDL Para poder implantar diseos con el lenguaje VHDL en el ambiente WebPack, se requiere un editor de textos para generar un archivo fuente VHDL, adems de un sintetizador para traducir el archivo fuente a la forma en que pueda ser descargado a un chip; tambin es necesario un simulador para corroborar los resultados. Cualquier editor de textos puede ser usado para crear un archivo fuente VHDL. Xilinx provee un editor con el WebPack, este editor de texto utiliza colores para identificar las palabras reservadas e indenta el cdigo para hacerlo ms legible. Para comenzar a trabajar con el editor HDL de Xilinx, hay que dar clic derecho en el nombre del dispositivo en el panel Sources in Project y seleccionar New

42

Source (o seleccionar del men Project la opcin New Source de la ventana principal del Navegador de Proyectos como se muestra en la figura 4).

Figura 4. Utilizando asistente para generar archivo fuente VHDL En la ventana que aparece, se escoger la opcin VHDL Module y se capturar el nombre del archivo fuente despus se dar clic en Siguiente (ver figura 5).

43

Figura 5. Seleccionar la opcin VHDL Module. Se abrir un cuadro de dilogo (ver figura 6) donde se puede definir el nombre de la arquitectura architecture (el nombre por default puede ser utilizado), en la tabla se pueden definir las seales como entradas o salidas que se requerirn. Este paso es opcional, ya que si las seales son definidas aqu, automticamente aparecern dentro de Port () sobre la entidad entity. Si las seales no son definidas aqu, est informacin puede ser capturada dentro del editor. A continuacin se dar clic en Siguiente.

44

Figura 6. Definiendo nombre de la entidad y arquitectura.

A continuacin se generar un archivo fuente VHDL con las libreras y paquetes a utilizar, la declaracin de la entidad con la definicin de seales si fue el caso, ya que como se mencion pudo no haberse incluido con la ayuda del asistente y por ltimo la declaracin de la arquitectura donde se describir el funcionamiento de la entidad. (Ver figura 7).

45

Figura 7. Generacin de cdigo fuente VHDL

Una vez tecleado el funcionamiento de la entidad dentro de la arquitectura el cdigo quedar listo para ser simulado y sintetizado y entonces ser descargado a un chip. Para simular el archivo fuente, utilizar el procedimiento abajo descrito. Se tiene que guardar el archivo fuente, para poder simularlo. En el men File se selecciona la opcin Save o tecleando las teclas CTL + S se guardarn los cambios hechos al archivo fuente como se muestra en la figura siguiente.

46

Figura 8. Guardar cambios del archivo fuente. Para poder evaluar los errores de sintaxis de una fuente VHDL, hay que seleccionar el nombre del archivo fuente en el panel Source in Project de la ventana principal del Navegador de Proyectos, y haciendo doble clic en el proceso Check Syntax dentro de Synthesize que se encuentra en el panel Processes for Current Source o seleccionando la misma opcin y seleccionando la opcin Run dentro del men Process como se muestra el la figura 9. Si el proceso se completa sin errores, una palomita verde aparecer en el proceso de sintetizado y un mensaje de xito aparecer en la ventana de status en la parte baja de la ventana del Navegador de Proyectos. Si se presentan errores, un mensaje de error aparecer en la ventana de status y guiar al usuario para poder corregir los errores cometidos.

47

Figura 9. Sintetizando un archivo fuente VHDL. Despus hay que seleccionar el proceso Implement Design que se encuentra en el panel Process for Current Source, ya sea haciendo doble clic en esta opcin o una vez seleccionada la opcin, seleccionar del men Process la opcin Run; como se muestra en la figura 10.

48

Figura 10. Sintetizando un archivo fuente VHDL. Si los pasos anteriores se han llevado con xito, en el panel Processes for Current Source se pintar una palomita verde, en todos los procesos que se realizaron y no tuvieron errores como se muestra en al figura 11.

49

Figura 11. Procesos realizados con xito. Una vez que se ha sintetizado el archivo fuente, lo que procede es hacer una simulacin lgica para observar las salidas del circuito y corroborar si tienen el comportamiento adecuado antes de implantarlo en hardware. El simulador requiere de dos tipos de entradas: el archivo fuente que describe al circuito y un conjunto de valores para las entradas lgicas mientras dura la simulacin. La descripcin del circuito puede ser el archivo VHDL que se sintetiz anteriormente, o un archivo esquemtico creado. El simulador funciona dividiendo la simulacin total en pasos muy pequeos del tiempo (tpicamente 10ps; solamente este valor se puede cambiar por el usuario). En cada paso, el simulador encuentra todas las seales que han cambiado durante el paso precedente del tiempo, y procesa esas seales segn lo dictado por el archivo fuente de HDL del circuito. Si las seales de salida deben cambiar como resultado de este procesamiento, entonces cambian estas seales en el siguiente paso (el cambio de las seales son programadas para el siguiente paso de tiempo porque las seales no pueden cambiar los valores de voltaje instantneamente). Diversos simuladores proporcionan varios mtodos para que los diseadores puedan definir seales de entrada en un cierto tiempo. La mayora de los simuladores proporcionan por lo menos tres mtodos, incluyendo una interfaz grfica, una interfaz basada en archivo de texto, y una interfaz de lnea de comando. Cualesquiera de

50

estos mtodos se pueden utilizar con el simulador de ModelSim incluido con las herramientas de Xilinx ISE/WebPack cad. El simulador de ModelSim es una herramienta avanzada que tiene muchas caractersticas para asistir a ingenieros en crear entradas con estmulo, corregir descripciones del circuito, y analizar salidas del circuito. Ejecutando una simulacin Desde que Xilinx ha incorporado ModelSim en su plataforma de herramientas de diseo, el simulador puede ser ejecutado sin dejar al navegador de proyectos. Pero antes de ejecutar el simulador, un archivo de entrada debe ser creado (el simulador se puede utilizar sin un archivo de entrada usando la interfaz de lnea de comando). Xilinx incluye una herramienta grfica que se pueda utilizar para crear archivos de entrada. Para ejecutar la herramienta de simulacin se da clic derecho en el archivo fuente que se encuentra en el panel Source in Project del Navegador de Proyectos. Entonces se selecciona la opcin New Source y aparecer un cuadro de dilogo (figura 12) en el cual se elegir esa tipo de archivo; seleccionndose la opcin Test Bench Waveform, introduzca el nombre y la localizacin del archivo (no elija el mismo nombre que su archivo de fuente del circuito).

Figura 12. Cuadro de dilogo seleccionando New Source.

51

De clic en Siguiente, y entonces seleccione el archivo fuente que el Test Bench Waveform asociar, seleccionando Finalizar (figura 13) se ejecutar el editor de forma de onda.

Figura 13.Terminando el proceso de seleccin de archivo fuente. El editor de forma de onda puede ejecutarse junto con un cuadro de dilogo que permite a los usuarios modificar varios parmetros como los mostrados en la figura 14.

52

Figura 14.Asignando valores de reloj y escala de tiempo al editor de forma de onda. Cuando el editor de forma de onda se abre, son mostradas las seales a lo largo de la ventana (estas seales son las que se asocian a las entradas y salidas de un archivo fuente VHDL dado), a la izquierda de las seales esta el nombre que le corresponde especificando si son entradas o salidas dichas seales.(Figura 15) .

53

Figura 15.Pantalla principal del editor de forma de onda. A la derecha de los nombres de las seales, a lo largo de la ventana, estn las posiciones de la escala de tiempo estn graduadas de 100ns por paso de tiempo para la simulacin. Dando clic izquierdo es cualquier seal debajo de cualquier paso de tiempo causar que la seal vaya de un 0 lgico a un 1 lgico o viceversa. (Figura 16).

54

Figura 16.Ventana Pattern Wizard.

Cuando la ventana del editor de la forma de onda se abre, una segunda ventana se abre tambin y muestra el cdigo fuente del circuito que va a ser simulado. Para este diseo, el archivo fuente se muestra como netlist de Xilinx VHDL del diagrama esquemtico (porque XST VHDL fue seleccionado como el tipo del proyecto). Una vez que los valores deseados se hayan incorporado en el editor de la forma de onda, se da clic en el men File Save Waveform (figura 17), para salvar dichos valores. Un cuadro de dilogo puede abrirse preguntando cuntos pasos de tiempo deben pasar entre el ltimo cambio de entrada y el fin de la simulacin, el valor default es 1.

55

Figura 17.Salvar valores Para ejecutar la simulacin, seleccionar el archivo test bench waveform del panel Sources in Project del Navegador de Proyectos, este archivo tiene la extensin .tbw. Es entonces cuando hay que seleccionar dentro de la opcin ModelSim Simulator que se encuentra en el panel Processes for Current Source el proceso Simulate Behavioral VHDL Model una vez hecho esto hay que seleccionar del men ProcessRun. (Figura 18). Esto iniciar el simulador ModelSim donde cargar automticamente el netlist del circuito y la simulacin de la forma de onda.

56

Figura 18.Pasos para ejecutar la simulacin. Cuando el ModelSim se ejecute, sern desplegadas cuatro diferentes ventanas, incluyendo la de comandos, estructura, seales y formas de onda. (Figura 19).

57

EMBED PBrush

Figura 19.Pantallla principal del ModelSim. La ventana de comandos muestra los mensajes de estado, errores y advertencias. Adems provee un prompt en el cual instrucciones en lnea de comandos pueden ser introducidas (Figura 20).

58

Figura 20.Ventana de comandos. La ventana de estructura muestra todos los archivos utilizados por el simulador. Esta ventana es til para circuitos complejos.

Figura 21.Ventana de estructura. La ventana de seales muestra todas las seales disponibles para el simulador. La ventana puede ser usada para agregar o remover seales.

Figura 22.Ventana de seales. La cuanta ventana es donde muestran las formas de onda como resultado de la simulacin (Figura 23).

59

Figura 23.Resultado de una simulacin.

APNDICE B.
60

EJEMPLOS DE PROGRAMAS EDITADOS, CORREGIDOS, COMPILADOS Y SIMULADOS.


B.1 .- Multiplexor combinacional de bit
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY muxe IS PORT (a: IN std_logic; b: IN std_logic; s: IN std_logic; f: OUT std_logic); END muxe; ARCHITECTURE Behavioral OF muxe IS BEGIN f<= (not s and a) or (s and b); END Behavioral;

61

EMBED PBrush

62

B.2 .- Multiplexor vectorial usando with-select


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY muxe IS PORT (a: IN std_logic_vector(3 downto 0); b: IN std_logic_vector(3 downto 0); s: IN std_logic; f: OUT std_logic_vector(3 downto 0)); END muxe; ARCHITECTURE Behavioral OF muxe IS BEGIN WITH s SELECT f<= a WHEN '1', b WHEN OTHERS; END Behavioral;

63

EMBED PBrush

B.3 .- Retardo (delay)


64

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ny2 IS PORT (i1: IN std_logic; i2: IN std_logic; o1: OUT std_logic); END ny2; ARCHITECTURE single_delay OF ny2 IS BEGIN o1<= i1 nand i2 after 5 ns; END single_delay;

65

EMBED PBrush

66

B.4 .- Sumador Completo


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY sumador IS PORT (x: IN std_logic; y: IN std_logic; z: IN std_logic; s: OUT std_logic; c: OUT std_logic); END sumador; ARCHITECTURE Behavioral OF sumador IS BEGIN s<= (x xor y) xor z; c<=(x and y) or (x and z) or (y and z); END Behavioral;

67

EMBED PBrush

B.5 .- Comparador combinacional


68

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY bitcomp IS PORT (a: IN std_logic; b: IN std_logic; gt: IN std_logic; eq: IN std_logic; lt: IN std_logic; a_gt_b: OUT std_logic; a_eq_b: OUT std_logic; a_lt_b: OUT std_logic); END bitcomp; ARCHITECTURE Behavioral OF bitcomp IS BEGIN a_gt_b<=not(not(a and gt)and(not(not b and gt))and(not(a and not b))); a_eq_b<=not(not(a and b and eq)and(not(not a and not b and eq))); a_lt_b<=not(not(not a and lt)and(not(b and lt))and(not(not a and b))); END Behavioral;

69

EMBED PBrush

70

B.6 .- Comparador de 4 bits de igualdad


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY comparador IS PORT (A: IN std_logic_vector(3 downto 0); B: IN std_logic_vector(3 downto 0); i: OUT std_logic); END comparador; ARCHITECTURE Behavioral OF comparador IS BEGIN compara: process(A,B) begin if A=B then i <= '1'; else i<='0'; end if; end process compara; END Behavioral;

71

EMBED PBrush

72

B.7 .- Comparador de magnitud


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY comparar IS PORT (a: IN std_logic_vector(3 downto 0); b: IN std_logic_vector(3 downto 0); i: OUT std_logic; ma: OUT std_logic; me: OUT std_logic); END comparar; ARCHITECTURE Behavioral OF comparar IS BEGIN i<='0'; ma<='0'; me<='0'; process (a,b) begin if(a=b) then i<='1'; ma<='0'; me<='0'; elseif (a>b) then i<='0'; ma<='1'; me<='0'; else i<='0'; ma<='0'; me<='1'; end if; end process; END Behavioral;

73

EMBED PBrush

B.8 .- Contador ascendente/descendente con carga en paralelo con flanco positivo

74

Para el desarrollo de este ejemplo, cabe hacer notar lo siguiente:

Si el RESET se conecta a 1 lgico, el contador se iniciar con 0000, no importando el conteo actual: COUNT 0000. Si la variable carga en paralelo, es decir LOAD, es 1 lgico, entonces el contador se cargar con el valor DIN de 4 bits: COUNT DIN (4 bits). Si el habilitador de conteo es 1, es decir CE (Count Enable) y DIR = 1, entonces tendremos un contador ascendente (COUNT COUNT + 1). Pero si DIR = 0, entonces ser descendente (COUNT COUNT 1).

Lo anterior suceder nicamente cuando se tenga un pulso de reloj con flanco positivo , denotndose como CLK = 1 and CLKevent. Solo el RESET es asncrono, por lo que RESET = 0 para que haya conteo.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cuenta IS PORT (CLK,RESET, CE, LOAD, DIR : IN std_logic; DIN : IN std_logic_vector(3 downto 0); COUNT : INOUT std_logic_vector(3 downto 0)); END cuenta; ARCHITECTURE Behavioral OF cuenta IS BEGIN process (CLK, RESET) begin if RESET='1' then COUNT <= "0000"; elseif CLK = '1' and CLK 'event then if LOAD='1' then COUNT <= din; else if CE='1' then if DIR='1' then COUNT<=COUNT + 1; else COUNT<=COUNT - 1; end if; end if; end if; end if; end process; END Behavioral;

75

EMBED PBrush

B.9 .- Decodificador
76

El siguiente ejemplo muestra el desarrollo de un decodificador para un exhibidor de 7 segmentos en nodo comn. Ya que todos los segmentos estn conectados al voltaje positivo de una fuente externa de alta potencia, el decodificador enviar un 0 lgico (0 volts) y activar los segmentos o dispositivos (como un motor) pero sin que entregue potencia. Esto es, P = VI = (0 volts) I amperes = 0 watts; siendo entonces la fuente externa la que genere potencia, sobre todo si es grande. A esto se le denomina lgica negativa.

+5 v

f e

a b g c d

Bits del exhibidor: g f e d c b a ejemplo: 0 0 0 0 0 1 0 no enciende b

Library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cuenta is Port ( CLK,RESET,CE: in std_logic; LED: out STD_LOGIC_VECTOR (6 downto 0); COUNT : inout std_logic_vector(3 downto 0)); end cuenta; architecture Behavioral of cuenta is begin process (CLK, RESET) begin if RESET='1' then COUNT <= "0000"; elsif CLK='1' and CLK'event then if CE='1' then COUNT <= COUNT + 1; end if; end if; end process; with COUNT select LED<= "1111001" when "0001", --1 "0100100" when "0010", --2 "0110000" when "0011", --3 "0011001" when "0100", --4 "0010010" when "0101", --5 "0000010" when "0110", --6

77

"1111000" "0000000" "0010000" "0001000" "0000011" "1000110" "0100001" "0000110" "0001110" "1000000" end Behavioral;

when when when when when when when when when when

"0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111", others;

--7 --8 --9 --A --b --C --d --E --F --0

78

EMBED PBrush

B.10 .- Circuito secuencial de cuatro estados (s0, s1, s2, s3) sin control

79

figura B.10.1 Diagrama de estados correspondiente al siguiente programa VHDL.


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity asm0 is Port ( entrada, reset, clk : in std_logic; salida : out std_logic); end asm0; architecture Behavioral of asm0 is type estado is (s0, s1, s2, s3); attribute ENUM_ENCODING: STRING; attribute ENUM_ENCODING of estado: type is "00 01 10 11"; signal presente,estado_sig: estado; begin estados: process(clk) begin if reset='1' then presente <= s0;estado_sig <=s1;salida<='0'; elsif clk='1' and clk'event then case presente is when s0 => estado_sig <= s1; when s1 => estado_sig <= s2;salida<='1'; when s2 => estado_sig <= s3; when s3 => estado_sig <= s0;salida<='0'; end case; presente <= estado_sig; end if; end process estados; end Behavioral;

80

B.11 .- Registro de desplazamiento bidireccional con carga en paralelo


81

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; PACKAGE registros IS COMPONENT desplazamiento PORT(clk, rst, ed, ei : IN STD_LOGIC; m : IN STD_LOGIC_VECTOR(1 DOWNTO 0); e : IN STD_LOGIC_VECTOR(3 DOWNTO 0); s : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT; END registros; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; ENTITY desplazamiento IS PORT(clk, rst, ed, ei : IN STD_LOGIC; m : IN STD_LOGIC_VECTOR(1 DOWNTO 0); e : IN STD_LOGIC_VECTOR(3 DOWNTO 0); s : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); END desplazamiento; ARCHITECTURE comportamiento OF desplazamiento IS BEGIN PROCESS (clk,rst) BEGIN IF rst='1' THEN s<="0000"; ELSIF (clk'EVENT AND clk='1') THEN CASE m IS WHEN "01" => s(3)<=ei; s(2)<=s(3); --Desplazamiento a s(1)<=s(2); s(0)<=s(1); --la derecha WHEN "10" => s(3)<=s(2); s(2)<=s(1); --Desplazamiento a s(1)<=s(0); s(0)<=ed; --la izquierda WHEN "11" => s<=e; --Carga en paralelo WHEN OTHERS => s<=s; --La salida no cambia END CASE; END IF; END PROCESS; END comportamiento;

82

EMBED PBrush

B.12 .- Encendido y apagado de un motor


83

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY conmutador IS PORT (boton: IN bit; motor: OUT bit); END conmutador; ARCHITECTURE moore OF conmutador IS TYPE estado IS (apagado1,apagado2,encendido1,encendido2); SIGNAL presente: estado:=apagado1; BEGIN PROCESS(boton,presente) BEGIN CASE presente IS WHEN apagado1 => motor<='0'; IF boton='1' THEN presente<=encendido2; END IF; WHEN encendido2 => motor<='1'; IF boton='0' THEN presente<=encendido1; END IF; WHEN encendido1 => motor<='1'; IF boton='1' THEN presente<=apagado2; END IF; WHEN apagado2 => motor<='0'; IF boton='0' THEN presente<=apagado1; END IF; END CASE; END PROCESS; END moore;

84

EMBED PBrush

B.13 .- Mquina algortmica

85

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity unov is Port ( clk,i,reset:in std_logic; os : buffer std_logic_vector(1 downto 0); COUNT : inout std_logic_vector(2 downto 0); CE,f, clr, l1, l0: buffer std_logic); end unov; architecture Behavioral of unov is type estado is (s0, s1, s2, s3);signal presente: estado; begin estados: process(clk,reset,i,f) begin if reset='1' then presente <= s0;os <="00"; elsif clk='1' and clk'event then case presente is when s0 =>if i='0' then presente <= s0;os <="00"; else presente <= s1;os <="01";end if; when s1 => presente <= s2;os <="10"; when s2 => presente <= s3;os <="11"; when s3 => if f='0' then presente <= s2;os <="10"; else presente <= s0;os <="00"; end if;end case;end if; end process estados; vars: process (os) begin case os is when "00" => l1<='0'; l0<='0'; when "01" => l1<='1'; l0<='1'; when "10" => l1<='0'; l0<='1'; when others => l1<='0'; l0<='0'; end case; if os="00" then clr<='1'; else clr<='0';end if ; if os="10" then CE<='1'; else CE<='0';end if; end process vars; cuenta:process (clk, clr) begin if clr='1' then COUNT <= "000"; elsif clk'event and clk='0' then if CE='1' then COUNT <= COUNT + 1;end if;end if; f<=COUNT(1); end process cuenta; end Behavioral;

86

BIBLIOGRAFA

87

[1] Mano, M. Morris y Kime Charles R. Fundamentos de Diseo Lgico y Computadoras Editorial Prentice Hall. [2] Maxinez, David G. y Alcal Jessica VHDL. El arte de programar sistemas digitales Editorial CECSA. [3] Roth, Charles H. Jr. Digital Systems Design Using VHDL PWS Publishing Company.

88

S-ar putea să vă placă și