もう1つの記述言語 VHDL
VHDL は、Verilog と並んで広く使われる、もう1つのハードウェア記述言語です。同じ回路を2つの言語で書けると、どちらの現場の設計書も読めるようになります。
Verilog は短く書けます。VHDL は型に厳しく、書き方が決まっています。
このレッスンのゴール
メモ
同じ回路を VHDL で書き、Verilog との違いを言える。
重要な言葉
| ことば | いみ |
|---|---|
| エンティティ | 回路の外側。入力と出力だけを決める部分 |
| アーキテクチャ | 回路の中身を書く部分 |
| std_logic | VHDL で1本の信号を表す型 |
| 解析 | ファイルを読んで、文法を調べる最初の段階 |
| エラボレート | 部品をつなぎ、動かせる形にする段階 |
学生が入力するセルは、このプレビューでは空白です。
箱の外側と中身を分けて書く
VHDL は、回路を2つの部分に分けて書きます。入力と出力を決めるエンティティと、中身を書くアーキテクチャです。
Verilog の module は、この2つを1つにしたものです。次の表で、同じ意味の書き方を並べてみましょう。
同じ意味の書き方
| 意味 | Verilog | VHDL |
|---|---|---|
| 回路の単位 | module ... endmodule | entity と architecture |
| 入力の宣言 | input door | door : in std_logic |
| AND、OR、XOR | & | ^ | and or xor |
| 反転 | ~key | not key |
| 信号への代入 | assign y = a; | y <= a; |
学生が入力するセルは、このプレビューでは空白です。
GHDL は3段階で動かす
Verilog の iverilog と vvp に当たる道具が、GHDL です。3つの段階があります。
ghdl -a が解析、ghdl -e がエラボレート、ghdl -r が実行です。ドアと鍵の警報の回路を、VHDL で書いて動かしましょう。
VHDL で書いた警報
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 に加える方法を考えてみましょう。まず、手で書いた答えを書いてから、コードにします。