シングルサイクル RISC プロセッサの設計
実験概要
RISCReduced Instruction Set Computer
プロセッの設計を行験を通して,プロセッサの命令セットーキテクチャとその
実現方式についての理解を深めるまた,令実行中のプロセッサの内部状態を観察するこ
とによりC 言語プログラム中のループや条件分岐,関数呼び出しがプロセッサの命令実
行レベルでどのように処理されるのかについての理解を深める.
実験スケジュール
本実 5 週で以下なスール(第 5 週目は調日)
1 週(予習:参考文献 7 , 8 2 , 3 , 5 章,本指導書の 1 ,2 ,3 , 5 章)
クル RISC プロセッサの設計と動作実験を行うVerilog HDL 記述された,即値
号なし整数加算命令add immediate unsignedaddiu)とストアワード命store
wordswが未実装なプロセッサについて,追加設計を行い,両命令が正しく動くプ
ロセサを完成させるまた,ディプレイに文字を出力する簡単な機械語のマシン
コードを,追加設計前と後のプロセッサで実際に動作させる.
実験 1-1 (マシン・コードの動作実験 1-1 (ディスプレイへの文字出力)
実験 1-2 (プロセッサの追加設計 1 addiu 命令,sw 命令)と動作実験 1-2
2 週(予習:参考文献 7 2 , 3 , 5 章,本指導書の 4 , 5 章) の設と動
作実験を行うャンプ命jumpj即値符号なセッオンレスザン
命令set on less than immediate unsignedsltiuブランチオンノッコー
ル命令branch on not equalbneロードワード命令load wordlwが未実
な,第 1 週に完成させたプロセッサについて,さらに追加設計を行い,これらの命令
が正しく動くプロセッサを完成させる.また,C プログラムから本実験をとおして完
成させるロセッサのマードを生するクロコンイルの実を行
らに,ディスプレイに繰り返し文字を出力するマシンコードと C プログラムを,
れぞれ追加設計前と後のプロセッサで実際に動作させる.
実験 2-1 (マシン・コードの動作実 2-1,ディスプレイへの繰り返し文字出力
1
実験 2-2 (追加設計 2j 命令)と動作実験 2-2
実験 3 C クロスコンパイラを用いたマシン・コード生成)
実験 4-1 C プログラムの動作実験 4-1ィスプレイへの繰り返し文字出力 2
実験 4-2 (追加設 3sltiu 令,bne 命令lw 命令 C プログラムの動作
4-2
3 週(予習:参考文献 7 2 , 3 , 5 章,本指導書の 5 章) セッサ
実験を行うジャンプ・アンド・リンク命令jump and linkjalジャンプ・レジ
スタ命令jump registerjr)が未実装な,第 2 週に完成させたプロセッサについて,
さらに追加設計を行い,両命令が正しく動くプロセッサを完成させる.また,ディス
プレイに文字列を出力する関数と,キーボードからの文字列入力を受ける関数を含む
C プログラムを,それぞれ追加設計前と後のプロセッサで実際に動作させる.
実験 5-1 C プログラムの動作実験 5-1,関数呼出・ディスプレイへの文字列出
力関数)
実験 5-2 (追加設計 4jal 命令)と C プログラムの動作実験 5-2
実験 6-1 C プログラムの動作実験 6-1,関数からの復帰・キーボードからの文
字列入力を受ける関数)
実験 6-2 (追加設計 5jr 命令)と C プログラムの動作実験 6-2
4 週(予習:本指導書の 5 章) 素数計算を行う C プログラムと,ステッピングモータ
を制御す C プロラムを作し,第 3 完成させプロセッサで際に動作
せる.
実験 7 C プログラムの動作実験 7,素数計算)
実験 8 C プログラムの動作実験 8,ステッピングモータの制御)
指導書の構成
1 章ではプロセッサの命令セットアーキテクチャについて述べ,2 章では本実験で設計す
るプロセサと作実験用ンピータにつて説する3 章,4 章では 1 週目 2
週目に行うシングルサイクル RISC プロセッサの設「基礎編「中級編」ついてそれぞ
れ説明する.5 章では本実験で実施する実験について,6 章ではレポートについて説明する
実験の進め方
実験は,23 1 組(各班 2 組で構成)で実施する.組ごとに,実験機器を共有しなが
ら,全ての実験を進める.
実験課題目次
1 はじめに 1
1.1 コンピュータの標準的な構成 . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 命令セット・アーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1 データの格納場所 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.2 命令セットの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.3 命令の表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 命令セット・アーキテクチャの実現方式 . . . . . . . . . . . . . . . . . . . . 11
2 シングルサイクル RISC プロセッサの設計「導入編」 12
2.1 設計するプロセッサの命令セット・アーキテクチャとその実現方式 . . . . . 12
2.2 プロセッサ設計の準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 プロセッサの動作実験用コンピュータの構成 . . . . . . . . . . . . . . . . . . 12
2.4 動作実験の手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 シングルサイクル RISC プロセッサの設計「基礎編」 14
3.1 マシン・コードの動作実験 1-1(ディスプレイへの文字出力) . . . . . . . . 14
3.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 15
3.1.2 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 15
3.1.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1.4 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 プロセッサの追加設計 1addiu 命令,sw 命令)と動作実験 1-2 . . . . . . . 20
3.2.1 addiu 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . 20
3.2.2 sw 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . 23
3.2.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.4 FGPA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.5 プロセッサの機能レベルシミュレーション . . . . . . . . . . . . . . . 27
4 シングルサイクル RISC プロセッサの設計「中級編」 28
4.1 マシン・コードの動作実験 2-1(文字の繰り返し出力 1 . . . . . . . . . . . 28
4.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 28
4.1.2 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 29
4.1.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.1.4 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2 プロセッサの追加設計 2j 命令)と動作実験 2-2 . . . . . . . . . . . . . . . 32
4.2.1 j 命令のためのジャンプ・セレクト・モジュールの追加設計 . . . . . 32
4.2.2 j 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . . 34
4.2.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.4 FGPA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 36
5 実験 37
6 実験レポートについて 50
作成者: 中村一博,小尻智子
改訂者: 大野誠寛,松原豊
協力者: 平野靖,北坂孝幸,高田広章,冨山宏之,大下弘,土井富雄,
小川泰弘,濱口毅,出口大輔,村上靖明,後藤正之,柴田誠也,
高瀬英希,鬼頭信貴,大野真司,尾野紀博,小幡耕大,中村悟,
長瀬哲也,北川哲,島崎亮,安藤友樹
最終更新日: 2015 8 25
1.21
1 はじめに
現代の生活では,多種多様な電子機器が身の回りに存在してお,それら多くの機器にプ
ロセッサ(processorCPU(中央演算処理装置Central Processing Unit)が搭載されて
いる.
パソンやーム電話みな各種庭電製品画像器,
動車,航空機鉄道,船舶,ボット等においてもディジタル化が進み,制御データ処理
等の用途で CPU は不可欠なものとなってきている.
1.1 コンピュータの標準的な構成
本節では参考文献 [7,8,9] に基づき,標準的なコンピュータの構成について述べる.
コンピュータを構成するすべての構成要素は,図 1 示され 5 つの古典的な構成要素,
入力出力記憶データパス制御のいずれかに概念的に分類される.
入力
出力
制御
(プロセッサ) 記憶
データパス
(コンパイラ)
1: コンピュータの標準的な構成(参考文献 [7] 1.5,参考文献 [9] 1.4 より).
この構成は,コンピュータのハードウェア実現において採用される種のハードウェア技術
に依存しい,およ過去ほぼすべのコンピータ共通する準的な構である.
ここでプロセッは,データパスと制御を合わせたものである.プロセッサは,憶装置か
命令 (instruction) とデータを取り出.入力装置は,データを記憶装置に書き込む.出力
装置は,憶装置からデータを読み出す.データパスはプロセッサ内でデータを処理また
は保持する制御装置は,データパス,記憶装置,入力装置,出力装置に,動作を指定する
制御信号を送る.
プロセッサは,憶装置から取り出された命令の指示どおりに動作する.その命令はプロ
2 イナmachine languageであ
る.コンパイ間が理すいプロミンhigh-level programming
language)で書かれたログラムを,械語をシンボ(記号)で表現するアセンブリ言語
assembly languageに変換するアセンブラassemblerは,シンボル形式のアセンブ
言語を機械語の命令を連らねたバイナリ形式シンコードmachine codeに変換する
1
1.2 命令セット・アーキテクチャ
本節では参考文献 [7,8,9] 基づき,命令セット・アーキテクチャについて述べる.プ
セッサの言葉である命令の語彙を命令セットinstruction set)という.人が機械語でプロ
セッサに適切な指示を出すためには少なくともプロセサの命令について理解していなけ
ればならない.このプロセッサの命令のような,正しく動作する機械語プログラムを書くた
めにプログラマが知っていなければならない事柄すべてを要素とする,ロセッサのハード
ウェアと機械語との間の抽象的なインタフェースを,ロセッサの命令セッーキテク
チャinstruction set architecture)という
この抽象的な命令セッアーキテクチャにより,プロセッサの機能と,の機能を実際
に実行するプロセサのハードウェアを独立に考えることが可能になる.プロセッサのハー
ドウェアは,命令セッーキテクチャが論理回路として設計され,集積回路技術により
ハードウアの形で実現されたものである.械語プログラムはプロセッサを論理回路レ
ベル考えまでなくサの命令ジスタメモリ量なの命
キテクチャに基づいて書くことが可能である.
以下では,多くのメーカーの製品に組み込まれ広く普及している命令セ 1 つで
MIPS の命令ット例とMIPS 命令セトの主要分のブセトにいて述べ
具体的には,MIPS の算術論理演算命令,メモリ参照命令,条件分岐命令,ジャンプと手続
きサポート用の命令について述べる.
1.2.1 データの格納場所
プロセッサは命令の指示どおりに,データに対する演算や条件判定データ転送などの処
理を行う.処理対象のデータが収められている場所として,(1) プロセッサに直接組み込ま
れている記憶領域であるジスタregister(2) モリ(3) 令(定数または即値)の 3
ヶ所がある.また,処理結果のデータが収められる場所として,(1) ジスタ(2) モリの
2 ヶ所がある.
(1) レジスタ
 レジスタはプロセッサハードウェアの基本構成要素であり,命令セットアーキテクチ
の主要な要素である.レジスタは高速にアクセス可能なデータの一時的な格納場所であ
MIPS 1 32 ットのレジス 32 本あるレジスタ 1 本のト幅は 1 word
と呼ばれ,語は一つの単位として頻繁に用いられる.MIPS では 1 語は 32 ビットである.
MIPS では,算術演算は必ずレジスタを介して行われる.メモリにある演算対象のデータ
は,算前にレジスタに移されていなければならないメモリとレジスタ間でデータを転送
する必要があるときにはータ転送命data transfer instruction)が用いられる.一般
に,メモリからレジスタへデータを転送するデータ転送命令はロードload命令と呼ばれ
る.また,レジスタからメモリへデータを転送する命令はストアstore)命令と呼ばれる.
 レジスタの表記には,人が書くときの形とプロセッサが読むときの形がある.が書くと
きの形はアセンブリ言語プロセッサが読むときの形は機械語である. 1 に主要なレジ
タのアセンブリ言語と機械語による表記を示アセンブリ言語ではシンボル $s0, $s1,
..., $s7 によ,それぞ 16 番目から 23 番目でのジスを表.また,シボル
$t0, $t1, ..., $t7 によ,それ 8 から 15 番目表す.シン
$zero 0 番目,$ra 31 番目のレジスタを表す0 番目のレジスタには定 0 が収めら
れている.31 番目のレジスタは,手続き呼出の戻りアドレスを収めるのに用いられる.機
械語では,2 進数でレジスタ番号を書き,それによりバイナリ形式でレジスタを表記する.
2
1: 主なレジスタ
レジスタ番号 アセンブリ言語 機械語 備考
0 $zero 00000 定数 0
8 から 15 $t0, $t1, ..., $t7 01000 から 01111 一時変数
16 から 23 $s0, $s1, ..., $s7 10000 から 10111 一時変数
31 $ra 11111 戻りアドレス
(2) メモリ
ことMIPS モリ
てのaddress
を指定する必要がある.
 アドレスは 0 から始まりMIPS はデー 8 ビッ単位,すなちバイbyte)単位で
アドレスを表すバイトドレス方式が採用されている.MIPS では,1 語が 4 バイトであ
ることから,バイト・アドレス 0 から 4 刻みに 0, 4, 8, 12, ... と進めていくことにより
順番に並んだ語の第 1 バイト目を指すことができる.例えば,3 番目の語のバイアドレ
スは 8 である.MIPS では,メモリ内の語にアクセスするとき,この 4 の倍数のアドレス,
語アドレスが用いられる.
MIPS のデータ転送命令ではベース相対アドレッシングbase addressingが採用され
ておりオフセットoffset)とベース・アドレbase address)の和が,アクセスする
のアドレスとなるオフセットはデータ転送命令中に直接書かれた定数で,プログラムにお
ける配列をメモリに記憶する際のインデックスに対応する.また,ベースアドレスについて
は,ベースアドレスを収めたベース・レジスタbase register)がデータ転送命令中で指定
される.ベースアドレスは配列の開始アドレスに対応する.
 メレスンブ言語はオトとベタをフセ
ベースレジスタ)のように書かれる.例えば,オフセッ 8ースレジスタ
$t0 場合アドスは 8($t0) と書かれる.ではフセトとベー
ジスがそぞれ 2 数でされの例場合フセトは 0000000000001000
ベース・レジスタは 01000 と書かれる.
(3) 命令(定数または即値)
 定数を命令内に直接書くことにより,定数のメモリからのロードがなくなり処理が高速
