15

这里发生了什么?为什么我会收到“运算符参数类型不匹配”,我能做些什么来解决它?

--
-- 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;

谢谢

4

6 回答 6

28

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

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

例如,请参阅如何使用 IEEE.NUMERIC_STD 执行 STD_LOGIC_VECTOR 加法

于 2009-05-13T07:30:46.900 回答
5

试试这个代码:

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

在我的情况下,这个解决方案是有效的!

于 2014-05-06T21:57:50.963 回答
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 包,因为它包含转换函数。

于 2013-06-02T11:52:33.260 回答
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_vectorfor 类型nextvalue,清除它的首选方法似乎nextvalue <= (others => '0');不仅仅是nextvalue <= 0;.

于 2013-08-08T19:55:28.227 回答
1

简而言之,STD_LOGIC_VECTOR 就是一个比特向量。它本身没有任何意义,因此您不能期望 vhdl 在语义上假设增量操作将对其起作用。这里关于将其转换为无符号的其他帖子应该可以解决问题。

于 2013-11-21T04:25:56.400 回答
0

这也将起作用:

nextvalue <= value + '1'; 

不知道你是否真的精通VHDL。如果您使用的是 std_logic_arith 包,则以下语法在逻辑上是正确的

于 2014-02-20T16:48:46.007 回答