不能将实数和整数相乘

can't multiply real and integer

我在测试台中使用此代码,它按预期工作:

std_logic_vector(to_unsigned(integer(0.603205*(2**16)),16))

我想用同一文件中定义的函数替换它:

function convert_mult(mult : real) return std_logic_vector is
begin       
    
    return std_logic_vector(to_unsigned(integer(mult*(2**16)),16));
    
end function;

并这样称呼它:

convert_mult(0.603205)

函数编译失败,显示“找不到操作数用“[REAL,UNIVERSAL_INTEGER]”签名表示的“*”运算符。

我不知道这有什么问题,我以为支持实数 * 整数?我应该使用其他类型吗?

TL;DR

您可以像 0.603205*(2**16) 那样混合实数和整数文字,但不能像 mult*(2**16) 那样混合 non-literal 实数和整数文字。正如 Matthew 所指出的,realinteger 密切相关的类型 ,因此转换很容易。使用:

return std_logic_vector(to_unsigned(integer(mult*real(2**16)),16));

而且,顺便说一句,你写 我认为支持实数 * 整数。嗯,你错了。它不受支持。您必须使用显式转换...除了文字。

详情

为什么它适用于文字而不适用于 non-literals?根据 VHDL 2008 语言参考手册 (IEEE Std 1076-2008) universal_integeruniversal_real 分别是整数和浮点文字的类型。

0.603205universal_real.

2**16 有点复杂,因为它是一个涉及整数文字 (universal_integers) 的表达式。 LRM 的 9.3.6 类型转换 部分解释说,universal_integer 可以在上下文需要时自动转换为另一种整数类型。我不知道到底发生了什么自动转换,因为 LRM 在这方面不太容易理解,但我怀疑 16 会根据第 9.3.6 节的规则自动转换为 integer,它允许使用包 STANDARDuniversal_integer ** integer 操作数,即 return 是 universal_integer(参见 16.3 包标准 部分,其中所有这些运算符以其函数形式定义。

最后,第 9.5 节 通用表达式 明确指出 * 运算符是在 universal_integer * universal_realuniversal_real * universal_integer 上定义的。 return 和 universal_real.

注意:还有一个universal_real / universal_integerreturning universal_real但是没有universal_integer / universal_real.