División de punto fijo en verilog para Spartan 6

Estoy desarrollando un núcleo en Spartan 6 que necesita hacer divisiones como 1/6, 2/4, etc., por lo que los valores siempre están entre 0 y 1. Como no necesito la precisión del punto flotante, quiero usar un divisor de punto fijo ya que la división es costosa. Encontré algunos divisores en opencores.org pero todos ellos pueden computar problemas de división normales como 4/2, 8/4, etc... bueno, pero no pueden hacer operaciones del tipo 1/6. ¿Alguien puede señalar un divisor adecuado para mi aplicación?

Gracias

¿Los divisores son constantes o varían?
¿Qué tipo de ancho de banda (resultados por segundo) y latencia requiere su aplicación? Desarrollé un divisor canalizado que puede ofrecer un resultado por reloj a 150 MHz, pero eso se debe a que necesitaba calcular 1024 factores de escala durante el intervalo de borrado vertical de una transmisión de video HD. Si no necesita ese tipo de ancho de banda, existen otros enfoques que requieren menos recursos. Mi divisor está en VHDL; podría traducirse a Verilog (pero no de forma gratuita).
@JoeHass: si los divisores son constantes, no necesita ningún divisor; simplemente multiplicas por 1/x en su lugar.
@DaveTweed: Sí, es exactamente por eso que pregunté. He aprendido a nunca dar nada por sentado en stackexchange.
En realidad, incluso si los divisores varían, calcular 1/x es un enfoque muy viable si no necesita un resultado por reloj. El método de Newton-Rhapson solo necesita un multiplicador para calcular 1/x en unos pocos relojes, y luego una multiplicación más te da tu cociente. Hay muchas computadoras comerciales a lo largo de la historia que han usado exactamente este método.
@Joe Hess Tanto el divisor como el dividendo varían
@DaveTweed Estoy bien tanto con verilog como con VHDL. ¿Puede señalarme algún módulo leído para que pueda conectarlo en mi código?
¿Cómo puedo generar un código para la división de punto fijo en la programación de verilog?
@ChandrashekharGutte, ¡bienvenido a electronics.stackexchange! Como puede notar, este no es un foro sino un sitio de preguntas y respuestas, por lo tanto, el espacio de respuestas no está destinado a la discusión. Sea libre de hacer una nueva pregunta si tiene algo que preguntar, o use comentarios para (de hecho) comentar sobre preguntas y respuestas existentes.

Respuestas (1)

Dices que has encontrado divisores que hacen una división "normal". La división de punto fijo es una división normal, excepto que el dividendo debe escalarse (desplazarse a la izquierda). Mueva el dividendo a la izquierda 8 lugares (multiplique por 256), luego haga una división normal. El resultado fraccionario de punto fijo es igual al resultado entero de la división, dividido por 256. Entonces, si desea calcular 1/6, en realidad dividirá (1*256)/6, que es 42. El resultado real es por lo tanto, 42/256 = 0,1640625, que está razonablemente cerca del valor real de 0,1666... ​​Normalmente diríamos que este resultado es un número de punto fijo con 8 bits a la derecha del punto decimal. Si desea una mayor precisión, utilice un factor de escala mayor.

Mi problema es que si hago 1/4 con este divisor obtengo cero como respuesta. Siguiendo su método, si hago 256/4, obtengo 64. Nuevamente, si hago 64/256, obtendría cero porque cualquier división con numerador menor que denominador da como resultado cero. Qué hacer ? :(
Tienes que escalar el dividendo. Si quieres hacer una división de enteros y que el resultado represente una fracción, debes multiplicar el dividendo por alguna potencia de 2 de antemano.
Un poco de código de ejemplo me ayudaría mucho. Lo intenté y lo intenté pero no tuve éxito en absoluto. por favor, ayúdame
Si estás haciendo divisiones enteras, entonces es imposible obtener un resultado que no sea un número entero. El concepto clave es cómo interpretas ese número entero. En tu ejemplo anterior, no intentarías dividir 64/256, solo reconocerías que el resultado es una fracción multiplicada por el número entero 256.