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

VHDLにおける信号と変数の違いを理解する

前回のチュートリアルでは、プロセス内で変数を宣言する方法を学びました。変数はローカルなアルゴリズム処理に適していますが、そのプロセスの外からは見えません。設計の他の部分と値を共有する必要があるときは 信号(signal) を使います。

信号はアーキテクチャの宣言領域、すなわち architecture <architecture_name> of <entity_name> is と begin キーワードの間で宣言します。

本記事は「Basic VHDL Tutorials」シリーズの一部です。

信号宣言の構文:
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で信号と変数を作り、プロセス内で同じように扱いましたが、コンソール出力は明確に異なる振る舞いを示しています。主な違いは以下の通りです。

この例では、最初の2回の MySignal インクリメントは、wait for 10 ns; でプロセスが休止する前に上書きされたため失われました。休止後のインクリメントだけが正しく反映されています。

まとめ

次のチュートリアルへ »

VHDL

  1. 北斗衛星ナビゲーションシステム解説:GPSとの違いと独自の強み
  2. クラウドコンピューティング vs 従来型コンピューティング:実践的比較
  3. VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察
  4. VHDL変数の解説:実践例と信頼性設計のためのルール
  5. VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
  6. VHDLテストベンチ・シミュレーションを優雅に終了させる方法
  7. VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
  8. VHDLで乱数生成: 一様分布からOSVVMまで
  9. プロセス内プロシージャでVHDLステートマシンをクリーンに設計
  10. VHDLにおける不純関数の活用:FSMの可読性と保守性向上
  11. VHDL関数マスター:効率的な設計のための実践ガイド