15

式に遭遇したときに信号がすぐに変更されるのではなく、プロセスが終了したときに信号が変更されることを学びました。この例では、次のとおりです。

...
signal x,y,z : bit;
...
process (y)
begin
  x<=y;
  z<=not x;
end process;

例では次のように述べています。

信号 y が変化すると、x でイベントがスケジュールされ、y と同じになります。また、x の反対になるように z にイベントがスケジュールされます。問題は、z の値が y の反対になるかどうかです。もちろん、答えはノーです。2 番目のステートメントが実行されるとき、x のイベントはまだ処理されておらず、z でスケジュールされているイベントは、プロセスが開始される前の x の値の反対になるためです。

さて、私はいくつかのことを理解する必要があります:

  1. 私が学んだことから、信号値はプロセスの最後にのみ更新されます。これは正しいです?
  2. シグナルxは最初のステートメントとして更新されます。これは の値を変更しませんx。この変更はキューに入れられ、プロセスの終了後に実行されます。したがって、このステートメントの後のすべては変更を認識せず、古い値を持つことx <= yがわかります。xこれは正しいです?
  3. 2 番目のステートメントは、 signal の値を変更しようとしていますz。ここでも同じで、z はその値を変更しませんが、別のプロセスの値に依存します。変更zはキューに入れられ、プロセスの最後に実行されます。これは正しいです?

プロセスの最後には何が起こりますか?

可能性番号 1) の値xが変更され、x が新しい値を持つ。2 番目のシグナルzが更新され、最初のシグナルxが更新され、 が にz依存するx場合、その値は の NEW UPDATED 値に基づいて変更されますx。そして、例はうまくいくはずです。

可能性番号 2) の値xが変更され、x が新しい値を持つ。2 番目の信号zが更新されます。zに の古い値が割り当てられているとすると、xそれzは保持される値であり、その古い値xは更新されましたが、この更新は考慮されません。

どちらが正しい方法か教えてください。

4

3 に答える 3

12

変数は、割り当てると更新されます。シグナルは、次のデルタ サイクルで (最も早い時点で) 更新されます。

a := '1'; -- variable
assert a = 1;
b <= '1'; -- signal
computationUsing(b); --reads old value of b
-- new value will be visible after this process ends or some time passes

Jan Decaluwe は、このことについてここで詳しく説明しています: http://www.sigasi.com/content/vhdls-crown-jewel

于 2011-02-21T08:04:34.837 に答える
7

仕組み:

Y変更され、プロセスが開始されます。

X現在のものに割り当てられますY's valueが、プロセスが終了するまで割り当てられません

Znot X's old valueに割り当てられますが、プロセスの最後まで割り当てられません

プロセスは現在終了してXおり、Z更新されます

于 2011-02-20T22:59:40.280 に答える
0

私はアシュラフの投稿に同意しません。変数がワイヤで、信号がラッチである vhdl コードを自分で作成しました。例:

信号 x、y、clk; プロセス (clk) 開始 x <= y 終了プロセス

これにより、フリップフロップである同期ラッチが作成されます。

その値をシグナルに割り当てず、他の変数にのみ割り当てる変数は、完全に受け入れ可能な「ワイヤ」です。

主題全体についての私の理解は次のとおりです。

プロセス内のシグナル割り当ては、同じプロセス「インスタンス化」で行われた他のシグナル割り当てを無視します。また、同じ信号の場合、最後の割り当てのみが考慮されます。

「OK END OF THE PROCESS: 何が起こるか?????」について:

シグナルの割り当ては、プロセスのハードウェア使用率が許す限り最速で行われると思います。例外: if(rising_edge(clk)) 内の変更は、次のクロック サイクルの開始時に発生します。

于 2013-09-29T05:05:56.690 に答える