function文(1)

前回は条件演算子を用いて条件分岐を記述する方法について述べた。
実はverilogでもif文switch文に相当する記述が可能である。
今回はverilogでif文を使う方法について述べる。

『sw1がONのときはledがsw2の値, sw1がOFFのときはledがsw3の値となる回路を設計せよ』

今回はif文で記述する。
verilogでif文を使うにはfunction文の中でしか使えない。
function文とはC言語でいう関数みたいなものだが、
関数と大きく異なるのはモジュール内でしか使用できないことだ。

function (出力ビット幅)(function名);
  (入力宣言)
  (if文)
endfunction

function文は予約語functionの後にfunction名を宣言する。
functionの出力に相当するのでビット幅の指定が可能である。
次に入力宣言を行い, そのあとif文などを記述する。
例えば、さきほどの仕様を満たすfunction文は

function mux_2;
  input sw1, sw2, sw3;
  
  if( sw1 ==1'b1)begin
    mux_2 = sw2;
  end else begin
    mux_2 = sw3;
  end

endfunction

となる。ここで注意してもらいたいのは, 代入文の左辺はfunction宣言部で
宣言したfunction名になることである。また、代入文にはassignは不要ということだ。
function文では入出力の論理を記述している(つまり組合せ回路)。
if文や次回に述べるcase文を使えることから, function文では複雑な組合せ回路を記述するために使うと考えればよい。
なおbegin-endはC言語でいう中括弧'{}'であり、複数の文をまとめるときに使う。 (中括弧'{}'は連結演算子として使われているため)

さて、function文はモジュール内だけでしか使えないから今回の仕様を満たす記述は

module selector( sw1, sw2, sw3, led);
input sw1, sw2, sw3;
output led;
assign led = mux_2( sw1, sw2, sw3); // function の呼び出し
function mux_2;
  input sw1, sw2, sw3;
  
  if( sw1 ==1'b1)begin
    mux_2 = sw2;
  end else begin
    mux_2 = sw3;
  end

endfunction

endmodule

である。functionを呼び出すにはfunction宣言部で宣言したfunction名と(入力信号)を用いる。
もちろんfunctionは組合せ回路であるからassign文で代入できる。

function文にはまだ学ぶべき記述がある。
次回でさらに習得しよう。

function文(2)【Altera DE0】へ進む
Verilog入門へ戻る


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