フラグ出力は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 @( 変数 or 変数 or ... )	// オーバーフローフラグ
    case ( CB )
    `IADD   : V = ( 条件式 ) ? 1 : 0;
    `ISUB   : V = ( 条件式 ) ? 1 : 0;
    `IINC   : V = ( 条件式 ) ? 1 : 0;
    `IDEC   : V = ( 条件式 ) ? 1 : 0;
    `IASL   : V = ( 条件式 ) ? 1 : 0;
    default : V = 0;
    endcase
  ...
  assign F[3] = ...... ;	// 符号フラグ
  assign F[2] = ...... ;	// ゼロフラグ
  assign F[1] = V;		// オーバーフローフラグ
  assign F[0] = ...... ;	// キャリーフラグ
  ...
次は、 シミュレーション により正しく動作するかどうか確認します。
My mail address is
 kuga@cs.kumamoto-u.ac.jp .
Last modified on