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

10

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

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.

¿Así es 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?

    
pregunta James

3 respuestas

10

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

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

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

Con algunos trucos ingeniosos, la comprobación de los pares de bits se puede combinar con el muxer para el mismo par de bits.

    
respondido por el Wouter van Ooijen
2

Veamos el algoritmo en la pregunta:

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

Esto tiene etapas de suma y resta que luego se alimentan a una adición de segunda etapa. La división por 2 es trivial en hardware, se puede hacer eliminando el LSB. Sin embargo, el sumador / restador completo de dos etapas es bastante lento y requiere mucho uso de la puerta, especialmente si está en cascada múltiples caparisons como usted.

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

simular este circuito : esquema creado usando CircuitLab

El esquema anterior es para:

(A > B) ? A : B

pero observe que se puede reconfigurar fácilmente para cualquier comparación entre las dos entradas al hacer diferentes conexiones lógicas entre las salidas del comparador y la selección mux.

Entonces, si sabemos cómo formular los tres resultados del comparador, podemos implementar cualquier comparación en hardware. La lógica del comparador está bien descrita aquí . Para optimizar el hardware, solo eliminaríamos la lógica que controla 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 con qué esquema de nivel de puerta es óptimo. En su lugar, optimice su código y algoritmos para que al menos no esté forzando al sintetizador a producir un resultado ineficiente. "Con algunos trucos ingeniosos, la comprobación de los pares de bits se puede combinar con el muxer para el mismo par de bits", y la forma más sencilla de realizar esta optimización es mediante síntesis.

    
respondido por el travisbartley
1

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

$$ \ begin {eqnarray} E_ {i, out} & \ leftarrow & E_ {i, in} \ wedge \ neg (a_i \ oplus b_i) \\ L_ {i, out} & \ leftarrow & (\ neg E_ {i, in} \ wedge L_ {i, in}) \ vee (E_ {i, in} \ wedge a_i \ wedge \ neg b_i) \\ r_i & \ leftarrow & (\ neg E_ {i, in} \ wedge ((L_ {i, in} \ wedge a_i) \ vee (\ neg L_ {i, in} \ wedge b_i))) \ vee (E_ {i, in} \ cuña (a_i \ vee b_i)) \ end {eqnarray} $$

y luego conéctelos con el dígito más significativo que alimenta al siguiente. La parte crítica va desde la MSB a la LSB, mientras que el circuito basado en la resta- ración tendrá, como mucho, una ruta crítica que va de la LSB a la MSB y luego regresará a la LSB.

Es el equivalente de un sumador carry-ripple. Si está interesado, puede crear el equivalente para los agregadores carry-save o carry-select.

(\ $ E \ $ significa igual hasta aquí, y \ $ L \ $ tiene un significado solo si \ $ \ neg E \ $ y significa seleccionar \ $ a \ $)

    
respondido por el AProgrammer

Lea otras preguntas en las etiquetas