5 votos

División eficiente con matemáticas binarias

Estoy escribiendo código para una FPGA y necesito dividir un número por $1.024$ . Podría usar punto flotante y/o fijo e instanciar un multiplicador pero me gustaría ver si puedo hacer esta multiplicación de manera más eficiente.

Me he dado cuenta de que $2^0$ + $2^-$$ ^6 $ + $ 2^- $$^7$ = $1.0234375$ que es el 99,95% de $1.024$ ; bien dentro de mi requisito de tolerancia. Parece que hay alguna forma de aprovechar este hecho para dividir un número por $1.0234375$ (esencialmente $1.024$ ) sin tener que hacer una costosa multiplicación, pero estoy atascado en dónde ir desde aquí. He visto tipos similares de cosas hechas por los desarrolladores de juegos tempranos para acelerar sus cálculos y esto es esencialmente lo que estoy tratando de lograr aquí, pero en lugar de maximizar la velocidad que quiero minimizar la utilización de la FPGA.

5voto

mj6174 Puntos 289

$$\frac{1}{1.024} = \frac{1024-24}{1024} = \left(\frac{1024 - 16 - 8}{1024}\right)$$

Así que para dividir N,

$$ N*\left(\frac{1000}{1024}\right) = ((N << 10) - (N << 4) - (N << 3)) >> 10 $$

Necesitas 2 sumadores. La operación de desplazamiento será libre en la FPGA ya que todos son potencias de 2. Si quieres usar una fracción del resultado, simplemente usa los 10 bits inferiores de la suma. Para preguntas específicas de la FPGA, siempre puedes probar con electronics.SE

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X