¿Cómo se implementa el entero máximo sin signo en el hardware?

10

Estoy trabajando en un diseño que involucra muchas funciones máximas (y funciones máximas como argumentos para otras funciones máximas).

En un esfuerzo por simplificar el diseño del hardware, me preguntaba cómo se implementa max en el hardware.

Matemáticamente, Max (a, b) se puede representar como [(a + b) + abs (b - a)] / 2.

¿Es así como se implementa en hardware? (es decir, en etapas; adición, división de desplazamiento de bits, etc.)

Si es así, ¿cómo se calcula el absoluto de la diferencia?

James
fuente

Respuestas:

10

Un enfoque muy simple sería implementar (a> b)? A: b. a> b se puede implementar comenzando por la izquierda y verificando cada par de bits de (a, b):

  • ambos 0 o ambos 1: continúe al siguiente par inferior
  • a es 1: a es el más alto; b es 1: b es más alto

Cuando sepa cuál es el más alto, puede seleccionarlo con un 2N-> N mux.

Con algunos trucos inteligentes, la verificación de los pares de bits se puede combinar con el silenciador para el mismo par de bits.

Wouter van Ooijen
fuente
2

Veamos el algoritmo en la pregunta:

[(a + b) + abs(b - a)]/2

Esto tiene una suma y resta etapas que luego se alimentan a una segunda etapa de adición. La división entre 2 es trivial en hardware, se puede hacer quitando el LSB. Sin embargo, el sumador / sustractor completo de dos etapas es bastante lento e intensivo, especialmente si está en cascada múltiples capacidades como lo es usted.

Partiendo de la respuesta de Wouter van Ooijen, la estructura generalizada es un comparador digital que alimenta la señal seleccionada de un mux:

esquemático

simular este circuito : esquema creado con CircuitLab

El esquema anterior es para:

(A > B) ? A : B

pero tenga en cuenta que se puede reconfigurar fácilmente para cualquier comparación entre las dos entradas haciendo diferentes conexiones lógicas entre las salidas del comparador y la selección de mux.

Entonces, si sabemos cómo formular las tres salidas del comparador, podemos implementar cualquier comparación en hardware. La lógica del comparador está bien descrita aquí . Para optimizar el hardware, simplemente eliminaríamos la lógica que impulsa las salidas del comparador no utilizadas.

Pero al final, si va al hardware, tiene que pasar por la síntesis. Por lo tanto, no debe obsesionarse sobre qué esquema de nivel de puerta es óptimo. En su lugar, optimice su código y algoritmos para que al menos no obligue al sintetizador a producir un resultado ineficiente. "Con algunos trucos inteligentes, la comprobación de los pares de bits se puede combinar con el silenciador para el mismo par de bits", y la forma más fácil de realizar esta optimización es con síntesis.

Travisbartley
fuente
1

Si realmente desea construir un circuito especializado para calcular el máximo, puede comenzar con un bloque básico con las siguientes ecuaciones:

Ei,outEi,in¬(aibi)Li,out(¬Ei,inLi,in)(Ei,inai¬bi)ri(¬Ei,in((Li,inai)(¬Li,inbi)))(Ei,in(aibi))

y luego conectarlos con el dígito más significativo que alimenta al siguiente. La parte crítica va del MSB al LSB, mientras que el circuito basado en la sustracción tendrá, en el mejor de los casos, una ruta crítica que va del LSB al MSB y luego de regreso al LSB.

Es el equivalente de un sumador de arrastre. Si está interesado, puede crear el equivalente a los sumadores carry-save o carry-select.

( significa igual hasta aquí, y tiene un significado solo si y significa seleccionar )EL¬Ea

Un programador
fuente