首页 文章

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

提问于
浏览
1

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

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

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

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

1 回答

  • 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 是输出端口,则会赢得't work because you can' t访问同一块内输出端口的值 . 如果是这种情况,则需要添加一个新信号,然后在进程外部从该信号中分配 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 向量的宽度(作为整数),"**"运算符用于取幂,因此表达式表示"all unsigned integers that can be expressed with as many bits as Output has" .

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

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

相关问题