type number float data arithmetic compiler-errors floating-point vhdl

compiler-errors - number - floating point operations



to_float() y errores de divisiĆ³n (1)

Después de mencionar este tema en un comentario ( errores del compilador al compilar * .vhdl en una biblioteca - Altera Quartus II ), decidí que probablemente sería una pregunta diferente.

Este es el extracto del código, la parte principal de un proceso:

variable denum : integer; variable num : integer; variable dividend : float (4 downto -27); begin dividend := to_float(num) / to_float(denum); ...

Después de señalar el error de que la función to_float () necesita argumentos adicionales, probé las mejoras sugeridas, pero aún así obtuve algunos errores:

dividend := to_float(num, dividend) / to_float(denum, dividend);

devuelve: "Error de sintaxis VHDL en float_pkg_c.vhdl (3843): el límite derecho del rango debe ser una constante"

y

dividend := to_float(num, 4, -27) / to_float(denum, 4, -27);

devuelve: "Error de VHDL en SM.vhd (93): el valor" -27 "está fuera del rango de restricción de destino (0 a 2147483647)"

Los mensajes de error indican que el problema se origina en la llamada incorrecta de to_float, pero no veo ningún problema en el método, considerando el hecho de que es parte del último paquete. ¿Alguien puede aclararme eso? Además, no estoy seguro de si la operación dividir se puede ejecutar de esta manera, es decir, en una línea, devolviendo una flotación obtenida de los eventos particulares.


Puedo ver un problema aquí mismo:

dividend := to_float(num, 4, -27) / to_float(denum, 4, -27);

Si echas un vistazo a la definición:

-- to_float (Integer) function to_float ( arg : INTEGER; constant exponent_width : NATURAL := float_exponent_width; -- length of FP output exponent constant fraction_width : NATURAL := float_fraction_width; -- length of FP output fraction constant round_style : round_type := float_round_style) -- rounding option return UNRESOLVED_float is variable result : UNRESOLVED_float (exponent_width downto -fraction_width); ...

Eche un vistazo a fraction_width : es un natural. Este es el error que está recibiendo actualmente, ya que suministra -27 .

Cuando miras un poco más abajo en la implementación un poco, el resultado usa el inverso de fraction_width . Por lo tanto, deberías estar invocando

to_float(num, 4, 27)