|
ポート名 |
ビット数 |
|
入力 |
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秒