Buscar raíz cuadrada de un número sin signo de 32 bits [cerrado]

-3

¿Cómo averiguar la raíz cuadrada de un número de punto fijo sin signo de 32 bits en verilog? La entrada es un entero positivo de 32 bits. La salida debe estar representada en formato 16.16 (16 enteros y 16 bits fraccionarios). Estoy usando la placa Zynq de xilinx.

    
pregunta bibo

1 respuesta

5

Un enfoque simple es la bisección de intervalos.

Aquí hay un pseudocódigo. Supongo que la división por 2 rondas hacia cero. El resultado final también se redondeará hacia cero. Supongo que tanto la entrada como la salida están en 16.16 puntos fijos (al volver a leer su pregunta, observé que especificó la ubicación del punto decimal para la salida pero no para la entrada)

low = 0.0
high = 256.0
in = (value you want to square root)
epsilon = (smallest value you can represent)
do {
  mid = (high + low) / 2 
  multresult = (mid * mid)
  if (multresult <= in) low = mid
  if (multreslut >= in) high = mid
} while ((high - low) > epsilon)
result = low

Hay dos maneras en que esto puede terminar. O encuentra la respuesta exacta o el intervalo se reduce a épsilon.

Debería ser lo suficientemente fácil como para implementar esto como una máquina de estado verilog.

  • La división por 2 es solo un pequeño cambio.
  • La multiplicación de puntos fijos es bastante fácil. Simplemente haga un entero multiplicado seguido de mover bits alrededor. Solo asegúrese de que su multiplicador sea lo suficientemente amplio para que las cosas no se desborden.
  • La suma, resta y comparación de puntos fijos son lo mismo que la resta y comparación de suma de números enteros.
respondido por el Peter Green

Lea otras preguntas en las etiquetas