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

时间:2011-04-17 01:02:12

标签: vhdl

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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

Output <= std_logic_vector(unsigned(Output) + 1);

将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;
使用一系列有效值声明

Output_int,以便工具能够确定整数的大小以及模拟的有效值范围。 在Output_int的声明中,Output'lengthOutput向量的宽度(作为整数),“**”运算符用于取幂,因此表达式意味着“全部”无符号整数,可以用输出“。

表示的位数表示

例如,对于定义为Output的{​​{1}},std_logic_vector(31 downto 0)为32. 2 32 -1是可用表达式表示的最高值无符号的32位整数。因此,在示例情况下,Output'length解析为范围0 ... 4294967295(2 32 = 4294967296),即可以用32位表示的完整无符号范围。 / p>

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