Está en la página 1de 77

INSTITUTO TECNOLOGICO DE CD.

GUZMAN DEPARTAMENTO DE ELECTRONICA Y ELECTRICA UNIDAD 4 DISEO LOGICO COMBINACIONAL CON VHDL SANTIAGO QUINTERO MAGAA SAUL CARDENAZ SOTO OCTUBRE DEL 2005

INTRODUCION
En este capitulo se dise an los circuitos combinacionales mas utilizados en el diseo lgico a travs del lenguaje de descripci n en hardware. Esto permite introducir nuevos conceptos, palabras reservadas, reglas, algoritmos, etc., que representan la potencia y profundidad del lenguaje VHDL. El desarrollo de cada una de las entidades de dise o descritas en este capitulo se puede optimizar mediante el uso adecuado de las declaraciones secu nciales, concurrentes o ambas, utilizando en esta descripci n cualquiera de los tres tipos de arquitectura funcional, por flujo de datos y estructural vistos en el capitulo anterior.

Sin embargo y dada la filosof a que queremos manejar en este texto, nos parece conveniente presentar soluciones que incluyan nuevas declaraciones, nuevos tipos de datos y nuevos algoritmos de anlisis; es decir, no se pretende presentar la mejor opci n de dise o para un problema; por el contrario, se propone brindar la mayor cantidad de soluciones (modelos) que le permitan deducir y construir sus estrategias de diseo para optimizar sus resultados.

SENTENCIAS CONCURRENTES

Las sentencias concurrentes son aqullas que se ejecutan simultneamente en la simulacin, es decir, no existe una prioridad entre unas u otras. Se utilizan para el modelado del hardware porque describen adecuadamente su comportamiento. Deben de formar parte siempre del cuerpo de arquitecturas o de bloques. Son las siguientes:

En VHDL existen tres tipos de declaraciones:

Declaraciones condicionales asignadas a una seal (when-else) Declaraciones concurrentes asignadas a seales Seleccin de una seal (with-select-when)

3.1.1 Declaraciones condicionales asignadas a una seal (when-else).


La declaracin whenelse se utiliza para asignar valores a una seal, determinando as la ejecucin de una condicin propia del diseo. Para ejemplificar, consideremos la entidad mostrada en la figura 3.1, cuyo funcionamiento se define en la tabla de verdad. a
0 0 0 0

b
0 0 1 1 0 0 1 1

c
0 1 0 1 0 1 0 1

f
1 0 0 1 0 0 1 1

a b c

Entidad Prueba

f(a,b,c)

1 1 1 1

Figura 3.1 Declaraciones when-else

SENTENCIAS CONCURRENTES
Se ejecutan en paralelo, de manera simultnea y no importa el orden en que se escriban dentro de la arquitectura Asignaciones concurrentes: el resultado no depende del orden en que aparecen stas d <= a OR b; z <= c OR d; z <= c OR d; d <= a OR b;

Los programas se ejecutan de manera secuencial, un circuito fsico funciona concurrentemente: Todos los elementos estn activos de manera simultnea e interaccionan entre s a lo largo del tiempo

La entidad se puede programar mediante declaraciones condicionales (whenelse), debido a que este modelo permite definir paso a paso el comportamiento del sistema, segn se muestra en el listado 3.1. 1 Ejemplo combinacional basico 2 library ieee; 3 use ieee. std_logic_1164.all; 4 entity tabla is port ( 5 a,b,c: in std_logic; 6 f: out std_logic); 7 end tabla; 8 architecture ejemplo of tabla is 9 begin 10 f<= 1 when (a=0 and b=0 and c=0 ) else 11 1 when (a=0 and b=1 and c=1 ) else 12 1 when (a=1 and b=1 and c=0 ) else 13 1 when (a=1 and b=1 and c=1 ) else 14 0; 15 end ejemplo;

Ntese que la funcin de salida f (lnea 10) depende directamente de las condiciones que presentan las variables de entrada, adems y que dado que la ejecucin inicial de una u otra condicin no afecta la lgica del programa, el resultado es el mismo; es decir, la condicin de entrada 111, visualizada en la tabla de verdad, puede ejecutarse antes de la condicin 000 sin alterar el resultado final. La ventaja de la programacin en VHDL en comparacin con el diseo lgico puede intuirse considerando que la funcin de salida f mediante lgebra booleana se representa con:

f a b c a bc ab c abc

En el diseo convencional se utilizaran inversores, compuertas OR y compuertas AND; en VHDL la solucin es directa utilizando la funcin lgica and. Como ejemplo, observemos que de la lnea 10 a la 14 las instrucciones se interpretaran de la siguiente manera:
10 asigna a f el valor de 1 cuando a = 0 y b = 0 y c = 0 si no 11 asigna a f el valor de 1 cuando a = 0 y b = 1 y c = 1 si no 12 asigna a f el valor de 1 cuando a = 1 y b = 1 y c = 0 si no 13 asigna a f el valor de 1 cuando a = 0 y b = 1 y c = 1 si no 14 asigna f el valor de 0.

