VHDL: 環境構築
2026/05/10

WindowsでVHDLのSimulation環境作成

  • VHDLのSimulation環境をWindows上で作成します。とは言うものの現在のWSL2はGUIもシームレスなので、WSL2上でSimulation環境を作成します。

  • 前提として、VHDL-2008の規格を意識した環境作成とRTL記述になります。そのため、Webで拾ってきた記述や古い入門本の記述は、本環境(Simulatorのオプション指定)ではエラーになります。例として下記パッケージの使用は想定に入りません。ご注意下さい。
    use ieee.std_logic_unsigned.all; -- 使いません
    use ieee.std_logic_signed.all;   -- 使いません
    use ieee.std_logic_arith.all;    -- 使いません
    

WSL2

  • WSL2上でVHDLのSimulation環境を作成します。最初にWindows 11でコマンドプロンプト(又はPowerShell)を管理者権限で起動し下記コマンドを実行します。
    >wsl --install -d Ubuntu-24.04

  • Ubuntu-24.04がインストールされなかったら、再起動後にもう一度実行して下さい(*1)

GHDL

  • WSL2インストール後、Ubuntuを実行してターミナル(bash)を開き、下記コマンドでGHDL(VHDL Simulator)をインストールします。
    $ sudo apt update
    $ sudo apt upgrade -y
    $ sudo apt install ghdl -y
    

GTKWave

  • 続いてGTKWave(波形Viewer)をインストールします。
    $ sudo apt install gtkwave -y
    

Visual Studio Code: 本体インストール

  • エディタとしてVisual Studio Codeを使用します。Windows側でインストールして下さい。

Visual Studio Code: VHDL用拡張機能インストール

  • VHDL用の拡張機能としてTerosHDLをインストールします。VSCode左側の拡張機能アイコンをクリックして下さい。
    alt text

  • 検索BoxにTerosHDLと入力し、現れた拡張機能をインストールして下さい。
    alt text

GHDL:Analyze⇒Simulation

  • analyze(-a) ⇒ elaborate(-e) ⇒ run simulation(-r) の順番で実行します。
    $ ghdl -a --std=08 VHDLファイル名 VHDLファイル名 ...
    $ ghdl -e --std=08 トップentity名
    $ ghdl -r --std=08 トップentity名 --fst=FSTファイル名 
    

GTKWave:波形確認

  • FSTファイルを見ることで、波形から動作を確認できます。Linuxシェル上のコマンド入力なので、最後の&(バックグラウンド実行)を忘れないで下さいね。
    $ gtkwave FSTファイル名 &
    
  • では、一度VHDL作成から波形確認まで一通りやってみましょう。

まずはUbuntuを実行

  • WindowsのメニューからUbuntuを実行します。コマンドプロンプトっぽい画面が出てくればOKです。
    ユーザー名@PC名:~$
    
  • 以降はシェル上のユーザー名@PC名~を省略して$と表記します。

作業ディレクトリの作成

  • 作業ディレクトリを作り、そこへ移動します。
    $ cd
    $ mkdir rtl
    $ mkdir rtl/vhdl
    $ cd rtl/vhdl
    

VHDLの回路記述

  • 4bitの加算回路を書いてみましょう。
    $ code adder_4bit.vhd
    
  • VSCodeで下記のように編集して下さい。
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    entity adder_4bit is
      port (
          a : in std_logic_vector(3 downto 0);
          b : in std_logic_vector(3 downto 0);
          q : out std_logic_vector(3 downto 0)
      );
    end adder_4bit;
    
    architecture RTL of adder_4bit is
      signal w_a : unsigned(3 downto 0);
      signal w_b : unsigned(3 downto 0);
    begin
      w_a <= unsigned(a);
      w_b <= unsigned(b);
            
      q <= std_logic_vector(w_a + w_b);
    end RTL;
    

回路記述のAnalyze確認

  • エラーが出なくなるまで頑張りましょう。何も表示されずに、Analyzeコマンドが終了すればOKです。
    $ ghdl -a --std=08 adder_4bit.vhd
    $ 
    

