我建立了一个 mod-16 计数器,输出结果是一个 INTEGER(我看到的所有示例都使用 INTEGER)。
我构建了一个 hex-to-7-segment-display 解码器,它的输入是一个 STD_LOGIC_VECTOR(这样写是因为它很容易映射出真值表)。
我想将计数器的输出连接到解码器的输入,但是尝试在 QuartusII 中编译时出现“类型不匹配”错误。
有没有办法在 VHDL 列表中从 INTEGER 类型转换为 STD_LOGIC_VECTOR 类型?
我建立了一个 mod-16 计数器,输出结果是一个 INTEGER(我看到的所有示例都使用 INTEGER)。
我构建了一个 hex-to-7-segment-display 解码器,它的输入是一个 STD_LOGIC_VECTOR(这样写是因为它很容易映射出真值表)。
我想将计数器的输出连接到解码器的输入,但是尝试在 QuartusII 中编译时出现“类型不匹配”错误。
有没有办法在 VHDL 列表中从 INTEGER 类型转换为 STD_LOGIC_VECTOR 类型?
正如其他人所说,使用ieee.numeric_std
, never ieee.std_logic_unsigned
,这不是真正的 IEEE 包。
但是,如果您使用支持 VHDL 2008 的工具,则可以使用新的包ieee.numeric_std_unsigned
,它本质上使std_logic_vector
行为类似于无符号。
另外,由于我没有看到它明确说明,这里是从(无符号)整数转换为的实际代码示例std_logic_vector
:
use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
要将整数转换为 std_logic_vector,您有多种选择。使用 numeric_std:
vect <= std_logic_vector( to_unsigned( your_int, vect'length));
要么
vect <= std_logic_vector( to_signed( your_int, vect'length));
使用 std_logic_arith:
vect <= conv_std_logic_vector( your_int, vect'length);
std_logic_arith 不是 ieee 标准,但大多数工具将其编译到 IEEE 库中,并且被广泛使用。
正如主要答案所说,推荐的方法如下:
use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
但是,我想详细说明为什么推荐这样做,以及为什么 VHDL 有一种看似复杂的将整数转换为 std_logic_vectors 的方式。
归结为工具如何查看这些类型。
标准逻辑向量实际上是一堆 1 或 0。我有 10001。这是什么号码?这得看情况。它是签名的还是未签名的?SLV 不知道也不关心。多少位?那么,您的 SLV 有多长?
一个整数是有符号的,通常是 32 位(如果我没记错的话)。
第 1 阶段:使我的整数更短且无符号。就是这部分:
to_unsigned(my_int, my_slv'length));
“我有这个整数,我希望它是无符号的,我希望它适合我的 SLV 的长度。”
第 2 阶段:然后,获取这些位并使用它们来驱动 my_slv。
my_slv <= std_logic_vector(...)
“拿走这些东西,用它们来驱动我的 slv”
(关于术语的注释。A <= B
在 VHDL 中大声读出为“A 由 B 驱动”)
结合起来,这可以让你:
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
当来自传统的编程背景时,很容易陷入编程思维方式。但是在 VHDL 中,您编写的代码在硬件中具有物理意义。了解为什么这种方法有效并被推荐是更接近于用硬件术语思考你在写什么的一步。
额外提示:以 to_ 为前缀的函数是缩短/更改操作数的函数。它们使它们无符号或一定长度或两者兼而有之。这就是 to_unsigned 要求您指定长度的原因。当类型已经直接兼容时,使用没有 to_ 的函数(本例中为直接的 std_logic_vector(...) )。“获取这些位并以这种类型填充它们,无需修改”。这些没有长度参数,因为双方已经相同。所以在构建这样的东西时,我不需要查找它,我只考虑我是如何更改数据的。