トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

alu.v

算術論理演算回路

入出力ポート

  ポート名 ビット数  
入力 a 16 オペランド(2項演算の場合は第2オペランド)
入力 b 16 2項演算の場合の第1オペランド
入力 f 5 演算の種類の選択
出力 s 16 演算結果

fが整数演算のとき,a,b,sは2の補数として取り扱います.

ネット

ネット名
x aに16'h8000を加算した値
y bに16'h8000を加算した値

ソースコード

`include "defs.v"

module alu(a, b, f, s);

 input [15:0] a, b;
 input [4:0] 	f;
 output [15:0] s;
 reg  [15:0] 	 s;
 wire [15:0] x, y;

 assign x = a + 16'h8000;
 assign y = b + 16'h8000;
  
 always @(a or b or x or y or f)
   case(f)
     `ADD : s = b + a;
     `SUB : s = b - a;
     `MUL : s = b * a;
     `SHL : s = b << a;
     `SHR : s = b >> a;
     `BAND: s = b & a;
     `BOR : s = b | a;
     `BXOR: s = b ^ a;
     `AND : s = b && a;
     `OR  : s = b || a;
     `EQ  : s = b == a;
     `NE  : s = b != a;
     `GE  : s = y >= x;
     `LE  : s = y <= x;
     `GT  : s = y > x;
     `LT  : s = y < x;
     `NEG : s = -a;
     `BNOT : s = ~a;
     `NOT : s = !a;
     default : s = 16'hxxxx;
   endcase

endmodule
注1
ビット列は符号なし整数として扱われるので,aとbの大小比較を2の補数として行うために,16'h8000を加算したxとyを導入.つまり,aとbの最上位ビットを反転したものがxとyになる.符号なし整数xとyの大小比較は2の補数aとbの大小比較と一致する.
注2
Verilog2001の場合,signedが使えるので,xとyを使う必要はない.a,b,sを,singedをつけて(input signed, output signed, reg signedなど)宣言する.ただし,シミュレータ,論理合成ツールによってはsignedの扱いにバグがあるので注意が必要.(例えば,Icarus Verilogにはsignedの処理にバグがある)

最終更新時間:2007年11月19日 18時14分13秒