2009-05-12 24 views
11

ここでは何が起こっていますか?なぜ私は '演算子の引数の型の不一致'を得るのですか?それを修正するために何ができますか?なぜ私はこの `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; 

あなたが直接STD_LOGICをインクリメントすることはできませんおかげ

+0

シミュレータ上の-v93スイッチがフリックされた場合、 'value'の初期化のために' to_stdlogicvector(bit_vector '(X "0")) 'または' X "0" 'のみです。 – Marty

答えて

24

は、あなたがnumeric_stdパッケージを使用してバックstd_logic_vectorからunsigned、その結果に変換する必要があります。

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

たとえば、How Do Perform STD_LOGIC_VECTOR Addition Using IEEE.NUMERIC_STDを参照してください。

+0

ありがとう!このVHDLのものは非常に困惑しています... – Marty

+3

実際にはそれほど難解ではない、実際には非常に明示的です。 'std_logic_vector'はちょうどビットの配列なので、数値はありません。 VHDL-2008には 'IEEE.Numeric_Std_Unsigned'と' IEEE.Numeric_Std_Signed'という2つのパッケージがあり、 'std_logic_vector'で直接算術演算を行うことができます。私はこれが良いことだと思うかどうかはわかりません。なぜなら、VHDLの強力な側面の1つが説明であるからです。しかし、少なくともVerilogスタイルでそれをやりたいのであれば、それがあります。 – trondd

+0

VHDL-2008はIEEE.numeric_std_unsignedだけを追加します。 –

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

1

答えが既に提供されていることに加えて、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; 

この形式の並行割り当ては、書籍やオンラインで見つけたものからカウンタを更新するのに適した方法です。あなたがnextvalueためstd_logic_vectorタイプを使用し続けた場合も

は、それをクリアするための好ましい方法は、nextvalue <= (others => '0');だけでなくnextvalue <= 0;のようです。

1

簡単に言えば、STD_LOGIC_VECTORはビットのベクトルです。それは何も意味しないので、vhdlがインクリメント操作がそれに対して動作するとは、セマンティック的に仮定することは期待できません。それを未署名のものに変換することについての他の記事は、このトリックを行うべきです。

0

また、これは動作します:あなたは本当によくVHDLに精通している場合

nextvalue <= value + '1'; 

いけない知っています。あなたはこのコードを試してみてくださいstd_logic_arithパッケージ

1

を使用している場合logicaly正しい次の構文イストは:私の場合は

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

このソリューションは作品です!

関連する問題