フラグは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 | 結果に応じて変化 | 常に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