Circuito booleano: 4 bits divisibles por 3

Necesito dibujar un circuito tomando un número en 4 bits que devolverá 1 solo si ese número es divisible por 3.

Mis pasos iniciales fueron dibujar una tabla de verdad de la que obtuve una expresión booleana que no se puede simplificar. Luego dibujé un Mapa de Karnaugh, mismo resultado. Parece que tal expresión booleana sería realmente molesta de dibujar tal como está, estoy bastante seguro de que es una forma más fácil.

Mi segundo pensamiento fue usar 4 "sumador de 1 bit" en serie, generando las sumas alternas; la última suma debe ser 0 para ser divisible por 3. ¿Cómo funcionaría eso exactamente? ¿Tendría que llevar el resultado de la suma aunque sea bastante irrelevante para todo el circuito?

Esta es una pregunta interesante ya que quizás yo tampoco sepa la respuesta. Sin embargo, podemos tratar de pensar en esto, en primer lugar, desde la perspectiva del software porque, al final del día, todo el software finalmente conduce a puertas lógicas y 1 y 0. Sé que para el software existe una operación matemática llamada módulo , donde tomas el valor y encuentras el resto. Entonces, por ejemplo, 6 mod 3 = 0 porque si divides 6 entre 3, obtienes 2 pero no hay resto. Pero 5 mod 3 sería 2 porque sobran dos. Por lo tanto, si dice "NÚMERO mod 3 = 0", significa que el número es divisible por 3.
Lo que quiero decir con esto es que sería bueno si pudieras investigar cómo implementar el módulo en el diseño lógico y ver cómo se hace. Lo sé, con la resta binaria, requiere un sumador binario (¡lo que parece contradictorio pero es cierto!)
Parece que tal expresión booleana sería realmente molesta de dibujar tal como está, estoy bastante seguro de que es una forma más fácil. - No. Los circuitos están implementando funciones. Si no puede obtener una función más simple, no obtendrá un circuito más simple.
¿Puedes usar un MUX? Entonces la pregunta es trivial.

Respuestas (5)

Enfoque general para metro pedacitos

La solución general para una prueba de división por 3 es sumar los bits pares y sumar por separado los bits impares, tomar la diferencia entre estas sumas y luego ver si la diferencia misma es divisible por 3. (Hay Hay una variedad de enfoques para esta operación, pero el primero que se encuentra generalmente es a través de sumadores de acarreo y guardado).

Para un valor binario con metro pedacitos, donde metro es par, la diferencia requerirá como máximo en 2 metro 2 pedacitos Para un valor binario con metro pedacitos, donde metro es impar, la diferencia requerirá como máximo en 2 metro + 1 2 pedacitos Este resultado de diferencia podría enviarse a un nivel mucho más pequeño para, una vez más, calcular la diferencia entre las sumas de bits pares e impares. (Y repetir.)


Caso específico donde metro = 4

En este punto, es bastante fácil ver que las sumas pares e impares se pueden calcular utilizando un medio sumador simple, cada uno. La tabla resultante es:

C extraño ¯ S extraño ¯ C extraño ¯ S extraño C extraño S extraño ¯ C incluso ¯ S incluso ¯ Y norte norte C incluso ¯ S incluso norte Y norte C incluso S incluso ¯ norte norte Y

En este caso, no hay necesidad de preocuparse por la "divisibilidad por 3" de la diferencia. En cambio, es suficiente comparar las dos sumas para "iguales", como se muestra en la tabla anterior.

Esto debería ser muy fácil de implementar:

esquemático

simular este circuito : esquema creado con CircuitLab

Las medias sumadoras se reconocen fácilmente arriba. Además, sus salidas asociadas se comparan directamente mediante un par de XOR. Los resultados de estas dos comparaciones luego se consideran utilizando un NOR para el resultado final.

