vhdl - 不能将实数和整数相乘
问题描述
我在测试台中使用此代码,它按预期工作:
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;博士
您可以混合使用像 in 这样的实数和整数文字,0.603205*(2**16)
但不能混合使用像 in 这样的非文字实数和整数文字mult*(2**16)
。正如 Matthew 所指出的,real
它们integer
是密切相关的类型,因此转换很容易。利用:
return std_logic_vector(to_unsigned(integer(mult*real(2**16)),16));
而且,顺便说一句,你写的我认为支持真正的 * 整数。嗯,你错了。不支持。您必须使用显式转换...除了文字。
细节
为什么它适用于文字而不适用于非文字?根据 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
会自动转换为integer
第 9.3.6 节的相应规则,它允许使用universal_integer ** integer
package 的操作STANDARD
数返回 a universal_integer
(参见第16.3 节 Package STANDARD,其中所有这些运算符都以其函数形式定义)。
最后,第 9.5 节通用表达式明确指出*
运算符定义在universal_integer * universal_real
and上universal_real * universal_integer
。两者都返回一个universal_real
.
注意:还有一个universal_real / universal_integer
返回universal_real
但没有universal_integer / universal_real
。
推荐阅读
- android - 使用重新训练的 Tensorflow 对象检测模型使用 snpe 进行 pb 到 dlc 转换失败
- mysql - mysql连接sleep太多,wait_timeout不起作用
- google-app-engine - 在原生模式下在 AppEngine + Firestore 中创建复合索引
- python - 如何使用 postgresql 在“bytea”数据类型列中查询?
- django - 如何正确显示多级数据
- python - 将 mp3 文件转录为文本文件时出错
- node.js - 如何处理`无法访问'
'在初始化之前`? - javascript - 以特定方式订购对象
- git - 如何将 github PR 的 base 分支合并到 head 分支而不变基?
- reactjs - 将 create-react-app --template-typescript 部署到 gh 页面