【HDL】モジュールの記述方法1
1.moduleとは
Verilog HDLでは、プログラムによって論理回路を記述することができます。
shizenkarasuzon.hatenablog.com
そのときに、重要となる考え方が「モジュール(module)」というものです。
その名の通り、Verilog HDLで回路を記述するときには、回路を複数のモジュールで構成します。それぞれのモジュールは特定の回路を持っており、それらを組み合わせることで大規模で複雑な回路が完成するのです。VerilogHDLはモジュールの集合体です。
モジュール名は設計者が自由に決定することができます(予約語を除く)。
ファイルの拡張子は「.v」です。
通常、モジュールは機能ごとに作成することが多いです。
2.モジュールの構造
一つのモジュールは、このような構造をしています。
モジュールの中身は、大きく2つに分けることができ、「宣言部分」と「回路記述部分」です。宣言部では、「今からこんな変数を使って、この線(ワイヤ)を出力用に使うね」ということを書きます。
回路記述部分では、モジュールのデータ入力から出力までの回路を製作します。製作中に別のモジュールを読み込んでも構いません、(モジュール構造の階層化)
一つ一つ見ていきましょう。
ポート宣言
入出力のポートを指定します。
コード例です。
input port_A; output port_B; inout port_C;
これは、port_A, port_B, port_Cの3つのポートの入出力を宣言するコードです。
上のとおりで、ポートの種類としてinput, output, inoutの3種類が存在します。
それぞれの役割は、以下のとおりです。
input | 入力用ポート |
---|---|
output | 出力用ポート |
inout | 入出力両方可能なポート |
構文(1ビット)
構文は、次のようになっています。
input ポート名;
output, inoutの時も同様です。
配列を使う
上の構文は1ビットの入出力ポートですが、複数ビットのポートを宣言することもできます。
下の例は、32ビットのデータ入力を宣言したときのコードです。
input [31:0] data;
このように、同時に複数ビットの値を入れ込むときには、C言語の配列の様に「[A:B]」と書きます。
レジスタ宣言
次に、レジスタ宣言についてです。レジスタ宣言は、値を保持する変数を宣言することです。
reg FLAG;
このように、「reg 変数名」と書いて宣言します。宣言したレジスタの値は、そのモジュール内からアクセスすることができます。
また、先ほどと同じように「[A:B]」の構文を使って、配列構造のレジスタを作成することも可能です。
reg [31:0] data; //32ビットレジスタ
また、System Verilogでは、次のような多次元配列もサポートされています。
reg [7:0] ARRAY [0:255][0:15]; // 8ビットの要素が256×16個ある2次元配列
(初めてでも使えるVerilog HDL文法ガイド ―― 文法ガイド編|Tech Village (テックビレッジ) / CQ出版株式会社より引用)
regは任意ビットの変数を宣言しますが、そのほかにも変数宣言に使われる予約語が存在します。
変数型名 | 説明 |
---|---|
reg | 任意ビット(未指定時は符号なし) |
integer | 符号付き32bit |
time | 符号なし64bit |
real | 実数 |
realtime | 実数表記での時間 |
ネット宣言
3つ目はネット宣言です。ネット宣言では、「wire 変数名」の形で、配線に使用する変数を宣言します。
wire bus1; wire [31:0] bus2;
このように、配列を作ることもできます。
パラメータ宣言
最後にパラメータ宣言です。これは、定数を宣言するもので、C言語の#defineみたいなものです。
パラメータ宣言した後に値を変更することはできません。
また、これは必ず必要なものではありません。数値を定数として宣言して文字列で記述することで、コードを見やすくしよう!、という工夫の一つです。
パラメータ宣言の例です。
parameter THOUSAND=1000; parameter [3:0] Param=2'b0101
このように=を使って宣言します。