Solo para eliminar una posible confusión que uno podría tener, esta solución es equivalente a la que se obtiene utilizando el enfoque directo a través de la tabla de verdad y el álgebra booleana. Se puede derivar de la misma tabla de verdad y fórmula realizando cierta transformación para obtener las operaciones XOR y NOR.
Buena expansión de mi idea. Me alegra ver que esto resultó en una respuesta mucho más eficiente que los métodos de fuerza bruta.
@ bxk21 Como dije en mi comentario anterior, no es más eficiente. Es lo mismo.
@EugeneSh. Esto fluye desde una generalización muy poderosa hacia una implementación que se entiende fácilmente en un caso específico aquí. Creo que cualquier matemático entendería bien las palabras de "fuerza bruta" utilizadas por bxk21. Se puede usar un mux de entrada infinita para resolver muchos problemas. Por supuesto. Pero no proporciona información sobre esos problemas. Creo que eso es todo lo que significaba bxk21. Su solución no dice nada sobre la comprensión de casos más amplios de este tipo de problema. (No es que tuviera que hacerlo).
@jonk Estoy de acuerdo en que es un método de pensamiento más eficiente , sí, pero no de implementación.
@EugeneSh. Cómo pensar y hacerlo mejor sobre el mundo que nos rodea es prácticamente todo lo que es importante para un científico. Diferencia a nuestros mejores pensadores de nuestros peores pensadores. Es por eso que leemos directamente de personas como Einstein. No porque Einstein siempre tenga razón. En realidad, está mayormente equivocado acerca de las cosas. Pero debido a que tales personas han desarrollado herramientas de pensamiento de las que debemos aprender. Quizás esta página de respuestas ilustre una diferencia entre cómo los científicos piensan sobre los problemas y cómo los ingenieros a veces piensan sobre ellos. Los ingenieros implementan .
@jonk Estoy totalmente de acuerdo contigo. Pero nuevamente, mi comentario está tratando principalmente de abordar la conclusión incorrecta que el OP podría sacar de aquí: que esta solución es un truco/magia que les permitirá hacer cosas que los métodos regulares no hacen. Proviene de OP "Parece que tal expresión booleana sería realmente molesta de dibujar tal como está, estoy bastante seguro de que es una forma más fácil"
@EugeneSh. Lo dejaré aquí, creo. Tenemos una gran discusión que se ha desarrollado sobre esta pregunta, que ha demostrado ser más interesante de lo que esperaba. Si estuviera de vuelta en la universidad dando clases de nuevo, probablemente tomaría lo que se tramita aquí y vería si pudiera moldearlo lo suficientemente bien como para incluirlo como una parte muy pequeña de una experiencia en el aula. Creo que mejoraría esa experiencia más de lo que hubiera imaginado, a primera vista.
No sé cómo pude haberme perdido el patrón, pero esa es una muy buena respuesta. ¿Se pregunta si esta es la forma en que se implementa una operación de módulo en un FPGA?
@EugeneSh. Entiendo tu punto. De hecho, si bien entiendo el proceso, el enfoque general me parece que proviene de algún lugar mágico (tal vez una mejor formación en matemáticas o la capacidad de ver patrones en la electrónica que no tengo, vengo de una formación en informática).
@EugeneSh. Si ayuda, solo dije "Eficiente" porque la primera respuesta publicada hablaba sobre la cantidad de puertas. Supuse que era una medida de eficiencia. (al menos en términos de energía/tamaño, si no de velocidad. Aunque puedo estar equivocado).
@InTheMoodForNow No es en absoluto "viniendo de un lugar mágico". Las matemáticas son prosaicas y fáciles de entender cuando uno se toma unos momentos para considerarlas. ¿Preferirías que agregue un breve tutorial sobre aritmética de módulo? (No requeriría mucha adición). @ bxk21 ya hizo la mayor parte del trabajo, pero puedo proporcionar quizás una exposición un poco mejor, si es necesario.

Las otras respuestas son simplemente forzar la respuesta al escribir todos los casos verdaderos. Se volverá mucho más complejo cuanto más bits agregue (aproximadamente se duplica la cantidad de casos cada bit).

Alternativamente, podría pensar en ello como un ciclo de módulo

0->1->2->0

El primer bit, si es verdadero, suma 1, por lo tanto, lo mueve a la derecha 1

El segundo suma 2. (+2 / -1)

Continuando con esto, tienes

|bit|num|mod|
| 1 | 1 |+1 |
| 2 | 2 |-1 |
| 3 | 4 |+1 |
| 4 | 8 |-1 |

Entonces, tienes la respuesta como

A-B+C-D=0

o

