8bit CPUを自作する(3)


シフト演算

シフト演算を実装する

算術計算と論理演算ができるようになったので、次はシフト演算を実装します。 実装する演算の種類は次の通りです。

  • 右シフト

    • RRCA
    • RRA
    • SRA
    • SRL
  • 左シフト

    • RLCA
    • RLA
    • SLA

動作を考える

まずは右シフトから考えます。

シフトCA3A2A1A0
Original54321
RRCA11432
RRA15432
SRA14432
SRL1"0"432

このようにするとシフトの種類によって変わるのはA3だけだとわかります。

次に左シフトを考えます。

シフトCA3A2A1A0
Original54321
RLCA43214
RLA43215
SLA4321"0"

このようにするとシフトの種類によって変わるのはA0だけだとわかります。

回路を設計する

まずは今回使用する2入力のマルチプレクサです。

2in MUX

Sが0の時はAを、Sが1の時はBを出力します。

回路

ではシフトをしてくれる回路です。

shifter

右シフトと左シフトでのほとんどの部分が共通なので、そこは2入力のマルチプレクサで解決できます。 右シフトでのA3と左シフトでのA0はそれぞれ3入力のマルチプレクサで解決します。

3入力のマルチプレクサは以前の記事で作成したものを使います。 8bit CPUを自作する(2)を参照してください。

制御線

制御線S2-0も登場しました。 対応は次の通りです。

シフトS2-0
RRCA011
RRA010
SRA001
SRL000
RLCA111
RLA110
SLA101

S2が0の時は右シフト、1の時は左シフトです。 S1が0の時はシフト、1の時はローテートです。 S0が0の時はキャリー抜きもしくは論理シフト、1の時はキャリー込みもしくは算術シフトです。

詳しくはZ80のシフト命令を参照してください。

ALUの出力

前回作成したALUと今回作成したシフタを接続します。 接続にはマルチプレクサを使います。

ALU Merge

バス入力バス出力にしていますが、中身はさっきの2入力マルチプレクサを4つ並べたものです。

FOut
0AL
1Shift

制御線Fが0の時はALUの出力を、1の時はシフタの出力を選択します。

制御線たち

ALUとシフタの制御線の代表的なものをまとめます。

命令制御線 (F=0 S1S2 ~OR INV INC) (F=1 S0-S2)
ADD011100
SUB011111
AND001110
OR010000
XOR010100
RRCA111000
RRA101000
SRA110000
SRL100000
RLCA111100
RLA101100
SLA110100

ALUのほうは~OR,INV,INCによってさらに演算を増やせますが今回は省略します。 シフト演算の5,6ビット目は0にしています。

次にやるべきこと

フラグの実装です。 Z,C,S,Nの4つを実装する予定です。