Vamos a ver dos nuevas puertas lógicas la XOR y la NXOR. La XOR es una puerta cuyo símbolo veis aquí representado. Funciona de la siguiente manera. Cuando las dos entradas toman valores distintos la salida es uno y cuando las dos entradas toman valores iguales la salida es cero. A nivel de tabla de verdad, eh, lo tenemos aquí. Dice cuando las entradas son cero uno o uno cero, es decir, cuando son distintas entre sí la salida es uno y en caso contrario la salida es cero. A nivel de operador booleano la XOR se representa por un símbolo como este, que toma indistintamente los valores de XOR o de O exclusiva, esto son expresiones sinónimas que utilizaremos indistintamente una u otra. De manera que a O exclusiva b, esto lo podríamos obtener directamente de la tabla de verdad, es igual al producto a b barra más a barra b. La siguiente puerta lógica, la NXOR es similar a esta primera, pero como veis, este pequeño círculo de aquí nos está, nos está indicando que funciona justo al contrario. Es decir, cuando las entradas son iguales, cuando toman los valores cero cero o uno uno la salida es uno. Y cuando las entradas son distintas la salida es cero. Fijaros que esta salida es exactamente la anterior cambiando ceros por unos y unos por ceros. No existe un operador para, un operador lógico para esta operación, simplemente se representa como a O exclusiva b negada y otra vez desde la tabla de verdad podríamos sacar, obtener su expresión lógica que es a barra b barra más a por b. A diferencia de lo que pasaba con las puertas NAND y NOR, las puertas XOR y NXOR no son módulos universales. Es decir, utilizando solo puertas XOR no podemos construir cualquier función booleana. Y lo mismo ocurre con las puertas NXOR. La función XOR es asociativa, esto quiere decir que a O exclusiva b O exclusiva c es igual a a O exclusiva paréntesis b O exclusiva c y es igual a a O exclusiva b O exclusiva c sin necesidad de ningún paréntesis. A nivel de circuitos esto quiere decir que este circuito que vemos aquí que implementa esta primera expresión booleana es equivalente a este segundo circuito que implementa esta expresión booleana y es equivalente a una única puerta XOR de tres entradas. Esto nos permite definir, eh, la función de la puerta XOR de tres entradas y en general de una puerta XOR de n entradas. Aquí tenéis la tabla de verdad de una puerta XOR de tres entradas. Fijaros que tiene una propiedad, eh, muy curiosa y es que esta, eh, esta puerta toma el valor uno cuando, fijaros, el número de entradas igual a uno es un número impar. Aquí tenemos una entrada igual a uno, una entrada igual a uno, una y aquí tenemos tres entradas igual a uno. Es decir, en la puerta XOR la salida z toma el valor uno sí solo sí el número de unos que hay a la entrada es un número impar. Y además esta propiedad es generalizable, es decir, para una puerta XOR en general de n entradas también se cumple que su salida es uno sí solo sí el número de entradas igual a uno es un número impar. Las puertas NXOR no son asociativas, pero como una puerta NXOR de n entradas podemos implementarla con una puerta XOR de n entradas más un inversor, y como la XOR sí es asociativa, la puerta NXOR se puede implementar como un conjunto de puertas XOR de dos entradas más una última puerta NXOR también de dos entradas. La tabla de verdad de una puerta NXOR es esta que nos aparece aquí en rojo y, puesto que es la complementaria de, eh, la función XOR podemos decir que en el caso de una puerta NXOR la salida toma el valor uno sí solo sí el número de entradas, perdón el número de, eh, unos en las entradas es un número, en este caso par. Un comentario que vale la pena hacer aquí, las puertas lógicas NAND y NOR no son asociativas. Es decir, en este caso no es cierto que una puerta NAND de tres entradas se pueda implementar con dos puertas NAND de dos entradas como vemos aquí. ¿De acuerdo? Vamos a ver a continuación algunos ejemplos de, eh, utilización práctica de las puertas XOR y NXOR, y vamos a comenzar con un comparador de igualdad, eh. Dados dos números x e y de cuatro bits x tres, x dos, x uno, x cero, y tres, y dos, y uno, y cero queremos diseñar un circuito al que le entren el número x, el número y y nos saque una salida z que tome el valor uno sí solo sí x e y son iguales. Bueno, la manera de mirar si los dos números x e y son iguales simplemente consiste en ir mirando bit a bit que x cero e y cero coincidan, x uno e y sub uno coincidan, etcétera, como nos muestra este algoritmo, ¿vale? ¿Cómo podemos hacerlo? Pues recordar que dijimos que las puertas NXOR de dos entradas toman el valor uno sí solo sí las entradas son iguales. Es decir, en general si las entradas son a y b sí solo sí a es igual a b. Con lo cual, lo que podemos hacer es, eh, dibujar cuatro puertas NXOR ir entrando a la primera x0 e y0, la primera pareja a la segunda x1 e y1, etcétera. De forma que si x cero coincide con y sub cero aquí tendremos un uno. Si x uno coincide con y sub uno aquí tendremos un uno. Si x dos e y sub dos coinciden tendremos un uno y lo mismo con x tres e y sub tres. Si lo que queremos comprobar es que x cero coincide con y cero y x uno coincide con y uno, etcétera, etcétera, lo que podemos hacer es poner aquí una puerta AND que sabéis que la salida es uno sí solo sí todas sus entradas son uno. Es decir, sí solo sí se cumple que estos dos bits son iguales, estos dos son iguales, estos son iguales y estos también son iguales, eh. Con lo cual aquí you tenemos un comparador de igualdad para un número de cuatro bits. Y además fijaros que es perfectamente generalizable porque si los dos números x e y tuviesen cinco, eh, perdón, sí cinco bits pues simplemente yo pondría aquí una nueva puerta NXOR al que le entrara el x sub cuatro e y sub cuatro y esto entraría también a la puerta NAND. Y si yo tuviese, en general, eh, números de n bit pues aquí me entraría x n menos uno y n menos uno y su salida entraría a una puerta NAND. Como segundo ejemplo vamos a ver cómo utilizar XOR para generar los llamados bits de paridad. Y para esto evidentemente, lo primero que necesitamos saber es qué es esto de los bits de paridad. En comunicaciones un problema muy frecuente es el siguiente, tenemos un emisor que me está iniciando una información que recibe un cierto receptor y el problema es que es posible que entre medio se me introduzcan fallos. De manera que el receptor reciba una información que no sea la que el emisor le quería enviar. Existen distintos protocolos para intentar detectar estos fallos y uno de ellos, el más sencillo, es el llamado bit de paridad que consiste en lo siguiente. Dice vamos a imaginarnos que el emisor quiere emitir la información uno uno cero cero y hacérsela llegar al receptor. Pues lo que hace el emisor es mirar cuántos unos tiene el mensaje original y añadirle un cero o un uno de manera que el mensaje global que envíe el emisor siempre tenga un número par de unos. Esto sería un ejemplo de bit de paridad impar, eh perdón de bit de paridad par. Evidentemente podríamos definir protocolos de paridad impar. ¿Entendido? Es decir, en este caso el emisor vería que el mensaje original que quiere enviar tiene dos unos, que es un número par de unos, por lo tanto aquí le añadiría un cero y sería esto el cero uno uno cero cero lo que enviaría al receptor. El receptor al recibir el mensaje lo primero que hace es contar el número de unos y ver si es un número par. Y sabe que si el número de unos que recibe es impar es que el mensaje es erróneo. Si por ejemplo el emisor quisiese enviar un uno uno uno cero pues lo que haría es contar el número de unos, son tres. Es un número impar de unos, por lo tanto le añade un uno más para que globalmente el mensaje que envíe tenga cuatro unos, un número par de unos. Pues el objetivo sería diseñar un circuito que dado una información, pues en este caso la hemos puesto de ocho bits pero se puede generalizar a cualquier número de bits nos calcule, nos implemente directamente el bit que hemos de añadir antes de enviar el mensaje al bit de paridad que hemos dicho. Y esto es muy sencillo porque recordar que hemos dicho que una puerta OR exclusiva lo que hace es generar un valor de unos sí solo sí el número de unos en sus entradas es un número impar. Perfecto dice, pues esto es lo que queremos. Queremos una puerta OR exclusiva que me va a generar el bit de paridad donde cómo entrada tenga estas ocho entradas X0, X1, X2 hasta X7. Y you está, you tenemos esto you sería el circuito generador del bit de paridad par. El único problema es que en general en la biblioteca de celdas no vamos a tener puertas o XOR de ocho entrada o en general de n entradas, ¿no? De manera que el problema sería cómo construir esta puerta XOR a través de o mediante puertas XOR de dos entradas. Y esto también es muy sencillo porque lo que queremos conseguir la OR exclusiva de X7, X6, X5 hasta X0 y sabemos que, que esta operación es asociativa, es decir que yo puedo poner paréntesis aquí y decir X6, X7 esto es una puerta XOR a la cual entran X6, X7, esto es una puerta a la que entran X4, X5, X2, X3, X1, X0 y además puesto que es asociativa yo puedo poner paréntesis aquí y aquí y decir que este paréntesis lo implemento con esta puerta a la que entran X7 el resultado de X6 o XOR X7 que es este punto y el resultado de X4 OR exclusiva X5 que ese de aquí y por la misma razón la función global, la puerta que yo estoy tratando de construir consistirá en la XOR de estas dos salidas, es decir que siempre con un árbol de puertas XOR de dos entradas podemos construir una XOR de cualquier número de entradas y por lo tanto podemos construir un circuito generador de bit de paridad par. Y como último ejemplo vamos a ver cómo utilizando puertas XOR podemos simplificar un circuito que you diseñamos en su día capaz de sumar números de cuatro bits. Vimos en lecciones anteriores que este sumador de números de cuatro bits de podía construir utilizando cuatro módulos muy sencillos que llamábamos módulos sumadores de un bit y que les entraban el bit X sub i e Y sub i de los dos números a sumar, un acarreo nos generaba la suma y nos generaba un acarreo de salida. Vimos este circuito básico, el sumador de un bit se podía implementar con estas puertas lógicas y que las ecuaciones booleanas de C sub 0 y Z sub i eran estas que veis aquí. Pues vamos a manipular un poco algebraicamente estas operaciones. Aquí yo puedo sacar primero factor común del C sub i de estas dos expresiones y voy a sacar C sub i barra factor común de estas, de estos otros dos términos producto. Esto por definición es la OR exclusiva de x e y, y esto por definición es la OR exclusiva negada de x e y. Y fijaros que aquí tengo otra vez una variable multiplicado por algo negado más esta primera variable negada multiplicado por lo que teníamos antes pero sin negar, es decir esto es otra vez la definición de la OR exclusiva de C sub i con x OR exclusiva y, ¿vale? Primer resultado importante. Y ahora vamos a manipular C0, C sub 0 para ver cómo podemos simplificarlo. El C sub 0 voy a hacer lo siguiente. Primero a este primer término lo voy a multiplicar por x más x barra, esto lo puedo hacer porque sabes que x más x barra es uno, multiplicar por uno es dejar el término igual y el segundo término lo voy a multiplicar por y más y barra pues por la misma razón, ¿de acuerdo? Bien, voy a hacer estas operaciones. C sub i x más y C sub i x barra más x c sub i y más x c sub i y barra más xy. Recordar que en general a más a por b es igual a a, es lo que llamamos la ley de absorción. Y aquí tenemos un caso en el cual tenemos x por y, y aquí fijaros x por y por C sub i. Este término queda absorbido por el xy y exactamente lo mismo tenemos con este otro término xy por C sub i que queda absorbido por el xy. Y además lo que puedo hacer ahora es de estos dos términos sacar factor común C sub i con lo cual tendría C sub i por x barra y más xy barra más xy, y esto de nuevo la R exclusiva de x e y. ¿Vale? De manera que tenemos que el C0 es C sub i por x OR exclusiva y más x por y y además anteriormente habíamos definido, habíamos calculado que Z es igual a C sub i OR exclusiva x OR exclusiva Y. Dice pues ahora vamos a implementar el circuito utilizando estas dos ecuaciones. Dice fijaros, por un lado yo tendría las entradas x e y, aquí tendría el x OR exclusiva y, y aquí voy a hacer la OR exclusiva con C sub i de manera que esto es Z, es C sub i OR exclusiva x OR exclusiva y. Y para calcular C0 yo he de coger x OR exclusiva y que es este punto de aquí, lo he de multiplicar por C sub i que lo tengo aquí y luego he de multiplicar x por y, x por y, y sumar estos dos resultados, esto será C sub out. Es decir he conseguido implementar estas dos funciones utilizando uno, dos, tres, cuarto, cinco puertas lógicas en total. Aquí tenéis la comparación, la implementación utilizando las puertas XOR y la implementación que habíamos hecho originalmente que tenía pues tres y cuatro, siete, ocho, nueve puertas lógicas. Evidentemente utilizando puertas XOR se llega a un circuito mucho más sencillo. Y you si queréis verlo todo completo, dice pues el sumador para números de cuatro bits será coger este módulo, repetirlo uno, dos, tres, cuatro veces a la primera, al primer acarreo de entrada C sub i, este C sub i que normalmente será un valor igual a cero y aquí irán entrando X0 Y0, X1 Y1, este módulo calculará Z sub 0 y calculará el acarreo Z sub uno que entrará al siguiente, al siguiente módulo. Aquí calcularemos Z sub uno, aquí entrarán X2 Y2, calcularemos Z sub dos y conectaremos los acarreos, aquí entrarán X3 Y3, se calculará Z sub tres y el último resultado será el C sub out. Fijaros que sencillo nos ha quedado el sumador de números de cuatro bits. Bien, pues esto es todo en cuanto a ejemplos de uso de las puertas XOR y NXOR.