フラグの記述


演算後のフラグを生成する記述を追加しましょう。

フラグ出力は4ビットのバスであり、符号フラグ"S"、零フラグ"Z"、オーバー フローフラグ"V"、キャリーフラグ"C"があります。バスにおけるビットの順序 は自由です。フラグの変化は各命令で異なり、以下のようになっています。

算術系命令
演算種類 S Z V C
加算(ADD) 結果に応じて変化 結果に応じて変化 結果に応じて変化 結果に応じて変化
デクリメント(DEC) 結果に応じて変化 結果に応じて変化 結果に応じて変化 結果に応じて変化
インクリメント(INC) 結果に応じて変化 結果に応じて変化 結果に応じて変化 結果に応じて変化
減算(SUB) 結果に応じて変化 結果に応じて変化 結果に応じて変化 結果に応じて変化

論理系命令
演算種類 S Z V C
論理和(OR) 結果に応じて変化 結果に応じて変化 常に0 常に0
排他的論理和(XOR) 結果に応じて変化 結果に応じて変化 常に0 常に0
論理積(AND) 結果に応じて変化 結果に応じて変化 常に0 常に0
論理否定(NOT) 結果に応じて変化 結果に応じて変化 常に0 常に0

シフト系命令
演算種類 S Z V C
算術右シフト(ASR) 結果に応じて変化 結果に応じて変化 常に0 結果に応じて変化
算術左シフト(ASL) 結果に応じて変化 結果に応じて変化 結果に応じて変化 結果に応じて変化
論理右シフト(LSR) 結果に応じて変化 結果に応じて変化 常に0 結果に応じて変化
論理左シフト(LSL) 結果に応じて変化 結果に応じて変化 常に0 結果に応じて変化
右回転(ROR) 結果に応じて変化 結果に応じて変化 常に0 結果に応じて変化
左回転(ROL) 結果に応じて変化 結果に応じて変化 常に0 結果に応じて変化
バイトスワップ(SWP) 結果に応じて変化 結果に応じて変化 常に0 常に0

特別な演算機能
演算種類 S Z V C  
パス(PAS) フラグレジスタに記憶されないので、ALUからの出力はdon't careという意味です。

各フラグは以下のようにすれば生成できます。


  reg V;				// for Overflow
  ...
  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] = ...... ;	// キャリーフラグ
  ...


次は、 シミュレーション により正しく動作するかどうか確認します。


| CAD Home |