在评论(compiler errors when compiling *.vhdl into a library - Altera Quartus II)中提出这个问题后,我认为作为一个单独的问题可能会更好。
这是代码摘录,是流程的主要部分:
variable denum : integer;
variable num : integer;
variable dividend : float (4 downto -27);
begin
dividend := to_float(num) / to_float(denum);
...
在指出to_float()函数需要其他参数的错误之后,我尝试了建议的改进,但仍然遇到了一些错误:
dividend := to_float(num, dividend) / to_float(denum, dividend);
返回:" float_pkg_c.vhdl上的VHDL语法错误(3843):范围的右边界必须是常量"
和
dividend := to_float(num, 4, -27) / to_float(denum, 4, -27);
返回:" SM.vhd(93)处的VHDL错误:值" -27"超出目标约束范围(0到2147483647)"
错误消息指出问题源于to_float的错误调用,但考虑到它是最新软件包的一部分,我无法在方法中看到任何问题。有人可以向我澄清一下吗?此外,我不确定除法运算是否可以这种方式执行,我的意思是在一行中,返回从特定整数获得的浮点数。
答案 0 :(得分:1)
我可以在这里看到问题:
dividend := to_float(num, 4, -27) / to_float(denum, 4, -27);
如果你看一下定义:
-- 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);
...
看一下 fraction_width :它很自然。当您提供 -27 时,这是您当前获得的错误。
当您在实现中稍微向下看时,结果使用 fraction_width 的反转。因此,您应该调用
to_float(num, 4, 27)