为什么我不能增加这个`std_logic_vector`

时间:2009-05-12 20:21:21

标签: vhdl

这里发生了什么?为什么我得到'运算符参数类型不匹配',我该怎么做才能解决它?

--
-- 32-bit counter with enable and async reset
--
architecture synthesis1 of counter_32bit is    
signal nextvalue : std_logic_vector ( 31 downto 0 );    
begin

  --
  -- combo
  --
  nextvalue <= value + 1; -- here

  --
  -- sequential
  --
  ff:process( clk, rst )
  begin

    if( rst = '1' ) then
      value <= 0; -- and here...
    elsif( clk'event and ( clk ='1' ) ) then
      if( ena = '1' ) then
         value <= nextvalue;
      end if;
    end if;

  end process ff;    

end synthesis1;

由于

6 个答案:

答案 0 :(得分:24)

您无法直接增加std_logic,您需要将其转换为unsigned,并使用std_logic_vector包将结果返回numeric_std

use ieee.numeric_std.all
...
nextvalue <= std_logic_vector( unsigned(value) + 1 );

例如,请参阅How Do Perform STD_LOGIC_VECTOR Addition Using IEEE.NUMERIC_STD

答案 1 :(得分:3)

另一种方法是重载“+”,在这种情况下你可以写:

function "+" ( a : std_logic_vector; b : integer ) return std_logic_vector is
    variable result : unsigned(a'range);
begin
    result := unsigned( a ) + 1 ;
    return std_logic_vector( result ) ;
end function ;

创建一个包并在该包中包含此函数,这将起到作用。还有一件事包括ieee numeric_std包,因为它包含转换函数。

答案 2 :(得分:3)

试试这段代码:

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
nextvalue <= value + "1";

就我而言,这个解决方案是有效的!

答案 3 :(得分:2)

除了已经提供的答案之外,您还可以重写代码,将nextvalue定义为具有unsigned数据类型(下方)。请注意使用nextvalue <= to_unsigned(0, 32);清除计数器,并使用rising_edge(clk)触发上升沿。

-- 32-bit counter with enable and async reset
architecture synthesis1 of counter_32bit is    
    signal nextvalue : unsigned ( 31 downto 0 );    
begin

    ff:process( clk, rst )
    begin

        if( rst = '1' ) then
            nextvalue <= to_unsigned(0, 32); -- reset the count
        elsif rising_edge(clk) then
            if( ena = '1' ) then
                nextvalue <= nextvalue + 1;  -- increment the count
            end if;
        end if;

    end process ff;

    -- Concurrent assignment statement
    value <= std_logic_vector(nextvalue);

end synthesis1;

这种并发分配形式似乎是我在书籍和网上找到的更新计数器的首选方法。

此外,如果您继续使用std_logic_vector nextvalue类型,则清除它的首选方法似乎是nextvalue <= (others => '0');,而不仅仅是nextvalue <= 0;

答案 4 :(得分:1)

简而言之,STD_LOGIC_VECTOR只是一个位向量。它本身并不意味着什么,所以你不能指望vhdl在语义上假设增量操作将对它起作用。这里关于将其转换为无符号的其他帖子应该可以解决问题。

答案 5 :(得分:0)

这也有效:

nextvalue <= value + '1'; 

不知道你是否真的精通VHDL。如果您使用std_logic_arith包

,则以下语法是逻辑上正确的