¿Cómo funciona el modo decimal en una ALU?

1

Tratando de envolver mi cabeza en torno a lo básico de cómo hacer una suma decimal en una ALU. Esto es lo que tengo hasta ahora.

Principalmente estoy mirando la arquitectura de la CPU MOS 6502. Tiene dos modos en los que puedes realizar operaciones sobre valores. El primero es el modo normal. Dale dos números hexadecimales y obtendrás un número hexadecimal. Ejemplo,

0x5 + 0x6 = 0xA

El segundo modo (modo decimal) tomará dos números hexadecimales (entre 0-9) y emitirá el resultado en hexadecimal PERO ajustado para que se vea como decimal. Ejemplo,

0x5 + 0x6 = 0x11

Así que volví a mi programación en Python para escribir una función simple para emular el modo. Básicamente, cada vez que tu número hexadecimal es divisible 0xA (10), sumas 6 al resultado.

def add(a, b):
    c = (a+b) + (((a+b)/10) * 6)
    return hex(c)

add(0b1111, 0b1111)
'0x30'

Entonces,

¿Cómo se hace esto usando lógica digital?

    
pregunta Jake Robinson

2 respuestas

5

No sé qué lógica utiliza exactamente el 6502, pero muchos micros tienen una instrucción de ajuste decimal que depende de tener las banderas carry y nibble carry disponibles. Se aplica después de una adición binaria de 8 bits.

La lógica funciona así:

Si hay un acarreo de nibble o si el LSD es > 9, agregue 0x06 ('o' el indicador de acarreo anterior al nuevo)

Si hay un carry o si el MSD es > 9, agregue 0x60 y establezca acarreo.

Entonces, si, por ejemplo:

si agrega 0x43 y 0x39 en binario, obtendrá 0x7C sin acarreo. Desde LSD > 9, agregue 0x06 para dar el resultado de 0x82 (sin acarreo), que es el correcto Resultado BCD empaquetado.

si agrega 0x49 y 0x49 en binario, obtendrá 0x92 con un acarreo de nibble Desde nibble carry, agregue 0x06 para dar el resultado de 0x92 (sin carry)

agrega 0x50 y 0x50 n binarios, obtienes 0xA0 sin acarreo Desde MSD > 9, agregue 0x60 para dar el resultado 00 con acarreo.

etc.

Ahora, si desea hacerlo en un solo paso, puede hacer fácilmente un sumador BCD para BCD empaquetado de dos dígitos combinando dos sumadores BCD de nibble con un acarreo entre ellos, como se ve aquí , que es solo la lógica que describí anteriormente, pero se extiende en lugar de secuencial.

Podrías agregar fácilmente algunas puertas AND al circuito anterior para convertirlo en modo dual (binario / decimal) como en el venerable 6502.

    
respondido por el Spehro Pefhany
1

Nibble por nibble. Como tal, no hay necesidad de dividir por 0xA, ya que cada suma de nibble puede ser menor que 0xA, o no menor que 0xA (en cuyo punto agregamos 6 antes de la siguiente etapa).

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas