- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!算術論理演算回路
!!入出力ポート
, ,ポート名,ビット数,
,入力,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の処理にバグがある)