Celdas sumadoras de prefijos paralelos en Negabinary

14

Estoy intentando diseñar un sumador de prefijo paralelo para un sumador basado en negabinary. Negabinary es base \ $ - 2 \ $ en lugar del conocido binario base \ $ 2 \ $. Cada sumador de 1 bit genera una suma y dos acarreos (en lugar de uno en binario) que van al siguiente sumador.

Para hacer que el sumador sea más rápido, quiero usar una estructura de prefijo paralelo, como la estructura de Ladner-Fischer que se muestra a continuación. Estoy familiarizado con la funcionalidad de la celda púrpura en el sistema binario, pero no estoy seguro de cómo podría obtener la misma funcionalidad en el sistema negativo.

La razón por la que hago esto es solo por diversión, todavía no he encontrado ningún uso para negabinary.

Fórmulas para calcular la suma y los valores:

\ $ s_i = a_i \ oplus b_i \ oplus (c_i ^ + + c_i ^ -) \ $

\ $ c_ {i + 1} ^ + = \ overline {a_i} \ overline {b_i} \ overline {c_i ^ +} c_i ^ - \ $

\ $ c_ {i + 1} ^ - = a_ib_i \ overline {c_i ^ -} + a_i c_i ^ + \ overline {c_i ^ -} + b_i c_i ^ + \ overline {c_i ^ -} \ $

Ladner-fischer carry estructura de árbol:

Si algo no está claro, no dude en preguntar.

    
pregunta gilianzz

1 respuesta

1

Probablemente haya dedicado más tiempo a esta pregunta del que debería, pero aquí están mis conclusiones.

No puedo encontrar ningún ejemplo de un sumador de prefijo paralelo "puro" para números negativos. También creo que es un problema abierto, ya que no he visto ninguna prueba de que no sea posible

Lo más cercano que puedo conseguirte es mediante el uso de una adición negativa negativa de dos pasos (comúnmente abreviada n.n.b.a. en la literatura). Se basa en la siguiente propiedad:

Deje que \ $ f (x) = \ overline {x_ {n-1}} x_ {n-2} ... \ overline {x_1} x_0 \ $ y \ $ g (x) = x_ {n- 1} \ overline {x_ {n-2}} ... x_1 \ overline {x_0} \ $. Estas son básicamente una operación XOR con 0xAA...AA y 0x55...55 respectivamente. Entonces puedes probar que

$$ - (a + _ {nb} b) = g \ left (f (a) + f (b) + 1 \ right) $$

Donde el lado izquierdo es la suma negativa \ $ + _ {nb} \ $, mientras que el \ $ + \ $ en el lado derecho es una suma binaria normal.

La suma negativa puede entonces simplemente invertirse usando la misma propiedad pero con un operando cero:

$$ - x = g \ left (f (x) + f (0) + 1 \ right) $$

Entonces, para encontrar la suma usando sumadores de prefijos paralelos, puedes:

  1. Calcular \ $ f (a) \ $ y \ $ f (b) \ $, es decir. invirtiendo cada bit impar de los números negativos
  2. Calcule la suma binaria regular mientras establece el bit de acarreo para el LSB (el \ $ + 1 \ $), lo que lleva a una primera suma intermedia \ $ s_1 \ $.
  3. Invierta todos los bits de \ $ s_1 \ $ (esto es \ $ f (g (s_1)) \ $). Este es el final de la primera suma, mientras que también se inicia la inversión.
  4. Incremente el resultado con 0xAA...AB (\ $ = f (0) +1 \ $) usando un sumador de prefijo paralelo, obteniendo la segunda suma intermedia \ $ s_2 \ $
  5. Calcular \ $ g (s_2) \ $ (invirtiendo cada bit par) para encontrar la suma negativa final.

En realidad, traté de encontrar un sumador de prefijos paralelos "puro", pero lo consideré demasiado complejo para el tiempo que estaba dispuesto a dedicarle. He aquí por qué:

El punto central de los agregadores de prefijos paralelos es encontrar alguna operación de \ $ \ {0,1 \} ^ n \ times \ {0,1 \} ^ n \ rightarrow \ {0,1 \} ^ n \ $ que le permite calcular fácilmente los (en este caso 2) acarreos de estos bits. Como una restricción adicional, la operación debe ser asociativa para ser computada en paralelo. Por ejemplo, esto básicamente excluye cualquier operador NOT (que no es parte de una doble negación). Por ejemplo: \ $ a \ circ b = a \ cdot \ bar b \ $ no es un operador asociativo, porque

$$ \ begin {align} (a \ circ b) \ circ c & = a \ cdot \ bar b \ cdot \ bar c \\ a \ circ (b \ circ c) & = a \ cdot \ overline {b \ cdot \ bar c} \ end {align} $$

Tenga en cuenta que el operador booleano para los acarreos en su pregunta incluye los términos mixtos \ $ c_i ^ + \ overline {c_i ^ -} \ $ y \ $ c_i ^ - \ overline {c_i ^ +} \ $, por lo que imposible usarlo como está. Para un único acarreo en adición binaria normal, se hizo bastante obvio cómo construir este operador cuando se piensa en términos de generación y propagación , pero parece que no es así. obvio para los acarreos negativos.

    
respondido por el Sven B

Lea otras preguntas en las etiquetas