トップ 一覧 検索 ヘルプ 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の処理にバグがある)