EXPRESIONES Y OPERADORES
La metodologa de programacin de una componente, basada en la descripcin por comportamiento (behavioral), puede emplear en su diseo la mayora de operadores que se encuentran habitualmente tiles en los SDL's ( software design languages) En el cuadro adjunto se puede ver una relacin de los operadores predefinidos ms empleados en VHDL, as mismo se aprecia que su clasificacin atiende al tipo de dato que vaya a manejar:

TIPOS DE OPERADORES
OPERADORES LGICOS NOT, AND, OR, NAND, NOR, XOR Tipo de operador: boolean Tipo de resultado: boolean

OPERADORES RELACIONALES OPERADORES ARITMTICOS

= / < <= > >= + - * / ** MOD, REM, ABS

Tipo de operador: cualquier tipo Tipo de resultado: boolean Tipo de operador: integer, real, signal Tipo de resultado: integer, real,signal Tipo de operador: array Tipo de resultado: array

OPERADOR CONCADENACIN

&

Los operadores lgicos, pueden ser empleados con los tipos predefinidos, BIT y BOOLEAN, dndonos como resultado un valor booleano del mismo tipo que los operadores. Para graficar un poco la importancia de emplear correctamente los distintos tipos de operadores, a continuacin lo ilustramos con la ayuda del diseo de un sumador de cuatro bits mas el carry de la etapa anterior

architecture archisumador of sumador is begin process (a,b,cin) variable aux:std_logic_vector(4 downto 0); begin aux:=('0' & a) + ('0' & b); if cin='1' then aux:=aux+1; elsif cin='0' then null; end if; sum<=aux; end process; end archisumador;

En este ejemplo se aprecia una concatenacin del elemento "a" (que previamente debe de haber sido definido como un std_logic_vector), con un "0", dndonos como resultado un array en el que la primera posicin la ocupa el "0" y despus va el elemento "a Este mismo ejemplo nos servir para graficar la utilizacin del operador suma "+", que lo empleamos para incrementar a la variable aux, en caso de que cin valga uno.

Los operadores relacionales tambin nos generaran un resultado de tipo booleano sin importar el tipo de operando con el que lo empleemos, como nota comentar que el operador "diferente que" viene dado por la combinacin " /= ".

El operador concadenacon es empleado para concadenar arrays de bits, como muestra se grafica este operador con el siguiente ejemplo. aux:=('0' & a)

Los operandos de tipo aritmticos estn en la obligacin de ser empleados con elementos del mismo tipo y de devolver un resultado que a su vez este contenido en el mismo tipo que los operandos. El signo "+", "-" dar como resultado sumas de unidades es decir que al elemento sumado le aade uno

Los elementos a concadenar deben de ser del mismo tipo. Este tipo de operador es muy empleado a la hora de trabajar con buses o registros. El resultado que nos devuelve este operador es un array de los elementos de los operndoos concatenados. En nuestro ejemplo, si "a" es un array de cuatro bits, la variable "aux", pasara a tener en su primera posicin el valor "0" y a continuacin tendr el valor de los elementos de "a", de forma que "aux" pasa a tener dimensin cinco.

3.1.2 Declaraciones concurrentes asignadas a seales


En este tipo de declaracin encontraremos las funciones de salida mediante la ecuacin booleana que describe el comportamiento de cada una de las compuertas. Obsrvese que el circuito de la figura 3.2 cuenta con tres salidas (x1, x2, y x3) en lugar de una.

a b c d e f

x1 x2 x3

Figura 3.2 Circuito lgico realizado con compuerta

El programa correspondiente a la figura 3.2 se muestra en el listado 3.2. 1 libraly ieee; 2 use ieee.std_logic_1164.all; 3 entity logic is port ( 4 a, b, c, d, e, f: in std_logic; 5 x1,x2, x3: out std_logic) ; 6 end logic; 7 architecture booleana of logic is 8 begin 9 x1 <= a xnor b; 10 x2 <= ((( c and d) or (a xnor b)) nand 11 ((e xor f) and (c and D))); 12 x3 <= (e xnor f) and (c and d ); 13 end booleana; Listado 3.2 Declaraciones concurrentes asignadas a seales.

Ejemplo 3.2
Dada la tabla de verdad mostrada a continuacin, halle las ecuaciones X, Y, Z, de la forma suma de productos y progrmelas en VHDL, utilizando declaraciones concurrentes asignadas a se ales.
A B C X Y Z 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0

Solucin Las ecuaciones de las formas suma de productos para X, Y, y Z se muestra a continuacin:

X ABC ABC ABC ABC Y A BC A BC ABC Z A BC ABC ABC

