You are on page 1of 32
Capitulo 3 Disenio légico combinacional mediante VHDL Introduccién En este capitulo se disefian los circuitos combinacionales més utilizados en el disefio légico a través del lenguaje de descripcién en hardware. Esto permite introducir nuevos conceptos, palabras reservadas, reglas, algoritmos, etc., que muestran la potencia y profundidad del lenguaje VHDL. El desarrollo de cada una de las entidades de disefio descritas en este ca- pitulo se puede optimizar mediante el uso adecuado de las declaraciones se- cuenciales, concurrentes o ambas, utilizando en esta descripcién cualquiera de los tres tipos de arquitectura —funcional, por flujo de datos y estructu- ral vistos en el capitulo anterior. Sin embargo y dada la filosoffa que que- remos manejar en este texto, nos parece conveniente presentar soluciones que incluyan nuevas declaraciones, nuevos tipos de datos y nuevos algorit- mos de anilisis; es decir, no se pretende presentar la mejor opcidn de disefio para un problema; por el contrario, se propone brindar la mayor cantidad de soluciones (modelos) que le permitan deducir y construir sus estrategias de disefio para optimizar sus resultados. 3.1 Programacion de estructuras basicas mediante declaraciones concurrentes Como se mencioné antes, las declaraciones concurrentes se encuentran fue- ra de la declaracién de un proceso y suelen usarse en las descripciones de flu- jo de datos y estructural. Esto se debe a que en una declaracién concurrente no importa el orden en que se escriban las sefiales, ya que el resultado para determinada funcién seria el mismo. 62 VHDL: El arte de programar sistemas digiales En VHDL existen tres tipos de declaraciones concurrentes: Declaraciones condicionales asignadas a una sefial (when-else) Declaraciones concurrentes asignadas a sefiales Seleccién de una sefal (with-select-when) 3.1.1 Declaraciones condicionales asignadas a una sefial (when-else) La declaracién when-else se utiliza para asignar valores a una sefial, detem- nando asi la ejecucidn de una condicién propia del disefio. Para ejemplifica, consideremos la entidad mostrada en la figura 3.1, cuyo funcionamiento define en la tabla de verdad. bot] Entidad extL_Prusba_ [> "°) Figura 3.1 Declaraciones when-else. La entidad se puede programar mediante declaraciones condicionales (when-else), debido a que este modelo permite definir paso a paso el com portamiento del sistema, segtin se muestra en el listado 3.1. = Ejemplo combinacional bésico 2 library ieee; 3 use icee.std_logic_1164.al1; 4 entity tabla is port ( 5 a,b,c: in std_logic; 6 out std_logic); 7 end tabla; 8 architecture ejemplo of tabla is 9 begin 10 fee 1 else 11 “a else 12 ae else 3 sae else 14 “Or; 15 end ejempl Listado 3.1 Descripcién de la entidad mostrada en la tabla de la figura 3.1. Diseho kyicocombinacional mediante VHDL 63 Notese que la funcisn de salida f (linea 10) depende directamente de las condiciones que presentan las variables de entrada, adems y dado que la ejecucién inicial de una u otra condici6n no afecta la l6gica del programa, el resultado es el mismo; es decir, la condicién de entrada “111”, visualizada en la tabla de verdad, puede ejecutarse antes que la condicién “000” sin alterar el resultado final La ventaja de la programacién en VHDL en comparacién con el disefio logico puede intuirse considerando que la funci6n de salida f mediante alge- bra booleana se representa con: frabet+abc+abctabc en el disefio convencional se utilizarfan inversores, compuertas OR y com- puertas AND; en VHDL la soluci6n es directa utilizando la funcién lgica and. Como ejemplo, observemos que de la linea 10 a la 14 las instrucciones se interpretarian de la siguiente manera 10 asigna a “f” el valor de 1 cuando a = Oy b = Oyc = Osino 11 asigna a “f” el valor de I cuando a = Oyb = Lyc = I sino 12 asigna a “f” el valor de 1 cuandoa = 1yb = lyc = Osino 13 asigna a “f” el valor de I cuando a = Oyb = Lyc = Isino 14 asigna a “f” el valor de 0. Operadores légicos Los operadores légicos mas utilizados en la descripein de funciones boolea- nas, y definidos en los diferentes tipos de datos bit, son los operadores and, or, nand, xor, xnor y not. Las operaciones que se efecttien en- tre ellos (excepto not) deben realizarse con datos que tengan la misma lon- gitud o palabra de bits. En el momento de ser compilados los operadores logics presentan el si- guiente orden y prioridad: 1) Expresiones entre paréntesis 2) Complementos 3) Funcién AND 4) Funcién OR Las operaciones xox y_xnov son transparentes al compilador y las in- terpreta mediante la suma de productos correspondiente a su funci6n. Como ejemplo del uso de operadores légicos en VHDL, observemos la si- guiente comparacién: 64 VHDL: Blarte de programar sistemas digitales Ecuacién En VHDL quatxey aor (xand y) yoatbectd y = not (a or (band not c) or d) Ejemplo 3.1 Una funcién F depende de cuatro variables D, C, B, A, que representan un niimero binario, donde A es la variable menos significativa. La funcién F adopta el valor de uno si el nimero formado por las cuatro variables es infe- rior o igual a 7_y superior a 3. En caso contrario la funcién F es cero. * Obtenga la tabla de verdad de la funcién F y realice el programa corres pondiente en VHDL (utilice estructuras del tipo when-else y operadores légicos). Solucion Primero analizamos el enunciado y estructuramos la siguiente tabla de ver- dad segiin las especificaciones indicadas. DCBA F 0000 Oo ooo01 0 ooLo 0 ool 0 o100 1 o101 1 o11o0 41 o1iid 1 1000 0 1001 0 1010 0 1011 0 1100 0 1101 0 111 0 0 1ii1 0 A partir de la tabla anterior, se puede programar la funcién F utilizando de- claraciones condicionales when-else. El cédigo VHDL es el siguiente: Disefto légico combinacional mediante VHDL 65 i library ice; 2 use icce.std_logic_1164.al1; 3 entity funcion is port ( 4 D,C,B,A: im std_logic; 5 Fr owt std_togic); 6 end funcion; 7 architecture a_func of funcion is 8 begin 9 Fes "1 when (A = '0' and B= ‘0/ and C= ‘1’ and D = ‘0") else 10 "1) when (A = ‘1’ and B= ‘0’ and C = ‘1’ and D = '0") else nu "U) when (A = ‘0’ and B= ‘1’ and C = ‘1’ and D = ‘0’) else 2 ‘1r when (A = '1! and B= '1' and C= ‘1’ and D = ‘0’) else B “0' 14 end a_tunc; 3.1.2 Declaraciones concurrentes asignadas a sefiales En este tipo de declaracién encontraremos las funciones de salida mediante la ecuacién booleana que describe el comportamiento de cada una de las compuertas. Obsétvese que ahora el circuito de Ia figura 3.2 cuenta con tres salidas (x1, x2 y x3) en lugar de una. b xt J — [>H { )4 x3 Figura 3.2 Circuito l6gico realizado con compuertas, El programa correspondiente al circuito de la figura 3.2 se muestra en el lis- tado 3.2. library ieee; use icee.std_logic_1164.all; entity logic is port ( a,b,c,d,e,f: in std_logic; x1,x2,x3: owt std_logic); end logic; architecture booleana of logic is begin xl <= a mor b; x2 <= (((¢ and d)or(a 2mor b)) nand ((e or f)and(c and d))); x3 <= (© mor f) and (c and a); Listado 3.1 Declaraciones concurrentes asignadas a sefiales. 66 VHDL: Elarte de programar sistemas digicales Ejemplo 3.2 Dada la tabla de verdad mostrada a continuacién, halle las ecuaciones X, Y, Z, de la forma suma de productos y programelas en VHDL, utilizando decla- raciones concurrentes asignadas a sefiales. A B C|xX ¥ Z o o of 1 0 1 o o t}/ 1 1 0 o 1 of 0 o 1 o ro4y.ioo 48 1 0 of o 0 0 1 0 tlo 1 0 1 1 0] o 1 0 1 or tfi 0 0 Solucién Las ecuaciones de la forma suma de productos para X, Y y Z se muestran a continuacién: 1) X= ABC + ABC + ABC + ABC 2) Y= ABC + ABC + ABC 3) Z= ABC + ABC + ABC Obsérvese ahora la forma de implementar estas ecuaciones por medio de operadores légicos. 1 Library icce; 2 use icee.std_logic_1164.al1; 3 entity concurrente is port ( 4 A,B,C: in std_logic; 5 X,¥,2: out std_logic); 6 ena 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 2 and C) 10 or (not a and 8 and C } or (A and 5 and C}; u Y <= (not A and not B and C) or (A and not 5 and C) 2 or (A and 5 and not C); 2B Z <= (not A and not B and not C) or (not A and 8 and mot ©) 4 or (mot A and B and C); 15 end a_conc; Disefio légico combinacional mediante VHDL 67 3.1.3 Seleccién de una sefal (with-select-when) Ejemplo 3.3 La declaracién with-select-when se utiliza para asignar un valor a una sefial con base en el valor de otra sefial previamente seleccionada. Por ejemplo, en ellistado correspondiente a la figura 3.3 se muestra el cddigo que representa aeste tipo de declaracién. Como puede observarse, el valor de la salida C de- pende de las sefiales de entrada seleccionadas a(0) y a(1), de acuerdo con la tabla de verdad correspondiente a) al) | “Oo 0 ° 1 1 ° 1 1 Figura 3.3 Tabla de verdad. library ieee; use icce.std_logic_116d.all; entity circuito is port( fa: dn std_logic_vector (1 downto 0); 2 ut std_logic); end circuito; architecture aracir of circuito is begin with a select © <= ‘1 when “00", *0" when 01", “1 when “10”, +0’ when others?; end aracir: Listado 3.3 Cédigo VHDL correspondiente a la tabla de verdad de la figura 3.3, Se requiere disefiar un circuito combinacional que detecte nuimeros primos de 4 bits. Realice la tabla de verdad v elabore un programa que describa su funcién. Utilice instrucciones del tipo with ~ select ~ when. "EL uso de la palabra reservada others se explica a detalle en la seccién multiplexores de este captclo, 68 = VHDL: El arte de programar sistemas digitales Solucién La tabla de verdad que resuelve la funcién es la siguiente: a tas * 8 x | OF Hee ee HHH coco coos HH HH occ oH HHH ooo HH ooHHcoHHocoHHoco HoH onoro~o-o-oH~o econo o0o-o- oH Ho Si se considera que la entrada X es un vector de 4 bits y que F es la funcién de salida, el programa en VHDL quedarfa de la siguiente manera 1 library ices; 2 use icee.std_logic_1164.al1; 3 entity seleccion is port ( 4 X: dm std_logic_vector (0 to 3); 5 F: out std_logic); 6 end seleccion; 1) architecture a_selec of seleccion is 8 begin 8 with X select 10 F c= ‘1! when “o001", Fe “1 when “0010", a2 “1 when "0011", 13 "L' when "0101", 14 ‘Lt when "0111", 15 “1? when “1011 16 "1) when “1101” u ‘0’ when others 18 end a_selec; Disefio ligico combinacional mediante VHDL 69 {3.2 Programaci6n de estructuras basicas mediante declaraciones secuenciales Como ya se mencion6, las declaraciones secuenciales son aquellas en las que el orden que llevan puede tener un efecto significativo en la légica descrita. A diferencia de una declaracién concurrente, una secuencial debe ejecutar- se en el orden en que aparece y formar parte de un proceso (process). Declaracién if-then-else (si-entonces-si no). Esta declaracién sitve para seleccionar una condicién o condiciones basadas en el resultado de evaluaciones légicas (falso 0 verdadero). Por ejemplo, observemos que en la instruccién: if la condiciém es cierta then realiza la operacién 1; else realiza la operacién 2; end if si (i) condicion se evaltia como verdadera, entonces (then) la instruccién indica que se ejecutard la operacién 1. Por el contrario, si la condicién se evaliia como falsa (else) correrd la operacién 2. La instruccién que indica el fin de la declaraciGn es end if (fin del si). Un ejemplo que ilustra este tipo de declaracién se encuentra en la figura 2.6 y por comodidad se repite en la figura 3.4. By Comparador = Fc Figura 3.4 Comparador de igualdad de dos bits. El cédigo correspondiente a esta entidad de disefio se muestra en el listado 3.4 70 VHDL: El arte de programar sistemas digitales 1 -Bjemplo de declaracién de la entidad comparador 2 entity comp is 3 port (a,b: in bit_vector{ 1 downto 0); 4 cr out bit); 5 end comp; 6 architecture funcional of comp is 7 begin 8 compara: process (a,)} 3 begin 10 if'a = b then a eel; 2 else B e «2/0; uu end if; 15 end process compara; 16 end funcional; Listado 3.4 Declaracién secuencial de un comparador de igualdad de dos bits. Notemos cémo en este tipo de ejemplos sélo son necesarias dos condi- ciones por evaluar, pero no en todos los disefios es asf. Por tanto, cuando se requieren més condiciones de control, se utiliza una nueva estructura llama- da elsif (si no-si), la cual permite expandir y especificar prioridades dentro del proceso. La sintaxis para esta operacién es: if la condicion | se cumple then realiza operacién 1; elsif la condicién 2 se cumple then realiza operacién 2; else realiza operacion 3; end if; la cual se interpreta como sigue: Si (if) la condicién 1 es verdadera, entonces (then) se ejecuta la operacion 1, si no-si (elsif) se evaliia la condicicn 2 y si es verdadera entonces (then) se ejecuta la operacién 2, si no (else) se ejecuta la operacién 3. 3.2.1 Comparador de magnitud de 4 bits La forma de utilizar las declaraciones secuenciales se ilustra en el disefio de un comparador de dos ntimeros de 4 bits, figura 3.5a). En este caso el siste- ma tiene tres salidas que indican cuando uno de los ntimeros es mayor, igual Disefio I6gico combinacional mediante VHDL 71 6 menor que el otro. La figura 3.5b) representa el mismo comparador de ma- nera simplificada utilizando la notacién vectorial. a3 a2 at a0 b3 b2 bt bo [30] — a>b}—-y b{3:0] | 2 ial acb}—z 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 fun- cionamiento del comparador. En la linea 9 se muestra la lista sensitiva (a y b) del proceso (process). En las lineas 10 a 17 el proceso se desenvuelve mediante el andlisis de las variables de la lista sensitiva. Sin mucho esfuer- 20 puede verse que sia = b, entonces x toma el valor de 1, de forma similar se intuye el comportamiento para a > by a b) then yes ‘1s end if; end process; 19 end arq_comp4; Listado 3.5 Descripcidn del comparador de 4 bits utilizando el estilo funcional 72. VHDL: El arte de programar sistemas digitales Ejemplo 3.4 —_Diserie un comparador de dos ntimeros A y B, cada mimero formado por dos bits (AI AO) y (BI BO) la salida del comparador también es de dos bits y esta representada por la variable Z (Z1 ZO ) de tal forma que si: A = Bentonces Z = 11 A Bentonces Z = 10 La tabla de verdad correspondiente a este comparador es la siguiente. Al AO B1 BO] Z1ZO oo 0 ofi 1 oo oO 1fo 4 0 Oo 1 oO} oO] oo 1 ifjod o 1 0 o] 1 0 o 1 0 iti o 1 t ofo. o 1 t tfo. 1 0 0 of 1 0 1 0 0 1f1 0 1 0 1 oft t 10 1 ito. 1 1 0 of 1 0 1 1 0 if1 0 11 1 0f1 0 todouoafiad Las ecuaciones légicas reducidas mediante un mapa de Karnaugh para Z1 y 20 son las siguientes: Z1 = AO Al + BO Bi + Al BO + AO BO + AO BL Z0 = AO Al +BOB1 + AOBi1+ AQBO+ A1BO El circuito representativo de este comparador es el siguiente, figura E3.4. #0 —_5! Mo Bo Bi, Comparador i, Z0 Figura E3.4 Descripcidn funcional de un comparador de igualdad de dos bits. Diserio Idgico combinacional mediante VHDL 73 La programacién de este comparador se muestra en el siguiente listado. i library ieee; use icee.std_logic_1164.all; entity comp is port ( A,B: in std_logic_vector(1 downto 0); : out std_logic_vector (1 downto 0)); end comp; architecture a_comp of comp is begin process (A,B) begin Af R= 5 then Zee “11; elsif A < 5 then Z y >=) lo estan solo dentro del tipo escalar. En ambos casos debe considerarse que el tamafio de los vectores en que se aplicarén dichos operadores debe ser igual. En la tabla 3.1 se mues- tran estos operadores y su significado. Operador Significado Tgval Diferente < Menor < Menor o igual > Mayor > Mayor o igual ‘Tabla 3.1 Operadores relacionales. 74 VIKDL: El arce de programar sistemas digitales 3.2.2 Buffers tri-estado Los registros de tres estados (buffers tri-estado) tienen diversas aplicaciones, ya sea como salidas de sistemas (modo buffer) 0 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 eddigo que describe su funcionamiento. enable. Figura 3.6 Bufier tri-estado. library icce; use icee.std_logic_1164.all; entity tri_est is port ( enable, entrada: in std_logic; salida: out std_logic); end tri_est; architecture arg buffer of triest is begin process (enable, entrada) begin if enable = ‘0’ then salida <= '2'; else salida <= entrada; end if; end process end ara puffer; Listado 3.6 Descripci6n mediante valores de alta impedancia. El listado anterior se basa en un proceso, el cual se utiliza para describir los valores que tomaré la salida del registro (buffer). En este proceso se indi- ca que cuando se confirma el habilitador del circuito (enable), el valor que se Disefio légico combinacionat mediante VHDL_—75 encuentra a la entrada del circuito se asigna 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 disefio se prefiera utilizar el estdndar std_logic_1164 y no el tipo bit, ya que el primero es mas versstil al prover valores de alta impedancia y condicio- nes de no importa (-), los cuales no estén considerados en el tipo bit. 3.2.3 Multiplexores Los multiplexores se disefian describiendo su comportamiento mediante la declaracién with-select-when o ecuaciones booleanas. En la figura 3.7a) se observa que el multiplexor dual tiene como entrada de datos las variables a, b, ¢ y d, cada una de ellas representadas por dos bits (al, a0), (bl, bO), etc., las Iineas de seleccién (s) de dos bits (s1 y sO) y la It nea de salida 2 (21 y 20). En la figura 3.7b) se muestra un diagrama simplificado que resalta la re- presentacién mediante vectores de bits. a1 —foo b1 —jo1,, Mux ct —110 a it T= 21 alto) —foo 5 bit] —Jor MUX a 00. Mux [1:0] — 10 bo —jo1 ai) —Jin Lato) co —10 a 0 it ] | s{t:0} st 80 a) b) Figura 3.7 a) Multiplexor de 4 bits. b) Multiplexor con veetores. En el listado 3.7 se muestra la descripcién mediante with-select-when del multiplexor dual de 2 x 4. En este caso la sefial s determina cual de las cuatro sefiales se asigna a la salida z. Los valores de s estén dados como “00”, “OL” y “10”; el término others (otros) especifica cualquier combinacién adicional que pudiera presentarse (que incluye el “I1”), ya que esta variable se encuentra definida dentro del tipo std_logic_vector, el cual contiene nueve 76 VHDL: El arte de programar sistemas digitales valores posibles que la herramienta de sintesis? reconoce como tipos l6gicos estandares. Library ieee; use iece.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: out std_logic_vector(1downte 0); end mux; architecture aramuxd of mux is begin with s select 2 <= a when “00", b when “01", c when “10", @ when others; end aromuxd; Listado 3.7 Multiplexor descrito con declaraciones with-selectwhen. Tipos logicos estandares Las funciones esténdares definidas en el lenguaje VHDL se crearon para evitar que cada distribuidor de software introdujera sus paquetes y tipos de datos al lenguaje. Por esta raz6n el Instituto de Ingenieros Eléctricos y Electrénicos, IEEE, estableci6 desde 1987 los esténdares std_logic y std_logic_vector, que ya se vieron en un capitulo anterior. En cada uno de los estandares se definen ciertos tipos de datos conoci- dos como tipos ldgicos esténdares, los cuales se pueden utilizar haciendo refe- rencia al paquete que los contiene (en este caso std_logic_1164). En la tabla 3.2 se muestran los tipos logics estndares definidos en VHDL. 'U' | ~ Valor no inicializado ‘X’ | — Valor fuerte desconocido ‘0’ | - 0 Fuerte ‘V | — 1 Fuerte ‘Z' | = Alta impedancia WW" | = Valor débil desconocido ‘L | - Odebil ‘H’ | ~ 1débil No importa (don't care)): ‘Tabla 3.2. Tipos ligicos estsndares definidos en VHDL. 7 La herramienta de sintesis es el software incluido en VHDL, que genera ls ecuaciones de disefio de cualquier circuito. Esta herramienta permite implementar disefios sin el formato de ecuactones booleaneas que utlizan tras programas Disefto légico combinacional mediante VHDL 77 ‘Como se puede apreciar, estos tipos de datos no tienen un significado evi- dente para el disefiador, pero sf lo tienen en la compilacién del programa. Por ejemplo, el estandar no especifica alguna interpretacién de Ly H, debido a que la mayorfa de las herramientas no los soportan. Los valores metalégicos* (‘U', W", ‘X’, ) carecen de sentido en la sintesis, pero la herramienta los usa en Ia simulacin del cédigo. Como se mencioné en la seccién anterior, el uso de ‘2’ entrafia un valor de alta impedancia. 3.2.4 Descripcién de multiplexores mediante ecuaciones booleanas En el listado 3.8 se muestra una solucién con ecuaciones booleanas para el multiplexor dual de la figura 3.7. library ieee; use iece.std logic 1164.al1; entity mx is port ( a,b,¢,d: in std_logic_vector(1 downto 0); s in std_logic_vector (1 downto 0); zt out std_logic_vector(1 downto 0)); end mux; architecture arumux of mux is begin (1) <=(a(1) and not (s(1)) and not(s(0})) or (b(1) and not (s(1)} and s(0)) or (e(1) and s(1) and not(s(0))) or (a(1) and s(1) and s(0)); 2(0) <=(a(0) and not (s(1)) and not(s(0))) or (b(0) and not (s(1)) and s(0)) or (c(Q) and (1) and not(s(0))) or (a(0) and s(1) and s(0)); end aramux; Listado 3.8 Multiplexor descrito con ecuaciones booleanas. Un dato metalégico consiste en los valores definidos para el tipo std_logic. los cuales estén contenidos en el paquete estindar IEEE 1164, 78 VHDL: Elarte de programar sistemas digitales 3.2.5 Sumadores Disefio de un circuito medio sumador Para describir el funcionamiento de los circuitos sumadores es importante recordar las reglas basicas de la adicién. 0+0=0 Ofl=1 1+0=1 1+1=10 En el caso de la suma 1 + 1 = 10, el resultado “O” representa el va- lor de la suma, mientras que el “1” el valor del acarreo. Para observar en detalle el funcionamiento de un circuito medio suma- dor, considere la suma de los ntimeros A y B mostrados en la tabla 3.3 A_B| Suma Cout oo}lo o oii 10]1 0 11f}o0 1 (1#1=10) ‘Tabla 3.3 Tabla de verdad de un circuito sumador. La ecuacién légica que corresponde a la expresién Suma = AB + ABes la funcién légica or-exclusiva A ® B, mientras que la ecuacién légica del acarteo de salida es Cout = AB que corresponde a la compuerta Iogica and. La realizacién fisica de estas ecuaciones se muestra en la figura 3.8a, en ella se presenta el bloque légico del medio sumador (MS) y la figura 3.8 representa su implantacién mediante compuertas l6gicas. * E|—+ same Figura 3.8 a) Diagrama a bloques de un medio sumador; b) Medio sumador ligico, Disefio légico combinacional mediante VHDL 79) El programa en VHDL que representa este medio sumador se muestra en el listado 3.9, library ieee; use iece.std_logic_1164.all; entity msum is port ( A,B: in std_logic; SUMA, Cout: out std_logic); end msum; architecture an_sum of msum is begin SUMA <= A XOR B; Cout <= A AND B; end am_sum; Listado 3.9 Cédigo de un medio sumador Disefio 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 compor- tamiento de este sumador se describe a través de su tabla de verdad. ‘Suma|—__+ Cout | —_+ b) Listado 3.9 a) Sumador completo; b) Tabla de verdad del medio sumador, 80 VHDL: El arte de programar sistemas digitales | Las ecuaciones reducidas mediante un mapa de Karnaugh correspondien- tes a la salida Suma y Cout se muestran a continuacién A BCin+ AB Cin+ A BCin + ABCin AB +BCin + ACin Suma Cout Si se manipulan las ecuaciones anteriores mediante Algebra booleana obtenemos que la funcién de Suma y Cout puede expresarse como: Suma = A® B @Cin Cout = AB + (A ® B) Cin La realizaci6n fisica del circuito se basa en la utilizacién de compuertss or-exclusiva como se muestra en la figura 3.10 a). Como puede observarse en la figura 3.10 b), dos circuitos medio sumadores pueden implementar un sumador completo. 84 A408 cin jy >—— sua (A@B) Cin. Cout = AB +(A@B) Cin AB a) Circuito sumador completo implementado por compuertas. Medio sumador Medio sumador ——>la (AB) @ Cin uma ‘SumalA®)|q Suma|_A®E)@Cin_, si Cout lp Cout i B ———— Acarreo de Cin AE, salida Cout AB + (A@B)Cin b) Circuito sumador completo implementado por medio sumadores Figura 3.10. Circuitos sumadores, Disefto légico combinacional mediante VHDL 81 Laprogramacién en VHDL del sumador completo se presenta en el listado 3.10. library ieee; use ieee. std_logic_1164.al1; entity sum is port ( A,B,Cin: in std_logic; Suma, Cout: out std_logic); end sum; architecture a_sum of sum is begin Suma <= A xor B xor Cin; Cout <= (A and 8) or (A xor 8) and Cin; end a_sum; Listado 3.10 Sumador Completo. Sumador Paralelo de 4 bits Segtin lo anterios, para realizar un sumador paralelo de 4 bits s6lo se requie- re conectar en cascada un citcuito medio sumador y tres sumadores comple- tos como se muestra en la figura 3.11 0 —+| [+ so Figura 3.11 Sumador de 4 bits. 82 VHDL: Bl arte de programar sistemas digitales A su vez, éste es un buen ejemplo para reafirmar el manejo de sefiales (sg- nal). En la figura 3.11 se observa cémo los acarreos de salida (CO, 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 programacién en VHDL. Como puede apreciarse, el intervalo utilizado dentro de signal es (0 to 2), debido a que sdlo se rettoalimentan 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). library ieee; std_logic_1164.a11; entity suma is port ( A,B: in std_logic_vector (0 to 3); S: out std_logic_vector (0 to 3); cout: out std_logic); end suma; architecture arqsuma of suma is gnal C: std_logic_vector(0 to 2); begin S(O) <= A(0) xor Bi0); (0) <= A(0) and (0); S(1) <= (AG) B(1}) xr C(0); ca) <= (a) B(1}) of (C(0) and (A(1)xor B(1)))5 S12) <= (A(2) cla) <= (aa) S13) <= (AG) cout <= (AQ) B(2}) xox C(1); B(2}) or (C(1)and(A(2)xor B(2)))¢ B(3}) xox C(2); B(3}) or (C(2) and (A(3) xr B(3)))7 BHBHES end _argoumay Listado 3.11 Descripeién de un sumador de 4 bits Operadores aritméticos. Como su nombre indica, los operadores aritmé. ticos permiten realizar operaciones del tipo aritmético, como suma, resta, mul- tiplicacién, divisién, cambios de signo, valor absoluto y concatenacién. Estos operadores suelen usarse en el diserio légico para describir sumadores y resta- dores 0 en las operaciones de incremento y decremento de datos. En la tabla 3.4 se muestran los operadores aritméticos predefinidos en VHDL. Operador __Descripeién + Suma : Resta / Division * Multiplicacién ** Potencia ‘Tabla 3.4 Operadores aritméticos utilisados en VHDL. Disefio légico combinacional mediante VHDL 83. Como ejemplo, analicemos el disefio de un circuito sumador de 4 bits que no considera el acarreo de salida (listado 3.12). library ices; use iece.std_logic_1164.all; use work.std_arith.all; entity sum 4s port ( A,B: im std_logic_vector(0 to 3); Suma: out std_logic_vector(0 to 3)); end sum; architecture arqsum of sum is Listado 3.12 Descripcién 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 mencion6— se encuentra en la libreria de trabajo work. Este paquete permi- te el uso de los operadores aritméticos con operaciones realizadas entre arre- glos del tipo std_logic_vector; es decir, dado que dentro del paquete estandar (std_ogic_1164) no estan definidos los operadores aritméticos, es necesario usar el paquete std_arith. El uso de los operadores existentes en VHDL, asf como los tipos de da- tos para los cuales se encuentran definidos, se incluye en el apéndice B. 3.2.6 Decodificadores La programacién de circuitos decodificadores se basa en el uso de declaracio- nes que permiten establecer la relacisn entre un e6digo binario aplicado a las entradas del dispositivo y el nivel de salida obtenido. En esta seccién se presentan dos tipos de decodificadores: el decodifi- cador BCD-decimal y el decodificador de BCD a siete segmentos, ya que consideramos que son dos de los més utilizados en el disefio légico combi- nacional. Decodificador BCD a decimal En la figura 3.12 podemos observar la entidad de disefio correspondiente a un circuito decodificador, el cual converte eédigo BCD (cédigo de binario a de- cimal) en uno de los diez digitos decimales. Por lo general estos dispositivos 84 VHDL: El arte de programar sistemas digitales se conocen como decodificadores de 4a 10 lineas de entrada y 10 de salida, lineas, ya que contienen cuatro BoDIDEC OP— @ 1p— b Rp—c x0 14 3p—d x1_}2 4p—e xX2——] 4 Br Tt 3—l8 6p— 9 7hb—h Bp— i 9p— ji Figura 3.12 Decodificador de BCD a decimal. El programa que describe el comportamiento de la entidad de la figura 3.12 se encuentra en el listado 3.13. Como se puede apreciar, el cédigo correspondiente a este circuito se ba- sa en la ejecucidn de un proceso en que se establecen las condiciones que se evaltian para activar cada salida de acuerdo con el valor binario correspon diente. Para fines practicos se asigné a cada salida un nombre a fin de facili tar su identificacién. ‘A manera de ejemplo consideremos el valor de la entrada x = 0010, la cual corresponde al digito decimal 2. Nétese cémo Ia condicién que deter. mina la asignacién del valor evaltia primero la condicién de x y si la confir- ma, asigna a la salida c el valor correspondiente al digito decimal 2. Por otro lado, se puede ver que al inicio del proceso se declararon todas las salidas con un valor inicial de ‘I’, esto fue con el fin de asegurar que per- manecieran desactivadas cuando no estuvieran en evaluacién. —Decodificador de BCD a decimal library ieee; use icee.std_logic_1164.al1; entity deco is port ( x: in std_logic vector (3 downte 0); a,b.c,dre,f,9,h,i,j: owt std_logic); end deco; architecture arqdeco of deco is begin process (x) begin ace (1; bee 1; cme 1 aa 1G ‘Continua Diseioligico combinacional mediante VHDL__85 ere me elsif elsif elsif elsif elsif elsif elsif PEPPER E EE eleif end aradeco; Listado 3.13 Descripcién de un decodificador de BCD a decimal. Decodificador de BCD a display de siete segmentos En la figura 3.13a) se muestra un circuito decodificador, el cual acepta c6di- go BCD en sus entradas y proporciona salidas capaces de excitar un display de siete segmentos que indica el digito decimal seleccionado. En la figura 3.13b) se observa la distribucién de los segmentos dentro del display. Figura 3.13 a) Decodificador BCD a siete segmentos. b) Cont display de siete segmentos. 86 VHDL: El arte de programar sistemas digitales Como se puede apreciar, la entidad del decodificador cuenta con una en- trada llamada A, formada por cuatro bits (AQ, Al, A2, A3), y siete salidas (a,b, c,d, ¢, fg) activas en nivel bajo, las cuales corresponden a los segmen- tos del display. En la tabla 3.5 se indican los valores légicos de salida corres- pondientes a cada segmento. Cédigo BCD Segmento del display AO Al A2 A3 a bc de f g 0 000 0 0 0 0 0 o 1 o oo01 1 o0 O 2 Todo. oo10 o o 1 0 0 ft 0 oo1t o 0 0 O 1 1 0 o 100 1 0 0 1 1 0 0 o 1o0t o 1 0 O t 0 0 o 110 o 1 0 0 0 0 0 o rid o 0 O 1 tf 1 0 1000 o 0 0 0 0 0 0 1001 o 0 0 Oo 1 0 0 ‘Tabla 3.5. Valores l6gicos correspondientes a cada segmento del display. La funcién del programa cuyo cédigo se exhibe en el listado 3.14 utiliza declaraciones secuenciales del tipo case-when que, como se puede apreciar, ejecutan un conjunto de instrucciones basadas en el valor que pueda tomar una sefial. En nuestro ejemplo, se describe de qué manera se maneja el de- codificador de acuerdo con el valor que toma la sefial A. Para fines practicos se declararon todas las salidas como un solo vector de bits (identificado co- mo d); de esta forma se entiende que la salida a corresponde al valor dO, la b al valor dl, etc. Pot otro lado, la palabra reservada others, como ya se indi- 6, define los valores metalégicos que puede tomar en la sfntesis la salida d. Library ieee; use icee.std_logic_1164.al1; entity deco is port ( Ar dn std_logic_vector(3 downto 0); d: out std_logic_vector(6 downto 0)); end deco; architecture aradeco of deco is a Disefio I6gico combinacional mediante VHDL 87 process (A) begin case A is when 0000" => d when "0001" => d when "0010" => d when "0011" => 4 when "0100" => d when “0101" => d when “0110" => d when “O111" => 4 when “1000" => d when "1001" => 4 when others => d end case end process, end arqdeco; <= *0000001*; <= "1001111"; = "0010010" <= "0000110"; <= "1001100" <= "0100100"; 0100000"; 0001110"; <= "0000000"; 0000100"; qi"; Listado 3.14 Uso de declaraciones case-when. En la instruccién case-when podemos observar el uso de asignaciones do- bles (=> d <= ), las cuales permiten que una sefial adopte un determinado valor de acuerdo con el cumplimiento de una condicién especificada. Por ejemplo, en nuestro cédigo (listado 3.14) estas instrucciones se interpretan de la siguiente manera: cuando la sefial A sea “0000”, asigna a la sefial d el valor “0000001”; cuando A = “0001”, asigna ad el valor “1001111”, ete. Cabe men- cionar que en la simulacién del programa esta asignacién se realiza simulténea. 3.2.7 Codificadores En esta seccién se presenta la forma de programar un circuito codificador, el cual como se observa en la figura 3.14, posee 10 entradas (cada una correspon- diene a un digito decimal) y cuatro salidas para el c6digo binario de 4 bits BCD. Entrada Decimal a0. al a2. 23. ad 25. a6_| a7_| a8_| a9. HILL DECIBIN 0 1 2 +} ao 3 2 [dt salida 4 3{-02.8cD 5 ata 6 7c 8 9 Figura 3.14 Codificador de decimal a BCD. 88 VHDL: El arte de programar sistemas digitales EI programa que describe al circuito de la figura 3.14, se muestra en el listado 3.15. Como se puede ver, el puerto de entrada” a’” se declara como un vector para indicar la numeraci6n decimal del 0 al 9, mientras que la salida binaria se realiza a través del vector “d”. Asimismo, observe que la progra- macién se realizé utilizando declaraciones del tipo if-then-elsif. — Codificador de decimal a BCD library icee; use icee.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 argcodif of codif is begin Process (a) begin Tf a = 0 then d <= "0000"; elsif a = 1 then @ <= "0001"; elsif a - 2 then d <= *0010"; elsif a = 3 then dice "0011"; elsif a - 4 then d <= "0100"; elsif a = 5 then dice *0101"; elsif a - 6 then dice "0110"; elsif a = 7 then dice “0111"; elsif a = 8 then d <= "1000"; else @ <= "1001"; end if; end process; end argcodif; istado 3.15. Disefio de un codificador de decimal a binario, Disetio I6gico combinacional mediante VHDL___ 89. Ejercicios Declaraciones concurrentes 3 3.2 3.3 3.4 3.5 3.6 3.7 38 3.9 3.10 3.1 Mencione los tres tipos de declaraciones concurrentes en VHDL. Indique qué tipo de instrucciones se usan en las declaraciones condi- cionales asignadas a una sefial. Dé el orden de ejecucién de los operadores Iégicos en VHDL. En las siguientes expresiones proporcione la expresién equivalente en VHDL. a) X= (a+b) (cxord) | b) F=@@+c+d +(ardeo+ +b) ©) Z = (wexey) + (x xnor y) Mencione la principal diferencia entre las declaraciones secuenciales y las declaraciones concurrentes. Mencione qué tipo de instrucciones utilizan las declaraciones secuen- ciales. Indique qué instruccién se utiliza cuando se requieren més condicio- nes de evaluacién en un proceso. Mencione los operadores aritméticos que se utilizan en VHDL. Indique en cusl librerfa y en qué paquete se encuentran los operado- res de la pregunta 3.8. Un circuito comparador de 3 bits recibe dos ntimeros de 3 bits X = X2, XI, XO y Z = Z2, Z1, ZO. Disefie un programa en VHDL que produzca una salida F = 1 siy slo si X < Z. Elabore un programa en VHDL que describa el funcionamiento del circuito mostrado en la figura siguiente. [> FA : blo Pip LD» N Az v2 ela 2) a3 ¥3 TaBeexs|— Tle val a va ¥5|— a8 Mitel as v5 Th owl as Ye Ya|— 8 ar wr ry ve a) b) Multiplexores 3.14. Disefie un programa de un multiplexor de 1 bit con ocho entradas como el que se ilustra en la figura siguiente. Implemente el algoritmo con base en la tabla de verdad adjunta. EN CB A|Y ¥ | | | | t | | | 1 xX x xXfo 0 0 0 Of] BD EO EO £162 £3 E4 £5 E6 E7 o 0 0 1) EL EW ela 0 0 0 of B EY —|B - o 0 o 1] B ES — 1c EN vey o ft 1 0] EF EY | ? oot 1 1] Bs Bs o 1 1 0] 6 E6 o 1 i if] a) Multiplexor b) Tabla de verdad Diseito logico combinacional mediante VHDL 911 3.15. Disefie un programa en VHDL que produzca un decodificador bina- rio de 2 x 4 como un circuito demultiplexor de cuatro salidas y un bit. Considere las siguientes especificaciones en el disefo: a) El circuito debe tener dos sefiales para seleccionar una salida. b) El circuito sélo tendra una sefial de entrada. c) Implemente una sefial ENABLE para la habilitacién del circuito, 92 VHDL: El arte de programar sistemas digitales Bibliografia Floyd T. L: Fundamentos de Sistemas Digitales. Prentice Hall, 1998, Teres LL, Tortoja ¥., Oleoz S. y Villar E: VHDL Lenguaje Estdndar de Diserio Electronico. McGraw-Hill, 1998, Maxinez G. David, Alcala Jessica: Disefio de Sistemas Embebidos a través dl Lenguaje de Descripcion en Hardware VHDL. XIX Congteso Intemacio- nal Académico de Ingenieria Electronica. México, 197. Kloos C., Cerny E.: Hardware Description Language and their aplications. Spe- cification, modelling, verification and synthesis of microelectronic systems. Chapman & Hall, 1997. IEEE: The IEEE standard VHDL Language Reference Manual. IEEE-Std-1076- 1987,1988. Zainalabedin Navabi: Analysis and Modeling of Digital Systems, McGraw-Hil, 1988. Ashenden B J.: The Designer's guide to VHDL. Morgan Kauffman Publishers, Inc., 1995. Lipset R., Schaefer C.: VHDL Hardware Description and Design. Kluwer Academic Publishers, 1989, Mazor S., Langstraat P: A guide to VHDL. Kluwer Academic Publishers, 1993. Armstrong J.R. y Gail Gray F: Structured Design with VHDL. Prentice Hall, 1997. Skahill K.: VHDL for Programmable Logic. Addison Wesley, 1996. Bhasker J. A: A VHDL Primer. Prentice Hall, 1992. Randolph H.: Applications of VHDL to Circuit Design. Kluwer Academic Pu- blisher,

You might also like