1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

新たなCPUを作ろう!!【RISC風CPU・後編】

Last updated at Posted at 2025-12-21

さあやってまいりました!!
今回はついにCPUの回路を製作していきたいと思います!!

今回もlogisim-evolutionで製作します。

0.今回設計するCPUの仕様

image.png

今回は構造も簡単で作りやすいHACK CPUの回路を参考にします。
HACK CPUには以下のユニットがあります。

  • ROM
  • control Unit
    • ALU
    • JMP Unit
    • CPU control unit
    • Mov Unit
    • Load/Store Unit
  • reg/ram(=memory)
  • PC(counter)
  • clock

今回のCPUはHACKベースなので理解しやすいよう先にHACKの回路について解説します。


クロック信号について
クロックの上り(rising edge)で演算・出力
クロックの下り(falling edge)で記憶

なので基本的にはfalling edgeをよく使う

命令セット(ISA)について
ISAは以下の記事を参照。

各ユニットの簡単な説明

ROM

プログラムを格納する場所です。
ROMのAd番目の値を出力します。
scratchのリストと似ていますが編集機能はありません

control unit

image.png

Control unitは名前の通りCPUをコントロールする重要な役割を持つユニットです。
コントロールユニットは命令を解析し必要に応じて後述するユニットに命令を送ります。
(画像では15bit目が1ならALU instructionというユニットに命令を送っています)
画像のIは命令で
A,D,*Aはhack CPUオリジナルのレジスタを表しています。
出力のRは結果でa,d,*aはどのレジスタを書き換えるかを表しています。
jはジャンプする必要があるか判断する際に用いられます。

ALU

image.png

CPUの計算機能を担う重要な場所。
X,Yをop通りに計算し出力します。
画像の通り中には
算術系の演算を行うarithmetic unitとビット操作を行うlogic unitがあります。

JMPunit

image.png
Xの値と0を比較し、条件が揃っているなら1を出力します。

条件 意味
lt  0未満
eq 0と等しい
gz 0より大きい

memory

register

値を保存する場所
ここでは16bitの値を保存できます。
主に計算するときに使われます。
保存するためにはクロック信号が必要です。

RAM

簡単に言うとregisterの集合体
演算結果を一時的に保存したしする時に使います。

pc

image.png
PCはプログラムカウンタの略で、クロック信号を受け取る度に+1されるカウンタ(レジスタ)です。
st(control unitでいうJ)が1になるとXの値に書き換えます。
(すると命令を読み込む場所が変わるのでジャンプしたことになります。)

clock

コンピュータ内部のCPUやメモリなどの部品が、同じリズムで動くように指示を出す「規則正しい電気信号」です。

CPUはこう見えて全体のUNITの更新が完了するまで数百psかかります。
更新する時間はUNITによって違うので基準となる信号が必要です。
その信号がクロック信号です。

ということで実際に作っていきましょう

1.RAM/レジスタ

image.png


記憶装置なので全部falling edgeにしています。

M_wメモリに書き込むか
M_data書き込むデータ
R_type書き込むレジスタのID
R_dataレジスタのデータ
CLクロック信号
resetリセット信号

2コントロール装置

image.png


色々なユニットがあります。
左から A命令、D命令、B命令、C命令 実行ユニットとなっています。

今回はその中でも構造が複雑なB,D命令実行ユニットを開設します。

って言ってもA,C命令実行ユニットはだたの大きなマルチプレクサなんだよなぁ

2.1 ALU(B命令実行ユニット)

image.png


1番の回路で入力を変換 (0001ならr1の値に変換)
2番の回路でも入力を変換
3番の回路では演算部、演算を行います。
4番の回路で演算結果を切り替えます(op 0000ならaddの結果を出力)
5番の回路はオーバーフローしたか、余が出たか などを判断し出力。ジャンプなどに使用。

2.2 JMP Unit(D命令実行ユニット)

image.png