Observase ahora la forma de implementar estas ecuaciones por medio de operadores lgicos. 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity concurrente is port( 4 A, B, C: in std_logic; 5 X, Y, Z: out std_logic); 6 end concurrente; 7 architecture a_conc of concurrente is 8 begin 9 X <= (not A and not B and not C) or (not A and not B and C) 10 or (not A and B and C) or (A and B and C); 11 Y <= (not A and not B and C) or (A and not B and C) 12 or (A and B and not C); 13 Z <= (not A and not B and not C) or (not A and B and not C) 14 or (not A and B and C); 15 end a_conc;

Seleccion de una seal (with-select-when)


La declaracin with-select-when se utiliza para asignar un valor a una seal con base en el valor de otra seal previamente seleccionada. Por ejemplo, en el listado correspondiente a la figura 3.3 se muestra el cdigo que representa a este tipo de declaracin. Como puede observarse, el valor de la salida C depende de las seales de entrada seleccionadas a(0) y a(1), de acuerdo con la tabla de verdad correspondientes. a(0) 0 0 1 1 a(1) 0 1 0 1 C 1 0 1 0

Tabla de verdad

1 library ieee; 2 use ieee.srd_logic_1164.all; 3 entity circuito is port ( 4 a: in std_logic_vector (1 downto 0); 5 c: out std_logic); 6 end circuito; 7 architecture arq_cir of circuito is 8 begin 9 with a select 10 c <= 1 when 00, 11 0 when 01, 12 1 when 10, 13 0 when others; 14 end arq_cir; Listado 3.3 Cdigo VHDL correspondiente a la tabla de verdad de la figura 3.3.

Ejemplo 3.3
Se requiere disear un circuito combinacional que detecte n meros primos de 4 bits. Realice la tabla de verdad y elabore un programa que describa su funcin. Utilice instrucciones de tipo with-select-when. X0 X1 X2 X3 F
0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0

Solucin: La tabla de verdad que resuelve la


funcin es la siguiente:

0 0 0 0 1 1 1 1 1 1 1 1

Si se considera que la entrada X es un vector de 4 bits y que F es la funcin de salida, el programa en VHDL quedara de la siguiente manera: 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity seleccion is port ( 4 x: in std_logic_vector (0 to 3); 5 F: out std_logic); 6 end seleccion; 7 architecture a_select of seleccion is 8 begin 9 with x select 10 F <= 1 when 0001, 11 1 when 0010, 12 1 when 0011, 13 1 when 0101, 14 1 when 0111, 15 1 when 1011, 16 1 when 1101, 17 0 when others; 18 end a_select;

3.2 Programaci n de estructuras b sicas mediante declaraciones secunciales


Como ya se menciono, las declaraciones secu nciales son aquellas en las que el orden que llevan puede tener en efecto significativo el la l gica descrita. A diferencia de una declaracin concurrente, una secuencial debe de ejecutarse en el orden en que aparece y formar parte de un proceso (process). Declaracin if-then-else (si-entonces-si no). Esta declaraci n sirve para seleccionar una condici n o condiciones basadas en el resultado de evaluaciones lgicas (falso o verdadero). Por ejemplo, observemos que en la instruccin: if la condicin es cierta then realiza la operacin 1; else realiza la operacin 2; end if;

Si (if) condicin se evala como verdadera, entonces (then) la instruccin indica que se ejecutara la operacin 1. Por el contrario, si la condici n se evala como falsa (else) correr la operacin 2. La instruccin que indica el fin de la declaraci n es end if (fin de si). Un ejemplo que ilustra este tipo de declaraci n se encuentra en la figura 2.6 y como comodidad se repite en la figura 3.4.
a b 2 2 Comparador c

Figura 3.4 Comparador de igualdad de dos bits.

El cdigo correspondiente a esta entidad de diseo se muestra en el listado 3.4. 1 --Ejemplo de declaracin de la entidad comparador 2 entity comp is 3 port (a,b: in bit_vector(1 downto 0); 4 c: out bit); 5 end comp; 6 architecture funcional of comp is 7 begin 8 compara: process (a,b) 9 begin 10 if a = b then 11 c <= 1; 12 else 13 c<= 0; 14 end if; 15 end process compara; 16 end funcional; Listado 3.4 Declaracin secuencial de un comparador de igualdad de dos bits.

Notemos como, este tipo de ejemplos solo son necesarias dos condiciones por evaluar, pero no en todos los dise os es as. Por tanto, cuando se requieren mas condiciones de control, se utiliza una nueva estructura llamada elsif (si no-si), la cual permite expandir y especificar prioridades dentro del proceso. La sintaxis para esta operacin es: if la condicin 1 se cumple then realiza operacin 1; elsif la condicin 2 se cumple then realiza operacin 2; else realiza operacin 3; end if; la cual se interpreta como sigue: Si (if) la condici n 1 es verdadera, entonces (then) se ejecuta la operaci n 1, si no-si (elsif) se eval a la condicin 2 y si es verdadera entonces (then) se ejecuta la operacin 2, si no (else) se ejecuta la operacin 3.

3.2.1 Comparador de magnitud de 4 bits


