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 に答える
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;

于 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 に答える