我正在创建一个程序计数器,它应该只使用无符号数字 .
我有2个STD_LOGIC_VECTOR和几个STD_LOGIC . 有什么我需要做的,他们只使用无符号?目前我只有 library IEEE; use IEEE.STD_LOGIC_1164.ALL;
我还需要在某些条件下将一个二进制向量增加1(正如您现在可能已经猜到的那样) . 考虑到其中一个向量是以32位输出的,您是否会如此善意地解释如何执行此类操作(使用无符号并添加一个) .
我猜(我试过)输出<=输出1;不会这样做 . 哦,我正在使用一个过程 .
1 回答
简而言之,您可以将
ieee.numeric_std
包添加到您的体系结构(library ieee; use ieee.numeric_std.all;
),然后使用以下命令添加:将std_logic_vector转换为无符号向量,递增它,最后将结果转换回std_logic_vector .
请注意,如果
Output
是输出端口,则会赢得't work because you can' t访问同一块内输出端口的值 . 如果是这种情况,则需要添加一个新信号,然后在进程外部从该信号中分配Output
.如果确实需要添加信号,则可能更简单地使该信号与
std_logic_vector
不同 . 例如,您可以使用上面的整数或unsigned
类型 . 例如:Output_int
声明了一系列有效值,因此工具将能够确定整数的大小以及模拟的有效值范围 . 在Output_int
的声明中,Output'length
是Output
向量的宽度(作为整数),"**"运算符用于取幂,因此表达式表示"all unsigned integers that can be expressed with as many bits as Output has" .例如,对于定义为
std_logic_vector(31 downto 0)
的Output
,Output'length
是32. 232-1是可以用无符号32位整数表示的最高值 . 因此,在示例情况下,range 0 to (2**Output'length)-1
解析为范围0 ... 4294967295(232 = 4294967296),即可以用32位表示的完整无符号范围 .请注意,您需要手动添加任何包装逻辑:当您达到最大值并尝试递增1时,VHDL模拟器将产生错误,即使合成逻辑将干净地回绕到0 .