La forma de utilizar las declaraciones secunciales se ilustra en el diseo de un comparador de dos nmeros de 4 bits, figura 3.5 a). En este caso el sistema tiene tres salidas que indican cuando uno de los nmeros es mayor, igual o menor que el otro. La figura 3.5 b) representa el mismo comparador de manera simplificada utilizando la notacin vectorial. a3
a2 a1 a0 b3 b2 b1 b0 a>b y b[3:0] a <b z a <b z a=b x a=b a[3:0] a>b y x

Figura 3.5 a) comparador de 4 bits. b) comparador expresado con vectores de 4 bits. En el listado 3.5 se observa el algoritmo en VHDL que describe el funcionamiento del comparador. En la l nea 9 se muestra la lista sensitiva (a y b) del proceso (process). En las lneas 10 a 17 el proceso se desenvuelve mediante el anlisis de las variables de la lista sensitiva. Sin mucho esfuerzo puede verse que si a=b, entonces x toma el valor de 1, de la forma similar se intuye el comportamiento para a>b y a<b, incluyendo la declaracin elsif.

1 library ieee; 2 use ieee.std_logic_1164,all; 3 entity comp4 is port ( 4 a, b: in std_logic_vector (3 downto 0); 5 x, y, z: out std_logic; 6 end comp4; 7 architecture arq_comp4 of comp4 is 8 begin 9 process (a, b) 10 begin 11 if (a = b) then 12 x <= 1; 13 elsif (a > b) then 14 y <= 1; 15 else 16 z <= 1; 17 end if; 18 end process; 19 end arq_comp4; Listado 3.5 Descripcin del comparador de 4 bits utilizado el estilo funcional.

Ejemplo 3.4
Disee un comparador de dos nmeros A y B, cada numero formado por dos bits (A1 A0) y (B1 B0) la salida del comparador tambi n es de dos bits y esta representada por la variable Z(Z1 Z0) de tal forma que si:
A1
0

A0
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1

B1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1

B0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Z1
1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1

Z0
1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1

A = B entonces Z = 11 A < B entonces Z = 01 A > B entonces Z = 10

0 0 0 0 0 0

La tabla de verdad correspondiente a este comparador es la siguiente:

0 1 1 1 1 1 1 1 1

Las ecuaciones lgicas reducidas mediante un mapa de karnaugh para Z1 y Z0 son las siguientes:

Z1 0 A1 B 0 B1 A1BO A0 B0 A0 B1

Z 0 A0 A1 B 0 B1 A0B1 A0B0 A1B0


El circuito representativo de este comparador es el siguiente, figura E3.4.
A0 A1 B0 B1 Comparador Z1 Z0

Figura e3.4 Descripcin funcional de un comparador de igualdad de dos bits.

La programacin de este comparador se muestra en el siguiente listado. 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity comp is port ( 4 A, B: in std_logic_vector (1 downto 0); 5 Z: out std_logic_vector (1 downto 0)); 6 end comp; 7 architecture a_comp of comp is 8 begin 9 process (A, B) begin 10 if A = B then 11 Z <= 11; 12 elsif A < B then 13 Z <= 01; 14 else 15 Z <= 10; 16 end if; 17 end process; 18 end a_comp;

3.2.2 Buffers tri-estado


Los registros de tres estados (buffers tri-estado) tienen diversas aplicaciones, ya sea como salidas de sistemas (modo buffers) o como parte integral de un circuito. En VHDL estos dispositivos son definidos a trav s de los valores que manejan (0,1 y alta impedancia Z ). En la figura 3.6 se observa el diagrama correspondiente a este circuito, y en el listado 3.6 el cdigo que describe el funcionamiento.

enable entrada salida

Figura 3.6 Buffers tri-estado.

1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity tri_est is port ( 4 enable, entrada: in std_logic; 5 salida: out std_logic; 6 end tri_est; 7 architecture arq_buffer of tri_est is 8 begin 9 process (enable, entrada) begin 10 if enable = 0then 11 salida <= z; 12 else 13 salida <= entrada; 14 end if; 15 end process; 16 end arq_buffer; Listado 3.6 Descripcion mediante valores de alta impedancia.

El listado anterior se basa en un proceso, el cual se utiliza para describir los valores que tomara la salida del registro (buffer). En este proceso se indica que cuando se confirma el habilitador del circuito (enable), el valor que se encuentra a la entrada del circuito se signa a la salida; si por el contrario no se confirma enable, la salida del buffer tomara un valor de alta impedancia (Z). El tipo std_logic soporta este valor al igual que 0 y 1-. A esto se debe que en el dise o se prefiere utilizar el est ndar std_logic_1164 y no el tipo bit, ya que el primero es mas vers til al proveer valores de alta impedancia y condiciones de no importa (-), los cuales no estn considerados en el tipo bit.

3.2.3 MULTIPLEXORES

Un circuito multiplexor acepta N entradas y presenta una salida en la que aparecer el valor lgico asociado a una de estas entradas. La seleccin de cul de esas entradas es la que aparece en la salida se determina por un conjunto de M seales de control, cumplindose que N = 2M. La salida presentar aquella entrada cuyo ndice concuerda con el nmero codificado en binario en las lneas de control (o seleccin).

3.2.3 Multiplexores
Los multiplexores se disean describiendo su comportamiento mediante la declaracin with-select-when o ecuaciones boolenas. En la figura 3.7 a) se observa que el multiplexor dual tiene como entrada de datos las variables a, b, c y d, cada una de ellas representadas por dos bits (a1, a0), (b1, b0), etc., las lneas de seleccin (s) de dos bits (s1, s0) y la lnea de salida z(z1, z0). En la figura 3.7 b) se muestra un diagrama simplificado que resalta la representacin mediante vectores de bits.
a1 b1 c1 d1 a0 b0 c0 d0 00 01 10 Mux 11 00 Mux 01 10 11 s1 s0 a) a1 b1 c1 d1 a0 b0 c0 d0 s1 s0 a) 00 01 10 Mux 11

