Hola,
Estoy por la labor de ir fabricando módulos que nos permitan hacer operaciones matemáticas básicas, como en este caso la división con decimales. La división con decimales en punto fijo se llama Qint.frac, donde 'int' representa la parte entera y 'frac' representa la parte fraccionaria (los decimales).
En este post adjunto un circuito donde utilizo para dividir con decimales el formato Q8.8. Esto significa que utilizo 8 bits para la parte entera y otros 8 bits como parte fraccionaria. Siempre hay que utilizar números positivos, de momento no se puede introducir números negativos.
Es decir, que podemos dividir con decimales y el resultado también nos dará decimales. La salida "dbz" se pondrá a 1 si ocurre una división entre 0.
Como ejemplo he creado otro módulo donde traduce el formato Q8.8 a decimal de toda la vida y que podremos ver el resultado a través del puerto serie. Como estamos en formato Q8.8 el número más alto que se puede introducir es el 255, lo mismo para la parte fraccionaria, aunque en este último caso, para simplificar el ejemplo, la parte fraccionaria de entrada siempre la dejo con valor 0. Pero he hecho pruebas a parte y también divide con entradas fraccionarias (es decir, con decimales) sin problemas.
Si cargamos el circuito y abrimos el terminal serie de Icestudio podremos ver pruebas como esta:
Con tiempo iré creando otro módulos de división para Icestudio, tipo Q16.10 que nos permitirá enviar números de 0 al 65535 con parte fraccionaria que nos permita tener decimales hasta .999.
El módulo de división, en su interior hay un diseño hecho en Verilog. La división (sea cual sea) siempre se realizará con 24 ciclos de reloj. El algoritmo pertenece a
Will Green y esta persona tiene una web alucinante sobre diseño en Verilog con proyectos geniales (también para gráficos) y os animo a visitar su web y daros un buen paseo. Yo estuve horas admirando todo su trabajo:
https://projectf.io/ En concreto, la división con punto fijo y para cualquier anchura de bits se encuentra aquí:
https://projectf.io/posts/division-in-verilog/
Adjunto el módulo y el ejemplo.
Saludos.