工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> VHDL

VHDL の信号と変数の違い

前のチュートリアルでは、プロセスで変数を宣言する方法を学びました。変数は、プロセス内でアルゴリズムを作成するのに適していますが、外部からアクセスすることはできません。変数のスコープが 1 つのプロセス内にのみある場合、他のロジックとどのようにやり取りできるでしょうか?これに対する解決策は シグナル です .

シグナルは architecture <architecture_name> of <entity_name> is の間で宣言されます 行と begin VHDL ファイルのステートメント。これは、アーキテクチャの宣言部分と呼ばれます。

このブログ投稿は、基本的な VHDL チュートリアル シリーズの一部です。

シグナルを宣言するための構文は次のとおりです。
signal <name> : <type>;

オプションで、初期値を指定してシグナルを宣言できます:
signal <name> : <type> := <initial_value>;

エクササイズ

このビデオ チュートリアルでは、シグナルを宣言する方法を学習します。また、変数とシグナルの主な違いについても学びます:

このチュートリアルで作成した最終的なコード:

entity T06_SignalTb is
end entity;

architecture sim of T06_SignalTb is

    signal MySignal : integer := 0;

begin

    process is
        variable MyVariable : integer := 0;
    begin

        report "*** Process begin ***";

        MyVariable := MyVariable + 1;
        MySignal   <= MySignal + 1;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

        MyVariable := MyVariable + 1;
        MySignal   <= MySignal + 1;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

        wait for 10 ns;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

    end process;

end architecture;

ModelSim で実行ボタンを押したときのシミュレータ コンソールへの出力:

VSIM 2> run
# ** Note: *** Process begin ***
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=1, MySignal=0
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=0
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: *** Process begin ***
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=3, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=2
#    Time: 20 ns  Iteration: 0  Instance: /t06_signaltb
...

分析

同じ初期値 0 を持つ信号と変数を作成しました。このプロセスでは、それらをまったく同じ方法で処理しましたが、出力では動作が異なることがわかります。最初に、VHDL では変数と信号への代入の表記が異なることがわかりました。変数の割り当ては := を使用します 演算子 while シグナル割り当ては <= を使用します

MyVariable 変数の振る舞いを期待するように振る舞います。ループの最初の繰り返しで、1 にインクリメントされ、次に 2 にインクリメントされます。最初の繰り返しからの最後の出力は、予想どおり、その値がまだ 2 であることを示しています。

MySignal 挙動が若干異なります。最初の +1 の増分は効果がないようです。プリントアウトは、その値がまだ初期値である 0 であることを示しています。 2 回目の +1 インクリメントの後も同様です。 MyVariable の値 は 2 ですが、値は MySignal です wait for 10 ns; の後 3 番目の出力は、MySignal の値を示しています。 は現在 1 です。その後の出力もこのパターンに従います。

この魔法は何ですか? wait for 10 ns; という手がかりを教えます それと何か関係があります。シグナルは、プロセスが一時停止されたときにのみ更新されます。私たちのプロセスは、wait for 10 ns; の 1 か所だけを一時停止します。 .したがって、信号値は、この行がヒットするたびにのみ変化します。 10 ナノ秒は任意の値であり、0 ナノ秒であってもかまいません。試してみてください!

もう 1 つの重要な観測結果は、シグナルが wait の前に 2 回インクリメントされたものの、そのイベントです。 、その値は一度だけ増加します。これは、プロセス内のシグナルに割り当てるときに、最後の割り当てが「勝つ」ためです。 <= オペレーターは新しい値をシグナルにスケジュールするだけで、wait まで変更されません。 .したがって、MySignal の 2 回目のインクリメントで 、old に 1 が追加されます 価値。再びインクリメントすると、最初のインクリメントは完全に失われます。

テイクアウト

次のチュートリアルに進む »


VHDL

  1. VHDL での符号付きと符号なし
  2. 変数 - VHDL の例
  3. クラウドコンピューティングは、従来のコンピューティングとどのように異なりますか?
  4. VHDL で文字列のリストを作成する方法
  5. VHDL テストベンチでシミュレーションを停止する方法
  6. VHDL で PWM コントローラーを作成する方法
  7. VHDL で乱数を生成する方法
  8. VHDL のプロセスでプロシージャを使用する方法
  9. VHDL で不純な関数を使用する方法
  10. VHDL で関数を使用する方法
  11. 北斗ナビゲーション衛星システムとは? GPSとどう違うの?