z1

z1

z0

z0

En el listado 3.7 se muestra la descripcin mediante with-select-when del multiplexor dual de 2 x 4. En este caso la se al s determina cual de las cuatro seales se asignan a la salida z. Los valores de s est n dados como 00 , 01 y 10 ; el termino others (otros) especifica cualquier combinaci n adicional que pudiera presentarse (que incluye el 11 ), ya que esta variable se encuentra definida dentro del tipo std_logic_vector, el cual contiene nueve valores posibles que la herramienta de sntesis reconoce como tipos lgicos estndares.

1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity mux is port ( 4 a, b, c, d: in std_logic_vector(1 downto 0); 5 s: in std_logic_vector(1 downto 0); 6 z: out std_logic_vector(1 downto 0)); 7 end mux; 8 architecture arqmux4 of mux is 9 begin 10 with s select 11 z <= a when 00 12 b when 01 13 c when 10 14 d when others; 15 end arqmux4;

Listado 3.7 Multiplexor descrito con declaraciones with-select-when.

Tipos logicos estandares

U X 0 1 Z W L H -

- Valor no inicializado - Valor fuerte desconocido - 0 Fuerte - 1 Fuerte - Alta impedancia - Valor dbil desconocido - 0 dbil -1 dbil - No importa (dont care));

Las funciones estndares definidas en le lenguaje VHDL se crearon para que cada distribuidor de sorftware introdujera sus paquetes y tipos de datos al lenguaje. Por esta razn el Instituto de Ingenieros Elctricos y Electrnicos, IEEE, estableci desde 1987 los estndares de etd_logic y std_logic_vector, que ya se vieron en un capitulo anterior. En cada uno de los estndares se definen ciertos tipos de datos conocidos como tipos lgicos estndares, los cuales se pueden utilizar haciendo referencia al paquete que los contiene (en este caso std_logic_1164). En la tabla 3.2 se muestra los tipos lgicos estndares definidos en VHDL.

Tabla 3.2 Tipos lgicos estndares definidos en VHDL.

Como se puede apreciar, estos tipos de datos no tienen un significado evidente para el diseador, pero si lo tienen en la compilacin del programa. Por ejemplo, el estndar no especifica alguna interpretacin de L y H, debido a que la mayora de las herramientas no los soportan. Los valores metalogicos (U, W, X, -) carecen de sentido en la sntesis, pero la herramienta los usa en la simulacin del cdigo. Como se menciono en seccin anterior, el uso de Z entraa un valor de alta impedancia.

3.2.4 Descripcin de multiplexores mediante ecuaciones boolenas En el listado 3.8 se muestra un solucin de ecuaciones booleanas para el multiplexor dual de la figura 3.7.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

library ieee; use ieee.std_logic_1164.all; entity mux is port ( a,b,c,d: in std_logic_vector(1 downto 0); s: in std_logic_vector(1 downto 0); z: in std_logic_vector(1 downto 0)); end mux; architecture arqmux of mux is begin z(1) <= (a(1) ant not (s(1)) ant not (s(0))) or (b(1) ant not (s(1)) ant s(0)) or (c(1) ant s(1) ant not (s(0))) or (d(1) ants(1) ant s(0)); z(0) <= (a(0) ant not (s(1)) ant not (s(0))) or (b(0) ant not (s(1)) ant s(0)) or (c(0) ant s(1) ant not (s(0))) or (d(0) ant s(1) ant s(0)); end arqmux;

14. 15. 16. 17. 18.

3.2.5.- Sumadores
Diseo de un medio sumador Para describir el funcionamiento de los circuitos sumadores es importante recordar las reglas bsicas de la adicin. 0+0=0 0+1=1 1+0=1 1 + 1 = 10 En el caso de la suma 1 + 1 = 10, el resultado es 0 representa el valor de la suma, meimtras que el 1 el valor del acarreo. Para observar en detalle el funcionamiento de un circuito medio sumador, considere la suma de los numero A y B mostrados en la tabla 3.3.

A 0 0 1 1

B 0 1 0 1

