コードの最初の部分で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;
初期条件: sig
is1
とsig2
is0
であるため、clk
エッジを待っているだけです。
クロック エッジが到達すると、最初に確認したプロセスに入り、sig
に1
割り当て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 が物事をスケジュールする方法の重要な部分を理解できます。