私が理解するところでは、PROCESS内のすべてのステートメントは順番に実行されます。では、同時信号割り当て(< =)はどうなりますか?シーケンシャル割り当て(:=)と同じように動作するのですか、それともデルタ遅延の後に実行されますか?プロセス・ステートメント内の(並行した)シグナル割り当ては、順次または並行ですか?
デルタ遅延後に実行すると、PROCESS内のすべてのステートメントをどのように順次呼び出すことができますか?
すぐに実行される場合は、=と< =プロセス内に違いがありますか?
私が理解するところでは、PROCESS内のすべてのステートメントは順番に実行されます。では、同時信号割り当て(< =)はどうなりますか?シーケンシャル割り当て(:=)と同じように動作するのですか、それともデルタ遅延の後に実行されますか?プロセス・ステートメント内の(並行した)シグナル割り当ては、順次または並行ですか?
デルタ遅延後に実行すると、PROCESS内のすべてのステートメントをどのように順次呼び出すことができますか?
すぐに実行される場合は、=と< =プロセス内に違いがありますか?
シグナル割り当て(< =)は、プロセス内のすべてのシーケンシャルコードの実行が完了した後に実行されます。これは、そのタイムステップのすべてのアクティブなプロセスが完了したときです。
は、あなたが2つのプロセスをトリガするイベントがあるとします。これはなぜな例として
。これらの2つのプロセス は同じシグナルを使用しますが、そのうちの1つはシグナル の値を変更します。シミュレータは、シーケンシャルシミュレーションモデル( vhdlの同時モデルと混同しないでください)のために、 時間に1つのプロセスしか実行できません。したがって、プロセスAが最初にシミュレートされ、A が信号を変更した場合、Bは間違った信号値を持ちます。したがって、 信号は、トリガされたすべてのプロセスが完了した後にのみ変更することができます。
変数の代入(:=)は、immidiatlyで実行され、たとえば次のように使用できます。いくつかのデータをプロセス内に一時的に格納する。
シーケンシャルな変数割り当て(:=)とは対照的に、順次信号割り当て(< =)は、後でイベントの1つのデルタ遅延を更新するシグナルの値に対して後でスケジュールします。スケジュールされたイベントを変更するには、同じプロセス内の同じ信号に対する順次信号割り当てを使用します。特定の信号でスケジュールされた最後の更新のみが発生します。たとえば:
signal a : std_logic := '1'; --initial value is 1
process(clk)
variable b : std_logic;
begin
--note that the variable assignment operator, :=, can only be used to assign the value of variables, never signals
--Likewise, the signal assignment operator, <=, can only be used to assign the value of signals.
if (clk'event and clk='1') then
b := '0' --b is made '0' right now.
a <= b; --a will be made the current value of b ('0') at time t+delta
a <= '0'; --a will be made '0' at time t+delta (overwrites previous event scheduling for a)
b := '1' --b will be made '1' right now. Any future uses of b will be equivalent to replacing b with '1'
a <= b; --a will be made the current value of b ('1') at time t+delta
a <= not(a); --at time t+delta, a will be inverted. None of the previous assignments to a matter, their scheduled event have been overwritten
--after the end of the process, b does not matter because it cannot be used outside of the process, and gets reset at the start of the process
end if;
end process;
一連の処理は、VHDLで論理的な観点から順に操作しながら、合成された場合、彼らは本当にフリップフロップの接続、複雑な同時実行文になっていることに注意することも重要です。プロセス全体は、クロック・サイクルごとに1つの単位として同時に実行されます(クロックで動作しないプロセスは純粋な組合せロジックになります)。信号は実際にフリップフロップに格納される値です。変数はプロセスを読みやすくするためのエイリアシングに過ぎません。それらは合成後に組合せ論理に吸収される。