to_float()和划分错误

时间:2014-04-01 12:06:04

标签: compiler-errors floating-point vhdl

在评论(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的错误调用,但考虑到它是最新软件包的一部分,我无法在方法中看到任何问题。有人可以向我澄清一下吗?此外,我不确定除法运算是否可以这种方式执行,我的意思是在一行中,返回从特定整数获得的浮点数。

1 个答案:

答案 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)