CPUの作り方10講
どんな本
簡単なCPUを作ることでCPUの全体像を学ぶための本
流れ
アーキテクチャの決定
CPUエミュレータを作成
VHDLを用いて回路設計の学習
VHDLでCPUを設計
FPGAでCPUを動作させる
メモリの実装
パイプライン処理
アーキテクチャの決定
https://scrapbox.io/files/635558b5ada9e4001d69ed0a.png
RISC型でシンプルな命令セットのみ。15bit固定長命令。
16bit長のデータ表現
8個の汎用レジスタ
命令コード4bit
オペランド3bit x 2
絶対アドレスのみ使う
メモリマップドI/O
CPUエミュレータを作成
reg
汎用レジスタ。8つ。
rom
メインメモリのプログラム領域。実行するプログラムを配置する。8bit(256)
ram
メインメモリのデータ領域。演算中のデータなどを書き込んだりする場所。8bit(256)
各種命令と命令の分解をするコードを実装
テストはちゃんと書いた
例 mov
code:rs
// 左シフトを駆使して命令コードとオペランドを指定の位置に移動し論理和(ただの足し算)をする
// MOV(0)、ra(2),rb(3)の場合の機械語は00001001100000
// MOV << 11 == 0 << 11 == 0000,???,???,????? ・・・ (1)
// ra << 8 == 010 << 8 == ????,010,???,????? ・・・ (2)
// rb << 5 == 011 << 5 == ????,???,011,????? ・・・ (3)
// (1) | (2) | (3) == 0000,010,011,????? == 00001001100000
fn mov(ra: u16, rb: u16) -> u16 {
return MOV << 11 | ra << 8 | rb << 5;
}
SRAは何?
算術右シフト。符号ビット(+/-)を保持してシフト演算。
実装ではREG_A & 0x8000 | REG_A >> 1とする。
0x8000 = 1 000 000 000 000 000なのでREG_A & 0x8000は1 000 000 000 000 000との論理積で符号は+なら+、-なら-になる、その他の値は0との論理積で0になる。つまり符号だけ保存される。
この符号だけが保存された値とREG_Aを1bit右シフトした値の論理和を取ることで符号を保存しつつ値を右シフトしてることになる。
1~10まで足し算するコードの簡易アセンブラを作成
とりあえずはベタ書きする
命令ごとに実行するコードをそれぞれ書く
PCカウンタの値をもとに上から順にromの命令をインストラクションレジスタにロードして実行する
というか2進数 <-> 10進数変換の暗算力が低いのでだるい
リソース