Suma 0 1 1 0 0 0 0

Cout

0 1 (1+1=10)

Tabla 3.3 Tabla de verdad de un circuito sumador

La ecuacin lgica que corresponde a la expresin es la funcin lgica or-exclusiva A + B, mientras que la ecuacin lgica del acarreo de salida Cout = AB que corresponde a la compuerta lgica and. La realizacin fsica de estas ecuaciones se muestra en la figura 3.8a, en ella se presenta el bloque lgico del medio sumador (MS) y la figura 3.8b representa su implantacin mediante compuertas lgicas.

A MS B

Cout a)

Suma Cout

A B

Suma

Cout

b) Figura 3.8 a) Diagrama a bloques de un medio sumador; b) Medio sumador lgico.

El programa en VHDL que representa este medio sumador se muestra en el listado 3.9. libary ieee; use ieee.std_logic_1164.all; entity m_sum is port ( A,B: in std_logic; SUMA, cout : out std_logic); end m_sum; architecture am_sum of m_sum is begin SUMA <= A XOR B; Cout <= A AND B; end am_sum; Listado 3.9 Codigo de un medio sumador.

Diseo de un sumador completo Un sumador completo (SC) a diferencia del circuito medio sumador considera un acarreo de entrada (Cin) tal y como se muestra en la figura 3.9a, el comportamiento de este sumador se describe a trav s de su tabla de verdad.
A 0 0 B 0 0 1 1 0 0 1 1 Cin 0 1 0 1 0 1 0 1 Su ma 0 1 1 0 1 0 0 1 Cou t 0 0 0 1 0 1 1 1

A SC Suma B Cout Cin a)

Suma Cout

0 0 1 1 1 1

Listado 3.9 a) Sumador completo; b) Tabla de verdad del medio sumador.

Las ecuaciones mediante un mapa de Karnaugh correspondientes a la salida Suma y Cout se muestra a continuacin Suma = A B Cin + A B Cin + A B Cin + A B Cin Cout = A B + B Cin + A Cin Si se manipulan las ecuaciones anteriores mediante algebra boolena obtenemos que la funcion de Suma Y Cout puede expresarse como: Suma = A + B + Cin Cout = A B + (A + B) Cin La realidad f sica del circuito se basa en la utilizaci n de compuertas or-exclusiva como se muestra en la figura 3.10 a). Como puede observarse en la figura 3.10 b), dos circuitos medio sumador pueden implementar un sumador completo.

a) Circuito sumador completo implementado por compuertas

b) Circuito sumador completo implementado por medio sumadores

La programacin en VHDL del sumador completo se presenta en el listado 3.10


library ieee; use ieee.std_logic_1164.all; entity sum is port ( A,B,Cin: in std_logic; Suma, Cout: out std_logic); end sum; architecture a_sum of sum is begin Sum <= A xor B xor Cin; Cout <= (A and B) or (A xor B) and Cin; end a_sum;

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

Listado 3.10 Sumador completo.

Seg n lo anterior, para realizar un sumador paralelo de 4 bits solo se requiere conectar en cascada un circuito medio sumador y tres sumadores completos como se muestra en la fug 3.11

Figura 3.11 Sumador de 4 bits

A su vez, este es un buen ejemplo para reafirmar el manejo de se ales (signal). En la figura 3.11 se observa como los acarreos de salida (C0, C1 y C2) se encuentran retroalimentados dentro del circuito, por lo que no tienen un pin externo asignado. En el listado 3.11 se ilustra la programacin de VHDL. Como puede apreciarse, el intervalo utilizado dentro de signal es (0 to 2), debido a que solo se retroalimentan los acarreos C0, C1 y C2. Por otro lado, con un poco de esfuerzo puede intuirse que cada uno de los diferentes bloques que forma el sumador se caracteriza usando compuertas xor (or exclusiva).

1. library ieee; 2. use ieee.std_logic_1164.all; 3. entity suma is port( 4. A,B: in std_logic_vector (0 to 3); 5. S: out std_logic_vector (0 to 3); 6. Cout: out std_logic); 7. end suma; 8. architecture arqsuma of suma is 9. signal C: std_logic_vector (0 to 2); 10. benig 11. S(0) <= A(0) xor B(0); 12. C(0) <= A(0) and B(0); 13. S(1) <= (A(1) xor B(1)) xor C (0); 14. C(1) <= (A(1) and B(1)) or (C(0) and (A(1) xor B(1))); 15. S(2) <= (A(2) xor B(2)) xor C(1); 16. C(2) <= (A(2) and B(2)) or (C(1) and (A(2) xor B(2))); 17. S(3) <= (A(3) xor B(3)) xor C(2); 18. Cout <= ( A(3) and B(3)) or (C(2) and (A(3)xor B(3))); 19. end arqsuma; Listado 3.11 Descripcion de un sumador 4bits.

Operadores aritmticos

