生きた証。( -_-)
自分が作ったCPUの仕様についての話。
はじめに
パタヘネとMIPS R3000仕様書の本があれば
センスある人なら一カ月もかからないはず。
センスある人なら一カ月もかからないはず。
自分はセンスないからかなりかかった・・・・。
あとは動作確認での時間がかなりかかるのでシミュレーション用プログラムを
つくっておくとかなり楽。というか手書きだと死ぬ。
つくっておくとかなり楽。というか手書きだと死ぬ。
実機で動作確認できてこそ初めて「実装完了」ですので
ISEで大丈夫だったから動くなんて甘いです。('A')
ISEで大丈夫だったから動くなんて甘いです。('A')
興味があればつくってみよー。
スペック
CPU | MIPS R3000 51.336MHz |
メモリ | 128MB |
その他 | キャッシュ無し、浮動小数演算非サポート |
MIPSとは?
MIPS Technologies Incが開発したRISCマイクロプロセッサのアーキテクチャ Microprocessor without interlocked pipeline stages(パイ プラインステージがインターロックされないマイクロプロセッサ)の略 命令セットが非常にきれいなので、コンピュータ・アーキテ クチャを学校で教えるときに教材としてMIPSアーキテクチャを使うことが多い ゲーム機分野でもよく使われており、NINTENDO64、ソニーの PlayStation、PlayStation2、PSPでもMIPSアーキテクチャのプロセッサが使われた。
などなど
ちなみに
NINTENDO64(MIPS 64ビットRISC R4300カスタム), PS(MIPS 32bit コア R3000カスタム), PS2(Emotion Engine(MIPSベース)), PSP(MIPS 32bit コア R4000×2)で、
今回はR3000を実装しております。
がんばればプレステレベルのCPUをつくれるのでしょうか‥‥‥?
実行可能な命令
後で命令の種類によって整理します。
命令 | 意味 | 命令形式 | 例外 |
ADD | 加算 | ADD rd,rs,rt | オーバフロー例外 |
ADDI | イミディエイト(即値)の加算 | ADDI,rt,rs,immediate | オーバフロー例外 |
ADDIU | イミディエイト(即値)の加算(無符合) | ADDIU,rt,rs,immediate | |
ADDU | 加算(無符合) | ADDU rd,rs,rt | |
AND | 論理積 | AND rs,rs,rt | |
ANDI | イミディエイト(即値)の論理積 | ANDI rt,rs,immediate | |
BEQ | 等号での分岐 | BEQ rs,rt,offset | |
BGEZ | ゼロ以上の分岐 | BGEZ rs,offset | |
BGEZAL | ゼロ以上の分岐とリンク | BGEZAL rs,offset | |
BGTZ | ゼロ以上での分岐 | BGTZ rs,offset | |
BLEZ | ゼロ以下の分岐 | BLEZ rs,offset | |
BLTZ | ゼロ未満の分岐 | BLTZ rs,offset | |
BLTZAL | ゼロ未満の分岐とリンク | BLTZAL rs,offset | |
BNE | 不等号での分岐 | BNE rs,rt,offset | |
DIV | 除算 | DIV rs,rt | |
DIVU | 除算(無符合) | DIVU rs,rt | |
J | ジャンプ | J target | |
JAL | ジャンプとリンク | JAL target | |
JALR | ジャンプとリンクのレジスタ | JAL rs または JALR rd,rs | |
JR | ジャンプレジスタ | JR rs | |
LB | バイトのロード | LB rt,offset(base) | *1 |
LBU | バイトのロード(無符合) | LBU rt,offset(base) | *1 |
LH | ハーフワードのロード | LH rt,offset(base) | *1 |
LHU | ハーフワードのロード(無符合) | LHU rt,offset(base) | *1 |
LUI | 上位イミディエイトのロード | LUI rt,immediate | |
LW | ワードのロード | LW rt,offset(base) | *1 |
LWL | ワードの左ロード | LWL rt,offset(base) | *1 |
LWR | ワードの右ロード | LWR rt,offset(base) | *1 |
MFHI | HIからの転送 | MFHI rd | |
MFLO | LOからの転送 | MFLO rd | |
MTHI | HIへの転送 | MTHI rs | |
MTLO | LOへの転送 | MTLO rs | |
MULT | 乗算 | MULT rs,rt | |
MULTU | 乗算(無符合) | MULTU rs,rt | |
NOR | 否定論理和 | NOR rd,rs,rt | |
OR | 論理和 | OR rd,rs,rt | |
ORI | イミディエイト(即値)の論理和 | ORI rt,rs,immediate | |
SB | バイトの格納 | SB rt,offset(base) | *1 |
SH | ハーフワードの格納 | SH rt,offset(base) | *1 |
SLL | 論理左シフト | SLL rd,rt,shamt | |
SLLV | 論理変数左シフト | SLLV rd,rt,rs | |
SLT | 未満へのセット | SLT rd,rs,rt | |
SLTI | イミディエイト未満へのセット | SLTI rd,rs,rt | |
SLTIU | イミディエイト未満へのセット(無符合) | SLTIU rd,rs,rt | |
SLTU | 未満へのセット(無符合) | SLTU rd,rs,rt | |
SRA | 算術右シフト | SRA rd,rt,shamt | |
SRAV | 算術変数右シフト | SRAV rd,rt,rs | |
SRL | 論理右シフト | SRL rd,rt,shamt | |
SRLV | 論理変数右シフト | SRLV rd,rt,shamt | |
SUB | 減算 | SUB rd,rs,rt | オーバフロー例外 |
SUBU | 減算(無符合) | SUBU rd,rs,rt | |
SW | ワード格納 | SW rt,offset(base) | *1 |
SWL | ワードの左格納 | SWL rt,offset(base) | *1 |
SWR | ワードの右格納 | SWR rt,offset(base) | *1 |
XOR | 排他的論理和 | XOR rd,rs,rt | |
XORI | 排他的論理和 | XORI rt,rs,immediate |
*1:この命令には UTLB不一致例外 TLB不一致例外 TLB変更例外 バスエラー例外 アドレスエラー例外 があるが、まだ未サポートである。
実装予定の命令
後々必要になるかもしれない命令
命令 | 意味 | 命令形式 | 例外 |
BREAK | ブレーク | BREAK | ブレークポイント・トラップ |
SYSCALL | システムコール | SYSCALL | システムコール例外 |
メモ
例外発生時において処理を委託する番地は今の所適当。
つーかサポート処理を実装してない。
つーかサポート処理を実装してない。
質問でもなんでも
- テスト -- モリ (2006-06-23 16:55:55)
- lwl,lwr,swl,swr はlw,swとどう違うのでしょうか? -- loe (2009-02-06 23:04:58)
- 2つのワードにまたがっているデータ(4byte)を読み出すのに使うのがlwl,lwr。lwは1ワードを読み出す命令。swl,swrはレジスタの値を2つのワードにまたがっている領域に書き込むために使う。swは1ワードに書き込む命令。(時間あったら図のっけときます) -- mori (2009-02-07 21:47:43)