1番の回路ではreg1 = reg2かどうかを調べています。
2番の回路ではreg1 - reg2してreg1 < reg2かどうかを調べています。
3番の回路ではreg2 - reg1 してreg1 > reg2かどうかを調べています。
4番の回路では1~3の結果をMUXに入れることでジャンプするか決めています。
このソフトの引き算の回路では引き算の結果が0だとオーバーフローフラグが1にならないので

=かを調べる回路の出力をA
<かを調べる回路の出力をB 
>かを調べる回路の出力をC

としたときのジャンプコードの関係は以下のとおりです。

ジャンプコード op 条件 論理回路
000 JMP 強制 固定1出力
001 JEQ r==Ŕ A
010 JNE r!=Ŕ not(A)
011 JGT r>Ŕ C
100 JLT r<Ŕ B
101 JGE r>=Ŕ A or C
110 JLE r<=Ŕ A or B
111 none none 固定0出力

3.カウンター/ROM

image.png


構造はとても簡単で
falling edgeのカウンターとプログラムが格納されたROMしかありません。
入力ピンの説明:

JMPカウンターを書き換えるか(ジャンプするか)
resetカウンターを0にする(起動時使用)
Xジャンプアドレス

完成系

テストコードを実行してちゃんと動くかテストします。

等差数列計算
MOV AR,r0
MOV r3,0x1
IN r1
JEQ r1,r0 //入力が0ならジャンプ
ST r1

MOV AR,0x1
MOV r3,0x
IN r1
JEQ r1,r0 //入力が0ならジャンプ
ST r1

//out命令のテスト
MOV r2,0xf0f0
OUT r2

//初期化
MOV r1,r0
MOV r2,r0
MOV r3,r0

MOV r7,0x13 //ループ開始アドレス
MOV r6,0x3//結果カキコ位置
MOV AR,r6 //AR=0x3
//loop
SUB r4,r6,1 // r4=r6-1
SUB r5,r6,2 // r5=r6-2

MOV AR,r4 //AR=r4
LD r1
MOV AR,r5
LD r2

ADD r3,r1,r2
MOV AR,r6
ST r3

ADD r6,r6,1//カキコアドレスをインクリメント

JMP r7

r1入力
r2OUTテスト
r3ジャンプアドレス

r1数1
r2数2
r3結果
r4アドレス -1
r5アドレス -2
r6アドレス
r7ループ開始アドレス

バイナリにアセンブルします。

0010000000000000
0001011100000001
1101000100000000
1110001011001000
1010010000000000
0011000100000001
0001011100000110
1101000100000000
1110001011001000
1010010000000000
0001010111110000
0001010010101010
1101101000000000
0000001000000000
0000010000000000
0000011000000000
0001110100000011
0010110000000000
0001111100010011
0111001100010001
0111011100010010
0010100000000000
1000010000000000
0010101000000000
1000100000000000
0100110010100000
0010110000000000
1010110000000000
0111101100000001
1110000111000000

このままだとソフトに入力できないので16進数に変換して入力します。



2000 ...DONE
1701 ...DONE
d100 ...DONE
e2c8 ...DONE
a400 ...DONE
3101 ...DONE
1706 ...DONE
d100 ...DONE
e2c8 ...DONE
a400 ...DONE
15f0 ...DONE
14aa ...DONE
da00 ...DONE
0200 ...DONE
0400 ...DONE

0600 ...DONE
1d03 ...DONE
2c00 ...DONE
7311 (ALUへの線の一部が繋がってなかった)
7712 ...DONE
2800 ...DONE
8400 (LD/STが逆になってたので修正)
2a00 ...DONE
8800 (0rrrがrrr0になっていたので修正)
4ca0 ...DONE
2c00 ...DONE
ac00 ...DONE
7b01 ...DONE
e1c0 ...DONE

実行結果はこんな感じ⇩

配布

このCPUは

にあります。

使い方は書いてあるよ

まとめ

ということでCPU編はこれにて終了です。
ここまで読んでくれてありがとうございました。
次回からは別のことをします。
お楽しみに!!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?