合成ツールでVHDL変数を合成する方法


9

VHDL変数が合成ツールによって合成される2つの方法を知っています。

  • 組み合わせロジックとして合成された変数
  • 意図せずにラッチとして合成された変数(初期化されていない変数が信号または別の変数に割り当てられている場合)

VHDL変数を合成できる他の方法は何ですか?(例:FFとして解釈できますか?)

回答:


8

3つの可能性を区別します。

  1. VHDL変数にはハードウェア表現がまったくありません。次の例を想定します

    signal a,b,c : integer;  
    ...  
    process ( clk ) is  
    variable var : integer := 0;  
    begin  
    if ( rising_edge(clk) ) then  
    var := a + b;  
    c <= var;  
    end if;  
    end process;

    変数varは実際には組み合わせロジックとしてまったく合成されていません(これが問題の意味であると仮定した場合)。a + bハードウェアに統合されるのは、割り当ての右側です。厳密に言えば、変数が組み合わせロジックに合成されることはありません。

  2. 変数は中間結果を保持するだけであり、同じクロックサイクルで評価されます->ハードウェアは合成されません(これは1です))、または次のクロックサイクルで評価されます->フリップフロップが合成されます。

  3. これらの恐ろしいラッチの1つは、変数に新しい値(一部の信号に依存)もデフォルト値も割り当てられていない条件付きブランチが存在する場合に推測されます。通常、このケースは意図せず発生します:-)


「恐ろしいラッチ」は、クロックされたプロセスの外でのみ発生する可能性があり、最近のほとんどの人々(私の経験では)は、クロックされていないプロセスを使用していません。したがって、ラッチの恐怖はもう問題ではありません(IMHO)-これは、組み合わせロジックを別のプロセスでフリップフロップに書き込む必要があった昔の時代に由来します
Martin Thompson

4

保存する前に変数の値を使用すると、プロセスが最後に保存したときに保存された値が取得されます(クロックプロセスでは、前のクロックサイクルの値)。これはレジスターまたはFFとして合成されます。

もちろん、reset句で変数を初期化しない限り、最初のクロックサイクルでガベージが発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.