Módulo de adición 26 en lógica digital

1

Tengo dos señales de 5 bits, cada una con un valor comprendido entre 0 y 25. Me gustaría sumarlas y obtener otro valor de 5 bits entre 0 y 25, simplemente tomando sum % 26 .

La mejor solución que tengo hasta ahora es sumarlas para obtener una suma de 6 bits S , luego calcular también S-26 y seleccionar entre los dos en función de la salida de un comparador para verificar si S > 25 . Esto requiere bastantes partes para crear (4 sumadores de 4 bits, 2 comparadores de 4 bits, mux de 5 bits) y se siente un poco torpe.

Sé que podría hacerlo con una rom simple o micro muy fácil, pero soy un poco masoquista para diseños creados a partir de 74xx y chips similares solamente. ¿Hay una solución más elegante para este problema que me falta?

    
pregunta captncraig

2 respuestas

6

Debería poder hacerlo con tres sumadores de 4 bits, un mux de 4 bits, 2 entradas y una puerta OR:

Use dos de los sumadores para formar la suma de 6 bits de los dos números originales. Si se establece el MSB (bit 5) de esta suma, sabe que necesita restar 26 del resultado.

Aquí está el truco: hacer una operación %26 en un número no afectará al LSB (bit 0), por lo que el LSB de la suma formada anteriormente es el LSB del resultado final.

Use el tercer sumador para agregar la constante 0011 (el valor decimal 6, con el LSB eliminado también) a los bits 4: 1 de la primera suma. Si se establece el rendimiento de este sumador, entonces la suma original fue de 26 o mayor, y debe restar 26 de él. ¡Este es el resultado de este sumador!

O juntos los bits de acarreo de los dos sumadores y usa su salida para controlar el mux. El mux seleccionará los bits 4: 1 de la primera suma si la puerta OR es baja, o los bits 3: 0 de la segunda suma si la puerta OR es alta, para convertirse en los bits 4: 1 del resultado final.

Espero que eso quede claro; Si necesita un diagrama, hágamelo saber.

    
respondido por el Dave Tweed
1

Aquí hay un método que usa menos recursos que la primera respuesta .

Sean [x4..x0] y [y4..y0] las entradas, [z4..z0] = ([x4..x0] + [y4..y0])% 26 la salida deseada. Para simplificar, asimilo el vector de bits [x4..x0] y el entero que representa, en binario, MSbit primero.

Construye z0 = x0 ^ y0.

Construye u0 = x0 & y0. Tenemos [z4..z1] = ([x4..x1] + [y4..y1] + u0)% 13.

Genere [v4..v0] = [x4..x1] + [y4..y1] + u0, usando un sumador de 4 bits con entrada y salida de acarreo. Tenemos [v4..v0] < 26, y [z4..z1] = [v4..v0]% 13.

Genere w0 = v4 | (v3 & v2 & (v1 | v0)). Es 0 iff [v4..v0] < 13, 1 de lo contrario. Sea w1 = w0 (sin costo), ahora [w1..w0] es 0 iff [v4..v0] < 13, 3 de lo contrario. Por lo tanto, tenemos [z4..z1] = ([v4..v1] + [w1..w0])% 16 !!

Genere [z4..z1] = ([v4..v1] + [w1..w0])% 16, usando un sumador de 4 bits. La entrada de acarreo y los dos bits de orden superior de una entrada están conectados a tierra, los dos bits de orden inferior están unidos para ser v4 | (v3 & v2 & (v1 | v0)).

Circuito utilizado: el 74HC83 en la foto de abajo; 3 Y, 2 O, 1 XOR. Esos son otros tres IC comunes de 14 pines, que dejan 6 puertas de 2 entradas sin usar.

Diagrama lógico de 74HC83 (sumador binario de 4 bits con transporte rápido)

    
respondido por el fgrieu

Lea otras preguntas en las etiquetas