Ir al contenido principal

Armado de circuitos combinatorios y circuitos equivalentes...

Anteriormente hicimos una introducción a los circuitos combinatorios donde explicamos las compuertas lógicas y sus respectivas tablas de verdad. En este post aplicaremos todo lo aprendido para armar circuitos combinatorios.

Expresiones booleanas y circuitos combinatorios: 

Dada una expresión booleana, podemos encontrar un circuito combinatorio que la represente y viceversa.

Por ejemplo: Si tenemos la expresión:  (x' + y) . z

Tendremos un circuito con tres entradas (x, y, z) e iremos agregando los conectores lógicosEn esta expresión: NOT , OR y AND correspondientes a los operadores En esta expresión: El unario " ' " y los binarios "+" y "." de la expresión booleana.

Donde S es la salida de nuestro circuito que depende de los valores de las variables de entrada (0 y 1) y que será la misma que obtenemos en la tabla de verdad de nuestra expresión booleana inicial.



Circuitos equivalentes:


Estos circuitos se basan, como ya dijimos, en el álgebra de Boole , por lo que responden a las leyes correspondientes de la misma. Si aplicamos las leyes de equivalencia que empezamos a ver desde lógica proposicional podemos obtener lo que llamaremos circuitos equivalentes , es decir circuitos que utilizarán diferentes compuertas pero que, en definitiva, devolverán la misma salida S para los mismos valores de entrada.


En el ejemplo anterior, si aplicamos la ley distributiva obtendremos la expresión: (z . x') + (z . y) .

Si se fijan, aquí decidimos colocar z en segundo lugar para que no haya líneas que se crucen en estos primeros circuitos y puedan entenderlo mejor; hacer esto no modifica las entradas ni la solución.




Antes dijimos que éste es un circuito equivalente al anterior, probemos eso a través de tablas de verdad:


Analizamos la tabla de verdad de la expresión que dio lugar al primer circuito del ejemplo.

Ya que ahora tenemos 3 entradas, todas las diferentes combinaciones posibles serán la cantidad de binarios distintos que se pueden formar con 3 bits, en este caso 8 combinaciones (Desde 000 hasta 111).







Si ahora hacemos lo mismo con la expresión booleana que representa al segundo circuito y comparamos la solución con la obtenida en la tabla de verdad anterior vemos que, efectivamente, las soluciones son iguales para las mismas entradas, por lo que los circuitos son equivalentes.







Hasta aquí llegamos en esta entrada, espero que los conceptos quedaran claros. En el próximo post continuaremos con este tema de armar circuitos combinatorios y daremos algunos tips Recomendaciones, claves. para facilitar un poco este trabajo.


Comentarios

  1. PARA LA SIGUIENTE TABLA CUAL SERIA LA COMPUERTA LOGICA?
    X Y Z
    0 0 0
    0 1 1
    1 0 0
    1 1 1

    ResponderEliminar
    Respuestas
    1. Hola anónimo, no me queda clara tu consulta ya que hay 3 entradas y sólo 4 combinaciones posibles cuando deberían ser 2^3 es decir 8 en este caso. Y habría que saber a qué resultado querés llegar para armar la expresión booleana correspondiente y expresarla en el circuito con las compuertas lógicas adecuadas.

      En el caso que tus entradas sean X e Y y que Z no sea una entrada sino el resultado que querés obtener entonces una posible expresión que se me ocurre que devuelve el resultado Z es (X'.Y) + Y con lo que obtendríamos la tabla que pasaste:

      X Y |(X'.Y)+ Y
      0 0 | 0
      0 1 | 1
      1 0 | 0
      1 1 | 1

      Y el circuito se arma con tres compuertas, una not, una and y una or.

      Espero que esto resuelva tu duda, si lo que quisiste preguntar era algo diferente no dudes en plantearlo nuevamente así podamos ayudarte.

      Eliminar
  2. ok gracias si la z es el resultado pero el acomodo de las compuertas serian como?

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

C: Conversiones de tipo (casting) en C...

El casting o simplemente cast  nos permite hacer una conversión explícita de un tipo de dato a otro, a criterio del programador siempre y cuando estos tipos sean compatibles. Este cast se realiza a través de un operador de conversión de tipos (type casting operator) y es un recurso a tener en cuenta ya que hay situaciones en que nos puede resultar de gran utilidad. Hacer uso de un cast es tan sencillo como poner (tipo de dato)  delante de la expresión o variable a convertir. Veamos un ejemplo: Declaramos una variable de tipo int con un identificador tan creativo como "a" y le realizamos diferentes cast a a para mostrarlo como si fuera un float, un double y un char en un printf. Lo que obtendríamos en pantalla sería lo siguiente: Donde tenemos el valor de nuestro a, a convertido en float y double (mostrándolo con 3 cifras decimales) y a convertido en char. Si vemos este último caso, al hacer la conversión de "a" a char toma a como el código ascii de

C: Ejemplos: Congruencia de Zeller (nivel básico) ...

La Congruencia de Zeller es un algoritmo que se atribuye al matemático alemán Julius Christian Johannes Zeller que vivió en el siglo XIX. Este algoritmo nos permite determinar el día de la semana que le corresponde a una fecha determinada del calendario Gregoriano. La fórmula que nosotros usaremos (con algunas modificaciones respecto de la original para poder usarla en  informática) es la siguiente: Donde h es el día de la semana (entre 0 y 6), J es año/100 (la centuria) y K es año mod 100 (el año de la centuria). Y hay que tener en cuenta que los meses de enero y febrero cuentan como el mes 13 y 14 del año anterior. Ahora que tenemos la fórmula, programemos el algoritmo en C mediante el uso de una función: Analicemos el código paso a paso: Tenemos en cuenta el caso de enero y febrero: Dijimos que estos meses corresponden a los meses 13 y 14 del año anterior por lo que los asignamos como corresponde (mes + 12 , que dará 13 para enero y 14 para febrero) y le rest

Algoritmos: Resolución de problemas y refinamientos en pseudocódigo...

En otras entradas, vimos las partes que debe tener nuestro algoritmo en pseudocódigo y las estructuras que utilizaremos para resolverlo. Ahora llega el turno de implementar todo en conjunto para dar origen a nuestra creación. Pero ¿cómo resolvemos un problema así? Para hacerlo, utilizaremos lo que llamamos refinamientos sucesivos. Este concepto consiste en dividir el problema en subproblemas más pequeños y a estos, a su vez, en otros más pequeños; y así sucesivamente hasta que la solución de los últimos sea trivial, sencillo de resolver. Luego usaremos todas las soluciones obtenidas para armar la solución de nuestro problema mayor. Este principio, tiene base en parte de la técnica divide and conquer (dependiendo de la traducción: "divide y vencerás") que es una de las muchas técnicas de resolución de algoritmos existentes. Como vemos, al dividir el problema en otros más pequeños y más fáciles de resolver, podemos pasar de un problema complicado a uno cuya solución es much