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

Qos*_*smo 1 vhdl

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

我有2个STD_LOGIC_VECTOR和几个STD_LOGIC.有什么我需要做的,他们只使用无符号?目前我只有library IEEE; use IEEE.STD_LOGIC_1164.ALL;

我还需要在某些条件下将一个二进制向量增加1(正如您现在可能已经猜到的那样).考虑到其中一个向量是以32位输出的,您是否会如此善意地解释如何执行此类操作(使用无符号并添加一个).

我猜(我试过)输出<=输出+ 1; 不会这样做.哦,我正在使用一个过程.

Tom*_*ila 8

简而言之,您可以将ieee.numeric_std包添加到您的体系结构(library ieee; use ieee.numeric_std.all;)中,然后使用以下命令添加:

Output <= std_logic_vector(unsigned(Output) + 1);
Run Code Online (Sandbox Code Playgroud)

将std_logic_vector转换为无符号向量,递增它,最后将结果转换回std_logic_vector.

请注意,如果Output是输出端口,则不起作用,因为您无法访问同一块中的输出端口的值.如果是这种情况,您需要添加一个新信号,然后Output在该过程之外从该信号中分配.

如果您确实需要添加信号,则可能更简单地使该信号与其他类型不同std_logic_vector.例如,您可以使用整数或unsigned上面的类型.例如:

architecture foo of bar is
    signal Output_int : integer range 0 to (2**Output'length)-1;
begin
    PR: process(clk, resetn)
    begin
        if resetn='0' then
            Output_int <= 0;
        elsif clk'event and clk='1' then
            Output_int <= Output_int + 1;
        end if;
    end process;

    Output <= std_logic_vector(to_unsigned(Output_int, Output'length));
end foo;
Run Code Online (Sandbox Code Playgroud)

Output_int声明了一系列有效值,以便工具能够确定整数的大小以及模拟的有效值范围.在声明中Output_int,Output'lengthOutput向量的宽度(作为整数),"**"运算符用于取幂,因此表达式意味着"所有无符号整数,可以用与输出一样多的位表示".

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

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