コードの最初の部分で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;
初期条件: sigis1とsig2is0であるため、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 が物事をスケジュールする方法の重要な部分を理解できます。