になる.命令の処理対象データの在処や処理結果データの格納先を表オペランド披演算
; operand 1 つを定数とした命令を即値命令というMIPS では即値の算術演算や論
理演算,条件判定命令など即値命令が多数用意されている.
1.2.2 命令セットの概要
MIPS 命令セットの命令を大まかに分類すると,算術演算命令理演算命令ータ転
送命令条件判定命令件分岐命ャンプと手続きサポートのための命令分けられ
る.表 2 に,MIPS 命令セットの主要部分のサブセットをその機能区分ごとに示す.略号は
その命令のアセンブリ言語でのシンボル表記である.算術演算命令と論理演算命令は2
のレジスタまたは,1 のレジスタと命令内に収められているデータに対して演算を行い
その結果をレジスタに格納する命令である.ータ転送命令はメモリとレジスタ間でデー
タを転送する命令である.条件分岐命令は条件が成立するときにプログラムの実行の流
れを命令内で指示される方へ分岐させる命令である.ンプ命令は,条件に,プログラ
ムの実行の流れを命令内で指示される方へ分岐させる命令である続きサポートのための
3
2: MIPS の主要な命令
区分 命令 略号 機能の概要
add add 整数加算
add unsigned addu 符号なし整数加算
subtract sub 整数減算
算術演算 subtract unsigned subu 符号なし整数減算
shift right arithmetic sra 算術右シフト
add immediate addi 即値整数加算
add immediate unsigned addiu 即値符号なし整数加算
and and ビット単位 AND
or or ビット単位 OR
nor nor ビット単位 NOR
xor xor ビット単位 XOR
shift left logical sll 論理左シフト
論理演算 shift right logical srl 論理右シフト
shift left logical variable sllv 論理左変数シフト
shift right logical variable srlv 論理右変数シフト
and immediate andi 即値ビット単位 AND
or immediate ori 即値ビット単位 OR
xor immediate xori 即値ビット単位 XOR
load word lw メモリからレジスタへ転送
データ転送 store word sw レジスタからメモリへ転送
load upper immediate lui 定数をレジスタの上位へ転送
branch on not equal bne 等しくないときに分岐
branch on equal beq 等しいときに分岐
branch on greater than or bgez >= のときに分岐
条件分岐 equal to zero
branch on less than or blez <= 0 のときに分岐
equal to zero
branch on greater than zero bgtz > 0 のときに分岐
branch on less than zero bltz < 0 のときに分岐
set on less than slt < のとき 1 をセット
条件判定 set on less than unsigned sltu 符号なし slt
set on less than immediate slti 即値 slt
set on less than immediate unsigned sltiu 符号なし即値 slt
ジャンプ jump j ジャンプ
jump and link jal PC 値をレジスタに退避し
ジャンプ
手続きサポート jump register jr レジスタに退避させていた
(ジャンプ) PC 値を戻す
jump and link register jalr jal jr
branch on greater than or bgezal bgez jal
手続きサポート equal to zero and link
(条件分岐) branch on less than zero bltzal bltz jal
and link
4
opcode rs rt rd shamt funct
R 形式 6 ビット 5 ビット 5 ビット 5 ビット 5 ビット 6 ビット
31 26 25 21 20 16 15 11 10 6 5 0
opcode rs rt immediate
I 形式 6 ビット 5 ビット 5 ビット 16 ビット
31 26 25 21 20 16 15 0
opcode address
J 形式 6 ビット 26 ビット
31 26 25 0
2: MIPS の命令のフィールド構成
命令は,プログラムの実行の流れを手続きの方へ分岐させる命令,手続きから元のプログラ
ムの実行の流れに戻す命令である.
1.2.3 命令の表現
MIPS 1 命令の長さは 32 ビットである.命令はプロセッサ・ハードウェアにも人にも
理解しやすいように長さ数ビットのフィールドfield)から構成されている.フィールドの
枠取り命令形式と呼ばれ,MIPS の主な命令形式には (1) R 形式(2) I 形式(3) J
3 類がある 2 にこれらの命令形式のフィールド構成を示すR 形式の命令 6
フィールド opcode, rs, rt, rd, shamt, funct から構成され,I 形式の命令は 4 のフィー
ルド opcode, rs, rt, immediate から構成されている.J 形式の命令は,2 個のフィール
opcode, address から構成されている.
R 形式の命令はレジスタに収められているデータに対して演算を行い,その結果をレジ
スタ収め令でる.た,I 形式令は値およデー転送命令あり
ジスタに収められているデータと命令内に書かれているデータを元に処理を行うその結果
は,レジスタまたはメモリに収められるJ 形式の命令は,ジャンプおよび分岐用の命令で
あり,命令内に書かれているアドレスを元にジャンプおよび分岐処理を行う
全ての命令形式において,命令の 26 ビット目から 31 ビット目までの 6 ビットは,命令
の形式および作の種類表す opcode 命令操作コードopcode; オペコード)ばれ
る.R 形式と I 形式にある rs ールドは 1 ソースオペランと呼ばれ1 のソ
ペランドのレジスタ操作対象データの在処を表すR 形式にある rd ィール
はデステネーシオペランドと呼ばれデスティネーショペランドのレジスタ
即ち操作結果データの格納先を表すR 形式と I 形式にある rt フィールドは R 形式では第
2 ソーペランドと呼ばれ2 つ目のソースオペランドのレジスタ操作対象デー
タの在処を表すI 形式では,rt フィールドはデスティネーションペランドのレジスタ
で,操作結果データの格納先を表I 形式の immediate フィールドは,数または即値の
オペランドで,ここにデータやアドレスが直接書かれる.J 形式の address フィールドも,
定数または即値のオペランドでここにアドレスが直接書かれる.R funct フィ
ドにはR 形式の命令の機能が書かれるR 形式 shamt フィルド shift amount の略
であり,語中のビットをシフトshiftする命令のとき利用され,ここにシフトするビット
数が書かれる.
以降では,各命令形式の命令の,アセンブリ言語と機械語について述べる.
5
3: R 形式の主要な命令
区分 命令 略号 機能の概要
add add 整数加算
add unsigned addu 符号なし整数加算
算術演算 subtract sub 整数減算
subtract unsigned subu 符号なし整数減算
shift right arithmetic sra 算術右シフト
and and ビット単位 AND
or or ビット単位 OR
nor nor ビット単位 NOR
論理演算 xor xor ビット単位 XOR
shift left logical sll 論理左シフト
shift right logical srl 論理右シフト
shift left logical variable sllv 論理左変数シフト
shift right logical variable srlv 論理右変数シフト
条件判定 set on less than slt < のとき 1 をセット
set on less than unsigned sltu 符号なし slt
jump register jr レジスタに退避させていた
手続きサポート PC 値を戻す
(ジャンプ) jump and link register jalr jal jr
R 形式の命令
R 形式の命令には術演算命令,論理演算命令件判定命令,手続きサポートのため
の命令がある.表 3 R 形式の主要な命令を示す
アセンブリ言ではR の各ールドがンボルで表さる. 4 R の主
な命令のアセンブリ言語の例を示す.例えば,アセンブリ言語で整数の減算(subtract)は
次のように書かれる.
sub $s1, $s2, $s3
sub は減 subtract 号,$s1, $s2, $s3 はオあり
$s1 はデネーションンド$s2 は第1ソペラ$s3 は第2ソー
オペランドのレジスタである.この命令の意味は次のとおりである.
$s1 = $s2 - $s3
この命令によりレジスタ $s1 $s2 - $s3 の結果が格納される.
機械ではR opcode フィールド全て令でじで0 あるfunct
フィールドは個々の命令に応じて異なり,この値により行う演算が指定される.表 5 に,R
形式の主要な命令の機械語の例を示例えば,sub 意味す funct フィールドの値は 34
である.デスティネーション・オペランド,第 1 ソース・オペランド,第 2 ソース・オペラ
ンドの値は使用されるレジスタに応じて異なる.この例では$s1 がデスティネーション・
オペランド$s2 が第 1 ソースペラン$s3 が第 2 ソースオペランドのレジスタであ
$s1$s2$s3 のレジスタ番号である 171819 がそれぞれ rdrsrt ールドの
値となっている.
6
4: R 形式の主要な命令のアセンブリ言語の例
区分 命令の例 意味 説明
add $s1,$s2,$s3 $s1 = $s2 + $s3 3 オペランド,整数加算
addu $s1,$s2,$s3 $s1 = $s2 + $s3 3 オペランド,符号なし整数加算
算術演算 sub $s1,$s2,$s3 $s1 = $s2 - $s3 3 オペランド,整数減算
subu $s1,$s2,$s3 $s1 = $s2 - $s3 3 オペランド,符号なし整数減算
sra $s1,$s2,shamt $s1 = $s2 >> shamt 定数 shamt 分の算術右シフト
and $s1,$s2,$s3 $s1 = $s2 AND $s3 3 オペランド,ビット単位 AND
or $s1,$s2,$s3 $s1 = $s2 OR $s3 3 オペランド,ビット単位 OR
nor $s1,$s2,$s3 $s1 = $s2 NOR $s3 3 オペランド,ビット単位 NOR
論理演算 xor $s1,$s2,$s3 $s1 = $s2 XOR $s3 3 オペランド,ビット単位 XOR
sll $s1,$s2,shamt $s1 = $s2 << shamt 定数 shamt 分の論理左シフト
srl $s1,$s2,shamt $s1 = $s2 >> shamt 定数 shamt 分の論理右シフト
sllv $s1,$s2,$s3 $s1 = $s2 << $s3 定数 $s3 分の論理左シフト
srlv $s1,$s2,$s3 $s1 = $s2 >> $s3 定数 $s3 分の論理右シフト
条件判定 slt $s1,$s2,$s3 if($s2<$s3) $s1=1 $s2 $s3 を比較
else $1=0
sltu $s1,$s2,$s3 if($s2<$s3) $s1=1 符号なし数値$s2 $s3 を比較
else $1=0
手続きサポート jr $s1 goto $s1 PC $s1 に設定
(ジャンプ) 手続きからの戻り用
jalr $s1,$s2 goto $s1 + $s2 PC $s1 + $s2 に設定
5: R 形式の主要な命令の機械語の例
命令 op rs rt rd shamt funct
add add $s1,$s2,$s3 0 18 19 17 0 32
addu addu $s1,$s2,$s3 0 18 19 17 0 33
sub sub $s1,$s2,$s3 0 18 19 17 0 34
subu subu $s1,$s2,$s3 0 18 19 17 0 35
sra sra $s1,$s2,10 0 0 18 17 10 3
and and $s1,$s2,$s3 0 18 19 17 0 36
or or $s1,$s2,$s3 0 18 19 17 0 37
nor nor $s1,$s2,$s3 0 18 19 17 0 39
xor xor $s1,$s2,$s3 0 18 19 17 0 38
sll sll $s1,$s2,10 0 0 18 17 10 0
srl srl $s1,$s2,10 0 0 18 17 0 2
sllv sllv $s1,$s2,$s3 0 19 18 17 0 4
srlv srlv $s1,$s2,$s3 0 19 18 17 0 6
slt slt $s1,$s2,$s3 0 18 19 17 0 42
sltu sltu $s1,$s2,$s3 0 18 19 17 0 43
jr jr $s1 0 17 0 0 0 8
jalr jalr $s1,$s2 0 17 0 18 0 9
7
6: I 形式の主要な命令
区分 命令 略号 機能の概要
算術演算 add immediate addi 即値整数加算
add immediate unsigned addiu 即値符号なし整数加算
and andi 即値ビット単位 AND
論理演算 or ori 即値ビット単位 OR
xor xori 即値ビット単位 XOR
load word lw メモリからレジスタへ転送
データ転送 store word sw レジスタからメモリへ転送
load upper immediate lui 定数をレジスタの上位へ転送
branch on not equal bne 等しくないときに分岐
branch on equal beq 等しいときに分岐
branch on greater than or bgez >= のときに分岐
equal to zero
条件分岐 branch on less than or blez <= 0 のときに分岐
equal to zero
branch on greater than zero bgtz > 0 のときに分岐
branch on less than zero bltz < 0 のときに分岐
条件判定 set on less than immediate slti 即値 slt
set on less than immediate unsigned sltiu 符号なし即値 slt
branch on greater than or bgezal bgez jal
手続きサポート equal to zero and link
(条件分岐) branch on less than zero and link bltzal bltz jal
I 形式の命令
I形式の命令には,算術演算命令,論理演算命令データ転送命令,条件分岐命令,条件
判定命令,手続きサポートのための命令がある.表 6 に,I 形式の主要な命令を示す
I 形式言語R 形式ール用い
表される. 7 I 形式の主要な命令のアセンブリ語の例を示.表中 imm immediate
して例えアセ言語レジ (load
word) は次のように書かれる.
lw $s1, immediate($s2)
lw はレジスの転の名 load word 略号$s1, $s2 ドの
$s1 ティネション・オ$s2 は第 1 ス・オ
のレジスタである.転送する元のメモリのアドレスが immediate($s2) で指定されている.
immediate($s2) $s2 immediate の和で,値の入っているメモリのアドレスを表すベー
ス相対アドレシングの表記である.sw もベース相対アドレシングの命令である.アドレ
ング形式には,その他にレジスタ・アドレシング,即値アドレシンPC 相対アドレシ
,擬似直接アドレシングがある.I 形式の命令では,addi, addiu などが即値アドレシン
bne, bqe などが PC 相対アドレシングである.
機械語では,opcode フィールドは命令に応じて異なりほとんどの命令 opcode
ルドの値によって識別できる. 8 I 形式の主要な命令の機械語の例を示す.例えば,lw
を意する opcode フィールドの 35 である.ステネーオペランド 1 ソー
オペ使るレlw の例$s1 がデネー
ショペランド$s2 が第 1 ソース・オペランドであるため,rt, rs のフィールドの値
はそれぞれ 17, 18 なる.bgez, bltz, bgezal, bltzal opcode ィールドは全て 1
あり,条件の種類を rt フィールドの値で識別する.
8
7: I 形式の主要な命令のアセンブリ語の例
区分 命令 意味 備考
算術演算 addi $s1,$s2,imm $s1 = $s2 + imm imm を加算
addiu $s1,$s2,imm $s1 = $s2 + imm 符号なし imm を加算
andi $s1,$s2,imm $s1 = $s2 AND imm ビット単位$s2,imm AND
論理演算 ori $s1,$s2,imm $s1 = $s2 OR imm ビット単位$s2,imm OR
xori $s1,$s2,imm $s1 = $s2 XOR imm ビット単位$s2,imm XOR
lw $s1,imm($s2) $s1 = メモリ ($s2+imm) メモリ ($s2+imm) から
レジスタ$s1 へ転送
データ転送 sw $s1,imm($s2) メモリ ($s2+imm)=$s1 レジスタ$s1 からメモリ
($s2+imm) へ転送
lui $s1,imm $s1=imm * 2
16
imm $s1 の上位 16 ビットへ
転送
bne $s1,$s2,imm if($s1!=$s2) goto $s1 $s2 が等しくないときに
(PC+4)+imm*4 PC (PC+4)+imm*4
beq $s1,$s2,imm if($s1==$s2) goto $s1 $s2 が等しいときに
(PC+4)+imm*4 PC (PC+4)+imm*4
bgez $s1,imm if($s1>=0) goto $s1 0 以上のときに
(PC+4)+imm*4 PC (PC+4)+imm*4
条件分岐 blez $s1,imm if($s1<=0) goto $s1 0 以下のときに
(PC+4)+imm*4 PC (PC+4)+imm*4
bgtz $s1,imm if($s1>0) goto $s1 0 より大きいときに
(PC+4)+imm*4 PC (PC+4)+imm*4
bltz $s1,imm if($s1<0) goto $s1 0 より小さいときに
(PC+4)+imm*4 PC (PC+4)+imm*4
slti $s1,$s2,imm if($s2<imm) $s1=1 $s2 imm を比較
条件判定 else $s1=0
sltiu $s1,$s2,imm if($s2<imm) $s1=1 符号なし数値$s2 imm
else $s1=0 比較
bgezal $s1,imm if($s1>=0+$ra) 戻り番地以上であれば
手続きサポート goto (PC+4)+imm*4 PC (PC+4)+imm*4
(条件分岐) bltzal $s1,imm if($s1<0+$ra) 戻り番地より小さければ
goto (PC+4)+imm*4 PC (PC+4)+imm*4
9
8: I 形式の主要な命令の機械語の例
命令 op rs rt immediate
addi addi $s1, $s2, 100 8 18 17 100
addiu addiu $s1, $s2, 100 9 18 17 100
andi andi $s1, $s2, 100 12 18 17 100
ori ori $s1, $s2, 100 13 18 17 100
xori xori $s1, $s2, 100 14 18 17 100
lw lw $s1, 100($s2) 35 18 17 100
sw sw $s1, 100($s2) 43 18 17 100
lui lui $s1, 100 15 0 17 100
bne bne $s1, $s2, 100 5 18 17 100
beq beq $s1, $s2, 100 4 18 17 100
bgez bgez $s1, 100 1 17 1 100
blez blez $s1, 100 6 17 0 100
bgtz bgtz $s1, 100 7 17 0 100
bltz bltz $s1, 100 1 17 0 100
slti slti $s1, $s2, 100 10 18 17 100
sltiu sltiu $s1, $s2, 100 11 18 17 100
bgezal bgezal $s1, 100 1 17 17 100
bltzal bltzal $s1, 100 1 17 16 100
9: J 形式の主要な命令
区分 命令 略号 機能の概要
ジャンプ jump j ジャンプ
手続きサポート jump and link jal PC 値をレジスタに退避し
(ジャンプ) ジャンプ
J 形式の命令
J 形式の命令には,ジャンプ命令と手続きサポート命令がある.表 9 に,J 形式の主要な
命令を示す
J 形式のアセンブリ言語も,R 形式や I 形式の命令と同様に各フールドがシンボルを用
いて表される.表 10 J 式の主要な命令のアセンブリ語の例を示す.例えば,アセンブ
リ言語でジャンプ jjump)は次のように書かれる.
j address
j はジャンプの略号であaddress ジャンプ先のアドレスを指定する値であるj 命令
では擬似直接アドレシングでジャンプ先を決定する擬似直接アドレシングとは,命令
中の 26 ットと PC の上位ビトを連結したものがプ先のアドレスとなるアドレ
ング形式である.jal 命令も擬似直接アドレッシングでジャンプを行う命令である.
J 形式の opcode ールで識 11 に,J 命令
語の例を示すj 命令,jal 令の opcode フィールドの値はそれぞれ 2, 3 ある.address
フィールドにはジャンプ先の 26 ビット分のアドレスが入る.
10
10: J 形式の主要な命令のアセンブリ語の例
区分 命令 意味 備考
ジャンプ j address goto address * 4 PC address*4
手続きサポート jal address $ra=PC+4 次の命令番地を$ra
(ジャンプ) goto address * 4 PC address*4
11: J 形式の主要な命令の機械語の例
命令 op address
j j 100 2 100
jal jal 100 3 100
1.3 命令セット・アーキテクチャの実現方式
プロセッサの命令セット・アーキテクチャは,1.2 節で述べたように,プロセッサハード
ウェアと機械語との間の抽象的なインタフェースであるプロセッサハードウェアは,命令
セッアーキテクチャが論理回路として設計され,ードウェアの形で実現されたもので
ある.
命令セット・アーキテクチャを実現する方式には単純なものから複雑でより高性能なも
のまで様々ものがある.全ての命令の実行 1 クロサイクルを要するシングルサイ
クルの実現方式や,数サイクルを要するマルチサイクルの実現方式シングルサイクル方
式をパイプライン化した実現方式などがあるさらにパイプライン方式でフワーディン
グ機構を有するものや,岐予測機構を有するもの複数命令発行投機実行の機構を有す
るもの等もある.
MIPS よう RISCReduced Instruction Set Computerプロは,命令の数
を減らし複雑な処理を単純な命令の組み合わせで行うことで回路を単純化し演算速度の
向上を図っいる.一方,CISCComplex Instruction Set Computerロセサは,1つ
の命令で複雑な処理を一気に行うことができるように設計されている.ソフトウア側で指
定する命令を減らせる利点がある反面,CPU の仕組みが複雑になり,高速化しにくいとい
う欠点もある.近年の CISC CPU は,パイプライン等 RISC 技術を取り入れ,RISC
CISC の長所を併せ持った CPU となっている.
11
2 シングルサイクル RISC プロセッサの設計「導入編」
2.1 設計するプロセッサの命令セット・アーキテクチャとその実現方式
本実験では,1.2 節に示した命令セットアーキテクチを実現するプロセッサの設計を
行う命令セットアーキテクチャの実現方式は,全ての命令の実行が 1 クロックサイクル
を要するシングルサイクル方式とする.
本実験で設計するプロセサは,参考文献 [7,8,9] シングルサイクルプロセサの構成に
基づいておりよく知られた RISC プロセッの一つである MIPS の命令セトのサブセ
トに対応している.
2.2 プロセッサ設計の準備
本実験では,ICE Linux マシン上で, Altera 社の EDA ツールを使用して,プロセッ
サの設計を行算機と EDA ツールの環境設定方法は,前の実験EDA ツールを用い
た論理回路設計」と全く同じである.3.1 節を参考にして,環境設定を行うこと.
2.3 プロセッサの動作実験用コンピュータの構成
設計したプロの動実験は,Altera DE2-115 ボード上に実現するプロサの動
作実験用コンピュータを用いて行う.このコンピュータの CPU として,設計した MIPS
CPU
を使用する.この動作実験用コンピュータは,図
1
に示した一般的なコンピュータ
ハードウェア実現したものである.図 3 DE2-115 ボード上に実現するコンピュータの
成を示す.この構成は,5 つの構成要素からなる図 1 の構成に基づいており,キーボードと
制御
(プロセッサ) 記憶
データパス
(Cクロスコンパイラ)
キーボード
液晶ディスプレイ
ABCDE
FG
入力
出力
FPGA
DE2 ボード
3: プロセッサの動作実験用コンピュータの構成
液晶ディスプレイがそれぞれ,(1) 入力装置,(2) 出力装置,DE2-115 ボード上の FPGA
の回路が (3) 記憶装置,(4) 制御装置,(5) データパスを実現している.C クロスコンパイ
は,プロセッサの設計を行 Linux マシン上で動作し,C 言語で書かれたプログラムを
実験で設計する MIPS CPU のマシン・コードに変換する.
12
4: コンピュータの内部構成
4 コンピータの内部構成を示液晶デスプレイとキーボードが,DE2-115 ボー
ドの VGA 端子と PS/2 端子を介して DE2-115 ボード上の FPGA に接続されているこの
FPGA 内には,CPU や記憶装置(命令メモリとデータメモリ)VGA コントローラ,キ
ボードコントローラが実現される.
2.4 動作実験の手順
DE2-115 ードを用いたプロの動作実験は下記 1 から 5 手順で行手順 5
のスライドスイッチの操作では,CPU の動作クロック周波数を表 12 に基づき設定する.
12 は,図 5 示す DE2-115 ボードのスライドスイッチ SW1, SW0 の設定値 CPU の動作
クロック周波数の関係を表している.なお,スライドスイッチは上げると 1,下げると 0
FPGA に入力されるCPU の動作クロック周波数 2[Hz], 200[Hz], 1000[Hz], 動クロッ
クの中から選択でき,手動クロックを選択した場合はKEY3 を押す毎にクロックパルスが
CPU に1つ送られる.CPU 1 クロッずつ動作させる必要がある実験では手動クロック
を選択するDE2-115 ボード 7 セグメント LED はプロセッサの PC の値が表示され
る.なお,KEY2 を押すと,CPU 及び周辺回路がリセットされる.
1. MIPS CPU で実行するプログラムのコンパイル(クロスコンパイル)
2. MIPS マシン・コードから命令メモリ ( 4) のメモリイメージファイルへの変換
3. CPU ならびに周辺回路の論理合成
4. DE2-115 ボードへのダウンロード
5. DE2-115 ボードのスライドスイッチ,プッシュスイッチを操作して CPU でプログラ
ムを実行
13
12: スライドスイッチ SW1, SW0 による CPU の動作クロック周波数の設定
(SW1, SW0) クロック周波数 [Hz]
(0, 0) 2
(0, 1) 200
(1, 0) 1000
(1, 1) 手動クロック
!"#
$%&'#
()*+,'#
-./#
00#
12345# 1236#
0#
7893:# 78936#
;<$=-#
./#
>?#
@'=#
A1B(#
$%&'#
C1DE#
$%&'#
FCB(#
G)HIJKLM3NOP#
,QRSTUQV#
TWUXTUQV#
Y8Z#
5[\]=^
Y8Z#
5: Altera DE2-115 ボード
3 シングルサイクル RISC プロセッサの設計「基礎編」
本実験ではシングルサイクル RISC プロセサの設計と動作実験を行 1 週目の実
験では,プロセッサの動作実験と,即値符号なし整数加算命令 addiu)とストアワード
命令(sw)についてのプロセッサの追加設計を行う
3.1 マシン・コードの動作実験 1-1(ディスプレイへの文字出力)
マシン・コードの動作実験 1-1 では,ディスプレイに文字 ’B’ 1 つ表示する MIPS
シン・コー print B.bin と,それを実行するプロセッサ FPGA 上に実現しその動作
確認する.の実験を通じて,ロセッサの動作実験の各手順の理解を目指す本動作実験
では,即値符号なし整数加算命令add immediate unsignedaddiuとストワード命令
store wordswが未実装なプロサにおいて,それらの命令を含む簡単な機械語のマシ
ン・コードを実行すると,どのような動作をするかを観察する.本実験で観察した結果は
14
次のプロセッサの追加設計 1 において,addiu sw が正しく動くプロセッサを完成させた
後,動作比較の対象として用いる.
3.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験では,まずMIPS マシン・コードをプロセッサの命令メモリのメモリイメージ
イルに換す変換よりQuartusII 論理成可能なモリイメージフ
ルが得られる.このメモリイメージを命令メモリに持ったプロセッサを論理合成すること
により変換元のマシコードを実行するプロセサが得られる MIPS マシンコード
の例として print B.bin
1
を使用する.た変換には,変換プログラム bin2v を使用する.
最初に,2.2 節に従 EDA ツールの環境設定をたのち,bin2v print B.bin
MIPS マシン語プログラムからメモリイメージファイルを作成する.この変換により,論
理合成用のメモリイメージ rom8x1024 DE2.mif が得られる.た,機能レベルシ
ミュレーション用の Verilog HDL 記述 rom8x1024 sim.v も同時に生成される.メモリ・イ
メージファイ rom8x1024 DE2.mif は,論理合成の際に QuartusII によって読まれるファ
イルである.また,機能レベルシミュレーション用 Verilog HDL rom8x1024 sim.v
は,機能レベルシミュレーションとプロセッサが実行する命令列を確認する際に使用する.
本実験で使用する MIPS マシン・コード print B.bin は,正しいプロセッサ(即値符号
なし整数加算命令 addiu と,ストアワード命 sw が実装済みのプロセサ)動作さ
ると,次の 1, 2, 3 のような動作をする命令列を含んだ,バイナリファイルである.
1. データメモリ(RAM)の 0x0300 番地に 0 を格納
addiu $s2, $s0, 0x0300
sw $s0, 0x0000($s2)
2. RAM 0x0304 番地に 2 を格納
addiu $s3, $s0, 0x0304
addiu $s2, $s0, 0x0002
sw $s2, 0x0000($s3)
3. RAM 0x0300 番地に 1 を上書き
addiu $s3, $s0, 0x0300
addiu $s2, $s0, 0x0001
sw $s2, 0x0000($s3)
3.1.2 命令メモリに格納される命令列の確認
験でサのこの
bin2v Verilog HDL rom8x1024 sim.v
を使する.図 6 rom8x1024 sim.v を示.図 6 case ロック内行は
本実験で設計するプロセッサにおける,命令メモリ 10-bit アドレスとそこに格納される
32-bit 命令の機械語が記述されている.各行の // 以降のコメント部には,その行に記述さ
れているアドレスと命令に関するコメントが記述されている.コメント部には,左から,
際の MIPS 命令メモリにおけるアドレス,命令名,命令の内容が記述されている.ここ
で,シンボル REG[0], ..., REG[31] ,レジスタ 0 番から 31 番,すなわち $zero, ..., $ra
15
<省略>
case (word_addr)
<省略>
10’h00b: data = 32’h24020300; // 0040002c: ADDIU, REG[2]<=REG[0]+768(=0x00000300);   ここが PC=0x002c の命令
10’h00c: data = 32’hac400000; // 00400030: SW, RAM[REG[2]+0]<=REG[0];
10’h00d: data = 32’h24030304; // 00400034: ADDIU, REG[3]<=REG[0]+772(=0x00000304);
10’h00e: data = 32’h24020002; // 00400038: ADDIU, REG[2]<=REG[0]+2(=0x00000002);
10’h00f: data = 32’hac620000; // 0040003c: SW, RAM[REG[3]+0]<=REG[2];
10’h010: data = 32’h24030300; // 00400040: ADDIU, REG[3]<=REG[0]+768(=0x00000300);
10’h011: data = 32’h24020001; // 00400044: ADDIU, REG[2]<=REG[0]+1(=0x00000001);
10’h012: data = 32’hac620000; // 00400048: SW, RAM[REG[3]+0]<=REG[2];
<省略>
endcase
<省略>
6: rom8x1024 sim.v の一部
を表す ( 1).また,シンボル RAM[w] は,データメモリの w 番地を表す
例えば,図 6 case ブロック内の最初の記述は,本実験で設計するプロセッサの命令メモ
リの 0x00b 番地に機械語 0x24020300 格納されることを表している.また,この命令
実際の MIPS 0x0040002c に格納され,命令名は addiu,レジスタ 2 番にレジスタ 0
番(値は常に 0+768 の結果をセットする命令であることを表している.なお,本実験
設計するプロセッサのプログラムカウンタ PC=(0x h3 h2 h1 h0) が指す命令は,本プ
セッサの命令メモリでは,アドレスを右に 2-bit シフトした ( (0x h3 h2 h1 h0) >> 2 )
番地に格納されてる.ば,実験設計するプロサの PC=0x002c が指す命令は,
本プロセッサの命令メモリの (0x002c) >> 2,即ち 0x000b 番地に格納されている.また,
本実験で設計するプロセッサのプログラムカウンタ PC=(0x h3 h2 h1 h0) が指す命令は,
実際の MIPS の命令メモリでは,アドレスの上位に 0x0040 を付加した (0x0040 h3 h2 h1
h0) 番地に格納されている.
print B.bin から生成され rom8x1024 sim.v, または,図 6 Verilog HDL 記述を
解析し,次の 1, 2, 3, 4, 5 に答えよ.お,addiu は即値符号なし整数加算命令,sw はレ
ジスタの値をメモリに転送するストア・ワード命令,レジスタ 0 番の値は常に 0 である.
1. プロセッサが PC=0x002c の命令を実行することにより,レジスタ REG[2] の値がい
くらになるかを予想せよ.
2. プロセッサが PC=0x0030 の命令を実行することによりRAM 768 (0x00000300)
番地の値がいくらになるかを予想せよ.
3. プロセッサが PC=0x0034 番地の命令を実行することによりREG[3] の値いくらにな
るかを予想せよ.
4. プロセッサ PC=0x003c の命令を実行すると,RAM の何番地の値が変化し,変
後の値はいくらかを予想せよ.
5. プロセッサ PC=0x0048 の命令を実行すると,RAM の何番地の値が変化し,変
前,変化後の値はそれぞれいくらかを予想せよ.
3.1.3 論理合成
本実験でaddiu 命令と sw 令が実装プロッサらび命令モリその
辺回を行bin2v 用の
1
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/k01 addiu sw/print B.bin
16
rom8x1024 DE2.mif とプ Verilog HDL mips de2-115.tar.gz
2
を使用する.
tar xvfz ./mips de2-115.tar.gz mips de2-115.tar.gz
る.ロセース rom8x1024 DE2.mif Quartus II を使
FPGA DE2 115 Default.sof
が得られる.
本実験を通じで完成させる未完なプロセサの Verilog HDL 記述一式が,ィレクト
mips de2-115 ブデ MIPS に展開さる.イン御回
Verilog HDL main ctrl.v同じクト mips de2-115/MIPS
ジフ rom8x1024 DE2.mif クト mips de2-115 ピー
ディレクトリ mips de2-115 cd して,quartus sh --flow compile DE2 115 Default
で論理合成を行う論理合成には計算機の性能により 5 から 20 分程度の時間がかかる.
論理成が了すクト mips de2-115 FPGA ダウード能な
セッサなど回路一式のストリーム・アウト・ファイル DE2 115 Default.sof が生成される.
3.1.4 FPGA を用いた回路実現
本実験では,に,addiu 命令 sw 命令が未実装なプロセッサの実際の動作を観察する.
観察た結は,のプロサの追設計 1 いてaddiu sw く動くプ
サを完成させた後動作比較の対象として用いる.ここでは,理合成により生成されたプ
ロセなど回路一式のストリーム DE2 115 Default.sof Quartus
II を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させる.DE2-115 ボー
上のプッシュスイッチ KEY2, KEY3 は,それぞれプロセッサをリセットするためのスイッ
,クロックパルスを生成するためのスイッチである.
DE2-115 ドのライスイ SW0, SW1 をと 1上)してサへの
クロック供給を手動モードにする.プロセッサへのクロック供給が手動モードの時,KEY3
1 回押すと,プロセッサにクロックパルスが 1 つ送られ,プロセッサは PC 指してい
る命令メモリの命令 1 つ実行する.なお,本実験で設計するプロセッは,命令メモリの
0x0000 番地の命令から実行を開始する.
今回プロが実行するマシンコード print B.bin はデスプレイ下部に文 ’B’
1 表示するプログラムであるKEY3 を数回押しプロにクパルスを
ロセッサに PC=0x0000 番地か PC=0x0048 番地までの命令を実行させ,ディスプレ
イ下部に文字 ’B’ 1 つ表示されるかどうかを確認せよ.この時,ディスプレイ上部には
プロセッサ内部の主な信号線の現在の値が表示されている.一方ィスプレイ下部に文字
は全く表示されないはずである.
7 実験 1-1 セッサのロックを示.ディスプレイ線名
ロック図中の信号線名は,似た名前のもの同士が対応している.例えばィスプレイ上の
表示 PC, ALUY がブロック図中のプログラムカウンタ PC, ALU の出力 alu y それぞれ
応している.ALUY の表示の後の A, CTRL, B, COMP は,それぞれブロック図中の ALU の入
a, alu ctrl, b, 出力 alu cmp に対応している.COMP の表示の後の REGD1, IDX, REGD2, IDX
は,それぞれブロク図中のレジスタフイル Registers の出力 read data1, 入力 read idx1,
出力 read data2, 入力 read idx2 に対応している.その後の REGWRITED, IDX, WEN は,それ
ぞれ Registers の入 write data, write idx, write enable に対応している.RAMRDAT, ADDR,
WDATA, WEN は,それぞれブロック図中のデータメモリ RAM の出力 RAM data, 入力 RAM
2
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/k01 addiu sw/mips de2-115.tar.gz
17
address, RAM write data, write enable に対応している.これらの対応関係をまとめると表
13 のようになる.ブロック図中の線の幅はビット幅と対応してお,一番細い線は 1-bit
線,一番太い線は 32-bit の配線を表しているまた,ブロク図左下の ROM が,命令メモ
リである.ロセッサはここから命令を読み,命令毎に決められた処理を行.ブロック図
右下の RAM は,データメモリである. 3.1.2 節の 1, 2, 3, 4, 5 で予想した結果と同じよ
うに動作するかどうかを確認せよ(予想と異なり,正しくない動作のはずである)この結
果から,プロセッサが,addiu 命令と sw 命令を正しく実行できていないことが分かる.
次の実験 1-2 ではプロセッサの追加設計を行いプロセッサ内部で行われるデータ転送
や演算などを制御するメイン制御回路を,これらの命令に対応したものにする.
13: ディスプレイに表示される信号線名とブロック図中の信号線との対応関係
ディスプレイに表示される信号線名 ブロック図中の信号線
PC PC(プログラムカウンタの現在の値)
ALUY alu yALU の演算結果出力)
A aALU への入力)
CTRL alu ctrlALU への制御用入力)
B bALU への入力)
COMP alu cmpALU での比較結果出力)
REGD1 read data1(レジスタファイル Registers の出力)
REGD1 の後の IDX read idx1Registers への入力)
REGD2 read data2Registers の出力)
REGD2 の後の IDX read idx2Registers への入力)
REGWRITED write dataRegisters への入力
REGWRITED の後の IDX write idxRegisters への入力)
REGWRITED の後の WEN write enebleRegisters に対する書込許可制御入力)
RAMRDAT RAM data(データメモリ RAM からの出力)
ADDR RAM addressRAM へのアクセスアドレス入力)
WDATA RAM write dataRAM への書込データ入力)
WDATA の後の WEN write enableRAM に対する書込許可制御入力)
18
ALU
plus4
ROM
MUX
alu_ram_sel
0
命令
alu_cmp
RAM
address
RAM
write data
write
enable
a
b
alu_y
RAM
data
Registers
write idx
write data
write enable
read idx2
read idx1
[25-21]
[20-16]
controler
alu_ctrl
+
adder32
a
b
メイン
コントロール
PC
++4
<<2
[15-0]
Rd
[15-11]
sign_ext
MUX
0
alu_b_sel1
a16
y32
32
6
32
32
32
4
32
ALU
32
32
MUX
reg_widx_sel2
31
0
alu_ctrl
link
2
MUX
0
0
alu_ram_s
3
alu_b_sel2
Rt
MUX
0
[10-6]
shiftv
3
0
MUX
RAM
MUX
pc_sel
0
is_branch
IsBranch
[25-0]
[5-0]
link_sel
0
32
32
32
32
shifter
Rs
16
MUX
do_sign_ext
alu_op
func
reg_widx
_sel1_s
reg_widx_sel1
read
_data1
read
_data2
is_branch_ctrl
pc_next
7: 動作実験 1-1 のプロセッサのブロック図
19
3.2 プロセッサの追加設計 1addiu 命令,sw 命令)と動作実験 1-2
本実験ではまず,プロセッサの追加設計と動作実験を行い,ロセッサの追加設計の手
順とプロッサ動作の理を目ここではaddiu 命令と sw 命令未実なプロセ
サを例とし,加設計を行い両命令が正しく実行されるプロを完させる.らに
プロセッサを実際に動作させて観察する.
3.2.1 addiu 命令のためのメイン制御回路の追加設計
本実験では,動作実 1 動作を確認し addiu 命令と sw 命令が未実装なプロセッサ
について,追加設計行う.ここでは,動作実 1 で使用しプロセッサのメイン制
路の Verilog HDL 記述 main ctrl.v を使用する.main ctrl.v は,動作実験 1 でプロセッ
サの Verilog HDL 記述一式 mips de2-115.tar.gz を展開した際に作成されたディレクトリ
mips de2-115 のサブディレクトリ MIPS にあるソースファイル main ctrl.v 中のコメ
,追加設計 1 のヒント (1)(9) 周辺を,下記の 1, 2, 3, 4, 5, 6, 7, 8, 9 の手順で適
切なものに変更せよ.
0. addiu 命令について
addiu 命令は命令の rs ールドで指定されるレジスタの値と命令に直接書か
れている immediate を,符号なし整数加算し,結果を命令の rt フィールドで
指定されるレジスタに格納する命令である.
addiu 命令実行時のプロセッサ内の信号の流れを図 8 に示す.青線(濃い灰色の
線)緑線(薄い灰色の線)ラベル付けされた信号が,addiu 令の行に
わっている.以下では,号の流れがブロック図のようになるように,赤線(2)
(9) の番号付きの線)ラベ付けされた制御信号を切に設定するなお
御信号に付いた (2)(9) の番号と,ヒントの番号の間には対応関係がある.
addiu 命令は符号拡張された immediate rs の符号なし整数加算を行う
ブロック図中 sign ext は符号拡張モジュールである(参考文献 [9] pp.285,ま
たは参考文献 [8] pp.270また,MUX は,2 入力 1 出力の Multiplexer, 選択回
路を表しており 2 の入力信号のうち,0 のラベルが付けられている方が,
選択 0 の時力さ信号ALU (Arithmetic and Logic Unit;
術論理演算ユニッ) は,加算や減算シフトAND, OR などの演算を行うもの
である.
1. 追加設計 1 のヒント (1)I 形式の命令 addiu の追加,命令コードの定義
addiu の命令操作コードが「6’b001001」であることから,記述「‘define ADDIU
6’b001100」を「‘define ADDIU 6’b001001」に変更する.
2. 追加設計 1 のヒント (2)I 式の命令 addiu の追加,is branch ジュールへの制御
信号の記述
is branch (図8 [9] pp.295-299, pp.287
または参考文献 [8] pp.280-284, pp.271
20
ALU
plus4
ROM
MUX
alu_ram_sel
0
命令
alu_cmp
RAM
address
RAM
write data
write
enable
a
b
alu_y
RAM
data
Registers
write idx
write data
write enable
read idx2
read idx1
[25-21]
[20-16]
controler
alu_ctrl
+
adder32
a
b
メイン
コントロール
PC
++4
<<2
[15-0]
Rd
[15-11]
sign_ext
MUX
0
alu_b_sel1
a16
y32
32
6
32
32
32
4
32
ALU
32
32
MUX
reg_widx_sel2
31
0
jp
alu_ctrl
link
2
MUX
0
0
alu_ram_s
3
alu_b_sel2
Rt
jpr
MUX
0
[10-6]
shiftv
3
0
MUX
RAM
MUX
pc_sel
0
IsBranch
[25-0]
[5-0]
link_sel
0
32
32
32
32
shifter
Rs
16
MUX
do_sign_ext
alu_op
func
reg_widx
_sel1_s
reg_widx_sel1
targetaddr
read
_data1
read
_data2
is_branch_ctrl
pc_next
(2) do nothing
(3)
(5)
(4)
(6)
(7)
(8)
(9)
Registers/RAMアクセス、ALUを用いた計算
次のPCの値pc_nextの計算
メインコントロールからMUX等への制御信号
(2)(9)main_ctrl.v中のaddiuに関するヒント番号
青線
緑線
赤線
26
8: addiu 命令実行時のプロセッサ内の信号の流れ
21
addiu beq (branch on equal) is branch
制御信号3’b110あるス中 is branch
(十行)// is branch d0 // 分岐判定 is branch
の制御信号 // 3’b000, ==, EQ // ... <省略>... // 3’b110, do nothing」より)
記述‘ADDIU: is branch ctrl tmp = 3’bXXX;‘ADDIU: is branch ctrl tmp
= 3’b110;」に変更する.
3. 追加設計 1 ヒン (3)I 式の命令 addiu 追加ALU の入力ポート B 流す
データを選択するセレクト信号の記述
ALU B ポートに,命令に直接書かれている値 immediate(命令 [15:0]を転送
するには,セレクタ alu b sel1 のセレト信号を 1’b0 にするのがいか1’b1
にするのがよいかを考える.
1’b1 するのがよいことか(図 8 より)記述‘ADDIU: alu b sel1 s tmp
= 1’bX;」を「‘ADDIU: alu b sel1 s tmp = 1’b1;」に変更する.
4. 追加設計 1 のヒント (4)I 形式の命令 addiu 追加,符号拡張を行うかどうかの制御
sign ext は符号拡張モジュールである(図 8参考文献 [9] pp.285,または参考文
[8] pp.270
sign ext 制御信号として1’b1が適切であ(ソース中 do sign ext
関するコメント (ヒントの数行上あたり)// do sign ext // 符号拡張モジュー
sign ext の制御信// do sign ext == 1’b016-bit ータ 32-bit 化するとき符
号拡張を行わない// do sign ext == 1’b116-bit データを 32-bit 化するとき符
号拡張を行う」より)
記述「| | ((op code == ‘ADDIU) && 0)」を「| | (op code == ‘ADDIU)」に変
更する.
5. 追加設計 1 のヒント (5)I 形式の命令 addiu の追加,加算を行う制御信号の記述
alu op ALU 制御モジュール alu ctrler への制御信号である( 8,参考文献
[9] pp.290-299,または参考文献 [8] pp.274-284
addiu 命令 ALU に加を行せる令なで,制信号 alu op して
3’b000適切であース中の alu op に関するコメン (ヒントの数行上
たり) // alu op // ALU 制御モジュ alu ctrler の制御信号// 3’b000, ALU
に加算を行わせる// 3’b001, ALU LUI の処理を行わせる// 3’b010, ALU
R 式の命令に対して,R 形式の機能コードに応じた演算を行わせ// 3’b011,
ALU AND 算を行わせ// 3’b100, ALU OR 演算を行わせる// 3’b101,
ALU XOR 行わ// 3’b110, ALU SLT の処を行// 3’b111,
ALU SLTU の処理を行わせる」より)
記述‘ADDIU: alu op tmp = 3’bXXX;‘ADDIU: alu op tmp = 3’b000;
変更する.参考文献 [7,8,9] とは制御コードがやや異なる.
6. 追加設計 1 のヒント (6)I 形式の命令 addiu の追加レジスタフイルへの制御信号
の記述
22
reg write enable はレジスタファイル registers の書き込み制御信号である(図 8
参考文献 [9] pp.290-299,または参考文献 [8] pp.274-284
addiu 制御 reg write enable
の値1’b1ソー reg write enable コメ
(行上)// reg write enable // registers
信号// reg write enable == 1’b0// reg write enable
== 1’b1:書き込みを行う」より)
‘ADDIU: reg write enable tmp = 1’bX;‘ADDIU: reg write enable tmp
= 1’b1;」に変更する.
7. 追加設計 1 のヒン (7)I 式の命令 addiu の追加,レジスタファイルの方へ流す
データを選択するセレクト信号の記述
alu ram sel s はセレクタ alu ram sel ルのセレクト信号であ(図 8
考文献 [9] pp.290-299,または参考文献 [8] pp.274-284
ALU から出てくる演算結果をレジスタに転送するには,alu ram sel のセレクト
信号を 1’b0 にするのがよいか,1’b1 にするのがよいかを考える.
1’b0するのがこと 8 より記述‘ADDIU: alu ram sel s tmp
= 1’bX;」を「‘ADDIU: alu ram sel s tmp = 1’b0;」に変更する.
8. 追加設計 1 のヒント (8)I 形式の命令 addiu の追加,レジスタファイルの write idx
へ流すデータを選択するセレクト信号の記述 (1)
reg widx sel1 s はセレク reg widx sel1 モジールのセレト信であ 8
参考文献 [9] pp.290-299,または参考文献 [8] pp.274-284
レジスタファイルのデータ書き込み先インデックス write idx に,命令の rt(命
[20:16])を転送するには,reg widx sel1 のセレクト信号を 1’b0 にするのがよ
いか,1’b1 にするのがよいかを考える.
1’b0るのがよいことか 8‘ADDIU: reg widx sel1 s tmp
= 1’bX;」を「‘ADDIU: reg widx sel1 s tmp = 1’b0;」に変更する.
9. 追加設計 1 のヒント (9)I 形式の命令 addiu の追加,レジスタファイルの write idx
へ流すデータを選択するセレクト信号の記述 (2)
link はセレクタ reg widx sel2 モジュールのセレクト信号である(図 8参考文献
[9] pp.101,または参考文献 [7] pp.71
レジスタファイルのデータ書き込み先インデックス write idx ,命令の rt(命
[20:16])を転送するには,reg widx sel2 のセレクト信号を 1’b0 にするのがよ
いか,1’b1 にするのがよいかを考える.
1’b0にすのが(図 8 より記述‘ADDIU: link tmp = 1’bX;
を「‘ADDIU: link tmp = 1’b0;」に変更する.
3.2.2 sw 命令のためのメイン制御回路の追加設計
本実験では,次にsw 命令についての追加設計を行う.ここでも,プロセッサのメイン
制御回路の Verilog HDL 記述 main ctrl.v を使用する.main ctrl.v addiu 命令につ
23
いての追加設計を行った後のものを使用するソースファイル main ctrl.v のコメント
追加設計 1 のヒント (10)(16) の周辺を,下記の 1, 2, 3, 4, 5, 6, 7 の手順で適切に変更
せよ.
0. sw 命令について
sw 命令は,命令の rt フィールドで指定されるレジスタの値をメモリに転送する
命令である.令の rs ルド指定されるレジスタのと命令に直接書か
ている値 immediate との和が,転送先のメモリのアドレスとなる.
sw 命令実行時のプロセッサ内の信号の流れを図 9 に示す青線(濃い灰色)
線(薄い灰色)とラベル付けされた信号線が sw 命令の実行に関わっている.以
下では信号の流れがブク図のようになるように,赤線(11)(16) の番号)
とラベル付けされた制御信号を適切に設定する.制御信号に付いた (11)(16)
番号と,ヒントの番号の間には対応関係がある.
1. 追加設計 1 のヒント (10)I 形式の命令 sw の追加,命令コードの定義
sw 6’b101011‘define SW 6’b001100
を「‘define SW 6’b101011」に変更する.
2. 追加設計 1 のヒント (11)I 形式の命令 sw の追加,RAM への制御信号の記述
ram write enable はメモリの書き込み制御信号である(図 9
sw はレ ram write enable
の値として1’b1」が適切であるソース中の ram write enable に関するコメン
(ヒンの数上あ)// ram write enable // RAM の書込み御信//
ram write enable == 1’b0:書き込みを行わない// ram write enable == 1’b1
書き込みを行う」より)
記述「assign ram write enable = ((op code == ‘SW) && 0) ? 1’b1 : 1’b0;」を
assign ram write enable = (op code == ‘SW) ? 1’b1 : 1’b0;」に変更する.
3. 追加設計 1 のヒント (12)I 形式の命令 sw の追加,is branch モジュールへの制御信
号の記述
is branch (図9 [9] pp.295-299, pp.287
または参考文献 [8] pp.280-284, pp.271
sw beq (branch on equal) どの件分令でないis branch
3’b110 is branch
(ント数十上あ)// is branch d0 // 分岐定モ is branch
の制御信号 // 3’b000, ==, EQ // ... <省略>... // 3’b110, do nothing」より)
‘SW: is branch ctrl tmp = 3’bXXX;‘SW: is branch ctrl tmp = 3’b110;
に変更する.
4. 追加設計 1 ヒント (13)I 形式の命令 sw の追加,ALU の入力ポート B 流すデー
タを選択するセレクト信号の記述
24
ALU
plus4
ROM
MUX
alu_ram_sel
0
命令
alu_cmp
RAM
address
RAM
write data
write
enable
a
b
alu_y
RAM
data
Registers
write idx
write data
write enable
read idx2
read idx1
[25-21]
[20-16]
controler
alu_ctrl
+
adder32
a
b
メイン
コントロール
PC
++4
<<2
[15-0]
Rd
[15-11]
sign_ext
MUX
0
alu_b_sel1
a16
y32
32
6
32
32
32
4
32
ALU
32
32
MUX
reg_widx_sel2
31
0
jp
alu_ctrl
link
2
MUX
0
0
alu_ram_s
3
alu_b_sel2
Rt
jpr
MUX
0
[10-6]
shiftv
3
0
MUX
RAM
MUX
pc_sel
0
is_branch
IsBranch
[25-0]
[5-0]
link_sel
0
32
32
32
32
shifter
Rs
16
MUX
do_sign_ext
alu_op
func
reg_widx
_sel1_s
reg_widx_sel1
targetaddr
read
_data1
read
_data2
is_branch_ctrl
pc_next
(12) do nothing
(13)
(15)
(14)
(16)
Registers/RAMアクセス、ALUを用いた計算
次のPCの値pc_nextの計算
メインコントロールからMUX等への制御信号
(11)(16)main_ctrl.v中のswに関するヒント番号
(11)
青線
緑線
赤線
9: sw 命令実行時のプロセッサ内の信号の流れ
25
ALU B ポートに,命令に直接書かれている値 address(命令 [15:0])を転送す
るには,セレク alu b sel1 のセレクト信号を 1’b0 にするのがよいか,1’b1
するのがよいかを考える.
1’b1」にするのがよことから( 9 より),記述「‘SW: alu b sel1 s tmp =
1’bX;」を「‘SW: alu b sel1 s tmp = 1’b1;」に変更する.
5. 追加設計 1 のヒント (14)I 形式の命令 sw の追加,符号拡張を行う制御信号の記述
sign ext は符号拡張モジュールである(図 9参考文献 [9] pp.285,または参考文
[8] p.270
sw 命令はアドレス計算のために,符号拡張された address rs の符号なし整数
加算を行う
sign ext への制御信号としては「’b1」が適切である(ソース中 do sign ext
関するコメント (ヒントの数行上あたり)// do sign ext // 符号拡張モジュー
sign ext の制御信// do sign ext == 1’b016-bit ータ 32-bit 化するとき符
号拡張を行わない// do sign ext == 1’b116-bit データを 32-bit 化するとき符
号拡張を行う」より)
記述「| | ((op co de == ‘SW) && 0)」を「| | (op code == ‘SW)」に変更する.
6. 追加設計 1 のヒント (15)I 形式の命令 sw の追加,加算を行う制御信号の記述
alu op ALU 制御モジュール alu ctrler への制御信号である( 9,参考文献
[9] pp.290-299,または参考文献 [8] pp.274-284
sw ALU alu op 3’b000
が適(ソス中 alu op コメ (ヒンたり) //
alu op // ALU 制御モジュール alu ctrler の制御信号// 3’b000, ALU に加算を
行わせる// 3’b001, ALU LUI 処理を行わせる// 3’b010, ALU R 形式の
命令に対して,R 形式の機能コードに応じた演算を行わせ// 3’b011, ALU
AND 算を行わせる// 3’b100, ALU OR 演算を行わせる// 3’b101, ALU
XOR 演算を行わせる// 3’b110, ALU SLT の処理を行わせる// 3’b111, ALU
SLTU の処理を行わせる」より)
‘SW: alu op tmp = 3’bXXX;‘SW: alu op tmp = 3’b000;する
参考文献 [7,8,9] とは制御コードがやや異なる.
7. 追加設計 1 のヒント (16)I 形式の命令 sw 追加レジスタイルへの制御信号
記述
reg write enable はレジスタファイル registers の書き込み制御信号である(図 9
文献 [9] pp.290-299,または参考文献 [8] pp.274-284
sw 命令はレジスタに値を書き込まない命令なので,御信 reg write enable
して1’b0切である(ソ reg write enable るコメン (
あた)// reg write enable // イル registers 書き
み制信号// reg write enable == 1’b0みをわな// reg write enable
== 1’b1:書き込みを行う」より)
‘SW: reg write enable tmp = 1’bX;‘SW: reg write enable tmp = 1’b0;
に変更する.
26
3.2.3 論理合成
本実験では,に,追加設計後のプロセッサならびに命令メモリ,その他周辺回路の論
合成を行.論理合成には,追加設計後の main ctrl.v ,動作実験 1-1 で使用したその
他プロセサの Verilog HDL 記述一式,print B.bin から生成したメモージ
rom8x1024 DE2.mif を使用する.
計後 main ctrl.v サな一式トリ mips de2-115
MIPS に置 mips de2-115 に移 (cd)pring B.bin
rom8x1024 DE2.mif あるquartus sh --flow compile DE2 115 Default
理合成を完了 mips de2-115 FPGA ダウ
サな DE2 115 Default.sof
が生成される.
3.2.4 FGPA を用いた回路実現
本実次に追加サの実際動作 1-1 で観察し
た結果との比較を行.ここでは,論理合成により生成されたプロセサなど回路一式のス
トリーアウ DE2 115 Default.sof を, Quartus II を用いて DE2-115 ボー
ド上の FPGA にダウンロードし,動作させる.
スライドスイッチ SW0, SW1 をともに 1 にし,ロセッサへのクロック供給を手動モード
にする.プロセッサが実行するマシン・コー print B.bin ,ディスプレイ下部に文字
’B’ 1 つ表示するプログラムでる.KEY3 を数回押しプロセッサにククパルスを送
,プロセッサに PC=0x0000 番地から PC=0x0048 番地までの命令を実行させ,ディ
スプレイ下部に文 ’B’ 1 つ表示されるかどうかを確認せよ(文 ’B’ 1 つ表示さ
れるはずである) らに,動作実験 1-1 で確認された,3.1.2 節の 1, 2, 3, 4, 5 で予想
した結果と異なる動作について,の動作に変化がないかどうかを確認せよ3.1.2 節の 1,
2, 3, 4, 5 で予想した結果と同じ動作になったはずである)
3.2.5 プロセッサの機能レベルシミュレーション
本実験では最後に,追加設計後のプロセッサの動作を機能レベルシミュレーションによ
り確認する.機能レベルシミュレーションには,動作実験 1 print B.bin から生成した
機能レベルシミュレーション用の命令メモリの Verilog HDL 記述 rom8x1024 sim.v と,追
加設計後のプロセッサの Verilog HDL 記述一式を使用する.
mips de2-115/MIPS/cpu.v
をシミュレーション用の記述に変更し,能レベルシミュレーション用のソースにしておく
必要がある.下記の 1, 2, 3, 4, 5, 6 の手順で,ソース mips de2-115/MIPS/cpu.v の記述
を変更せよ.
1. cpu.v 70 行目周辺,動作実験用の include 文をコメントアウトする.
2. cpu.v 65 行目周辺,機能レベルシミュレーション用 include を有効にする.
3. cpu.v 320 行目周辺,動作実験用の ROM の実体化を数行コメントアウトする.
4. cpu.v 315 目周,機能レシミュレション用 ROM の実体化効に
する.
27
5. cpu.v 340 行目周辺,動作実験用の RAM の実体化を数行コメントアウトする.
6. cpu.v 335 目周,機能レシミュレション用 RAM 化を効に
する.
cpu.v 更後rom8x1024 sim.v レクト mips de2-115/MIPS にコピし,
レクトリ mips de2-115/MIPS cd して,EDA ツールを用いた論理回路設計の 3.2 節を参
考に「vsim test cpu.v」により機能レベルシミュレーションを行う.なお機能レベルシ
ミュレーショ後,の実験課題で再び論理合成が行えるように,cpu.v の記述を元にもど
しておくこと.
4 シングルサイクル RISC プロセッサの設計「中級編」
本実験では,シングルサイク RISC プロセサの設計と動作実験を行 2 週目の実
験では,ロセサの動作実と,ッサンプ命j即値号な
オン・レス・ザン命令(sltiu,ブランチ・オン・ノットイコール命令(bne,とロード・
ワードlwついての追加設計を行う.また,クロスコンパイラを用いたプログラム開発
についての実験も行う.以下では,ジャンプ命令についての動作実験 2-1 ならびに追加設計
2,動作実験 2-2 について述べる
4.1 マシン・コードの動作実験 2-1(文字の繰り返し出力 1
プロセサの動作実 2-1 では,ディスプレイに文字 ’B’ を繰り返し表示す MIPS マシ
ン・コード print B while.bin ,それを実行するプロセッサとして追加設 1 完成さ
たプロセッサを FPGA 上に実現し,その動作を確認する.
本動作実験では,実験 1-2 で完成させたジャンプ命令(jumpj)が未実装なプロセッサ
において,その命令を含む簡単な機械語のマシンコードを実行するとどのような動作を
するかを観察する.本実験で観察した結果は,次のプロセッサの追加設計 2 において,j
正しく動くプロセッサを完成させた後,動作比較の対象として用いる.
4.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験では,まずMIPS マシン・コードを命令メモリのメモリ・イメージファイルに変
換する.ここでは,MIPS マシンコードの例として print B while.bin
3
を使用する.
換には,変換プログラム bin2v を使用する.EDA ツールの環境設定を行ったのち,bin2v
print B while.binで, MIPS マシン語プログラムからメモリイメージファイルを作成
するこの変換によ論理合成のメモリイメージファイ rom8x1024 DE2.mif と,
能レベルシミュレーション用の Verilog HDL 記述 rom8x1024 sim.v が得られる.
なお,本実験で使用する MIPS マシン・コード print B while.bin は,正しいプロセッ
サ(ジャンプ命 j が実装済みのプロセッサ)で動作させると,次の 1, 2, 3, 4 のような動
作をする命令列を含んだ,バイナリファイルである.
1. データメモリ(RAM)の 0x0300 番地に 0 を格納
addiu $s2, $s0, 0x0300
sw $s0, 0x0000($s2)
3
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/k02 j/print B while.bin
28
2. RAM 0x0304 番地に 2 を格納
addiu $s3, $s0, 0x0304
addiu $s2, $s0, 0x0002
sw $s2, 0x0000($s3)
3. RAM 0x0300 番地に 1 を上書き
addiu $s3, $s0, 0x0300
addiu $s2, $s0, 0x0001
sw $s2, 0x0000($s3)
4. PC = 0x040002c 番地の命令にジャンプ
j 0x040002c
4.1.2 命令メモリに格納される命令列の確認
本実験では,次に,命令メモリに格納される命令列の確認を行う.この確認には,bin2v
により生成された機能レベルシミュレーション用の Verilog HDL 記述 rom8x1024 sim.v
使用する.図 10 rom8x1024 sim.v の一部を示す
<省略>
case (word_addr)
<省略>
10’h00b: data = 32’h24020300; // 0040002c: ADDIU, REG[2]<=REG[0]+768(=0x00000300);   ここが PC=0x002c の命令
10’h00c: data = 32’hac400000; // 00400030: SW, RAM[REG[2]+0]<=REG[0];
10’h00d: data = 32’h24030304; // 00400034: ADDIU, REG[3]<=REG[0]+772(=0x00000304);
10’h00e: data = 32’h24020002; // 00400038: ADDIU, REG[2]<=REG[0]+2(=0x00000002);
10’h00f: data = 32’hac620000; // 0040003c: SW, RAM[REG[3]+0]<=REG[2];
10’h010: data = 32’h24030300; // 00400040: ADDIU, REG[3]<=REG[0]+768(=0x00000300);
10’h011: data = 32’h24020001; // 00400044: ADDIU, REG[2]<=REG[0]+1(=0x00000001);
10’h012: data = 32’hac620000; // 00400048: SW, RAM[REG[3]+0]<=REG[2];
10’h013: data = 32’h0810000b; // 0040004c: J, PC<=0x0010000b*4(=0x0040002c);   ここが 命令メモリ 0x013 の命令
<省略>
endcase
<省略>
10: rom8x1024 sim.v の一部
10 case ロック内の最後の記述は,本実験で設計するプロセッサの命令メモリ
0x013 番地に機械語 0x0810000b が格納されることを表している.また,この命令は実際
MIPS では 0x0040004c に格納され令名は jPC 0x040002c をセッする命令であ
ることを表している.
print B while.bin から生成され rom8x1024 sim.v たは,図 10 Verilog HDL
記述を解析し,以下の 1 について答えよ.なお,j はジャンプ命令である.
1. プロセッサ PC=0x004c の命令を実行することによりPC に格納される値と,そ
れが表す命令メモリの番地を予想せよ.
4.1.3 論理合成
では次にj 実装なプならびに令メモリその他周辺回の論
合成理合は,bin2v により理合イメージイル
rom8x1024 DE2.mif 実験 1-2 成さたプロセサの Verilog HDL 記述一式を使する
29
メモリ・イメージファイル rom8x1024 DE2.mif をディレクトリ mips de2-115 にコピーし,
ディレクトリ mips de2-115 cd して,quartus sh --flow compile DE2 115 Default
合成を行完了クト mips de2-115 FPGA にダウン
サな DE2 115 Default.sof
が生成される.
4.1.4 FPGA を用いた回路実現
実験j 命令サの
次のプロセッサの追加設計 2 において,j が正しく動くプロセッサを完成させた後,動作比
較のとし用い成されロセ回路のスームアウイル
DE2 115 Default.sof を, Quartus II を用いて DE2-115 ボード上の FPGA ダウンロー
ドし,動作させる.スライドスイッチ SW0, SW1 をともに 1 にし,プロセッサへのクロッ
ク供給を手動モードにする.今回プロセが実行するマシンコード print B while.bin
はディスプレイ下部に文 ’B’ を繰り返し表示するプログラムである.KEY3 数回押
クロックパルスを送,プロセッサに PC=0x0000 地の命令から 25 程度の命令を実
行させディプレイ下部に文字 ’B’ 繰り返し表示されるかどうかを確認せよ(デ
レイ下部に文字 1 つしか表示されないはずである)ディスプレイ上部にはプロセサ内
部の主な信号線の現在の値が表示されている.
11 に動作実験 2-1 のプロセッサのブロック図を示す
4.1.2 1 で予想した結果と同じ,正しい動作かどうかを確認せよ(予想と異なり
しく動作しないはずであるこの結果から,プロセッサが,j 命令を正しく実行できてい
ないことが分かる.部で行われるデータ転送や演算などを制御するメイン制御回路を
れらの命令に対応したものにする.
30
ALU
plus4
ROM
MUX
alu_ram_sel
0
命令
alu_cmp
RAM
address
RAM
write data
write
enable
a
b
alu_y
RAM
data
Registers
write idx
write data
write enable
read idx2
read idx1
[25-21]
[20-16]
controler
alu_ctrl
+
adder32
a
b
メイン
コントロール
PC
++4
<<2
[15-0]
Rd
[15-11]
sign_ext
MUX
0
alu_b_sel1
a16
y32
32
6
32
32
32
4
32
ALU
32
32
MUX
reg_widx_sel2
31
0
alu_ctrl
link
2
MUX
0
0
alu_ram_s
3
alu_b_sel2
Rt
MUX
0
[10-6]
shiftv
3
0
MUX
RAM
MUX
pc_sel
0
is_branch
IsBranch
[25-0]
[5-0]
link_sel
0
32
32
32
32
shifter
Rs
16
MUX
do_sign_ext
alu_op
func
reg_widx
_sel1_s
reg_widx_sel1
read
_data1
read
_data2
is_branch_ctrl
pc_next
11: 動作実験 2-1 のプロセッサのブロック図
31
4.2 プロセッサの追加設計 2j 命令)と動作実験 2-2
本実験では,ロセッサの追加設計と動作実験を行うここでは, j 命令が未実装なプロ
セッサを例とし,追加設計を行い,j 命令が正しく実行されるプロセッサを完成させる.ま
た,その動作を実際に動作させて観察する.
4.2.1 j 命令のためのジャンプ・セレクト・モジュールの追加設計
本実験ではまず動作実験 2-1 で動作を確認した j 命令が未実装なプロセッサに対して
追加設計を行う.ここでは,プロセッサの最上位階層の Verilog HDL cpu.v を使用す
る.cpu.v は,ディレクトリ mips de2-115 のサブディレクトリ MIPS にある.追加設計 2
のヒント (1)(4) の周辺を,下記の 1, 2, 3, 4 の手順で適切なものに変更せよ.
j 命令は,「命令 address フィールドに直接書かれている値」 × 4 PC に格納する
命令である.
j 命令のためのジャンプセレクトモジュールを含むプロセッサのブロク図を,
12 に示す囲また,未実装加設計 2 書か部分 j のた
ンプ・セレクト・モジュールである.MUX jp sel は,2 1 力の Multiplexer,
選択回路であり,その 2 の入力信号のうち,0 のラベルが付けられている方が,選
択信号 jp 0 の時に出力される信号である.以下では,このンプレク
ジュールをプロセッサの最上位階層の記述に追加する.
1. 追加設計 2 のヒント (1)jp sel の入出力ワイヤの宣言
12 のワイヤ jp sel d0, jp sel d1, jp sel s, jp sel y に対応する,同名のワ
イヤを宣言する.
2. 追加設計 2 のヒント (2)32-bit, 32-bit 入力, 32-bit 出力のセレクタを実体化
12 のモジュール jp sel に対応する,同名のモジュールを実体化する.
3. 追加設計 2 のヒント (3)jp sel の出力 jp sel y pc next への接続
モジュール jp sel の出力 jp sel y を図 12 のように pc next に接続する.
古い接続 assign pc next = pc sel y; は消去する.
4. 追加設計 2 のヒント (4)jp sel の入力 jp sel d0, jp sel d1, jp sel s の接続
モジュール jp sel の入力 jp sel d0, jp sel d1, jp sel s を,それぞれ図 12 のよう
pc sel y, sh j y, jp に接続する.
32
ALU
plus4
ROM
MUX
alu_ram_sel
0
命令
alu_cmp
RAM
address
RAM
write data
write
enable
a
b
alu_y
RAM
data
Registers
write idx
write data
write enable
read idx2
read idx1
[25-21]
[20-16]
controler
alu_ctrl
+
adder32
a
b
メイン
コントロール
PC
++4
<<2
[15-0]
Rd
[15-11]
sign_ext
MUX
0
alu_b_sel1
a16
y32
32
6
32
32
32
4
32
ALU
32
32
shifter
MUX
reg_widx_sel2
31
0
jp
alu_ctrl
link
2
MUX
0
0
alu_ram_s
3
alu_b_sel2
Rt
jpr
MUX
0
[10-6]
shiftv
3
0
MUX
RAM
MUX
pc_sel
0
is_branch
IsBranch
MUX
jp_sel
0
<<2
[25-0]
[5-0]
link_sel
0
32
32
32
32
shifter
Rs
16
MUX
do_sign_ext
alu_op
func
reg_widx
_sel1_s
reg_widx_sel1
26
targetaddr
read
_data1
read
_data2
is_branch_ctrl
未実装
追加設計2
pc_next
sh_j_y
d0
d1
s
y
12: j 命令のためのジャンプ・セレクト・モジュールを含むプロセッサ
33
4.2.2 j 命令のためのメイン制御回路の追加設計
本実験では次に,動作実験 2-1 作を確認し j 命令が未実装なプロサに対して,
追加設計を行うここでは,プロサのメイン制御回路の Verilog HDL main ctrl.v
を使用する.main ctrl.v は,ディレクトリ mips de2-115 のサブディレクトリ MIPS にあ
る.ソースファイル main ctrl.v 中のコメント,追加設計 2 のヒント (1)(3) の周辺を,
下記の 1, 2, 3 の手順で適切に変更せよ.
j 命令実行時のプロセッサ内の信号の流れを図 13 に示す.緑線(薄い灰色)とラベル
付けされた信号線が j 命令の実行に関わっている.以下では,信号の流れがブロック
図のようになるように,赤線((2),(3) の番号付き)とラベル付けされた制御信号を適
切に設定する.制御信号に付いた (2),(3) の番号と,ヒントの番号の間には対応関係が
ある.
1. 追加設計 2 のヒント (1)J 形式の命令 j の追加,命令コードの定義
j の命令操作コードが6’b000010であることから,記述‘define J 6’b001100
‘define J 6’b000010」に変更する.
2. 追加 2 のヒ (2)J 式の j 追加jp sel への御信記述
jp sel はジャン用のューであ 13参考 [9] pp.295-299pp.287
または参考文献 [8] pp.280-284, pp.271
j 命令はジンプ命令なのでjp sel への制御信号として1’b1が適切である
(ソース中の jp sel に関するコメン (ヒントの数行上あた)// jump, J, JAL
// MUX, jp sel モジュールのセレクト信号// jp == 1’b0 jump しない場
の,次の PC の値を選択// jp == 1’b1 jump する場合の,次の PC の値を選
択」より)
記述「assign jp = (((op code == ‘J) && 0) | | ((op code == ‘JAL) && 0)) ?
1’b1 : 1’b0;」を「assign jp = ((op code == ‘J) | | ((op code == ‘JAL) && 0))
? 1’b1 : 1’b0;」に変更する.
3. 追加設計 2 のヒン (3)J 式の命令 j の追加,レジスタファイルへの制御信号の
記述
reg write enable はレジスタファイ registers の書き込制御信号であ(図 13
参考文献 [9] pp.290-299,または参考文献 [8] pp.274-284
j reg write enable
の値1’b0ソー reg write enable コメ
(行上)// reg write enable // registers
信号// reg write enable == 1’b0// reg write enable
== 1’b1:書き込みを行う」より)
記述‘J: reg write enable tmp = 1’b1;‘J: reg write enable tmp = 1’b0;
変更する.
34
ALU
plus4
ROM
MUX
alu_ram_sel
0
命令
alu_cmp
RAM
address
RAM
write data
write
enable
a
b
alu_y
RAM
data
Registers
write idx
write data
write enable
read idx2
read idx1
[25-21]
[20-16]
controler
alu_ctrl
+
adder32
a
b
メイン
コントロール
PC
++4
<<2
[15-0]
Rd
[15-11]
sign_ext
MUX
0
alu_b_sel1
a16
y32
32
6
32
32
32
4
32
ALU
32
32
shifter
MUX
reg_widx_sel2
31
0
jp
alu_ctrl
link
2
MUX
0
0
alu_ram_s
3
alu_b_sel2
Rt
jpr
MUX
0
[10-6]
shiftv
3
0
MUX
RAM
MUX
pc_sel
0
is_branch
IsBranch
MUX
jp_sel
0
<<2
[25-0]
[5-0]
link_sel
0
32
32
32
32
shifter
Rs
16
MUX
do_sign_ext
alu_op
func
reg_widx
_sel1_s
reg_widx_sel1
26
targetaddr
read
_data1
read
_data2
is_branch_ctrl
pc_next
sh_j_y
d0
d1
s
y
(2)
(3)
次のPCの値pc_nextの計算
メインコントロールからMUX等への制御信号
(2), (3)main_ctrl.v中のjに関するヒント番号
緑線
赤線
13: j 命令実行時のプロセッサ内の信号の流れ
35
4.2.3 論理合成
本実験では,に,追加設計後のプロセッサならびに命令メモリ,その他周辺回路の論
合成を行論理合成には追加設計後の main ctrl.v cpu.v動作実 2-1 で使用し
その他プロセッサの Verilog HDL 記述一式,print B while.bin から生成したメモリ・イ
メージファイル rom8x1024 DE2.mif を使用する.
main ctrl.v cpu.v ,ディレ mips de2-115 のサディレ
MIPS 置く.更に,ディレクトリ mips de2-115 cd pring B while.bin
rom8x1024 DE2.mif が,そこにあるのを確認してから,
quartus sh --flow compile DE2 115 Default」で論理を行.論理合成了す
ると,ディレクトリ mips de2-115 内に FPGA にダウンロード可能なプロセッサなど回
一式のストリーム・アウト・ファイル DE2 115 Default.sof が生成される.
4.2.4 FGPA を用いた回路実現
本実験では,次に追加設計後のプロセッサの実際の動作を観察し動作実験 2-1 で観察
した結果との比較を行う.ここでは,理合成により生成されたプロセッサなど回路一式の
ストアウイル DE2 115 Default.sof を,Quartus II を用い DE2-115 ボー
ド上の FPGA ダウンロードし,動作させるまた,ライドスイ SW0, SW1 をとも
1 にしサへクロク供手動ードするサが行すマシ
コード print B while.bin はデスプレイ下部に文字’B’ を繰り返し表示するプログラムで
ある.KEY3 数回押しプロセッサにクロックパルスを送り,プロセッサに PC=0x0000
番地か 25 程度の命令を実行させ,スプレイ下部に文字 ’B’ が繰り返し表示され
かどうかを確認せよ(文 ’B’ が繰り返し表示されるはずである)また,動作実験 2-1
確認された,4.1.2 節の 1 で予想した結果と異なる動作について,その動作に変化がないか
どうかを確認せよ(4.1.2 節の 1 で予想した結果と同じ動作になったはずである)
36
5 実験
実験 1-1 ディスプレイに文字 ’B’ を1つ表示する MIPS マシン・コー print B.bin
と,それを実行するプロセッサを FPGA 上に実現しその動作を確認せ(動作実
1-1.本動作実験は,3 章を参考に,下記の 1, 2, 3, 4 の手順で行いなさい.
動作実験 1-1 の手順
1. メモリイメージファイルの作成
3.1.1 節を参考に,MIPS シンコー print B.bin から,プロセッ
の命令メモリのメモリ・イメージファイルを作成する.
2. 命令メモリに格納される命令列の確認
3.1.2 節を参考に,命令メモリに格納される命令列を確認し,プロセッ
の動作を予想する.
3. 論理合成
3.1.3 節を参考に,プロセッサならびに作成したメモリイメージ,その他
周辺回路の論理合成を行う
4. FPGA を用いた回路実現
3.1.4 節をプロサなど回 DE2-115 ボー FPGA
にダウンロードし,実際の動作を観察する.
なお,本動作実験で使用する MIPS マシンコード print B.bin と,プロセッサ
Verilog HDL 記述一式は下記の URL からダウンロードできる.
MIPS マシン・コード:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/
k01 addiu sw/print B.bin
(実験 1-1 用の MIPS マシン・コード,バイナリファイル)
プロセッサの Verilog HDL 記述一式:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/k01 addiu sw/
mips de2-115.tar.gz
本実験をとおして完成させる未完成なプロセッサ
実験 1-1 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k01 addiu sw 1 1/index.html
37
実験 1-2 動作実験 1-1 addiu 命令と sw 命令が未実装なプロセッサについて,追加
設計を行い両命令を正しく実行するプロセッサを完成させなさい追加設 1
また,そのプロセッサと動作実験 1-1 print B.bin FPGA 上に実現し,そ
の動作を確認せよ(動作実験 1-2本実験は,3 章を参考に,記の 1, 2, 3, 4, 5
の手順で行いなさい.
プロセッサの追加設計 1 の手順
1. addiu 命令のためのメイン制御回路の追加設計
3.2.1 節を参考に,プロセッサのメイン制御回路の追加設計を行う
2. sw 命令のためのメイン制御回路の追加設計
3.2.2 節を参考に,プロセッサのメイン制御回路の追加設計を行い,プロ
セッサを完成させる.
動作実験 1-2 の手順
3. 論理合成
3.2.3 を参に,したプロその他周辺回の論理合成を
4. FPGA を用いた回路実現
3.2.4 節を参考に,完成したプロセッサ等の回路を DE2-115 ボード上の
FPGA にダウンロードし,実際の動作を観察する.
5. プロセッサの機能レベルシミュレーション
3.2.5 節を参考に,プロセッサの動作を機能レベルシミュレーションによ
り確認する.
addiu 命令と sw 命令のアセンブリ言語
区分 命令 意味
算術演算 addiu rt,rs,immediate rt = rs + immediate
データ転送 sw rt,address(rs) メモリ [rs + address] = rt
addiu 命令と sw 命令の機械語
addiu 001001 rs rt immediate
I 形式 6 ビット 5 ビット 5 ビット 16 ビット
sw 101011 rs rt address
I 形式 6 ビット 5 ビット 5 ビット 16 ビット
31 26 25 21 20 16 15 0
実験 1-2 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k01 addiu sw 1 2/index.html
38
実験 2-1 ディス ’B’ MIPS ン・コ
print B while.bin ,それを実行するプロセッサとして実 1-2 で完成させ
プロセッサ FPGA に実現しその動作を確認せよ(動作実験 2-1.本動作実
験は,4 章を参考に下記の 1, 2, 3, 4 の手順で行いなさい.
動作実験 2-1 の手順
1. メモリイメージファイルの作成
4.1.1 節を参考にMIPS マシンコード print B while.bin からプロ
セッサの命令メモリのメモリ・イメージファイルを作成する.
2. 命令メモリに格納される命令列の確認
4.1.2 節を参考に,命令メモリに格納される命令列を確認し,プロセッ
の動作を予想する.
3. 論理合成
4.1.3 節を参考に, 1-2 で完成させたプロセッサならびに作成したメ
モリイメージ,その他周辺回路の論理合成を行う
4. FPGA を用いた回路実現
4.1.4 節をプロサなど回 DE2-115 ボー FPGA
にダウンロードし,実際の動作を観察する.
なお,動作実験で使用す MIPS マシンコード print B while.bin は,下記
URL からダウンロードできる.
MIPS マシン・コード:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/
k02 j/print B while.bin
(実験 2-1 用の MIPS マシン・コード,バイナリファイル)
実験 2-1 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k02 j 2 1/index.html
39
実験 2-2 動作実験 2-1 j 命令が未実装なプロセッサについて,追加設計を行い,j
令を正しく実行するプロセッサを完成させなさい(追加設計 2.また,そのプ
セッサと動作実験 2-1 print B while.bin FPGA 上に実現し,その動作を
確認せ動作実 2-2本実験は,4 章を参考に下記の 1, 2, 3, 4 手順で行い
なさい.
プロセッサの追加設計 2 の手順
1. j 命令のためのジャンプ・セレクト・モジュールの追加設計
4.2.1 節を参考に,プロセッサの最上位階層の記述に追加設計を行う
2. j 命令のためのメイン制御回路の追加設計
4.2.2 節を参考に,プロセッサのメイン制御回路の追加設計を行い,プロ
セッサを完成させる.
動作実験 2-2 の手順
3. 論理合成
4.2.3 を参に,したプロその他周辺回の論理合成を
4. FPGA を用いた回路実現
4.2.4 節を参考に,完成したプロセッサ等の回路を DE2-115 ボード上の
FPGA にダウンロードし,実際の動作を観察する.
j 命令のアセンブリ言語
区分 命令 意味
ジャンプ j address PC = address × 4
j 命令の機械語
j 000010 address
J 形式 6 ビット 26 ビット
31 26 25 0
実験 2-2 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k02 j 2 2/index.html
40
実験 3 14 に,MIPS ,実 1-1, 1-2 使 MIPS
print B.bin が得られ C 言語のソー print B.c ソースの
1,2 行目は,それぞれ,プロセッサのデータメモリの 0x0300 番地 0x0304 番地
を指す define 文である.5 行目は,プロセッサのデータメモリの 0x0300 番地に
0x00000000 を格納記述6,7 は,それぞれプロセタメ
モリの 0x0304, 0x0300 番地に 0x00000002, 0x00000001 を格納する記述である.
14 のソースから実験 1-1, 1-2 で使用したマシン・コードが生成されることをふ
まえ,実験 2-1, 2-2 で使用した MIPS マシンコード print B while.bin が生成
される,元となった C 言語のソース my print B while.c を作成せよ
(ヒント:print B.c 2 行追加)
,作 my print B while.c MIPS ルしMIPS
ン・コ my print B while.bin .ク
cross compile.sh」を使 cross compile.sh my print B while.c」で
MIPS ン・コー得ら.更に,生 my print B while.bin
対して,bin2v」を使用し,メモリ・イメージファイル rom8x1024 DE2.mif
成し,その内容が,実験 2-1 で使用したものと同じであるかどうかを確認せよ.
1: #define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300)
2: #define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304)
3: main()
4: {
5: EXTIO_PRINT_STROKE = (unsigned int)0x00000000;
6: EXTIO_PRINT_ASCII = (unsigned int)0x00000002;
7: EXTIO_PRINT_STROKE = (unsigned int)0x00000001;
8: }
14: print B.c
実験 3 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここを
参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k03 cross/index.html
41
実験 4-1 61 C ログラ print all char.c と,
それを実行するプロセッサとして実験 2-2 で完成させたプロセッサを FPGA 上に
実現しその動作を確認(動作実 4-1本動実験は,記の 1, 2, 3, 4, 5
手順で行いなさい.
動作実験 4-1 の手順
1. クロスコンパイル
C print all char.c MIPS ン・コ
print all char.bin を生成する.
2. メモリイメージファイルの作成
MIPS マシード print all char.bin からプロの命令メ
リのメモリ・イメージファイルを作成する.
3. 命令メモリに格納される命令列の確認
命令メモリに格納される命令列を確認し,プロセッサの動作を予想する.
4. 論理合成
実験 2-2 で完成させたプロセッサならびに作成したメモリイメージ,そ
の他周辺回路の論理合成を行う
5. FPGA を用いた回路実現
プロセッサなど回路一式を DE2-115 ボード上 FPGA にダウンロード
し,実際の動作を観察する.
なお,本動作実験で使用す C プログラ print all char.c は,下記 URL
からダウンロードできる.
C プログラム:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/
k04 sltiu bne lw/print all char.c
(実験 4-1 用の C プログラム)
実験 4-1 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k04 sltiu bne lw 4 1/index.html
42
実験 4-2 動作実験 4-1 sltiu 命令と bne 命令,lw 命令が未実装なプロセッサについ
て,追加設計を行い,これ命令を正しく実行するロセッサを完成させな
(追加設計 3.また,そのプロセッサと動作実 4-1 print all char.bin
FPGA 上に実現しその動作を確認せよ(動作実験 4-2実験は,下記の 1, 2,
3, 4, 5 の手順で行いなさい.
プロセッサの追加設計 3 の手順
1. sltiu 命令のためのメイン制御回路の追加設計
プロセッサのメイン制御回路の追加設計を行う
2. bne 命令のためのメイン制御回路の追加設計
プロセッサのメイン制御回路の追加設計を行う
3. lw 命令のためのメイン制御回路の追加設計
加設ロセ
動作実験 4-2 の手順
4. 論理合成
完成したプロセッサ,その他周辺回路の論理合成を行う
5. FPGA を用いた回路実現
完成サ等の回 DE2-115 ボー FPGA ダウン
ドし,実際の動作を観察する.
sltiu 命令と bne 命令,lw 命令のアセンブリ言語
区分 命令 意味
条件判定 sltiu rt,rs,immediate rt = (rs < immediate) ? 1 : 0
条件分岐 bne rt,rs,address PC = (rs ̸= rt) ? PC + 4 + address × 4 : PC + 4
データ転送 lw rt,address(rs) rt = メモリ [rs + address]
sltiu 命令と bne 命令,lw 命令の機械語
sltiu 001011 rs rt immediate
I 形式 6 ビット 5 ビット 5 ビット 16 ビット
bne 000101 rs rt address
I 形式 6 ビット 5 ビット 5 ビット 16 ビット
lw 100011 rs rt address
I 形式 6 ビット 5 ビット 5 ビット 16 ビット
31 26 25 21 20 16 15 0
実験 4-2 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k04 sltiu bne lw 4 2/index.html
43
実験 5-1 ディスプレイに文字列を表示する C プログラム my print.c と,それを実行
するプロセサとして実 4-2 で完成させたプロセッサを FPGA 上に実現しその
動作を確認せよ(動作実験 5-1.本動作実験は,下記の 1, 2, 3, 4, 5 の手順で行
いなさい.
動作実験 5-1 の手順
1. クロスコンパイル
C my print.c からMIPS my print.bin
を生成する.
2. メモリイメージファイルの作成
MIPS マシコード my print.bin から,プロセの命令メモリの
モリ・イメージファイルを作成する.
3. 命令メモリに格納される命令列の確認
命令メモリに格納される命令列を確認し,プロセッサの動作を予想する.
4. 論理合成
実験 4-2 で完成させたプロセッサならびに作成したメモリイメージ,そ
の他周辺回路の論理合成を行う
5. FPGA を用いた回路実現
プロセッサなど回路一式を DE2-115 ボード上 FPGA にダウンロード
し,実際の動作を観察する.
なお,本動作実験で使用する C ログラム my print.c は,下記の URL からダ
ウンロードできる.
C プログラム:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/
k05 jal/my print.c
(実験 5-1 用の C プログラム)
実験 5-1 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k05 jal 5 1/index.html
44
実験 5-2 動作実験 5-1 jal 命令が未実装なプロセサについて,加設計を行い,jal
命令を正しく実行するプロセッサを完成させなさい(追加設計 4.また,その
ロセッサと動作実験 5-1 my print.bin FPGA 上に実現し,の動作を確認
せよ(動作実験 5-2.本実験は,下記の 1, 2, 3 の手順で行いなさい.
プロセッサの追加設計 4 の手順
1. jal 命令のためのメイン制御回路の追加設計
加設ロセ
動作実験 5-2 の手順
2. 論理合成
完成したプロセッサ,その他周辺回路の論理合成を行う
3. FPGA を用いた回路実現
完成サ等の回 DE2-115 ボー FPGA ダウン
ドし,実際の動作を観察する.
jal 命令のアセンブリ言語
区分 命令 意味
手続きサポート jal address PC = PC + 4
(ジャンプ) ra = address × 4
ra 31 番目のレジスタ)
jal 命令の機械語
jal 000011 address
J 形式 6 ビット 26 ビット
31 26 25 0
実験 5-2 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k05 jal 5 2/index.html
45
実験 6-1 キーボードからの文字列入力を受け C プログラム my scan.c と,それを実
行するプロセッサとして実験 5-2 で完成させたプロセッサを FPGA 上に実現しそ
の動作を確認せよ(動作実験 6-1.本動作実験は,下記の 1, 2, 3, 4, 5 の手順で
行いなさい.
動作実験 6-1 の手順
1. クロスコンパイル
C 言語プ my scan.c から,MIPS コード my scan.bin
を生成する.
2. メモリイメージファイルの作成
MIPS マシン・コー my scan.bin から,プロセッサの命令メモリのメ
モリ・イメージファイルを作成する.
3. 命令メモリに格納される命令列の確認
命令メモリに格納される命令列を確認し,プロセッサの動作を予想する.
4. 論理合成
実験 5-2 で完成させたプロセッサならびに作成したメモリイメージ,そ
の他周辺回路の論理合成を行う
5. FPGA を用いた回路実現
プロセッサなど回路一式を DE2-115 ボード上 FPGA にダウンロード
し,実際の動作を観察する.
なお,本動作実験で使用する C プログラム my scan.c は,下記の URL からダウ
ンロードできる.
C プログラム:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/
k06 jr/my scan.c
(実験 6-1 用の C プログラム)
実験 6-1 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k06 jr 6 1/index.html
46
実験 6-2 動作実験 6-1 jr 令が未実装なプロセッサについて,追加設計を行いjr
命令を正しく実行するプロセッサを完成させなさい(追加設計 5.また,その
ロセッサと動作実 6-1 my scan.bin FPGA 上に実現し,その動作を確
せよ(動作実験 6-2.本実験は,下記の 1, 2, 3, 4 の手順で行いなさい.
プロセッサの追加設計 5 の手順
1. jr 命令のためのジャンプ・レジスタ・セレクト・モジュールの追加設計
プロセッサの最上位階層の記述に追加設計を行う
2. jr 命令のためのメイン制御回路の追加設計
加設ロセ
動作実験 6-2 の手順
3. 論理合成
完成したプロセッサ,その他周辺回路の論理合成を行う
4. FPGA を用いた回路実現
完成サ等の回 DE2-115 ボー FPGA ダウン
ドし,実際の動作を観察する.
jr 命令のアセンブリ言語
区分 命令 意味
手続きサポート jr rs PC = ra
(ジャンプ) ra 31 番目のレジスタ)
jr 命令の機械語
jr 000000 11111 00000 00000 00000 001000
R 形式 6 ビット 5 ビット 5 ビット 5 ビット 5 ビット 6 ビット
31 26 25 21 20 16 15 11 10 6 5 0
実験 6-2 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここ
を参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k06 jr 6 2/index.html
47
実験 7 3 からキーボードから入力された数」までの数のうち,素数であるもののみを
ディスプレイに次々と表示する処理をC プログラムと実験 6-2 で完成させた
ロセッサにより実現せよ.本実験は,下記の 1, 2, 3, 4, 5, 6 の手順で行いなさい.
実験 7 の手順
1. クロスコンパイル
sosuu.c から,MIPS のマシン・コード sosuu.bin を生成する.
2. メモリイメージファイルの作成
sosuu.bin から,メモリ・イメージファイルを作成する.
3. 命令メモリに格納される命令列の確認
(a) 命令メモリの 0x082 番地の命令は,実 6-2 で完成させたプロセッ
サでは未実装な命令である.この命令はどのような命令か調査せよ.
(b) 3 (a) の命令は,sosuu.c 中の関 sosuu check() の処理を行う命令
の一つである.具体的に,どの記述に対応しているか予想せよ.
4. 論理合成
実験 6-2 で完成させたプロセッサならびに作成したメモリイメージ,そ
の他周辺回路の論理合成を行う
5. FPGA を用いた回路実現
プロセッサなど回路一式を DE2-115 ボード上 FPGA にダウンロード
し,実際の動作を観察する.
(a) HELLO, NUM= と表示されたら,キーボードか “20” と入力し,その
結果を観察せよ.
(b) 5 (a) で観察された正しくない動作の原因は3(a),(b) のためである
この問題を解決する方法を 2 つ考えよ.
6. C プログラム sosuu.c の変更(おそらく2 つの解決法のうちの 1 つ)
3 「キーボードから力された数」での数のち,数であるもの
みをプレと表 sosuu.c
を修正し,実際にその動作を確認する.
なお,本動作実験で使用する C プログラ sosuu.c は,下記の URL からダウ
ロードできる.
C プログラム:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/
k07 sosuu/sosuu.c
(実験 7 用の C プログラム)
実験 7 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここを
参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k07 sosuu/index.html
48
実験 8 キーボードからステッピングモーターを制御する処理をC プログラムと実験
6-2 で完成させたプロセッサにより実現せよ.本実験は,下記の 1, 2, 3, 4, 5 の手
順で行いなさい.
実験 8 の手順
1. クロスコンパイル
C 言語プログラ motor.c から,MIPS のマシンード motor.bin
生成する.
2. メモリイメージファイルの作成
MIPS マシン・コード motor.bin から,プロセッサの命令メモリのメモ
リ・イメージファイルを作成する.
3. 論理合成
実験 6-2 で完成させたプロセッサならびに作成したメモリイメージ,そ
の他周辺回路の論理合成を行う
4. FPGA を用いた回路実現
プロセッサなど回路一式を DE2-115 ボード上 FPGA にダウンロード
し,実際の動作を観察する(本プログラムはキーボードからの制御は
きない)
5. モーター制御プログラムの作成
キーボードからモーターを制御するプログラムを自由に作成し,実際
その動作を確認する.
なお,本動作実験で使用する C プログラ motor.c は,下記の URL からダウ
ロードできる.
C プログラム:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/
k08 motor/motor.c
(実験 8 用の C プログラム)
実験 8 に関する追加の情報がある場合は下記の URL に掲載するので,その時はここを
参照すること.
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/
j2hard-mips/k08 motor/index.html
49
6 実験レポートについて
実験 1実験 2 3実験 4 5実験 6実験 7 8 について,実験の概要
使用機器ならびにソフトウェア,実験の手順,実験の各段階の説明,動作実験の結果,実
の考察を,文章ならびに図,表を交えてまとめなさい.
参考文献
[1] http://www.vdec.u-tokyo.ac.jp/ 東京大規ステ教育
ター(VDEC.
[2] VDEC 監修, 浅田邦博. ディジタル集積回路の設計と試作. 培風館, 2000.
[3] 深山, 北川章夫, 田純, 木正. HDL によ VLSI Verilog-HDL
VHDL による CPU 設計 –. 共立出版株式会社, 1999.
[4] 白石肇. わかりやすいシステム LSI 入門. オーム社, 1999.
[5] 桜井至. HDL によるデジタル設計の基礎. テクノプレス, 1997.
[6] James O. Hamblen and Michael D. Furman. Rapid Prototyping of Digital Systems.
Kluwer Academic Publishers, 2000.
[7] パターソン&ネシ , 成田光彰 . コンピータの構成と設(上巻)第3版.
BP , 1999.
[8] パターソン&ネシ , 成田光彰 . コンピータの構成と設(下巻)第3版.
BP , 1999.
[9] パターソン&ネシ , 成田光彰 . コンピータの構成と設(上巻)第4版.
BP , 2009.
50