VHDLのテストベンチ記述

  • 4bit加算回路の入力に値を加えるテストベンチ(VHDL)を編集します。
    $ code tb.vhd
    
  • VSCodeで下記のように編集して下さい。
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    entity tb is
    end tb;
    
    architecture SIM of tb is
      constant CYC : Time := 100 ns;
    
      signal w_a : unsigned(3 downto 0) := "0000";
      signal w_b : unsigned(3 downto 0) := "0000";
      signal w_q : std_logic_vector(3 downto 0);
    
    begin
      dut : entity work.adder_4bit port map (
          a => std_logic_vector(w_a),
          b => std_logic_vector(w_b),
          q => w_q
      );
    
      process begin
          wait for CYC; w_a <= "0001"; w_b <= "1000";
          wait for CYC; w_a <= "0010"; w_b <= "1100";
          wait for CYC; w_a <= "1110"; w_b <= "0011";
          wait;
      end process;
    end SIM;
    
    configuration cfg_tb of tb is
      for SIM
      end for;
    end cfg_tb;
    

テストベンチ記述のAnalyze確認

  • エラーが出なくなるまで頑張りましょう。何も表示されずに、Analyzeコマンドが終了すればOKです。
    $ ghdl -a --std=08 tb.vhd
    $ 
    

回路構造のElaborate

  • 回路記述とテストベンチ記述の構造認識/組み上げ実行です。最上位となるテストベンチのentity名tbを指定します。何も表示されずに、Elaborateコマンドが終了すればOKです。
    $ ghdl -e --std=08 tb
    $ 
    

Simulation実行

  • Simulation実行です。テストベンチのEntity名(tb)と、FST(波形)ファイル名(wave.fst)を指定します。
    $ ghdl -r --std=08 tb --fst=wave.fst
    $ 
    

波形ビューアによる波形確認

  • Simulation実行後は、wave.fstができているはずです。
    $ ls
    adder_4bit.vhd  tb.vhd  wave.fst  work-obj08.cf
    
  • GTKWaveでwave.fstを見てみましょう。'&'を忘れずに付けて下さい。
    $ gtkwave wave.fst &
    
  • 下記のようなGUIが出てきます。


  • 左上部の▼SST画面tbをクリックすると階層が出るので、dutをクリックします。
    alt text

  • 左中央部に信号リストが表示されるので、マウスで全てセレクトします。
    alt text

  • 左最下部にある[Append]ボタンを押すと...
    alt text

  • 信号が波形表示部に追加されます。
    alt text

  • 最初は拡大されすぎ状態なので、上部にあるZoom Fitアイコンを押してみましょう。
    alt text

  • 波形全体が見渡せる状態になります。a + b = q になっていますね!!
    alt text

  • 使用方法の詳細は gtkwave.pdf を参照して下さい。

Appendix: MakefileでAnalyze〜Simulation

  • VHDLファイルを修正した後、Analyze/Elaborate/Runをいちいちコマンドで入れるのは面倒ですよね。そんな場合はMakefileを用意しましょう。makeで必要な操作をしてくれます。下記はMakefile例ですが、上部のdesign_rtl変更だけで汎用的に使えます。
    # =============================================================================
    # Makefile for VHDL simulation with ghdl
    # =============================================================================
    # you can modify design_rtl, name_top and name_fst for your design
    design_rtl = \
      adder_4bit.vhd
    
    name_top = tb
    name_fst = wave.fst
    
    # =============================================================================
    # design and test bench files
    list_rtl = \
      $(design_rtl) \
      $(name_top).vhd
    
    # simulator commands and options
    sim_ana = ghdl -a --std=08 $(list_rtl)
    sim_elb = ghdl -e --std=08 $(name_top)
    sim_run = ghdl -r --std=08 $(name_top) --fst=$(name_fst)
    
    # flag definitions
    flag_folder = flag
    flag_ana = $(flag_folder)/analyze
    flag_elb = $(flag_folder)/elaborate
    flag_run = $(flag_folder)/run
    
    # final process
    all: $(flag_run)
    
    # process definitions
    $(flag_ana): $(list_rtl)
      mkdir -p $(flag_folder)
      $(sim_ana)
      touch $(flag_ana)
      
    $(flag_elb): $(flag_ana)
      $(sim_elb)
      touch $(flag_elb)
    
    $(flag_run): $(flag_elb)
      $(sim_run)
      touch $(flag_run)
    
    # clean
    clean:
      rm -rf $(name_fst) work-*.cf $(flag_folder)
    
  • fstファイルは、fst2vcdコマンドで、いつでもvcdに変換できます。
    $ fst2vcd wave.fst -o wave.vcd
    

Notes

  1. wsl本体がインストールされていない場合、この状態になることがあります。
Copyright(C) 2026 Altmo
本HPについて