不能将实数和整数相乘
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 所指出的,real
和 integer
是 密切相关的类型 ,因此转换很容易。使用:
return std_logic_vector(to_unsigned(integer(mult*real(2**16)),16));
而且,顺便说一句,你写 我认为支持实数 * 整数。嗯,你错了。它不受支持。您必须使用显式转换...除了文字。
详情
为什么它适用于文字而不适用于 non-literals?根据 VHDL 2008 语言参考手册 (IEEE Std 1076-2008) universal_integer
和 universal_real
分别是整数和浮点文字的类型。
0.603205
是 universal_real
.
2**16
有点复杂,因为它是一个涉及整数文字 (universal_integer
s) 的表达式。 LRM 的 9.3.6 类型转换 部分解释说,universal_integer
可以在上下文需要时自动转换为另一种整数类型。我不知道到底发生了什么自动转换,因为 LRM 在这方面不太容易理解,但我怀疑 16
会根据第 9.3.6 节的规则自动转换为 integer
,它允许使用包 STANDARD
的 universal_integer ** integer
操作数,即 return 是 universal_integer
(参见 16.3 包标准 部分,其中所有这些运算符以其函数形式定义。
最后,第 9.5 节 通用表达式 明确指出 *
运算符是在 universal_integer * universal_real
和 universal_real * universal_integer
上定义的。 return 和 universal_real
.
注意:还有一个universal_real / universal_integer
returning universal_real
但是没有universal_integer / universal_real
.
我在测试台中使用此代码,它按预期工作:
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 所指出的,real
和 integer
是 密切相关的类型 ,因此转换很容易。使用:
return std_logic_vector(to_unsigned(integer(mult*real(2**16)),16));
而且,顺便说一句,你写 我认为支持实数 * 整数。嗯,你错了。它不受支持。您必须使用显式转换...除了文字。
详情
为什么它适用于文字而不适用于 non-literals?根据 VHDL 2008 语言参考手册 (IEEE Std 1076-2008) universal_integer
和 universal_real
分别是整数和浮点文字的类型。
0.603205
是 universal_real
.
2**16
有点复杂,因为它是一个涉及整数文字 (universal_integer
s) 的表达式。 LRM 的 9.3.6 类型转换 部分解释说,universal_integer
可以在上下文需要时自动转换为另一种整数类型。我不知道到底发生了什么自动转换,因为 LRM 在这方面不太容易理解,但我怀疑 16
会根据第 9.3.6 节的规则自动转换为 integer
,它允许使用包 STANDARD
的 universal_integer ** integer
操作数,即 return 是 universal_integer
(参见 16.3 包标准 部分,其中所有这些运算符以其函数形式定义。
最后,第 9.5 节 通用表达式 明确指出 *
运算符是在 universal_integer * universal_real
和 universal_real * universal_integer
上定义的。 return 和 universal_real
.
注意:还有一个universal_real / universal_integer
returning universal_real
但是没有universal_integer / universal_real
.