モジュールとwire

ようやく組合せ回路編もおしまい。あと少しなので頑張ってくださいm(_ _)m
C言語では関数を呼び出す(使いまわす)ことで記述量を大幅に削減できた。
verilogでもモジュールを呼び出すことができる。
例えば4bit加算器を設計してみよう。

module adder_4( a, b, c);
  input [3:0]a, b;
  output [3:0]c;
  
  wire c1, c2, c3;// wire宣言
  
  full_adr full_adr_inst1( .x(a[0]), .y(b[0]), .carry_in(1'b0), .sum(c[0]), .carry_out(c1)); //インスタンス化
  full_adr full_adr_inst2( .x(a[1]), .y(b[1]), .carry_in(c1), .sum(c[1]), .carry_out(c2));
  full_adr full_adr_inst3( .x(a[2]), .y(b[2]), .carry_in(c2), .sum(c[2]), .carry_out(c3));
  full_adr full_adr_inst4( .x(a[3]), .y(b[3]), .carry_in(c3), .sum(c[3]), .carry_out());
  
endmodule

module full_adr( x, y, carry_in, sum, carry_out);
  input x, y, carry_in;
  output sum, carry_out;
  
  wire w1, w2, w3;
  
  half_adr half_adr_inst1( .x( x), .y( y), .s( w1), .c( w2));
  half_adr half_adr_inst2( .x( carry_in), .y( w1), .s( sum), .c( w3));
  
  assign carry_out = w2 | w3;
  
endmodule

module half_adr( x, y, s, c);
  input x, y;
  output s, c;
  
  assign s = x ^ y;
  assign c = x & y;

endmodule

最初のモジュール adder_4 では4bit加算器を記述している。
(下の図は6bit加算器だが。wikiから拾ってきたので…著作権的に問題なら自分で描きます)

adr_4.png

このモジュールでは full_adr というモジュールを呼び出している。
モジュールを呼び出すにはインスタンス化(instantiation)を行わなければならない。
JavaやC++などのオブジェクト指向言語を知ってるならすぐわかったと思う。
要は予め宣言したモジュールを生成しているのである。

インスタンス化するには「インスタンス化(呼び出)されるモジュール名」「インスタンス名」を 宣言し、次にポートの接続を行う。
C言語の関数呼び出しと同じく, 信号線の順序とインスタンス化されたモジュールのポート宣言順が 一致していれば .a( x) のような記述は不要である。
ただし、人間は間違いがあるから .a( x)の記述をお勧めする。

ドット'.'(インスタンス化させるモジュールのポート名)括弧'()'

で信号線の接続を記述する。書式がややこしいので例題を見てもらうと理解しやすいと思う。

また、adder_4ではa,b,cという入出力信号が接続されている。
full_adr間のキャリー(桁上げ)信号線は wire という内部信号線で接続する。
wire宣言でwire信号を宣言できる。input宣言やoutput宣言と同じく信号線を定義する。

モジュールfull_adrではhalf_adr(半加算器)2個で全加算器を記述している。
加算器については詳しくはググルなりして自分で調べてね。
ここでもhalf_adrのインスタンス化を行い, w1,w2,w3というwire信号で half_adr間を接続している。

full_adr.png

最後にhalf_adrは半加算器を記述している。
特に難しくはないと思われる。

half_adr.png

ところでこのverilogソースだが実はfunction文を使っても記述できる(演習問題)。
function文を使うか、moduleを使うか迷ったときはmoduleで書くことをお勧めする。

  1. 1つのモジュールの記述量が分散するのでモジュール毎のソースが理解しやすい
  2. moduleは設計毎に使いまわせる

一方, function文を使うメリットは

  1. if文case文が使える

の一言に尽きると思う。最終的には設計者の好みだけど。

演習問題

  1. 例題で示した4bit加算器をfunction文を使って記述せよ
  2. 算術演算子'+'を使って4bit加算器を記述せよ。また, 例題の記述との違いを議論せよ。

お疲れ様でした。これで組み合わせ回路編はおしまいです。 次回からは順序回路編です! 頑張って習得していきましょう。

Verilog入門へ戻る


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-04-15 (金) 14:29:55 (2316d)