A+C=B+D

Esta solución es mucho más fácil de expandir a una cantidad arbitraria de bits de entrada.

No es mi experiencia, así que realmente no sé cómo escribir mi respuesta como una expresión booleana. Si alguien quiere editarlo, siéntase libre.
No veo lo que estás proponiendo. ¿Es un circuito secuencial?
Supongo que no es realmente una respuesta completa en este momento. Solo estoy acortando la lógica a un control muy simple:A+C=B+D
Eso es en realidad una observación interesante. ¿Te importa si escribo otra respuesta basada en eso? Actualización: en realidad no lo haré... es más complicado de lo que pensé inicialmente
@EugeneSh. Bueno, si solo está completando el final de mi pensamiento, preferiría que lo agregaras. Si está usando la idea del módulo y va por otra ruta, seguro.
No, planeé ponerlo como circuito, pero no lo haré porque no veo un beneficio en términos de implementación. Pero la observación es interesante, eso sí, si uno quiere usar sumadores
@ bxk21 Gran observación. Se generaliza de la siguiente manera: "Si el número de bits pares menos el número de bits impares es un múltiplo de tres, entonces el número es divisible por tres".
@jonk En realidad lo estaba generalizando como "igual a 0", pero ahora veo que no funcionaría para más bits de entrada. Gracias.
@ bxk21 Creo que escribiré una solución para el caso específico (no general) aquí. Es bastante simple en la forma de unas pocas puertas lógicas. A menos que quieras hacerlo. ¿Tú?
@jonk Sí, adelante.

Su función se puede escribir fácilmente como una notación de suma de productos:

F ( A , B , C , D ) = Σ ( 0 , 3 , 6 , 9 , 12 , 15 )

Tal representación se convierte trivialmente en una implementación MUX, que supongo que puede usar (como menciona el uso de sumadores). Simplemente conecte todas las entradas correspondientes a los números enumerados a lógico 1y las otras a 0:

esquemático

simular este circuito : esquema creado con CircuitLab

No se me ocurre nada más que la expresión booleana

A ¯ B ¯ C ¯ D ¯ + A B C ¯ D ¯ + A ¯ B C D ¯ + A ¯ B ¯ C D + A B ¯ C ¯ D + A B C D

Esta implementación requiere 12 AND, 6 NAND y 5 OR Gates. No creas que es demasiado complicado de construir. Lo bueno es que se escala linealmente con el tamaño de entrada, ya que en el caso del módulo 3 puede calcularlo por bytes. Entonces, para un número de 8 bits, necesitaría el doble de puertas, aunque su rango de entrada se haya multiplicado por 16.

Esto pierde dos valores: 0x0 y 0xC
... ¡gracias por eso! ... 0xC estaba allí
Me gusta este resumen porque está cerca de mis resultados iniciales y sería la solución más coherente para dar en este momento de mi entrenamiento. Sin embargo, ¿cómo harías para diseñar tal? Traté de dibujar eso pero no estoy seguro de cómo optimizar el dibujo, ¿hay algún buen recurso del que pueda leer?
@Humpawumpa debería haberte etiquetado aquí
Para mí, la implementación sugerida por jonk parece ser mucho más práctica que la mía. Pero si desea implementarlo de esa manera, depende del tamaño de sus puertas lógicas. Suponiendo que tiene compuertas de 2 entradas, simplemente combínelas por pares, por ejemplo, si comienza desde la izquierda, sería A y B a NAND y C y D a NAND y las dos salidas combinadas con AND.

La implementación de un número de 4 bits divisible por 3 es bastante simple. Encontré una forma directa como se muestra en la imagen:ingrese la descripción de la imagen aquí

Usé 2 puertas XOR y 1 puerta XNOR.

Hola, deberías tratar de explicar dónde está MSB (bit más significativo) y LSB (bit menos significativo). Si coloca MSB y LSB en los pines superior e inferior y viceversa, su circuito no funcionará, ya que generará una salida 1 para una entrada "0101", que es 5. Eso sería un disparador falso.
Este circuito entrega alto para 8 de los 16 patrones de entrada posibles, pero solo hay 6 números divisibles por 3. Por lo tanto, no hay una asignación de entrada posible que pueda resolver el trabajo.