Como su nombre lo indica, los operadores aritmticos permiten realizar operaciones del tipo aritmtico, como suma, resta, multiplicacin, divisin, cambios de signo, valor absoluto, y concatenacin. Estos operadores suelen usarse en el diseo lgico para describir sumadores y restadores o en las operaciones de incremento y decremento de datos. En la tabla 3.4 se muestran los operadores aritmticos preferidos en VHDL.

Operadores + / * **

Descripcin Suma Resta Divisin Multiplicacin Potencia

Tabla 3.4 Operadores aritmticos utilizados en VHDL.

Como ejemplo, analicemos el diseo de un circuito sumador de 4 bits que no considera el acarreo de salida (listado 3.12).

1. library ieee; 2. use ieee.std_logic_1164.all; 3. use work.std_arith.all; 4. entity sum is port ( 5. A, B: in std_logic_vector (0 to 3); 6. Suma: out std_logic_vector (0 to 3); 7. Cout: out std_logic); 8. end suma; 9. architecture arqsuma of suma is 10. begin 11. Suma <= A + B; 12. end arqsum; 13. Listado 3.12 Descripcin de un sumador mediante std_logic_vector y el paquete std arith.

En el listado 3.12 se introdujo el paquete std_arith, el cual como ya se menciono se encuentra en la librera work. Este paquete permite el uso de los operadores aritmeticos con operaciones realizadas entre arreglos del tipo std_logic_vector; es decir; dado que dentro del paquete estandar (std_logic_1164) no estan definidos los operadores aritmeticos, es necesario usar el paquete std_arith. El uso de los operadores existentes en VHDL, as como los tipos de datos para los cuales se encuentran definidos, se incluye en el apndice B

3.2.6 Decodificadores
Un decodificador es un circuito lgico combinacional, que convierte un cdigo de entrada binario de N bits en M lneas de salida (N puede ser cualquier entero y M es un entero menor o igual a 2N), tales que cada lnea de salida ser activada para una sola de las combinaciones posibles de entrada. La Figura 1, muestra el diagrama general de un decodificador de N entradas y M salidas. Puesto que cada una de las entradas puede ser 1 o 0, hay 2N combinaciones o cdigos de entrada. Para cada una de estas combinaciones de entrada slo una de la M salidas estar activada 1, para lgica positiva; todas las otras salidas estarn en 0. Muchos decodificadores se disean para producir salidas 0 activas, lgica negativa, donde la salida seleccionada es 0 mientras que las otras son 1. Esto ltimo se indica siempre por la presencia de pequeos crculos en las lneas de salida del diagrama del decodificador.

Algunos decodificadores no usan todos los 2N cdigos posibles de entrada, sino slo algunos de ellos. Por ejemplo, un decodificador BCD a DECIMAL, tiene un cdigo de entrada de 4 bits, el cual slo usa diez grupos codificados BCD, 0000 hasta 1001. Algunos de estos decodificadores se disean de tal manera, que si cualquiera de los cdigos no usados se aplican a la entrada, ninguna de las salidas se activar.

DECODIFICADOR DE BCD A DECIMAL

- La conversin de BCD a decimal es igual de simple, vamos a utilizar otro ejemplo. Imagina que deseas convertir el numero 01000110001 (BCD) a decimal. Tomamos a partir de la derecha grupos de 4 bits y los convertimos a su cifra correspondiente (utilizando cdigo binario): 0001 0011 010 -> 1 -> 3 -> 2 (si faltan bits se completan con ceros)

Se toman las cifras decimales as obtenidas en orden inverso, por lo tanto: 01000110001 (BCD) -> 231 (decimal)

BCD/DEC

x0 x1 x2 x3

1 2 4 8

0 1 2 3 4 5 6 7 8 9

a b c d e f g h i j

Figura 3.12

Decodificador de BCD a decimal.

El programa que describe el comportamiento de la entidad de la figura 3.12 se muestra en el listado 3.13 Como se puede apreciar, el cdigo correspondiente a este circuito se basa en la ejecucin de un proceso en que se establecen las condiciones que se evalan para activar cada salida de acuerdo con el valor binario correspondiente. Para fines prcticos se asigno a cada salida un nombre a fin de facilitar su identificacin. A manera de ejemplo consideremos el valor de la entrada x = 0010, al cual corresponde al digito decimal 2. Ntese como la condicin que determina la asignacin del valor evala primero la condicin de x y si la confirma, asigna a la salida c el valor correspondiente al digito decimal 2. Por otro lado, se puede ver que el inicio del proceso se declararon todas la salidas con valor inicial de `1`, esto fue con el fin de asegurar que permanecieran desactivadas cuando no estuvieran en evaluaci n.

--Decodificador de BCD a decimal


library ieee; use ieee.std_logic_1164.all; entity deco is port ( x: in std_logic_vector (3 dowton 0); a,b,c,d,e,f,g,h,i,j: out std_logic); end deco; architecture arqdeco of deco is begin process (x) begin a <= 1; b <= 1; c <= 1; d <= 1; e <= 1; f <= 1; g <= 1; h <= 1; i <= 1; j <= 1; if x = 0000 then a = 0; (continua)

