!!!算術論理演算回路 !!入出力ポート , ,ポート名,ビット数,  ,入力,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の処理にバグがある)