web-dev-qa-db-ja.com

この「std_logic_vector」をインクリメントできないのはなぜですか

何が起きてる? 「演算子の引数の型の不一致」が発生するのはなぜですか?それを修正するにはどうすればよいですか?

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

ありがとう

13
Marty

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を追加する方法を参照してください。

24
danielpoe

もう1つの方法は、この場合に「+」をオーバーロードすることです。

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パッケージがもう1つ含まれています。

3
abkds

このコードを試してください:

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

私の場合、この解決策はうまくいきます!

3
Vladislav

すでに提供されている回答に加えて、nextvalueunsignedデータ型(下記)として定義して、コードを書き直すことができます。 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;
_

この形式の同時割り当ては、私が本やオンラインで見つけたものからカウンターを更新する好ましい方法のようです。

また、nextvalueに_std_logic_vector_型を引き続き使用する場合、_nextvalue <= 0;_だけではなく、nextvalue <= (others => '0');を使用してクリアすることをお勧めします。

2
Engineero

一言で言えば、STD_LOGIC_VECTORはまさにビットのベクトルです。それ自体は何も意味しないので、vhdlがインクリメント操作が機能することを意味的に想定することはできません。それを署名なしに変換することについてここの他の投稿はトリックを行う必要があります。

1
Jun

これも機能します:

nextvalue <= value + '1'; 

あなたが本当にVHDLに精通しているかどうかわからない。 std_logic_arithパッケージを使用している場合、次の構文は論理的に正しいです

0
Vijay