「MIPS」(2009/02/07 (土) 21:59:22) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
生きた証。( -_-)
自分が作ったCPUの仕様についての話。
#contents
** はじめに
パタヘネとMIPS R3000仕様書の本があれば
センスある人なら一カ月もかからないはず。
自分はセンスないからかなりかかった・・・・。
あとは動作確認での時間がかなりかかるのでシミュレーション用プログラムを
つくっておくとかなり楽。というか手書きだと死ぬ。
実機で動作確認できてこそ初めて「実装完了」ですので
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)
#comment
生きた証。( -_-)
自分が作ったCPUの仕様についての話。
#contents
** はじめに
パタヘネとMIPS R3000仕様書の本があれば
センスある人なら一カ月もかからないはず。
自分はセンスないからかなりかかった・・・・。
あとは動作確認での時間がかなりかかるのでシミュレーション用プログラムを
つくっておくとかなり楽。というか手書きだと死ぬ。
実機で動作確認できてこそ初めて「実装完了」ですので
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)
#comment
表示オプション
横に並べて表示:
変化行の前後のみ表示: