Vhdl 为什么可以';t I递增这个'std\u逻辑\u向量`

Vhdl 为什么可以';t I递增这个'std\u逻辑\u向量`,vhdl,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 +

这是怎么回事?为什么会出现“运算符-参数类型不匹配”,我可以做些什么来修复它

--
-- 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;
--
--带启用和异步重置的32位计数器
--
计数器32位的结构综合1为
信号下一个值:标准逻辑向量(31到0);
开始
--
--组合
--

下一个值您不能直接递增std_逻辑,您需要使用
数值std
包将其转换为
无符号
,并将结果返回到
std_逻辑向量

use ieee.numeric_std.all
...
nextvalue <= std_logic_vector( unsigned(value) + 1 );
使用ieee.numeric\u std.all
...

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

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软件包,因为它包含转换函数。

除了已经提供的答案之外,您还可以重写代码,将
nextvalue
定义为具有
无符号
数据类型(如下)。注意
nextvalue的使用简而言之,STD_逻辑_向量就是一个位向量。它本身没有任何意义,因此您不能期望vhdl在语义上假定增量操作将对其起作用。这里关于将其转换为未签名文件的其他帖子应该可以做到这一点。

这也可以:

nextvalue <= value + '1'; 
nextvalue尝试以下代码:

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
nextvalue <= value + "1";
使用IEEE.STD\u LOGIC\u ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
...

下一个值用于初始化
,或者
到\u stdlogicvector(位向量'(X“0”)
,或者只要
X“0”
,如果模拟器上的-v93开关被轻弹。实际上它没有那么麻烦,实际上非常明确
std\u logic\u vector
只是一个位数组,因此它没有数值。在VHDL-2008中,有两个包名为
IEEE.Numeric\u Std\u Unsigned
IEEE.Numeric\u Std\u Signed
,它可以让您直接对
Std\u logic\u vector
进行算术运算。我不确定我是否认为这是一件好事,因为VHDL的一个强大方面是明确性。但如果你想用Verilog风格的话,至少它是存在的。请注意,VHDL-2008只添加了IEEE.numeric\u std\u unsigned。转换的问题是,你还需要将结果转换回std\u logic\u vector,这非常冗长
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
nextvalue <= value + "1";