1

たとえば、次のようなプロセスがあるとします。

process (clk)
if (var = '1') then
   var2 = '1';
end if;

if (var2 = '1') then
   //do something
end if;
end process;

2 番目の if ステートメントは次のクロック サイクルで実行されますか、それとも var2 = '1' が実行されるとすぐに実行されますか?

以下のコードは、上記のコードとまったく同じことを行いますか?

process (clk)
if (var = '1') then
   var2 = '1';
end if;
end process;

process (var2)
if (var2 = '1') then
   //do something
end if;
end process;

誰かがタイミングの問題を説明できれば、それは素晴らしいことです。

4

2 に答える 2

3

s が変数の場合、varプロセス間で変数を使用できないため、2 番目のオプションを賢明に実行することはできません (ほとんどの状況では、後で参照してください)。それらが実際に信号である場合、はい、できます。

最初のコードでは、それらが変数の場合、はい、すぐに更新され、コードの 2 番目の部分が実行されます。

それらがシグナルである場合、ifシグナルはそれらに書き込むプロセスの最後にのみ更新されるため、2 番目のブロックは次回のみ実行されます。

2 番目のサンプル コードは、var2 の変更に敏感であるため、最初のプロセスが実行された後、次の「デルタ サイクル」で 2 番目のプロセスを実行します。


プロセス間で変数を使用できますが、 shared variables として指定する必要があります。「ストレートな」shaed 変数でこれを行うと、読み取りと更新の順序が定義されていないため、Verilog のような厄介な競合状態が発生するリスクがあります。

protected typeオブジェクト指向に少し似ていて、複数のプロセス間でアクセスをアトミックにすることを可能にする値を操作するメソッドを持つa を作成する必要があります。

于 2012-05-21T12:11:35.940 に答える
2

コードの最初の部分でvar2は、変数と同様に、すぐに新しい値を取得します。したがって、ifステートメントは新しい値//do somethingを認識し、同じタイム スライスで発生します。

(//コメント? 本当に? これは VHDL です。私たちは を使用しました--)

2 番目のコードは機能しません。変数はプロセスにスコープされ、プロセス間で値を転送するために使用することはできません。信号を使用する必要があるため、ルールが変更されます。次のコードを検討してください。

signal sig  : std_logic := 1;
signal sig2 : std_logic := 0;

process (clk)
  if (sig = '1') then
    sig2 <= '1';
  end if;

  if (sig2 = '1') then
    -- do something
  end if;
end process;

process (sig2)
  if (sig2 = '1') then
    -- do something else
  end if;
end process;

初期条件: sigis1sig2is0であるため、clkエッジを待っているだけです。

クロック エッジが到達すると、最初に確認したプロセスに入り、sig1割り当て1ますsig2。これまでのところすべて単純sig2ですが、シグナルであるため、プロセスが完了するまで割り当ては行われません。つまり、次の行で比較sig2すると1、それは false になり (今のところsig2はまだ0です)、そうはなりません-- do something。その後、プロセスを終了します。

ここで、最初のプロセスの最後にsig2値が変更されたため0 -> 1、2 番目のプロセスがトリガーされます (これは に敏感sig2です)。それはそうでsig2あり1、そうなるでしょう-- do something else

次のクロック エッジが来ると (このコードでは負のエッジになる可能性があります)、sig2は静止1しているので-- do something、すべてのクロック エッジに対してこれを行います。

要約すると、このコードのイベントの順序は次のようになります。

Clk  : 0->1
Sig2 : 0->1
-- Do Something Else
Clk  : 1->0
-- Do Something
Clk  : 0->1
-- Do Something
Clk  : 1->0
-- Do Something
Clk  : 0->1
-- Do Something
.........

この順序を理解すると、VHDL が物事をスケジュールする方法の重要な部分を理解できます。

于 2012-05-20T11:32:37.897 に答える