Vhdl 无符号逻辑,向量和加法-如何?

Vhdl 无符号逻辑,向量和加法-如何?,vhdl,Vhdl,我正在创建一个程序计数器,它应该只使用无符号数字 我有两个标准逻辑向量和两个标准逻辑向量。我需要做些什么,以便他们只使用unsigned?目前我只有库; 使用IEEE.STD_LOGIC_1164.ALL 在某些条件下,我还需要将其中一个二进制向量增加1(正如您现在可能已经猜到的)。考虑到其中一个向量的输出是32位的,请您解释一下如何执行这些操作(使用无符号和相加) 我猜(我试过)输出简而言之,您可以将ieee.numeric\u std包添加到您的体系结构中(库ieee;使用ieee.nume

我正在创建一个程序计数器,它应该只使用无符号数字

我有两个标准逻辑向量和两个标准逻辑向量。我需要做些什么,以便他们只使用unsigned?目前我只有
库;
使用IEEE.STD_LOGIC_1164.ALL

在某些条件下,我还需要将其中一个二进制向量增加1(正如您现在可能已经猜到的)。考虑到其中一个向量的输出是32位的,请您解释一下如何执行这些操作(使用无符号和相加)


我猜(我试过)输出简而言之,您可以将
ieee.numeric\u std
包添加到您的体系结构中(
库ieee;使用ieee.numeric\u std.all;
),然后使用以下方法进行添加:

Output <= std_logic_vector(unsigned(Output) + 1);
Output_int
使用有效值范围声明,以便工具能够确定整数的大小以及模拟的有效值范围。 在
Output\u int
的声明中,
Output'length
Output
向量的宽度(作为一个整数),并且“**”运算符用于求幂运算,因此表达式表示“可以用输出所具有的位数来表示的所有无符号整数”

例如,对于定义为
标准逻辑向量(31到0)
输出
输出的长度为32。232-1是可以用无符号32位整数表示的最高值。因此,在示例情况下,
范围0到(2**Output'length)-1
解析为范围0…4294967295(232=4294967296),即可以用32位表示的完整无符号范围


请注意,您需要手动添加任何包装逻辑:当您达到最大值并尝试增加1时,VHDL模拟器将产生错误,即使合成逻辑将干净地包装为0。

简而言之,您可以将
ieee.numeric_std
包添加到您的体系结构中(
库ieee;使用ieee.numeric_std.all;
)然后使用以下方法进行添加:

Output <= std_logic_vector(unsigned(Output) + 1);
Output_int
使用有效值范围声明,以便工具能够确定整数的大小以及模拟的有效值范围。 在
Output\u int
的声明中,
Output'length
Output
向量的宽度(作为一个整数),并且“**”运算符用于求幂运算,因此表达式表示“可以用输出所具有的位数来表示的所有无符号整数”

例如,对于定义为
std_logic_vector(31向下到0)
Output
是32。232-1是可以用无符号32位整数表示的最高值。因此,在示例情况下,
范围0到(2**Output'length)-1
解析为范围0…4294967295(232=4294967296),即可以用32位表示的完整无符号范围


请注意,您需要手动添加任何包装逻辑:当您达到最大值并尝试增加1时,VHDL模拟器将产生错误,即使合成的逻辑将完全包装为0。

Woah,整数范围的事情让我大吃一惊。似乎奇怪的是,您需要这么多来只添加一个,但事实并非如此您能解释一下0到(2**输出长度)-1的范围吗?如果向量是32位的话,我假设输出的长度是32位的……是的,VHDL有时会有点模糊。:-)Output'length是输出向量的宽度(作为一个整数),而“**”运算符用于求幂,因此表达式的意思是“所有无符号整数都可以用输出的位数来表示”。啊,现在好多了!再次感谢Tomi!哇,那个整数范围的东西把我从屋顶上吹了下来。似乎奇怪的是,你需要这么多来加一个,但它确实按预期工作。感谢您的解释:)您能解释范围0到(2**输出长度)-1吗?如果向量是32位的话,我假设输出的长度是32位的……是的,VHDL有时会有点模糊。:-)Output'length是输出向量的宽度(作为一个整数),而“**”运算符用于求幂,因此表达式的意思是“所有无符号整数都可以用输出的位数来表示”。啊,现在好多了!再次感谢Tomi!