クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

VHDLとVerilogの違い

このレッスンのあとで: 同じ回路を VHDL で書き、Verilog との違いを言える。

55分のレッスンコマンド9件デジタル設計のラボ:Verilog、VHDL、yosys を 1 台の専用 Ubuntu VM で

もう1つの記述言語 VHDL

VHDL は、Verilog と並んで広く使われる、もう1つのハードウェア記述言語です。同じ回路を2つの言語で書けると、どちらの現場の設計書も読めるようになります。

Verilog は短く書けます。VHDL は型に厳しく、書き方が決まっています。

このレッスンのゴール

メモ

同じ回路を VHDL で書き、Verilog との違いを言える。

重要な言葉

ことばいみ
エンティティ回路の外側。入力と出力だけを決める部分
アーキテクチャ回路の中身を書く部分
std_logicVHDL で1本の信号を表す型
解析ファイルを読んで、文法を調べる最初の段階
エラボレート部品をつなぎ、動かせる形にする段階

学生が入力するセルは、このプレビューでは空白です。

箱の外側と中身を分けて書く

VHDL は、回路を2つの部分に分けて書きます。入力と出力を決めるエンティティと、中身を書くアーキテクチャです。

Verilog の module は、この2つを1つにしたものです。次の表で、同じ意味の書き方を並べてみましょう。

同じ意味の書き方

意味VerilogVHDL
回路の単位module ... endmoduleentity と architecture
入力の宣言input doordoor : in std_logic
AND、OR、XOR& | ^and or xor
反転~keynot key
信号への代入assign y = a;y <= a;

学生が入力するセルは、このプレビューでは空白です。

GHDL は3段階で動かす

Verilog の iverilog と vvp に当たる道具が、GHDL です。3つの段階があります。

ghdl -a が解析、ghdl -e がエラボレート、ghdl -r が実行です。ドアと鍵の警報の回路を、VHDL で書いて動かしましょう。

VHDL で書いた警報

コード: c
library ieee;
use ieee.std_logic_1164.all;

-- entity は箱の外側、入力と出力だけを決める。
entity lock is
  port (door, key : in std_logic; alarm : out std_logic);
end entity;

-- architecture は箱の中身を決める。
architecture rtl of lock is
begin
  alarm <= door and not key;
end architecture;

作業用のフォルダを作る

コマンド
mkdir -p /tmp/lockv

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

そのフォルダに入る

コマンド
cd /tmp/lockv

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

警報の回路を書く

コマンド
printf "library ieee;\nuse ieee.std_logic_1164.all;\nentity lock is\n  port (door, key : in std_logic; alarm : out std_logic);\nend entity;\narchitecture rtl of lock is\nbegin\n  alarm <= door and not key;\nend architecture;\n" > lock.vhd

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

テストベンチを書く

コマンド
printf "library ieee;\nuse ieee.std_logic_1164.all;\nentity lock_tb is\nend entity;\narchitecture sim of lock_tb is\n  signal door, key, alarm : std_logic := '0';\nbegin\n  dut: entity work.lock port map (door => door, key => key, alarm => alarm);\n  process\n  begin\n    door <= '1'; key <= '0'; wait for 10 ns;\n    report \"door=1 key=0 alarm=\" & std_logic'image(alarm);\n    door <= '1'; key <= '1'; wait for 10 ns;\n    report \"door=1 key=1 alarm=\" & std_logic'image(alarm);\n    wait;\n  end process;\nend architecture;\n" > lock_tb.vhd

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

解析する

コマンド
ghdl -a lock.vhd lock_tb.vhd

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

エラボレートする

コマンド
ghdl -e lock_tb

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

実行する

コマンド
ghdl -r lock_tb

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

GHDL のエラーは場所を教える

VHDL は書き方に厳しいので、小さな書き損じも、解析の段階で止まります。エラーには、ファイル名、行、列、理由が書かれます。

下の Run では、port の行のセミコロンを1つ落とした回路を解析します。理由の文を読みましょう。

書き損じのファイルを作る

コマンド
printf "library ieee;\nuse ieee.std_logic_1164.all;\nentity gate is\n  port (a, b : in std_logic; y : out std_logic)\nend entity;\n" > gate_bad.vhd

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

解析してエラーを読む

コマンド
ghdl -a gate_bad.vhd

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

y <= a and b; の <= を、「以下」の意味だと読みがちです。信号への代入では、<= は代入の記号です。Verilog の assign y = a; の = に当たります。比較の場所では、同じ記号が「以下」になります。

さらに挑戦: 論理の組み合わせ

課題が通ったら、assign y = (a & b) | c; を直してみましょう。VHDL では、and と or を括弧なしで混ぜると、エラーになります。

括弧を足す規則を、to_vhdl に加える方法を考えてみましょう。まず、手で書いた答えを書いてから、コードにします。

このラボとソースについて: デジタル設計のラボ:Verilog、VHDL、yosys を 1 台の専用 Ubuntu VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。