web-dev-qa-db-ja.com

VHDLで演算子「+」の「0」定義が見つかりました

最初に、これがVHDLでの私の最初の試みであることを指摘したいので親切にしてください。 X1 ... X4入力を読み取り、出力でそれらの合計を生成したいと思います。これは私のコードです

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity counter_of_aces is 
  Generic(N: integer := 3);
     port( X1, X2, X3, X4 : IN BIT; 
        count: out std_logic_vector(N-1 downto 0)); 
end counter_of_aces;

architecture behavioral of counter_of_aces is 
signal counter : std_logic_vector(Ν-1 downto 0);
begin 
  process (X1, X2, X3, X4) 
  begin
    counter <= "0";
    if(X1='1' OR X2='1' OR X3='1' OR X4='1')then 
        counter <= counter + "1"; --O counter λειτουργεί ως στοιχείο μνήμης 
    else
        counter <= counter;
    end if; 
  end process; 
end behavioral;

次のエラーが発生します

ERROR:HDLCompiler:69 - Line 11: <í> is not declared.
ERROR:HDLCompiler:1731 - Line 17: found '0' definitions of operator "+", cannot determine exact overloaded matching definition for "+"
ERROR:HDLCompiler:854 - Line 10: Unit <behavioral> ignored due to previous errors.

それはどの「i」を指し、他の「i」はどうですか?前もって感謝します。

5
Billy Grande

VHDLを開始する

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
17
Boris Ivanov

これらは、サンプルコードシミュレーターの分析に基づく観察です。

エラー:HDLCompiler:69-11行目:<í>は宣言されていません。

これは、ISO8859-1以外の文字が原因で発生します。 Nを新しいNに置き換えて、そのポイントを超えました。私のアナライザーは11行目、文字36を指しており、検査の結果、そこに2バイトの文字(X "CE9D")が表示されました。

VHDLアナライザは、ISO8859-1文字の特定のサブセットから字句要素を構築します。コメントにはVHDL-2008の任意の文字を含めることができますが、標準の以前のリビジョンでは、コメントをグラフィック文字サブセットで構成する必要がありました。

エラー:HDLCompiler:1731-行17:演算子「+」の「0」定義が見つかりました。「+」の正確なオーバーロードされた一致定義を判別できません

演算子のオーバーロード関数のオーバーロード解決のコンテキストは、シグニチャ(パラメータのタイプと数、および戻り値のタイプ)によって異なります。 VHDLアナライザは、すべてのデザインユニットで使用可能な暗黙的なコンテキスト句以外の方向を確認します。

_   library STD, WORK; use STD.STANDARD.all;
_

これが、次のようなものを追加する理由です。

_    library ieee;
    use ieee.std_logic_1164.all;
_

ライブラリieeeパッケージstd_logic_1164内のすべての宣言を表示して、設計仕様で使用できるようにします。

適切な使用句とライブラリ句を追加しないと、アナライザーは[std_logic_vector string returnstd_logic_vector]のシグネチャを持つ_"+"_関数を見つけることができません。

17行目の「+」演算子にオーバーロード関数を提供するには:

_        counter <= counter + "1"; --O counter λειτουργεί ως στοιχείο μνήμης 
_

文字列リテラル「1」のタイプは、コンテキスト(ここでは割り当て全体)から決定されます。

演算子オーバーロード関数を提供するための2つの候補パッケージがあります。Synopsysのstd_logic_unsignedと-2008IEEEパッケージのnumeric_std_unsignedです。現在、use句によってどちらも表示されていません。

コメントにISO8859-1以外の文字が含まれているため、IEEE Std1076-2008準拠のアナライザーを使用しているようです。

古いVHDL実装の場合、Synopsysパッケージを使用するか、独自の「+」関数を作成するか、パッケージnumeric_stdで型変換を使用できます。

_    counter <= std_logic_vector(unsigned(counter) + "1");
_

追加の問題があります

  1. ラッチのイネーブルは、組み合わせによって導出されるべきではありません。グリッチの原因となるさまざまなルーティング遅延またはタイミングが存在する可能性があります。

  2. counter(N - 1 downto 0)は、シミュレーションと一致する実装動作の合成(マッピング)に依存します。インクリメント付きのラッチとして実装されている場合、カウンタ出力でゲート発振を生成するフィードバックパス(_counter <= counter + "1";_)があります。インクリメントは、少なくとも1つの入力を反転することが保証されています。出力周波数は、ルーティング遅延、ラッチおよびインクリメント遅延に依存します。

  3. カウンターのelse割り当てをそれ自体に指示するために使用される履歴合成属性がロジックで実装されています。そうしないと、合成ツールはそれらを無視します(ほとんどのシミュレーターと同様に、有効値を変更せずに割り当ててもイベントは発生しません)。これらの属性は、CPLDのEarleラッチに役立つ可能性がありますが、FPGAベンダーは通常、ラッチの実装のすべての側面を管理します。

2
user1155120

Virginia自体では、以下に説明するこの最後の行を追加するように記述されています。


-使用している場合は、次のライブラリ宣言のコメントを解除します

-符号付きまたは符号なしの値を持つ算術関数

use IEEE.NUMERIC_STD.ALL
0
Ali Babayev