8bit CPUを自作する(3)
シフト演算
シフト演算を実装する
算術計算と論理演算ができるようになったので、次はシフト演算を実装します。 実装する演算の種類は次の通りです。
右シフト
- RRCA
- RRA
- SRA
- SRL
左シフト
- RLCA
- RLA
- SLA
動作を考える
まずは右シフトから考えます。
| シフト | C | A3 | A2 | A1 | A0 |
|---|---|---|---|---|---|
| Original | 5 | 4 | 3 | 2 | 1 |
| RRCA | 1 | 1 | 4 | 3 | 2 |
| RRA | 1 | 5 | 4 | 3 | 2 |
| SRA | 1 | 4 | 4 | 3 | 2 |
| SRL | 1 | "0" | 4 | 3 | 2 |
このようにするとシフトの種類によって変わるのはA3だけだとわかります。
次に左シフトを考えます。
| シフト | C | A3 | A2 | A1 | A0 |
|---|---|---|---|---|---|
| Original | 5 | 4 | 3 | 2 | 1 |
| RLCA | 4 | 3 | 2 | 1 | 4 |
| RLA | 4 | 3 | 2 | 1 | 5 |
| SLA | 4 | 3 | 2 | 1 | "0" |
このようにするとシフトの種類によって変わるのはA0だけだとわかります。
回路を設計する
まずは今回使用する2入力のマルチプレクサです。

Sが0の時はAを、Sが1の時はBを出力します。
回路
ではシフトをしてくれる回路です。

右シフトと左シフトでのほとんどの部分が共通なので、そこは2入力のマルチプレクサで解決できます。 右シフトでのA3と左シフトでのA0はそれぞれ3入力のマルチプレクサで解決します。
3入力のマルチプレクサは以前の記事で作成したものを使います。 8bit CPUを自作する(2)を参照してください。
制御線
制御線S2-0も登場しました。 対応は次の通りです。
| シフト | S2-0 |
|---|---|
| RRCA | 011 |
| RRA | 010 |
| SRA | 001 |
| SRL | 000 |
| RLCA | 111 |
| RLA | 110 |
| SLA | 101 |
S2が0の時は右シフト、1の時は左シフトです。 S1が0の時はシフト、1の時はローテートです。 S0が0の時はキャリー抜きもしくは論理シフト、1の時はキャリー込みもしくは算術シフトです。
詳しくはZ80のシフト命令を参照してください。
ALUの出力
前回作成したALUと今回作成したシフタを接続します。 接続にはマルチプレクサを使います。

バス入力バス出力にしていますが、中身はさっきの2入力マルチプレクサを4つ並べたものです。
| F | Out |
|---|---|
| 0 | AL |
| 1 | Shift |
制御線Fが0の時はALUの出力を、1の時はシフタの出力を選択します。
制御線たち
ALUとシフタの制御線の代表的なものをまとめます。
| 命令 | 制御線 (F=0 S1S2 ~OR INV INC) (F=1 S0-S2) |
|---|---|
| ADD | 011100 |
| SUB | 011111 |
| AND | 001110 |
| OR | 010000 |
| XOR | 010100 |
| RRCA | 111000 |
| RRA | 101000 |
| SRA | 110000 |
| SRL | 100000 |
| RLCA | 111100 |
| RLA | 101100 |
| SLA | 110100 |
ALUのほうは~OR,INV,INCによってさらに演算を増やせますが今回は省略します。 シフト演算の5,6ビット目は0にしています。
次にやるべきこと
フラグの実装です。 Z,C,S,Nの4つを実装する予定です。