5

私が理解していることから、PROCESS 内のすべてのステートメントは順番に実行されます。では、同時シグナル代入(<=)はどうなるでしょうか? シーケンシャル代入 (:=) と同じように機能しますか、それともデルタ遅延の後に実行されますか?

デルタ遅延の後に実行する場合、PROCESS 内のすべてのステートメントをどのように順次呼び出すことができますか?

すぐに実行される場合、プロセス内の := と <= の間に違いはありますか?

4

2 に答える 2

7

シグナルの割り当て (<=) は、プロセス内のすべての順次コードの実行が完了した後に実行されます。これは、そのタイムステップのすべてのアクティブなプロセスが完了したときです。

例として、これは次のとおりです。

2 つのプロセスをトリガーするイベントがあるとします。これら 2 つのプロセスは同じシグナルを使用しますが、そのうちの 1 つがそのシグナルの値を変更します。逐次シミュレーション モデルのため、シミュレーターは一度に 1 つのプロセスしか実行できません (vhdl の並行モデルと混同しないでください)。したがって、プロセス A が最初にシミュレートされ、A がシグナルを変更した場合、B は間違ったシグナル値を持つことになります。したがって、トリガーされたすべてのプロセスが完了した後にのみ、シグナルを変更できます。

変数の代入 (:=) は即座に実行され、プロセス内にデータを一時的に格納するなどに使用できます。

于 2013-10-06T14:17:04.367 に答える
4

シーケンシャル シグナル割り当て (<=) は、シーケンシャル変数割り当て (:=) とは対照的に、更新されるシグナルの値に対して 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 つの単位として同時に実行されます (クロックで動作しないプロセスは純粋な組み合わせロジックになります)。信号は、フリップフロップに実際に格納される値です。変数は、プロセスを読みやすくするためにエイリアシングを行っているだけです。それらは、合成後に組み合わせロジックに吸収されます。

于 2013-10-07T21:10:53.007 に答える