16 ビット ALU の入出力定義


ALUの入出力端子は以下のようになっています。被演算数"A"、演算数"B"、結果 "Y"は各々16ビットのバスです。演算機能の指定は制御信号"CB"です。制御信号 はALUに必要な演算機能が15種類あり、また3バス構成ではさらに1種類必要であ ることから、16種類となり最低4ビットは必要です。

フラグ出力は4ビットのバスであり、符号フラグ"S"、零フラグ"Z"、オーバー フローフラグ"V"、キャリーフラグ"C"があります。バスにおけるビットの順序 は上位桁から、この順序にしておきます。


この部分を alu.v として Verilog で記述してみましょう。

なお、ALUの設計からプロセッサの動作確認までは同じディレクトリ内で作業す ることに注意してください。


module alu (A, B, CB, Y, F);
  input  [15:0] A;
  input  [15:0] B;
  input  [ 3:0] CB;
  output [15:0] Y;
  output [ 3:0] F;

  reg    [16:0] tmp;	// 演算結果
  reg	 V;		// for Overflow

  always @( A or B or CB )
  begin
    case ( CB )
    `IADD   : tmp <= { 1'b0, A } + { 1'b0, B }; // 加算
       ...
       ...
       ...
       ...
       ...
       ...
       ...
       ...
       ...
    `ILSR   : tmp <= { A[0],  1'b0, A[15:1] };	// 論理右シフト
       ...
       ...
       ...
       ...
    default : tmp <= { 1'b0, A }; 		// パス演算(IPAS)
    endcase
  end

  assign Y    = 結果の再代入;

  always @( A or B or tmp or CB )
    case ( CB )
    `IADD   : V <= ( ( 条件式 ) && (  条件式 ) ) ? 1 : 0;
    `ISUB   : V <= ( ( 条件式 ) && (  条件式 ) ) ? 1 : 0;
    `IINC   : V <= ( ( 条件式 ) && (  条件式 ) ) ? 1 : 0;
    `IDEC   : V <= ( ( 条件式 ) && (  条件式 ) ) ? 1 : 0;
    `IASL   : V <= ( A[15] != tmp[15] ) ? 1 : 0;
    default : V <= 0;
    endcase

  assign F[3] = ...... ;	// 符号フラグ
  assign F[2] = ...... ;	// ゼロフラグ
  assign F[1] = V;		// オーバーフローフラグ
  assign F[0] = ...... ;	// キャリーフラグ

endmodule


次は、 演算コードの定義 についてみていきます。


| CAD Home |