elsif x = 0001 then b = 0; elsif x = 0010 then c = 0; elsif x = 0011 then d = 0; elsif x = 0100 then e = 0; elsif x = 0101 then f = 0; elsif x = 0110 then g = 0; elsif x = 0111 then h = 0; elsif x = 1000 then i <= 0 else j <= 0; end if; end process; end arqdeco; Listado 3.13 Descripcin de un decodificador de BCD a decimal

Decodificador de BCD a display de siete segmentos En la figura 3.13 a) se muestra un circuito decodificador, el cual acepta cdigo BCD en sus entradas y proporciona salidas capaces de excitar un display de siete segmentos que indica el digito decimal seleccionado. En la figura de siete segmentos que indica el cdigo decimal seleccionado. En la figura 3.13b) se observa la distribucin de los segmentos dentro del display.

Figura 3.13 a) Decodificador BCD a siete segmentos. b) Configuracin del display de siete segmentos

A cdigo BCD A0 A1 A2 A3 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1

Segmento del display d a 0 1 0 0 1 0 0 0 0 0 b 0 0 0 0 0 1 1 0 0 0 c 0 0 1 0 0 0 0 0 0 0 d 0 1 0 0 1 0 0 1 0 0 e 0 1 0 1 1 1 0 1 0 1 f 0 1 1 1 0 0 0 1 0 0 g 1 1 0 0 0 0 0 0 0 0

Tabal 3.5 Valores lgicos correspondientes a cada segmento del display.

La funcin del programa cuyo cdigo se exhibe en el listado 3.14 utiliza declaraciones secunciales del tipo case-when que, como se puede apreciar, ejecutan un conjunto de instrucciones basadas en el valor que puede tomar una seal. En nuestro ejemplo, se describe de que manera se maneja el decodificador de acuerdo con el valor que toma la seal A. para fines prcticos se declaran todas las salidas como un solo vector de bits (identificado como d); de esta forma se entiende que la salida a corresponde al valor d0, la b al valor d1, etc. Por lo tanto, la palabra others, como ya se indico, define los valores metalogicos que puede tomar en la sntesis la salida d.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.

library ieee; use ieee.std_logic_1164.all; entity deco is port( A: in std_logic_vector (3 downto 0); d: out std_logic_vector (6 downto 0)); end deco; architecture arqdeco of deco is begin process (A) begin case A is when 0000 => d <= 0000001; when 0001 => d <= 1001111; when 0010 => d <= 0010010; when 0011 => d <= 0000110; when 0100 => d <= 1001100; when 0101 => d <= 0100100; when 0110 => d <= 0100000; when 0111 => d <= 0001110; when 1000 => d <= 0000000; when 1001 => d <= 0000100; when others => d <= 1111111; end case; end process; end arqdeco;

En la instruccin case-when podemos observar el uso de asignaciones dobles (=> d <=), las cuales permiten que una seal adopte un determinado valor de acuerdo con el cumplimiento de una condicin especificada. Por ejemplo, en nuestro cdigo (listado 3.14) estas instrucciones se interpretan de la siguiente manera: cuando la seal A sea 0000, asigna a la seal d el valor 0000001; cuando A = 0001, asigna a d el valor 10001111, etc. Cabe mencionar que en la simulacin del programa esta asignacin se realiza simultneamente.

CODIFICADORES
Un codificador es un circuito combinacional con 2n entradas y n salidas cuya misin es presentar en la salida el cdigo binario correspondiente a la entrada activada. Existen 2 tipos fundamentales de codificadores. Los primeros solo admiten una entrada activada, codificando en la salida el valor binario de la misma y cero cuando no existe ninguna activa. En los segundos puede haber ms de una entrada activada, existiendo prioridad en aquella cuyo valor decimal es ms alto.

Figura 3.14 Codificador de decimal a 4 segmentos

El programa que describe al circuito de la figura 3.14, se muestra en el listado 3.15. Como se pude ver, el puerto de entrada a se declara como un vector para indicar la numeracin del 0 al 9, mientras que la salida binaria se realiza a travs del vector d. Asmismo, observe que la programacin se realizo utilizando declaraciones del tipo if-the-elsi. --Codificador de decimal a BCD library ieee; use ieee.std_logic_1164.all; entity codif is port ( a: in integer range 0 to 9; d: out std_logic_vector (3 downto 0)); end codif; architecture arqcodif of coidf is begin process (a) begin if a = 0 then d <= 0000; elsif a = 1 then d <= 0001; (continua)

elsif a = 2 then d <= 0010; elsif a = 3 then d <= 0011; elsif a = 4 then d <= 0100; elsif a = 5 then d <= 0101; elsif a = 6 then d <= 0110; elsif a = 7 then d <= 0111; elsif a = 8 then d <= 1000; else d <= 1001; end if; end process; end arqcodif; Listado 3.15 Diseo de un codificador de decimal a binario