blog mark

Posted on Mon, Feb 5, 2024 blog

以下为遇见的优秀博客

5 月

VHDL/Veilog 入門

VHDL/Verilog入門 はじめに 本章では,ハードウェア記述言語(HDL; Hardware Description Language)のうち,よく使用されるVHDLとVerilog HDLの二つのHDLの基本文法を説明します.ちょっとした違いを発見しながら読み進めると面白いでしょう. ソフトウェア・プログラミングで使用するCやJava,コミュニケーションで使用する英語についても,正しく使用するために文法の知識は欠かせません.同じようにHDLで設計する際も文法の知識が必要です.ここで,基本文法をしっかり押さえましょう. ハードウェア記述言語の基本概念 プログラミング言語に多くの種類があるように,ハードウェア記述言語(HDL)にもさまざまな種類があります.その中でもよく利用されるのが,VHDLとVerilog HDLです.VHDLとVerilog HDLは,どちらも,ハードウェアを表現するための似たような概念を取り扱うことができる言語です. ただし,似たような概念でもそれぞれの言語で使用する言葉が違うので注意が必要です.両方の言語に共通する概念と,言語の特徴について説明します. 構造の基本 — エンティティ/モジュール どの言語にも基本的な構造があります.たとえば,Cでは関数,Javaではクラスなどです.HDLでは,与えられた入力に対して出力を生成するブロックが基本的な単位です(図1).このブロックをVHDLではエンティティ entity ,Verilog HDLではモジュール module と呼びます.ただし,この章では,特にVHDLやVerilog HDLに違いがない説明では,モジュールと呼ぶことにします. 図1: ハードウェア・プログラミングの基本的な単位 通常のプログラミング言語とHDLの大きな違いは,エンティティ/モジュールは,最初から最後まで与えられた入力に対する出力を生成し続けるということです.Cなどで関数を呼び出す場合,mainプログラムからその関数内へ処理が移ります(図2).処理を終えると戻り値を呼び出し元に返し,mainプログラムが再び動き始めます.つまり,mainプログラムは,呼び出した関数の処理が完了するまで待たされます.これは,プログラム・カウンタが,プログラムを順々に呼び出して実行するからです. 図2: Cで記述した一般的なソフトウェア・プログラムの実行の様子 一方,HDLで記述されたエンティティ/モジュールには,共通のプログラム・カウンタのような,複数の演算回路の動作を制御する仕組みはありません.(図3).どのモジュールも常に存在し,独立して動作します.したがって,特定の入力を与えると出力を返すというよりも,入力されているデータに対して出力するデータを作り続けているというイメージになります.複数のモジュール間で制御が必要であれば自分で,そのように設計する必要があります. 図3: ハードウェアは常に存在し,演算回路の動作が制御されることはない(制御が必要なら自分で記述する必要がある) 2種類の基本処理方法 — 同時処理文と順次処理文 繰り返しになりますが,ハードウェア・プログラミングでは,独立して動作するモジュールを扱う必要があります.すなわちハードウェアを記述するための言語では,独立して動作する同時並行的な処理を記述できる必要があります.とはいえ,実現したい処理によっては,条件分岐のような依存関係のある処理の記述が望まれます.これらの要求を満たすため,VHDLとVerilog HDLのどちらも,同時処理文と順次処理文と呼ばれる二種類の記述方式をサポートしています.具体的な記述方法は後で説明しますが,それぞれの考え方を頭に入れておいてください. 同時処理文 同時処理文とは,周りの処理に依存せず独立して動作する処理です.複数の同時処理文は,ある特定の時点で一斉に処理されます.そのため,記述順や各処理文の間には,構文的な順序が存在せず,「ある時点」で入力された値に従って出力が生成されます.出力が確定するまでの時間は,物理的にデバイスの中を電気が流れる速さや信号遅延に依存します. 順次処理文 順次処理文は,複数の処理同士に構文などによって順序が規定された処理です.たとえば,ソフトウェアには欠かせない分岐などの制御文の表現には順序が必要になります. 使用できる変数 — 数値と信号 プログラミング言語と同じようにHDLでも変数を利用できます.VHDLでもVerilog HDLでも,変数はすべて型を持ちます.ハードウェアとして,基本的な型は1本の信号線です.また,信号線を束ねた配列もサポートされます.このほかに,整数や自分で定義した型も利用できます. 変数は,英数字からなる名前を付けることができます.変数名の先頭は英字または「_」で始める必要があり,末尾を「_」にしてはいけません.Verilog HDLでは,大文字と小文字は区別されます. 演算の基本 — 算術/論理減算,比較,代入 VHDLおよびVerilog HDLでは加減算や論理演算,比較などの演算子を利用することができます.ソフトウェア・プログラミングの場合は演算子を使って記述された処理はプロセッサに与える命令に変換されますが,HDLの場合は,その演算に相当するハードウェア・ロジックとしてLUTやFFなどの組み合わせに合成されます.FPGAの中には,小さなディジタルシグナルプロセッサや乗算器を持つものがあり,条件にうまく合致すると,それらが使用されます. HDLでもソフトウェア・プログラミング同様に,演算した結果を代入演算を利用して,ほかの(あるいは同じ)変数に代入することができます.HDLの代入には,ブロッキング代入とノンブロッキング代入の2種類があります.ブロッキング代入は,その時点で値を代入して次に進む代入です.一方,ノンブロッキング代入は,複数の代入文において,それらの代入の同時実行を規定します.Cなどで記述した単一スレッドのソフトウェア・プログラムの代入は,HDLでいうところのブロッキング代入に相当します. 値の基本 — ‘0’,‘1’,‘Z’,‘X’ ハードウェアの値は'0’と'1’の値をとります.加えて,ハードウェアにはハイ・インピーダンスという,「抵抗が無限大」を意味する状態が存在します.VHDLやVerilog HDLでは’Z’で表されます.値として「抵抗が無限大」というのは,少しわかりにくいかもしれません.物理的には,図4のようにスイッチを切った状態をイメージしてください.複数の信号が一つにまとめられるとき,‘Z’は,「ほかの値に影響を与えない」ということを意味します. 図4: HDLではハイ・インピーダンスでスイッチオフを記述できる.