シングルサイクル RISC プロセッサの設計
実験概要
本実験では,標準的なシングルサイクル RISCReduced Instruction Set Computer)プ
ロセッサの設計を行.実験を通して,プロセッサの命令セッ・アーキテクチャとその実
現方式についての理解を深める.また,命令実行中のプロセッサの内部状態を観察すること
によりC 言語プログラム中のループや条件分岐,関数呼び出しが,プロセッサの命令実
レベルでどのように処理されるのかについての理解を深める.
実験スケジュール
験は 6 で,のようなルで行う 6 は進度にせた調整
1 (予習:参考文献 [7] 2 , 3 , 4 章,本指導書の 1 , 2 , 3 章)
シングルサイクル RISC プロセッサの設計と動作実験を行うVerilog HDL で記述さ
れた,即値符号なし整数加算命令add immediate unsignedaddiuとストア・ワー
ド命令store wordswが未実装なプロセサについて追加設計を行い,両命令
正しく動くプロセッサを完成させる.また,ディスプレイに文字を出力する簡単な機
械語のマシン・コードを,追加設計前と後のプロセッサで実際に動作させる.
実験 1-1 (マシン・コードの動作実験 1-1 (ディスプレイへの文字出力)
実験 1-2 (プロセッサの追加設計 1 addiu 命令,sw 命令)と動作実験 1-2
2 (予習:参考文献 [7] 2 , 3 , 4 章,本指導書の 4 章)
プロセッサの設計と動作実験を行.ジャンプ命令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 , 4 章,本指導書の 5 章)
プロセッサの設計と動作実験を行ジャンプアンドリンク命jump and link
jalとジャンプレジスタ命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 (予習:本指導書の 6 章)
素数計算を行 C プログラムとステピングモータを制御す C プログラムを作成
し,第 3 週に完成させたプロセッサで実際に動作させる.
実験 7 C プログラムの動作実験 7,素数計算)
実験 8 C プログラムの動作実験 8,ステッピングモータの制御)
5 (予習:本指導書の 6 章)
ロセサの乗算multiplymultdivide
unsigneddivu)が未実装な,第 3 週に完成させたプロセッサについて,さらに追加
設計を行い,両命令が正しく動くプロセッサを完成させ,実 7 で使用した素数計算
プログラムにおいて,命令回避がなくても動作することを確認する.
実験 9 C プログラムの動作実験 9,整数乗算命令 mult の追加)
実験 10 C プログラムの動作実験 10,符号なし除算命令 divu の追加)
指導書の構成
1 章では,プロセッサの命令セットアーキテクチャについて述べ,2 章では,本実験で設
計するプロセッサと動作実験用コンータについて説明する.3 章,4 章では, 1 週目,
2 週目に行うシングルサイクル RISC プロセッサの設計「基礎編」「中級編」について,
それぞれ説明する5 6章では, 3 週目 4 週目に行 RISC プロセサの設計「上
級編」「応用編の実験課題について説明する.7 章では,実験レポートについて説明する
実験の進め方
実験は,23 1 組で実施する.組ごとに,実験機器を共有しながら,全ての実験を進
める.
実験課題目次
1 はじめに 1
1.1 コンピュータの標準的な構成 . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 命令セット・アーキテクチャ . . . . . . . . . . . . . . . . . . . . . . . . . . 1
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 実験の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5 未完成なプロセッサの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 各実験の作業手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 シングルサイクル RISC プロセッサの設計「基礎編」 16
3.1 マシン・コードの動作実験 1-1(ディスプレイへの文字出力) . . . . . . . . 16
3.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 16
3.1.2 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 17
3.1.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.1.4 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 プロセッサの追加設計 1addiu 命令,sw 命令)と動作実験 1-2 . . . . . . . 21
3.2.1 addiu 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . 21
3.2.2 sw 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . 25
3.2.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.4 FGPA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.5 プロセッサの機能レベルシミュレーション . . . . . . . . . . . . . . . 29
4 シングルサイクル RISC プロセッサの設計「中級編」 31
4.1 マシン・コードの動作実験 2-1(文字の繰り返し出力 1 . . . . . . . . . . . 31
4.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 31
4.1.2 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 32
4.1.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.1.4 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 プロセッサの追加設計 2 j 命令)と動作実験 2-2 . . . . . . . . . . . . . . 35
4.2.1 j 命令のためのジャンプ・セレクト・モジュールの追加設計 . . . . . 35
4.2.2 j 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . . 37
4.2.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2.4 FGPA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.3 C クロスコンパイラを用いたマシン・コード生成と実験 3 . . . . . . . . . . 40
4.4 C プログラムの動作実験 4-1 (ディスプレイへの繰り返し文字出力 2 . . . 41
4.4.1 クロスコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.4.2 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 42
4.4.3 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 42
4.4.4 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.4.5 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.5 プロセッサの追加設計 3 sltiu 命令,bne 命令,lw 命令)と C プログラ
ムの動作実験 4-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.5.1 sltiu 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . 47
4.5.2 bne 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . 47
4.5.3 lw 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . 47
4.5.4 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.5.5 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 51
5 シングルサイクル RISC プロセッサの設計「上級編」 52
5.1 C プログラムの動作実験 5-1(関数呼出しディスプレイへの文字列出力関数) 52
5.1.1 クロスコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.1.2 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 53
5.1.3 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 54
5.1.4 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1.5 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.2 プロセッサの追加設計 4jal 命令)と C プログラムの動作実験 5-2 . . . . 58
5.2.1 jal 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . 58
5.2.2 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.3 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.3 C プログラムの動作実 6-1(関数からの復キーボードからの文字列入力
を受ける関数) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3.1 クロスコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3.2 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 62
5.3.3 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 63
5.3.4 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.5 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.4 プロセッサの追加設計 5jr 命令)と C プログラムの動作実験 6-2 . . . . . 66
5.4.1 jr 命令のためのジャンレジスタセレクトモジュールの追加設 66
5.4.2 jr 命令のためのメイン制御回路の追加設計 . . . . . . . . . . . . . . 67
5.4.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.4.4 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 67
6 シングルサイクル RISC プロセッサの設計「応用編」 71
6.1 C プログラムの動作実験 7(素数計算) . . . . . . . . . . . . . . . . . . . . 71
6.1.1 クロスコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.1.2 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 72
6.1.3 命令メモリに格納される命令列の確認 . . . . . . . . . . . . . . . . . 72
6.1.4 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.1.5 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.1.6 C プログラムの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.2 C プログラムの動作実験 8(ステッピングモータの制御) . . . . . . . . . . 75
6.2.1 クロスコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.2.2 MIPS マシン・コードからのメモリ・イメージファイルの作成 . . . . 75
6.2.3 論理合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.2.4 FPGA を用いた回路実現 . . . . . . . . . . . . . . . . . . . . . . . . . 76
6.2.5 ステッピングモータ制御プログラムの作成 . . . . . . . . . . . . . . . 77
6.3 C プログラムの動作実験 9(整数乗算命令 mult の追加) . . . . . . . . . . . 79
6.3.1 数乗命令 mult びにーブLo mflo ため bin2v
の拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.3.2 整数乗算命令 mult のためのプロセッサの拡張 . . . . . . . . . . . . . 80
6.3.3 動作実験 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.4 C プログラムの動作実験 10(符号なし除算命令 divu の追加) . . . . . . . . 82
7 実験レポートについて 82
作成者: 中村一博,小尻智子
改訂者: 大野誠寛,松原豊,濱口毅
協力者: 平野靖,北坂孝幸,高田広章,冨山宏之,大下弘,土井富雄,
小川泰弘出口大輔,村上靖明,後藤正之,柴田誠也,
高瀬英希,鬼頭信貴,大野真司,尾野紀博,小幡耕大,中村悟,
長瀬哲也,北川哲,島崎亮,安藤友樹
最終更新日: 2019 3 25
1.50
1 はじめに
現代の生活では,多種多様な電子機器が身の回りに存在しておそれら多くの機器にプ
ロセッサ(processorCPU(中央演算処理装置Central Processing Unit)が搭載されて
いる.パソコンやゲーム機,携帯電話のみならず,各種家庭電化製品,音画像・映像機
器,自動車,航空機,鉄道,船舶,ロボット等においてもディジタル化が進み,制御,デー
タ処理等の用途で CPU は不可欠なものとなってきている.
1.1 コンピュータの標準的な構成
本節では参考文献 [7] に基づき標準なコンピタの構成ついて述べるンピ
タを構成するすべての構成要素は,図 1 に示される 5 つの古典的な構成要素,出力
記憶データパス制御のいずれかに概念的に分類される.
入力
出力
制御
(プロセッサ) 記憶
データパス
(コンパイラ)
1: コンピュータの標準的な構成(参考文献 [7] 1.5 より)
この構成は,コンピュータのハードウェア実現において採用される種々のハードウェア技
術に依存しない現在および過去のほぼすべてのコンピュータに共通する標準的な構成で
る.ここでプロセッは,データパスと制御を合わせたものである.プロセッサは,記憶装
置から命令 (instruction) データを取り出す.入力装置は,データを記憶装置に書き込む
出力装置は記憶装置からデータを読み出データパスは,プロセッサ内でデータを処理
または保持する.制御装置は,データパス,記憶装置,入力装置,出力装置に,動作を指定
する制御信号を送る.
プロセサは,記憶装置から取り出された命令の指示どおりに動作する.その命令はプロ
直接でき 2 ナリ機械machine languageある必要
る.コンパイが理解しやす水準プログラミング言high-level programming
languageで書かれたログラムを,機械語をシンボ(記号)で表現するアセンブリ言語
assembly language)に変換する.アセンブラassembler)はシンボル形式のアセンブリ
言語を機械語の命令を連らねたバイナリ形式シンコーmachine codeに変換する.
1.2 命令セット・アーキテクチャ
本節では参考文献 [7] に基づき,命令セット・アーキテクチャについて述べる.プロセッ
サの言葉であ命令語彙命令セinstruction setという人が機械語でプロセ
1
に適切な指示を出すためには,少なくともプロセッサの命令について理解していなければ
らない.
このプロッサの命令のような正しく動作する機械語プログラムを書くためにプログ
ばなない柄すてを素とる,ロセサのハードウ
との間の抽象的なインタフースをプロセサの命令セアーキテクチャ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
2
番目のレジスタを表す0 番目のレジスタには定 0 が収められている.31 番目のレ
ジスタは,手続き呼出の戻りアドレスを収めるのに用いられる.機械語では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 命令トの命令を大分類すると,算術演算命令論理演算ータ
命令条件判定命条件分岐命令ンプと手続きサポートのための命令に分けられる
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
2 に,MIPS 命令セットの主要部分のサブセットをその機能区分ごとに示す.略号はそ
の命令のアセンブリ言語でのシンボル表記である.算術演算命令と論理演算命令は2 つの
レジスタまたは1 つのレジスタと命令内に収められているデータに対して演算を行い,
の結果をレジスタに格納する命令であるデータ転送命令は,メモリとレジスタ間でデータ
を転送する命令である.条件分岐命令は,条件が成立するときに,プログラムの実行の流れ
を命令内で指示される方へ分岐させる命令である.ジャンプ命令は,無条件に,プログラム
の実行の流れを命令内で指示される方へ分岐させる命令である手続きサポートのための
令は,プログラムの実行の流れを手続きの方へ分岐させる命令手続きから元のプログラム
の実行の流れに戻す命令である.
1.2.3 命令の表現
MIPS 1 命令の長さは 32 ビットである.命令はプロセッサ・ハードウェアにも人にも
理解しやすいように長さ数ビットのフィールドfield)から構成されている.フィールド
枠取り命令形式と呼ばれ,MIPS の主な命令形式には (1) R 形式(2) I 形式(3) J 形式
3 種類がある.
2 にこれらの命令形式のフィールド構成を示す
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
の命令のフィールド構成
R 形式の命令は 6 個のフィールド opcode, rs, rt, rd, shamt, funct から構成される.レ
ジスタに収められているデータに対して演算を行い,その結果をレジスタに収める命令で
る.I 形式の命令は 4 個のフィールド opcode, rs, rt, immediate から構成されている.即
値およびデータ転送用の命令であレジスタに収められているデータと命令内に書かれて
いるデータを元に処理を行う.その結果は,レジスタまたはメモリに収められる.J 形式の
命令は,2 個のフィールド opcode, address から構成されている.ジャンプおよび分岐用の
命令であり,命令内に書かれているアドレスを元にジャンプおよび分岐処理を行う.全ての
命令形式において,命令の 26 ビット目から 31 ビット目までの 6 ビットは,命令の形式
よび操作の種類を表す opcode で,命令操作コードopcode; オペコード)と呼ばれる.
R 形式と I 形式にある rs フィールドは, 1 ソースオペランドと呼ばれ,1 つ目のソ
オペランドのレジス即ち操作対象データの在処を表す R 形式にある rd ール
は,デスティネーション・オペランドと呼ばれ,デスティネーション・オペランドのレジス
,即ち操作結果データの格納先を表す R 形式と I 形式にある rt フィールドは,R 形式
では 2 ソースペランドと呼ばれ,2 つ目のソーペランドのレジス即ち操作対
象データの在処を表すI 形式では,rt フィールドは,デスティネーション・オペランド
5
レジスタで,操作結果データの格納先を表すI 形式の immediate フィールドは,定数また
は即値のオペランドでここにデータやアドレスが直接書かれる. J 形式 address フィ
ルドも,定数または即値のオペランドで,ここにアドレスが直接書かれる. R 形式の funct
ールドには,R 形式の命令の機能が書かれるshamt ールドは,shift amount の略
であり語中のビットをシフトshiftする命令のとき利用され,ここにシフトするビット
数が書かれる. 以降では,各命令形式の命令の,アセンブリ言語と機械語について述べる.
R 形式の命令
R 形式の命令には算術演算命令,論理演算命令,条件判定命令,手続きサポートのため
の命令がある.表 3 R 形式の主要な命令を示す
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 形式の各フィールドがシンボルで表される.表 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 フィールドの値は,
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 に設定
34 である.デスティネーション・オペランド,第 1 ソース・オペランド,第 2 ソース・オペ
ランドの値は,使用されるレジスタに応じて異なる.この例では,$s1 がデスティネーショ
オペラン$s2 が第 1 ソースオペランド$s3 が第 2 ソースオペランドのレジス
であり$s1$s2$s3 のレジスタ番号である 171819 が,それぞれ rdrsrt フィー
ルドの値となっている.
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
I 形式の命令
I
形式の命令には,算術演算命令,論理演算命令,データ転送命令,条件分岐命令,条件
判定命令,手続きサポートのための命令がある.表 6 に,I 形式の主要な命令を示す
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 形式の命令のアセンブリ言語も,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 とな
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
る.bgez, bltz, bgezal, bltzal opcode フィールドは全て 1 であ条件の種類を rt
フィールドの値で識別する.
J 形式の命令
J 形式の命令には,ジャンプ命令と手続きサポート命令がある.表 9 に,J 形式の主要な
命令を示すJ 形式のアセンブリ言語も,R 形式や I 形式の命令と同様に各フィールドがシ
ンボルを用いて表される.
10 J 形式の主要な命令のアセンブリ語の例を示す
例えば,アセンブリ言語でジャンプ jjump)は次のように書かれる.
j address
j はジャンプの略号でありaddress ジャンプ先のアドレスを指定する値である.j
令では擬似直接アドレッシングでジャンプ先を決定する擬似直接アドレッシングとは,
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 値をレジスタに退避し
(ジャンプ) ジャンプ
10: J 形式の主要な命令のアセンブリ語の例
区分 命令 意味 備考
ジャンプ j address goto address * 4 PC address*4
手続きサポート jal address $ra=PC+4 次の命令番地を$ra
(ジャンプ) goto address * 4 PC address*4
令中の 26 トと PC の上位ビットを連結したものがジャンプ先のアドレスとなるアドレッ
シング形式であるjal 命令も擬似直接アドレッシングでジャンプを行う命令である. J
式の命令は,opcode フィールドの値で識別される.
11 に,J 形式の主要な命令の機械語の例を示j 命令jal 命令の opcode フィール
ドの値はそれぞれ 2, 3 であるaddress フィールドにはジャンプ先の 26 ビット分のアドレ
スが入る.
11: J 形式の主要な命令の機械語の例
命令 op address
j j 100 2 100
jal jal 100 3 100
10
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] のシングルサイクルプロセッサの構
成に基づき,RISC プロセッサの一つである MIPS の簡略化版であり,約 40 種類の命令を
実行可能である.
2.2 設計環境の準備
プロセッサの設計は,ICE Linux マシンにインストールされた Altera 社の EDA ツー
ルを使用する.計算機 EDA ツールの環境設定方法は,前の実験「EDA ツールを用い
論理回路設計」と全く同じである.3.1 節を参考にして,環境設定を行うこと.
2.3 実験用コンピュータの構成
本実験では,図 3 に示すAltera 社の DE2-115 ードを使用する.設計したプロセッサ
は,DE2-115 ボードに搭載された FPGA で動作させる.
!"#
$%&'#
()*+,'#
-./#
00#
12345# 1236#
0#
7893:# 78936#
;<$=-#
./#
>?#
@'=#
A1B(#
$%&'#
C1DE#
$%&'#
FCB(#
G)HIJKLM3NOP#
,QRSTUQV#
TWUXTUQV#
Y8Z#
5[\]=^
Y8Z#
3: Altera DE2-115 ボード
DE2-115 ボードに,液晶ディスプレイキーボードを接続して,動作実験用のコンピュー
タを構成する. 4 に,動作実験用コンピュータの全体構成を示す.このコンピュータの構
12
成は, 1 に示した,一般的なコンピュータと対応している.すなわち,キーボードと液晶
ディスプレイがそれぞれ,(1) 入力装置,(2) 出力装置,DE2-115 ボード上の FPGA 内の回
路が (3) 記憶装置(4) 制御装置(5) データパスを実現している.C クロスコンパイラは
MIPS をターゲットプロセッサとす gcc を使用する.プロセッサの設計を行 Linux マシ
ン上で動作し,C 言語で書かれたプログラムを,設計するプロセッサのマシンコードに
換する.
制御
(プロセッサ) 記憶
データパス
(Cクロスコンパイラ)
キーボード
液晶ディスプレイ
ABCDE
FG
入力
出力
FPGA
DE2 ボード
4: 動作実験用コンピュータの全体構成
実験用コンピタの内部構成を図 5 液晶レイとキーボが,DE2-
115 ード VGA 子と PS/2 子を介し DE2-115 ード上の FPGA に接続さ
いる.この FPGA 内では,CPU や記憶装置(命令メモリとデータメモリ)VGA ント
ローラ,キーボードコントローラが実現される.FPGA 上の CPU で動作するプログラムか
らディスプレイやキーボードを制御する場合には,それぞれ,キャラクタディスプレイイン
タフェース API とキーボードインタフェース API を使用する.
5: 動作実験用コンピュータの内部構成
13
2.4 実験の流れ
本実験では,以下の実験を通して,未完成のプロセッサに対して,徐々に機能を追加し,
繰返し処理,分岐処理,関数呼出し,ポインタ,配列,符号なし整数の加減算ができるプ
セッサを完成させる.最後に,完成させたプロセッサを使い素数計算とステッピングモー
ター制御の実験を行う
プロセッサの設計,追加実装
即値符号なし整数加算命令,ストア・ワード命令を正しく実行できるようにす
(実験 1-11-2
ジャンプ命令を正しく実行できるようにする(実験 2-12-2
C クロスコンパイラを使いはじめる(実験 3
即値符号なし・セット・オン・レス・ザン命令,ブランチ・ノット・イコール命
令,ロード・ワード命令を正しく実行できるようにする(実験 4-14-2
ジャンプ・アンド・リンク命令を正しく実行できるようにする(実験 5-15-2
ジャンプ・レジスタ命令を正しく実行できるようにする(実験 6-16-2
C 言語プログラミング
文字列をディスプレイに出力する my print() 関数と,キーボードからの入力を
け付ける my scan() 関数を使用して,素数計算プログラムを作成する(実験 7
ステッピングモータ制御プログラムを作成する(実験 8
2.5 未完成なプロセッサの概要
実験の最初に提供される未完成なプセッサは 8 個の命令と2 のハードウェアモ
ジュールが未実装の状態である.実装済の命令と未実装の命令は,以下の通りである.
実装済みの命令
R 形式の命令:ADD, ADDU, SUB, SUBU, AND, OR, NOR, XOR, SLL, SRL,
SLLV, SRLV, SRA, SLTU, JALR, SLR
I 形式の命令:ADDI, ANDI, ORI, XORI, BEQ, BGEZ, BLEZ, BGTZ, BLTZ,
BGEZAL, BLTZAL, SLTI, LUI
未実装の命令(本実験で追加実装する命令)
R 形式の命令:JR
I 形式の命令:LW, SW, ADDIU, BNE, SLTIU
J 形式の命令:J, JAL
14
2.6 各実験の作業手順
プロセッサの各実験は,下記の 1 から 5 の手順で行う
1. cross compile.sh を使用してC 言語のソース・プログラムを対象プロセッサで動
作する MIPS マシン・コードに変換する(実験 3 以降)
2. bin2v 使用してMIPS シン・コードから命令メモリ(図 5)のメモリイメー
ファイルに変換する
3. Quartus II を使用して,プロセッサと周辺回路を論理合成する
4. Quartus II 使用,ストリム・アプット・ファイル( sof ファイ)を
DE2-115 ボードにダウンロードする
5. DE2-115 ボードのスライドスイッチ,プッシュスイッチを操作してプロセッサでプロ
グラムを実行する
手順 5 のスライドスイチの操作では,CPU の動作クク周波数を 12 に基づき設
する.表 12 は,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 及び周辺回路がリセットされる.
12: スライドスイッチ SW1, SW0 による CPU の動作クロック周波数の設定
(SW1, SW0) クロック周波数 [Hz]
(0, 0) 2
(0, 1) 200
(1, 0) 1000
(1, 1) 手動クロック
15
3 シングルサイクル RISC プロセッサの設計「基礎編」
本実験では,シングルサイク RISC プロセッサの設計と動作実験を行 1 週目の実
験では,プロセッサの動作実験と,即値符号なし整数加算命令 addiu)とストア・ワード
命令(sw)についてのプロセッサの追加設計を行う
3.1 マシン・コードの動作実験 1-1(ディスプレイへの文字出力)
1-1 ,ディス ’B’ 1 MIPS ン・コ
print
B.bin
と,それを実行するプロセッサを
FPGA
上に実現し,その動作を確認する.
実験 1-1 ディスプレイに文字 ’B’ を1つ表示する MIPS マシン・コード print B.bin
と,それを実行するプロセッサを FPGA 上に実現しその動作を確認せよ.本動作
実験は,3 章を参考に,下記の 1, 2, 3, 4 の手順で行いなさい.
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 一式(験を完成る未プロセッサ)は,実験 Web
ページからダウンロードできる.
即値符号なし整数加算add immediate unsignedaddiu
ド命令(store wordswが未実装なプロセッサにおいて,それらの命令を含む簡単な機械
語のマシン・コードを実行すると,どのような動作をするかを観察する.本実験で観察した
結果は,次のプロセッサの追加設計 1 において,addiu sw が正しく動くプロセッサを完
成させた後,動作比較の対象として用いる.
3.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験では,まずMIPS マシン・コードをプロセッサの命令メモリのメモリ・イメージ
ファイルに変換する.この変換によりQuartusII で論理合成可能なメモリ・イメージファ
イルが得られる.このメモリ・イメージを命令メモリに持つプロセッサを論理合成するで,
16
変換元のマシコードを実行するプロセッサを実現できる. MIPS マシンコードの例と
して print B.bin を使用する.また,変換プログラムとして 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 の一部を示case ブロク内の各行は本実験で設計する
ロセッサにおける命令メモリの 10 トアドレスとそこに格納される 32 ト命令の
機械語が記述されている各行の // 以降のコメント部には,左から,実際の MIPS の命令
メモリにおけるアドレス,命令名命令内容が記述されている.ここで,シンボル REG[0],
..., REG[31] ,レジスタ 0 番から 31 番,すなわち $zero, ..., $ra を表す(表 1.また,
シンボル RAM[w] は,データメモリの w 番地を表す
例えば,図 6 case ブロック内の最初の記述は,本実験で設計するプロセッサの命令メ
モリの 0x00b 番地に機械 0x24020300 が格納されることを表している.この命令は,実
際の MIPS では 0x0040002c に格納され,命令名は addiu,レジスタ 2 番にレジスタ 0
(値は常に 0+768 の結果をセットする命令であることを表している.
つまり本実験で設計するプロセッサでは,プログラムカウンタ PC=(0x0040 h3 h2 h1
h0) が指す命令は,命令メモリでは,アドレスの上位 0x0040 を除き,かつ,アドレスを右
2 ビットシフト((0x h3 h2 h1 h0) << 2 )したアドレスに格納される.例えば,プ
ロセッサ PC 0x0040002c を指している場合,上位の 0x0040 を除き,2 ビット右シフ
トした命令メモリのアドレス 0x000b 番地に格納された命令が実行される.
17
<省略>
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 の一部
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 た論
rom8x1024 DE2.mif Verilog HDL mips de2-115.tar.gz
を使用する.
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 し,
18
ディレクトリ 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
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 では,プロセッサの追加設計を行い,プロセッサ内部で行われるデータ転
や演算などを制御するメイン制御回路を,これらの命令に対応したものにする.
19
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
のプロセッサのブロック図
20
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 data
RAM
への書込データ入力)
WDATA の後の WEN write enableRAM に対する書込許可制御入力)
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 の符号なし整数加算を行う
21
実験 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
ブロック図中 sign ext は,符号拡張モジュールである(参考文献 [7] p.246
MUX は,2 入力 1 出力の Multiplexer(選択回路)である.選択信号が 0 の時
に,2 つの力信号のうち0 のラベルが付けられてい信号が出力されるALU
Arithmetic and Logic Unit; 術論理演算ユニット)は,加算や減算,シフト
AND, OR などの演算を行う
1. 追加設計 1 のヒント (1)I 形式の命令 addiu の追加,命令コードの定義
addiu 6’bXXXXXX‘define XXXXX
6’bXXXXXX」を「‘define XXXXX 6’bXXXXXX」に変更する.
22
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
命令実行時のプロセッサ内の信号の流れ
23
2. 追加設計 1 のヒント (2)I 形式の命令 addiu の追加,is branch モジュールへの制御
信号の記述
is branch は,条件分岐用のモジュールである(図 8,参考文献 [7] pp.247–259
addiu 命令は beqbranch on equal)命令など条件分岐令ではなので
is branch への制御信号としては,3’bXXXが適切である(ソース中の is branch
に関するコメン// is branch d0 // 分岐判定モジュール is branch の制御信
// 3’b000, ==, EQ // ... <省略>... // 3’b110, do nothing」より)
記述‘XXXXX: XXXXXXXXXX = 3’bXXX;‘XXXXX: XXXXXXXXXX
= 3’bXXX;」に変更する.
3. 追加設計 1 のヒント (3)I 式の命令 addiu の追加,ALU の入力ポー B へ流す
データを選択するセレクト信号の記述
ALU B ポートに,命令に直接書かれている値 immediate(命令 [15:0]を転送
するには,セレク alu b sel1 セレクト信号を 1’b0 にするのがよいか,1’b1
にするのがよいかを考える.
1’bXにすがよいこ(図 8 記述‘XXXXX: XXXXXXXXXX
= 1’bX;」を「‘XXXXX: XXXXXXXXXX = 1’bX;」に変更する.
4. 追加設計 1 のヒン (4)I 形式の命 addiu の追加,符号拡張を行うかどうかの制
sign ext は,符号拡張モジュールである(図 8,参考文献 [7] p.246
sign ext への御信号としては,1’bX適切である(ソース中の do sign ext
関すコメント「// do sign ext // 拡張モジュー sign ext の制信号//
do sign ext == 1’b016-bit ータ 32-bit 化すとき号拡を行//
do sign ext == 1’b116-bit 32-bit ,符
より)
記述「XXXXXXXXXX」を「XXXXXXXXXX」に変更する.
5. 追加設計 1 のヒント (5)I 形式の命令 addiu の追加,加算を行う制御信号の記述
alu op ALU 御モジュー alu ctrler の制御信号である( 8,参考文献
[7] pp.250–259
addiu 命令は, ALU に加算を行わせる命令なので,制御信号 alu op の値として
3’bXXX」が適切である(ソース中の 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
処理を行わせる」より)
記述‘XXXXX: XXXXXXXXXX = 3’bXXX;XXXXX: XXXXXXXXXXX
= 3’bXXX;」に変更する.参考文献 [7] とは,制御コードが少し異なる.
6. 追加設計 1 のヒン (6)I 形式の命令 addiu の追加,レジスタフイルへの制御信
の記述
24
reg write enable はレジスタファイル registers の書き込み制御信号である(図 8
参考文献 [7] pp.250–259
addiu レジ reg write enable
の値として「1’bXが適切である(ソース中の reg write enable に関するコメン
ト「// reg write enable // ファイ registers //
reg write enable == 1’b0書き込みを行わない// reg write enable == 1’b1
き込みを行う」より)
記述‘XXXXX: XXXXXXXXXXX = 1’bX;‘XXXXX: XXXXXXXXXXX
= 1’bX;」に変更する.
7. 追加設計 1 のヒント (7)I 形式の命令 addiu 追加,レジスタファイルの方へ流
データを選択するセレクト信号の記述
alu ram sel s ,セレクタ alu ram sel モジュールのセレクト信号である(図 8
参考文献 [7] pp.250–259
ALU から出てくる演算結果をレジスタに転送するには,alu ram sel のセレクト
信号を 1’b0 にするのがよいか,1’b1 にするのがよいかを考える.
1’bXにすがよとか 8 り)‘XXXXX: XXXXXXXXXXX
= 1’bX;」を「‘XXXXX: XXXXXXXXXX = 1’bX;」に変更する.
8. 追加設計 1 のヒント (8)I 式の命令 addiu の追加,レジスタファイルの write idx
へ流すデータを選択するセレクト信号の記述 (1)
reg widx sel1 s は,セレクタ reg widx sel1 モジュールのセレクト信号である(図
8,参考文献 [7] pp.250–259
レジスタファイルのデータ書き込み先インデックス write idx に,命令の rt(命
[20:16])を転送するには,reg widx sel1 のセレクト信号を 1’b0 にするのがよ
いか,1’b1 にするのがよいかを考える.
1’bXこと(図 8 より‘XXXXX: XXXXXXXXXX
= 1’bX;」を「‘XXXXX: XXXXXXXXXX = 1’bX;」に変更する.
9. 追加設計 1 のヒント (9)I 式の命令 addiu の追加,レジスタファイルの write idx
へ流すデータを選択するセレクト信号の記述 (2)
link はセレクタ reg widx sel2 モジュールのセレクト信号である(図 8参考文
[7] pp.250–259
レジスタファイルのデータ書き込み先インデックス write idx に,命令の rt
[20:16])を転送するには,reg widx sel2 のセレクト信号を 1’b0 にするのがよ
いか,1’b1 にするのがよいかを考える.
1’bXこと(図 8 より‘XXXXX: XXXXXXXXXX
= 1’bX;」を「‘XXXXX: XXXXXXXXXX = 1’bX;」に変更する.
3.2.2 sw 命令のためのメイン制御回路の追加設計
次に,sw 命令の追加設計を行ここでもプロセッサのメイン制御回路の Verilog HDL
記述 main ctrl.v を使用する.main ctrl.v は,addiu 命令についての追加設計をった
25
のものを使用する.ソースファイル 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’bXXXXXXであることから,記述‘define XXXXX
6’bXXXXXX」を「‘define XXXXX 6’bXXXXXX」に変更する.
2. 追加設計 1 のヒント (11)I 形式の命令 sw の追加,RAM への制御信号の記述
ram write enable は,メモリの書き込み制御信号である(図 9
sw 値を ram write enable
の値とし1’bXが適切である(ソース中の ram write enable に関するコメン
ト「// ram write enable // RAM 書き込み御信// ram write enable ==
1’b0// ram write enable == 1’b1書き込みり)
assign XXXXXXXXXX;assign XXXXXXXXXXX = XXXXXXXXXX;
に変更する.
3. 追加設計 1 のヒント (12)I 形式の命令 sw の追加,is branch モジュールへの制御信
号の記述
is branch は,条件分岐用のモジュールである(図 9,参考文献 [7] pp.247–259
sw 命令 beq (branch on equal) 命令など件分岐命はないのis branch
への制御信号としては,3’bXXXが適切であ(ソース中の is branch に関す
メン// is branch d0 // 分岐定モール is branch の制 // 3’b000,
==, EQ // ... <省略>... // 3’b110, do nothing」より)
‘XXXXX: XXXXXXXXXXX = 3’bXXX;‘XXXXX: XXXXXXXXXXX
= 3’bXXX;」に変更する.
4. 追加設計 1 のヒント (13)I 形式の命令 sw の追加ALU の入力ポート B へ流すデー
タを選択するセレクト信号の記述
ALU B ポートに,命令に直接書かれている値 address(命令 [15:0])を転送す
るには,セレク alu b sel1 セレクト信号を 1’b0 にするのがよいか,1’b1
するのがよいかを考える.
1’bXこと(図 9 より‘XXXXX: XXXXXXXXXX
= 1’bX;」を「‘XXXXX: XXXXXXXXXX = 1’bX;」に変更する.
26
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
命令実行時のプロセッサ内の信号の流れ
27
5. 追加設計 1 のヒント (14)I 形式の命令 sw の追加,符号拡張を行う制御信号の記述
sign ext は,符号拡張モジュールである(図 9,参考文献 [7] p.246
sw 命令は,アドレス計算のために,符号拡張された address rs の符号なし整
数加算を行う
sign ext への制御信号としては,’bXが適切である(ソース中の do sign ext
関すコメント「// do sign ext // 拡張モジュー sign ext の制信号//
do sign ext == 1’b016-bit ータ 32-bit 化すとき号拡を行//
do sign ext == 1’b116-bit データを 32-bit 化するとき符号拡張を行う」より)
記述「XXXXXXXXXX」を「XXXXXXXXXX」に変更する.
6. 追加設計 1 のヒント (15)I 形式の命令 sw の追加,加算を行う制御信号の記述
alu op は, ALU 制御モジュー alu ctrler への制御信号であ(図 9参考文献
[7] pp.250–259
sw ALU 算を命令,制御信 alu op
3’bXXX」が適切である(ソース中の 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
処理を行わせる」より)
‘XXXXX: XXXXXXXXXX = 3’bXXX;‘XXXXX: XXXXXXXXXXX
= 3’bXXX;」に変更する.
参考文献 [7] とは制御コードがやや異なる.
7. 追加設計 1 のヒント (16)I 形式の命令 sw の追加,レジスタファイルへの制御信号の
記述
reg write enable は,レジスタファイル registers 書き込み制御信号である(
9,文献 [7] pp.250–259
sw 命令は,レジスタに値を書き込まない命令なので,制御信号 reg write enable
て「1’bX」がる( reg write enable
ント「// reg write enable // ジスタファイ registers 書き込み制御信//
reg write enable == 1’b0:書き込みを行わない// reg write enable == 1’b1:書
き込みを行う」より)
記述‘XXXXX: XXXXXXXXXX = 1’bX;‘XXXXX: XXXXXXXXXXX =
1’bX;」に変更する.
3.2.3 論理合成
追加設計後のプロセッサ命令メモその他周辺回路の論理合成を行う論理合成には
追加設計後の main ctrl.v と,動作実験 1-1 使用したその他プロセッサ Verilog HDL
28
記述一式,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 実体を有効に
する.
5. cpu.v 340 行目周辺,動作実験用の RAM の実体化を数行コメントアウトする.
6. cpu.v 335 目周辺,機レベシミュレーション RAM 体化を有
する.
29
cpu.v の変更後rom8x1024 sim.v をディレクトリ mips de2-115/MIPS にコピーし,ディ
レクトリ mips de2-115/MIPS cd して,EDA ツールを用いた論理回路設計の 3.2 節を参
考に「vsim test cpu.v」により機能レベルシミュレーションを行う.なお,機能レベルシ
ミュレーション後,次の実験課題で再び論理合成が行えるように,cpu.v の記述を元にも
しておくこと.
30
4 シングルサイクル RISC プロセッサの設計「中級編」
2 週目の実験では,プロセッサの動作実験と,プロセッサのジャンプ命令(j)と即値
符号なし・セットオン・レザン命令sltiuブランチオンノットイコール命令
bne,とロード・ワードlw)について追加設計を行う.また,クロスコンパイラを用い
たプログラム開発についての実験も行う
4.1 マシン・コードの動作実験 2-1(文字の繰り返し出力 1
プロセッサの動作実験 2-1 では,ディスプレイに文 ’B’ を繰り返し表示する MIPS マシ
ン・コード print B while.bin と,それを実行するプロセッサとして追加設計 1 で完成させ
たプロセッサを FPGA 上に実現し,その動作を確認する.
実験 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 は,実 Web
ページからダウンロードできる.
実験 1-2 で完成させたジャンプ命令(jumpj)が未実装なプロセッサにおいて,その命
令を含む簡単な機械語のマシンコードを実行するとどのような動作をするかを観察する.
本実験で観察した結果は,次のプロセッサの追加設 2 において,j が正しく動くプロセッ
サを完成させた後,動作比較の対象として用いる.
4.1.1 MIPS マシン・コードからのメモリ・イメージファイルの作成
まずMIPS マシコードを命令メモリのメモイメージファイルに変換するこで
MIPS マシコードの例と print B while.bin を使用す変換には変換
31
ラム 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)
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 の一部
case ブロック内の各行は, 3.1.2 節で説明した通本実験で設計するプロセッサにお
る,命令メモリの 10 ビットのアドレスと,そこに格納される 32 ビット命令の機械語の記
述である.
case ブロック内の最後の記述は,本実験で設計するプロセッサの命令メモリの 0x013
地に機械 0x0810000b が格納されることを表している.また,この命令は実際 MIPS
32
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 記述一式を使用する.メモリ・イメー
ジファイル 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 命令を正しく実行できてい
ないことが分かる.
次の実験 2-2 では,プロセッサの追加設計を行い,プロセッサ内部で行われるデータ転
や演算などを制御するメイン制御回路を,これらの命令に対応したものにする.
33
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
のプロセッサのブロック図
34
4.2 プロセッサの追加設計 2 j 命令)と動作実験 2-2
本実験では,プロセッサの追加設計と動作実験を行う.ここでは, j 命令が未実装なプロ
セッサを例とし,追加設計を行い,j 命令が正しく実行されるプロセッサを完成させる.ま
た,その動作を実際に動作させて観察する.
実験 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
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 に格納する
命令である.
35
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 命令のためのジャンプ・セレクト・モジュールを含むプロセッサ
36
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 に接続する.
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’bXXXXXX」であることから,記述「‘define XXXXX
6’bXXXXXX‘define XXXXX 6’bXXXXXX」に変更する.
2. 追加設計 2 のヒン (2)J 形式の命 j の追加jp sel モジールへの制御信号の記述
jp sel はジャンプ用のモジュールである(図 13,参考文献 [7] pp.247–259
37
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 命令実行時のプロセッサ内の信号の流れ
38
j 令はジャンプ命令なのでjp sel への制御信号としては「1’bX」が適切で
る(ソース中の jp sel に関するコメント「// jump, J, JAL // MUX, jp sel
ールのセレクト信号// jp == 1’b0 jump しない場合の,次の PC の値を選
// jp == 1’b1 jump する場合の,次の PC の値を選択」より)
記述「assign XXXXX = XXXXXXXXXX 1’bX : 1’bX;」を「assign XXXXX =
XXXXXXXXXX 1’bX : 1’bX;」に変更する.
3. 追加設計 2 のヒント (3)J 形式の命令 j 追加,レジスタファイルへの制御信号の
記述
reg write enable はレジスタフイル registers の書き込み制御信号である(図 13
参考文献 [7] pp.250–259
j reg write enable
の値として「1’bXが適切である(ソース中の reg write enable に関するコメン
ト「// reg write enable // ファイ registers //
reg write enable == 1’b0:書き込みを行わない// reg write enable == 1’b1:書
き込みを行う」より)
記述「‘XXXXX: XXXXXXXXXX = 1’bX;」を「‘XXXXX: XXXXXXXXXX =
1’bX;」に変更する.
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 で予想した結果と同じ動作になったはずである)
39
4.3 C クロスコンパイラを用いたマシン・コード生成と実験 3
実験 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
40
4.4 C ログラムの動作実験 4-1 (デスプレイへの繰り返し文字出 2
本実験では,FPGA 搭載した実験基板を使用し,プロセッサを FPGA 上に実現してそ
の動作を確認する本動作実験では,即値符号なしセッオンレスザン命令set on
less than immediate unsignedsltiuとブランチノット・イコール命令branch on not
equalbneロードワード命令load wordlw)が未実装なプロセッサにおいて,それ
らの命令を含む簡単な機械語のマシコードを実行すると,どのような動作をするかを観
察する本実験で観察した結果は,次のプロサの追加設 3 においてsltiubnelw
が正しく動くプロセッサを完成させた後,動作確認の際の比較に用いる.
実験 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 は,実験 Web ページか
ダウンロードできる.
4.4.1 クロスコンパイル
本実は,C グラ例とディスプ 61 の文表示 15
print_all_char.c を使用する.
クロスコンパイルには,cross_compile.shを使用する.2.2 節に示した環境設定を
たのちcross_compile.sh print_all_char.cで,print_all_char.c から MIPS マシ
を作よ.クロコンイルMIPS マシード print_all_char.bin
が得られる.
41
#define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300)
#define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304)
main()
{
unsigned int k;
for (k = 0; k <= 60; k++) {
EXTIO_PRINT_STROKE = (unsigned int)0x00000000;
EXTIO_PRINT_ASCII = k;
EXTIO_PRINT_STROKE = (unsigned int)0x00000001;
}
}
15: print all char.c
4.4.2 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験では,MIPS マシンコード print_all_char.bin を使用するまた変換には
換プログラム bin2v を使用する.bin2v print_all_char.binで,MIPS マシンコード
print_all_char.bin からメモリイメージファイルを作成せよ.この変換により,論理合
成用のメモリ・イメージファイル rom8x1024_DE2.mif と,機能レベルシミュレーション用
の命令メモリの Verilog HDL 記述 rom8x1024_sim.v が得られる.
なお,本実験で使用する MIPS マシンード print_all_char.bin は,正しいプロセッ
sltiu 命令,bne 命令,lw 命令が実装済みのプロセッサで動作させると,以下のよ
な動作をする命令列を含んだバイナリ・ファイルである.
1. データメモリ(RAM)の REG[30] 番地に 0 を格納
sw $s0, 0x0000($s30)
2. PC=0x040006c 番地の命令にジャンプ
j 0x040006c
3. RAM REG[30] 番地の値と 61 を比較
lw $s2, 0x0000($s30)
sltiu $2, $2, 0x0000003d
4. 比較結果が 1 なら PC = PC + 4 17 4,そうでなければ PC = PC + 4
4.4.3 命令メモリに格納される命令列の確認
本実験では,プロセッサの命令メモリに格納される命令列の確認を行う.この確認には
bin2v Verilog HDL rom8x1024_sim.v
を使用する.
16 rom8x1024_sim.v の一部を示す.図 16 case ブロック内の各行は本実験で設
計するプロセッサにおける,命令メモリの 10-bit アドレスとそこに格納される 32-bit 命令
の機械語の記述である.また,各行の // 以降のコメント部には,その行に記述されている
アドレスと命令に関する説明が記述されているコメント部には,実際の MIPS の命令メモ
リにおけるアドレスと,命令名,命令の意味が記述されている.命令の意味の記述では
ンボル REG[0], REG[1], . . . , REG[31] により,レジスタ 0 番から 31 番,$s0, . . . , $s31
表す.また,シンボル RAM[w] により,データメモリの w 番地を表す
16 case ブロック内の最後の記述は,本実験で設計するプロセッサの命令メモリ
0x01e 番地に機械語 0x1440ffef が格納されることを表している.また,この命令は実際の
MIPS では 0x00400078 格納され,命令名 bne,レジスタ 2 番とレジス 0 の値が等
42
<省略>
case (word_addr)
<省略>
10’h00b: data = 32’hafc00000; // 0040002c: SW, RAM[REG[30]+0]<=REG[0];   ここが PC=0x002c の命令
10’h00c: data = 32’h0810001b; // 00400030: J, PC<=0x0010001b*4(=0x0040006c);
10’h00d: data = 32’h00000000; // 00400034: SLL, REG[0]<=REG[0]<<0;
10’h00e: data = 32’h24020300; // 00400038: ADDIU, REG[2]<=REG[0]+768(=0x00000300);
10’h00f: data = 32’hac400000; // 0040003c: SW, RAM[REG[2]+0]<=REG[0];
10’h010: data = 32’h24030304; // 00400040: ADDIU, REG[3]<=REG[0]+772(=0x00000304);
10’h011: data = 32’h8fc20000; // 00400044: LW, REG[2]<=RAM[REG[30]+0];   ここが 命令メモリ 0x011 の命令
10’h012: data = 32’h00000000; // 00400048: SLL, REG[0]<=REG[0]<<0;
10’h013: data = 32’hac620000; // 0040004c: SW, RAM[REG[3]+0]<=REG[2];
10’h014: data = 32’h24030300; // 00400050: ADDIU, REG[3]<=REG[0]+768(=0x00000300);
10’h015: data = 32’h24020001; // 00400054: ADDIU, REG[2]<=REG[0]+1(=0x00000001);
10’h016: data = 32’hac620000; // 00400058: SW, RAM[REG[3]+0]<=REG[2];
10’h017: data = 32’h8fc20000; // 0040005c: LW, REG[2]<=RAM[REG[30]+0];
10’h018: data = 32’h00000000; // 00400060: SLL, REG[0]<=REG[0]<<0;
10’h019: data = 32’h24420001; // 00400064: ADDIU, REG[2]<=REG[2]+1(=0x00000001);
10’h01a: data = 32’hafc20000; // 00400068: SW, RAM[REG[30]+0]<=REG[2];
10’h01b: data = 32’h8fc20000; // 0040006c: LW, REG[2]<=RAM[REG[30]+0];
10’h01c: data = 32’h00000000; // 00400070: SLL, REG[0]<=REG[0]<<0;
10’h01d: data = 32’h2c42003d; // 00400074: SLTIU, REG[2]<=(REG[2]<61(=0x0000003d))?1:0;
0x01d の命令
10’h01e: data = 32’h1440ffef; // 00400078: BNE, PC<=(REG[2] != REG[0])?PC+4+65519*4:PC+4;
<省略>
endcase
<省略>
16: rom8x1024 sim.v の一部
しくなければ,PC PC + 4 + 65519 4(PC + (1 17) 4) をセットし,等しければ PC
PC + 4 をセットする命令であることを表している.
print all char.bin から生成され rom8x1024 sim.v または 16 Verilog HDL 記述を
析し,以下の 1,2 について答えよ. なお,sltiu は即値符号なし・セットオンレス・ザ
ン命令,bne はブランチ・オン・ノット・イコール命令,lw はロード・ワード命令である.
1. プロセッサが最初に PC=0x0074 番地の命令を実行した直後のレジスタ 2 番目の値を予
想せよ.
2. プロセッサが最初に PC=0x0078 番地の命令を実行した直後の PC の値を予想せよ.
4.4.4 論理合成
本実験ではsltiu 命令と bne 命令,lw 命令が未実装なプロセッサならびに命令メモ
その他周辺回路の論理合成を行う.論理合成には,bin2v により生成された論理合成用のメ
モリイメージイル rom8x1024_DE2.mif と実験 2-2 で完成させたプロセッサの Verilog
HDL 記述一式を使用する.
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 が生成される.
4.4.5 FPGA を用いた回路実現
本実験では,sltiu 命令と bne 命令,lw 命令が未実装なプロセッサの実際の動作を観察
する察した結果はのプロセサの追加設 3 おいて,sltiubnelw が正しく
43
くプロセッサを完成させた後,動作確認の際の比較に用いる.本実験には,論理合成により
生成されたプロセサなど回路一式のストリームウトイル DE2_115_Default.sof
を使用するDE2_115_Default.sof quartus_pgm を用いて DE2-115 ボード上の FPGA
にダウンロードし,動作させよ.
今回プロセッサが実行するマシン・コード print_all_char.bin はディスプレイに 61
類の文字を表示するプログラムであるKEY3 を連打してプロセッサにクロックパルスを
,プロセッサに PC=0x0000 番地から 30 個程度の命令を実行させ,ディスプレイ下部に文
字が表示されるかどうかを確認せよ ィスプレイ下部に文字 1 つも表示されないはず
ある.
17 に動作実験 4-1 のプロセッサのブロック図を示す.ディスプレイ上部にはプロセッ
サ内部の主な信号線の現在の値が表示されている.各信号線は, 17 の名前の似た信号線
と,それぞれ対応しているブロック図中の線の幅はビット幅と対応しており一番細い線
1-bit の線一番太い線は 32-bit の配線を表している.またブロク図左下の ROM が,
命令メモリである.プロセッサはここから命令を読み,命令毎に決められた処理を行う.ブ
ロック図右下 RAM は,データメモリである.3 の命令メモリに格納される命令列の確
の,1, 2 で予想した結果と同じ正しい動作かどうかを確認せよ.予想と異なる正しくない動
作のはずである.
プロセッサが,sltiu 命令と bne 命令,lw 命令を正しく実行できていないことが分かる.
これらの命令を正しく実行するためにプロセッサ内部で行われるデータ転送や演算などを
制御しているメイン制御回路を,これらの命令を適切に処理できるものにする必要がある.
44
17: 動作実験 4-1 のプロセッサのブロック図
45
4.5 プロセッサの追加設 3 sltiu 命令,bne 命令,lw 命令) C
ログラムの動作実験 4-2
本実験では,プロセッサの追加設計と動作実験を行.これにより,プロセッサの追加設
計の手順とプロセッサの動作の理解を目指す.本実験では,sltiu 命令と bne 命令,lw
令が未実装なプロセッサを例とし,追加設計を行い,これらの命令が正しく実行されるプロ
セッサを完成させる.また,その動作を実際に動作させて観察する.
実験 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
46
4.5.1 sltiu 命令のためのメイン制御回路の追加設計
本実験では動作実験
4-1
で動作を確認した
sltiu
命令と
bne
命令,
lw
命令が未実装な
プロセッサについて,追加設計を行う
本実験では,動作実 4-1 使用したプロセッサのメイン制御回路の Verilog HDL 記述
main_ctrl.v を使用する.main_ctrl.v は,ディレクトリ mips_de2-115 内のサブディレ
クトリ MIPS 内にある.
ソースファイル main_ctrl.v 中のコメント追加設計 3 のヒント (1)(8) の周辺を,
切に変更せよ.
sltiu 命令実行時のプロセッサ内の信号の流れを図 18 に示す.ブロック図中の青(濃
い灰色)と緑(薄い灰色)の線で書かれた信号 sltiu 命令の実行に関わっている
信号の流れがブロック図のようになるように,ブロック図中の赤で書かれた制御信号
を適切に設定する.
4.5.2 bne 命令のためのメイン制御回路の追加設計
本実験では,bne 命令についての追加設計を行う
本実験では,動作実 4-1 使用したプロセッサのメイン制御回路の Verilog HDL 記述
main_ctrl.v を使用する.main_ctrl.v は,ディレクトリ mips_de2-115 内のサブディレ
クトリ MIPS 内にある.
ソースファイ main_ctrl.v 中のコメン追加設計 3 のヒント (9)(13) の周辺を,
切に変更せよ.
bne 命令実行時のプロセッサ内の信号の流れを図 19 に示す.ブロック図中の青(濃い
灰色)と緑(薄い灰色)の線で書かれた信号が bne 命令の実行に関わっている.信号
の流れがブロック図のようになるように,ブロック図中の赤で書かれた制御信号を適
切に設定する.
4.5.3 lw 命令のためのメイン制御回路の追加設計
本実験では,lw 命令についての追加設計を行う
本実験では,動作実 4-1 使用したプロセッサのメイン制御回路の Verilog HDL 記述
main_ctrl.v を使用する.
main_ctrl.v は,ディレクトリ mips_de2-115 内のサブディレクトリ MIPS 内にある.
ソースファイル main_ctrl.v 中のコメン,追加設計 3 ヒント (14)(21) の周辺を,
適切に変更せよ.
lw 命令実行時のプロセサ内の信号の流れを図 20 に示ブロック図中の青(濃い灰
色)と緑(薄い灰色)の線で書かれた信号が lw 命令の実行に関ている.信号の流
れがブロック図のようになるように,ブロック図中の赤で書かれた制御信号を適切に
設定する.
47
18: sltiu 命令実行時のプロセッサ内の信号の流れ
48
19: bne 命令実行時のプロセッサ内の信号の流れ
49
20: lw 命令実行時のプロセッサ内の信号の流れ
50
4.5.4 論理合成
本実験では,追加設計後のプロセッサならびに命令メモリその他周辺回路の論理合成を
行う
論理合成には,追加設計後の main_ctrl.v と動作実験 4-1 で使用したその他プロセッサ
Verilog HDL 記述一式,print_all_char.bin から生成した メモリ・イメージファイル
rom8x1024_DE2.mif を使用する.
追加設計後の main_ctrl.v プロサなど一式のディレクト mips_de2-115 の,
サブディレクトリ MIPS 内に置く
mips_de2-115 cd print_all_char.bin rom8x1024_DE2.mif
がそこにあるのを確認して,quartus_sh --flow compile DE2_115_Defaultで論理合成
を行う
なお,論理合成には計算機の性能により 5 分から 20 分程度の時間がかかる.論理合成が
完了すると,ディレクトリ mips_de2-115 内に FPGA にダウンロード可能なプロセッサ等
の回路一式のストリーム・アウト・ファイル DE2_115_Default.sof が生成される.
4.5.5 FPGA を用いた回路実現
本実験では,追加設計後のプロッサの実際の動作を観察し動作実験 4-1 で観察した
果との比較を行う.本実験には,論理合成により生成された プロセッサなど回路一式の
トリームアウトファイル DE2_115_Default.sof を使用する.DE2_115_Default.sof
quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させよ.
プロセッサが実行するマシン・コード print_all_char.bin はディスプレイ下部に 61
類の文字を表示するプログラムであるKEY3 を連打してプロセッサにクロックパルスを
,プロセッサに PC=0x0000 番地から 60 個程度の命令を実行させ,ディスプレイ下部に異
なる文字が 2 つ表示されるかどうかを確認せよ. 異なる文字が 2 つ表示されるはずである.
また,動作実験 4-1 で確認された,動作実験 4-1 3 1, 2 で予想した結果と異なる動
作について,その動作に変化がないかどうかを確認せよ 動作実験 4-1 3 1, 2 で予想
した結果と同じ動作になったはずである.
完成版の sof を動かしてみたい場合は実験 Web ページか DE2_115_Default.k04.sof
をダウンロードできる
51
5 シングルサイクル RISC プロセッサの設計「上級編」
3 週目の実験ではプロセッサの動作実験とプロセッサのジャンプアンドリンク
命令(jal)とジャンプ・レジスタ命令(jr)について追加設計を行う
5.1 C プログラムの動作実験 5-1(関数呼出し・ディスプレイへの文字列
出力関数)
本実験では,FPGA を搭載した実験基板を使用し,プロセッサを FPGA 上に実現して
の動作を確認する.本動作実験では,ンプアンドリンク命jump and linkjal
が未実装なプロセッサにおいてその命令を含む簡単な機械語のマシン・コードを実行する
どのをすする本実した次のロセサの追加
4 において,jal が正しく動くプロセッサを完成させた後,動作確認の際の比較に用いる.
実験 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 は,実験 Web ページからダウン
ロードできる.
5.1.1 クロスコンパイル
本実験では,C プログラムの例として文字列を表示する図 21 my_print.c を使用する.
クロスコンパイルには,cross_compile.shを使用する.2.2 節に示した環境設定を
たのち,cross_compile.sh my_print.c」で,my_print.c から MIPS シン・コードを
作成せよ.クロスコンパイルによりMIPS マシン・コード my_print.bin が得られる.
52
#define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300)
#define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304)
void my_print();
main()
{
unsigned int string[64];
string[0] = ’H’;
string[1] = ’E’;
string[2] = ’L’;
string[3] = ’L’;
string[4] = ’O’;
string[5] = ’!’;
string[6] = ’!’;
string[7] = ’\0’;
my_print(string);
string[0] = ’B’;
string[1] = ’\0’;
}
void my_print(str)
unsigned int *str;
{
while (*str != ’\0’) {
EXTIO_PRINT_STROKE = (unsigned int)0x00000000;
if ((*str >= ’A’) && (*str <= ’Z’)) {
EXTIO_PRINT_ASCII = *str - ’A’ + 1;
} else if ((*str >= ’a’) && (*str <= ’z’)) {
EXTIO_PRINT_ASCII = *str - ’a’ + 1;
} else if ((*str >= ’0’) && (*str <= ’9’)) {
EXTIO_PRINT_ASCII = *str - ’0’ + 48;
} else {
if (*str == ’@’) {
EXTIO_PRINT_ASCII = (unsigned int)0;
} else if (*str == ’[’) {
EXTIO_PRINT_ASCII = (unsigned int)27;
} else if (*str == ’]’) {
EXTIO_PRINT_ASCII = (unsigned int)29;
} else if ((*str >= ’) && (*str <= ’/’)) {
EXTIO_PRINT_ASCII = *str - + 32;
} else if (*str == ’?’) {
EXTIO_PRINT_ASCII = (unsigned int)58;
} else if (*str == ’=’) {
EXTIO_PRINT_ASCII = (unsigned int)59;
} else if (*str == ’;’) {
EXTIO_PRINT_ASCII = (unsigned int)60;
} else if (*str == ’:’) {
EXTIO_PRINT_ASCII = (unsigned int)61;
} else {
EXTIO_PRINT_ASCII = (unsigned int)0x00000000;
}
}
EXTIO_PRINT_STROKE = (unsigned int)0x00000001;
str++;
}
}
21: my print.c
5.1.2 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験ではMIPS マシン・コー my_print.bin を使用する.また変換には,変換プロ
グラ bin2v を使用するbin2v my_print.binで,MIPS マシコー my_print.bin
からメモリ・イメージファイルを作成せよ.この変換によ,論理合成用のメモリ・イメー
ジファイ rom8x1024_DE2.mif と,機能レベルシュレーシン用の命令メモリ Verilog
HDL 記述 rom8x1024_sim.v が得られる.
53
実験使 MIPS マシコー my_print.bin は,正しいプ
ンプ&リンク命令 jal が実装済みのプロセッサ)で動作させると,以下のような動作をする
命令列を含んだバイナリ・ファイルである.
1. データメモリ(RAM)の $s30+16 番地に ’H’ を格納
addiu $s2, $s0, 0x0048
sw $s2, 0x0010($s30)
2. データメモリ(RAM)の $s30+20 番地に ’E’ を格納
addiu $s2, $s0, 0x0045
sw $s2, 0x0014($s30)
3. データメモリ(RAM)の $s30+24 番地に ’L’ を格納
addiu $s2, $s0, 0x004c
sw $s2, 0x0018($s30)
4. データメモリ(RAM)の $s30+28 番地に ’L’ を格納
addiu $s2, $s0, 0x004c
sw $s2, 0x001c($s30)
5. データメモリ(RAM)の $s30+32 番地に ’O’ を格納
addiu $s2, $s0, 0x004f
sw $s2, 0x0020($s30)
6. データメモリ(RAM)の $s30+36 番地に ’!’ を格納
addiu $s2, $s0, 0x0021
sw $s2, 0x0024($s30)
7. データメモリ(RAM)の $s30+40 番地に ’!’ を格納
addiu $s2, $s0, 0x0021
sw $s2, 0x0028($s30)
8. データメモリ(RAM)の $s30+44 番地に ’\0’ を格納
sw $s0, 0x002c($s30)
9. PC = 0x04000a0 番地の命令にジャンプ&リンク
jal 0x04000a0
5.1.3 命令メモリに格納される命令列の確認
本実験では,プロセッサの命令メモリに格納される命令列の確認を行う.この確認には
bin2v Verilog HDL rom8x1024_sim.v
を使用する.
22 rom8x1024_sim.v の一部を示す.図 22 case ブロック内の各行は本実験で設
計するプロセッサにおける,命令メモリの 10-bit アドレスとそこに格納される 32-bit 命令
の機械語の記述である.また,各行の // 以降のコメント部には,その行に記述されている
アドレスと命令に関する説明が記述されているコメント部には,実際の MIPS の命令メモ
リにおけるアドレスと,命令名,命令の意味が記述されている.命令の意味の記述では
54
<省略>
case (word_addr)
<省略>
10’h00b: data = 32’h03a0f021; // 0040002c: ADDU, REG[30]<=REG[29]+REG[0];   ここが PC=0x002c の命令
10’h00c: data = 32’h24020048; // 00400030: ADDIU, REG[2]<=REG[0]+72(=0x00000048);
10’h00d: data = 32’hafc20010; // 00400034: SW, RAM[REG[30]+16]<=REG[2];
10’h00e: data = 32’h24020045; // 00400038: ADDIU, REG[2]<=REG[0]+69(=0x00000045);
10’h00f: data = 32’hafc20014; // 0040003c: SW, RAM[REG[30]+20]<=REG[2];
10’h010: data = 32’h2402004c; // 00400040: ADDIU, REG[2]<=REG[0]+76(=0x0000004c);
10’h011: data = 32’hafc20018; // 00400044: SW, RAM[REG[30]+24]<=REG[2];
10’h012: data = 32’h2402004c; // 00400048: ADDIU, REG[2]<=REG[0]+76(=0x0000004c);
10’h013: data = 32’hafc2001c; // 0040004c: SW, RAM[REG[30]+28]<=REG[2];
10’h014: data = 32’h2402004f; // 00400050: ADDIU, REG[2]<=REG[0]+79(=0x0000004f);
10’h015: data = 32’hafc20020; // 00400054: SW, RAM[REG[30]+32]<=REG[2];
10’h016: data = 32’h24020021; // 00400058: ADDIU, REG[2]<=REG[0]+33(=0x00000021);
10’h017: data = 32’hafc20024; // 0040005c: SW, RAM[REG[30]+36]<=REG[2];
10’h018: data = 32’h24020021; // 00400060: ADDIU, REG[2]<=REG[0]+33(=0x00000021);
10’h019: data = 32’hafc20028; // 00400064: SW, RAM[REG[30]+40]<=REG[2];
10’h01a: data = 32’hafc0002c; // 00400068: SW, RAM[REG[30]+44]<=REG[0];
10’h01b: data = 32’h27c20010; // 0040006c: ADDIU, REG[2]<=REG[30]+16(=0x00000010);
10’h01c: data = 32’h00402021; // 00400070: ADDU, REG[4]<=REG[2]+REG[0];
10’h01d: data = 32’h0c100028; // 00400074: JAL, PC<=0x00100028*4(=0x004000a0); REG[31]<=PC+4   ここが
令メモリ 0x01d の命令
<省略>
endcase
<省略>
22: rom8x1024 sim.v の一部
ンボル REG[0], REG[1], . . . , REG[31] により,レジスタ 0 番から 31 番,$s0, . . . , $s31
表す.また,シンボル RAM[w] により,データメモリの w 番地を表す
22 case ブロック内の最後の記述は,本実験で設計するプロセッサの命令メモリ
0x01d 番地に機械語 0x0c1000028 が格納されることを表している.
また,この命令は実際の MIPS では 0x00400074 に格納され,命令名は jal,レジスタ 31
番に PC + 4 をセットし,PC 0x00100028 4 をセットする命令であることを表している.
my_print.bin から生成された rom8x1024_sim.v, または,図 22 Verilog HDL 記述を
解析し,以下 1, 2 について答えよ. なおjal はジンプアンリンク命令はである.
1. プロセッサが最初に PC=0x0074 番地の命令を実行した直後のレジスタ 31 番目の値を
予想せよ.
2. プロセッサが最初に PC=0x0074 番地の命令を実行した直後の PC の値を予想せよ.
5.1.4 論理合成
本実験では,jal 命令が未実装なプロセッサならびに命令メモリ,その他周辺回路の論理
合成を行う.論理合成には,bin2v により生成された論理合成用のメモリイメージファ
rom8x1024_DE2.mif と実験 4-2 で完成させたプロサの Verilog HDL 記述一式を使用
する.
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 が生成される.
55
5.1.5 FPGA を用いた回路実現
本実験では,
jal
命令が未実装なプサの実際察し
のプロセッサの追加設 4 においてjal が正しく動くプロセッサを完成させた後,動作確
認の際の比較に用いる.本実験には,論理合成により生成されたプロセッサなど回路一式の
ストリーアウトファイル DE2_115_Default.sof を使用する.DE2_115_Default.sof
quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させよ.
my_print.bin "HELLO!!"
ラムKEY3 してスをロセ
PC=0x0000 番地 70 個程命令行させ,プレイ下文字 "HELLO!!"
の一部が表示されるかどうかを確認せよ. ディスプレイ下部に "HELLO!!" に含まれる文字
1 つも表示されないはずである.
ディスプレイ上部にはプロセッサ内部の主な信号線の現在の値が表示されている.各信号
線は, 23 の名前の似た信号線と,それぞれ対応している.ブロック図中の線の幅はビッ
ト幅と対応してお,一番細い線は 1-bit の線,一番太い線は 32-bit 配線を表している.
また,ブロック図左下の ROM が,命令メモリである.プロセッサはここから命令を読み
命令毎に決められた処理を行う.ブロック図右下の RAM は,データメモリである.3 の命
令メモリに格納される命令列の確認の,1, 2 で予想した結果と同じ正しい動作かどうかを確
認せよ.予想と異なる正しくない動作のはずである.
プロセッサがjal 命令を正しく実行できていないことが分かる.これらの命令を正しく
実行するためにプロセッサ内部で行われるデータ転送や演算などを制御しているメイン制
御回路を,この命令を適切に処理できるものにする必要がある.
56
23: 動作実験 5-1 のプロセッサのブロック図
57
5.2 プロセッサの追加設計 4jal 命令) C プログラムの動作実験 5-2
本実験では,プロセッサの追加設計と動作実験を行.これにより,プロセッサの追加設
計の手順とプロセッサの動作の理解を目指.本実験では,jal 命令が未実装なプロセッサ
を例とし追加設計を行い,これらの命令が正しく実行されるプロセッサを完成させる.
た,その動作を実際に動作させて観察する.
実験 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 = address
(ジャンプ) ra = PC + 4
ra 31 番目のレジスタ)
jal 命令の機械語
jal 000011 address
J 形式 6 ビット 26 ビット
31 26 25 0
5.2.1 jal 命令のためのメイン制御回路の追加設計
本実験では,動作実 5-1 で動作を確認し jal 命令が未実装なプロッサについて
加設計を行う
本実験では,動作実 5-1 使用したプロセッサのメイン制御回路の Verilog HDL 記述
main_ctrl.v を使用する.main_ctrl.v は,ディレクトリ mips_de2-115 内のサブディレ
クトリ MIPS 内にある.
ソースファイル main_ctrl.v 中のコメント追加設計 4 のヒント (1)(4) の周辺を,
切に変更せよ.
jal 命令実行時のプロセッサ内の信号の流れを図 24 に示す.ブロック図中の青(濃い
灰色)と緑(薄い灰色)の線で書かれた信号が jal 命令の実行に関わっている.信号
58
の流れがブロック図のようになるように,ブロック図中の赤で書かれた制御信号を適
切に設定する.
5.2.2 論理合成
本実験では,追加設計後のプロセッサならびに命令メモリその他周辺回路の論理合成を
行う
論理合成追加設計後 main_ctrl.v と動実験 5-1 で使用したその他プロセサの
Verilog HDL my_print.bin rom8x1024_DE2.mif
を使用する.
追加設計後の main_ctrl.v プロサなど一式のディレクト mips_de2-115 の,
サブディレクトリ MIPS 内に置く
更に,ディレクトリ mips_de2-115 cd し,my_print.bin rom8x1024_DE2.mif
そこにあるのを確認して,quartus_sh --flow compile DE2_115_Defaultで論理合成
行う
なお,論理合成には計算機の性能により 5 分から 20 分程度の時間がかかる.論理合成が
完了すると,ディレクトリ mips_de2-115 内に FPGA にダウンロード可能なプロセッサ等
の回路一式のストリーム・アウト・ファイル DE2_115_Default.sof が生成される.
5.2.3 FPGA を用いた回路実現
本実験では,追加設計後のプロッサの実際の動作を観察し動作実験 5-1 で観察した
果との比較を行う.本実験には,論理合成により生成された プロセッサなど回路一式の
トリームアウトファイル DE2_115_Default.sof を使用する.DE2_115_Default.sof
quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させよ.
プロセッサが実行するマシンコード my_print.bin はディスプレイ下部に文字列を表
するプログラムである.KEY3 を連打してプロセッサにクロックパルスを送りプロセッサ
PC=0x0000 番地か 70 個程度の命令を実行させ,ディスプレイ下部に文字列 "HELLO!!"
の一部が表示されるかどうかを確認せよ. 文字列 "HELLO!!" の一部が表示されるはずであ
る.クロック供給モード 1000Hz にセットすると数秒で文字列 "HELLO!!" が完全に表示さ
れる.
また,動作実験 5-1 で確認された,動作実験 5-1 3 1, 2 で予想した結果と異なる動
作について,その動作に変化がないかどうかを確認せよ 動作実験 5-1 3 1, 2 で予想
した結果と同じ動作になったはずである.
59
24: jal 命令実行時のプロセッサ内の信号の流れ
60
5.3 C プログラムの動作実験 6-1(関数からの復帰・キーボードからの文
字列入力を受ける関数)
本実験では,FPGA を搭載した実験基板を使用し,プロセッサを FPGA 上に実現して
の動作を確認する.本動作実験では,ジャンプレジスタ命令(jump registerjr)が未
装なプロセッサにおいて,その命令を含む簡単な機械語のマシンコードを実行すると
のような動作をするかを観察する.本実験で観察した結果は,次のプロセッサの追加設計 5
において,jr が正しく動くプロセッサを完成させた後,動作確認の際の比較に用いる.
実験 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 は,実験 Web ページからダウン
ロードできる.
5.3.1 クロスコンパイル
C キー 25 my_scan.c
を使用する.
クロスコンパイルには,cross_compile.shを使用する.2.2 節に示した環境設定を
たのちcross_compile.sh my_scan.c」でmy_scan.c から MIPS シン・コードを作
成せよ.クロスコンパイルによりMIPS マシン・コード my_scan.bin が得られる.
61
#define EXTIO_SCAN_ASCII (*(volatile unsigned int *)0x0310)
#define EXTIO_SCAN_REQ (*(volatile unsigned int *)0x030c)
#define EXTIO_SCAN_STROKE (*(volatile unsigned int *)0x0308)
#define SCAN_STRORING (unsigned int)0xffffffff
#define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300)
#define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304)
void my_print();
void my_scan();
main()
{
unsigned int string1[32];
unsigned int string2[32];
string1[0] = ’H’;
string1[1] = ’E’;
string1[2] = ’L’;
string1[3] = ’L’;
string1[4] = ’O’;
string1[5] = ’!’;
string1[6] = ’!’;
string1[7] = ’\n’;
string1[8] = ’\0’;
my_print(string1);
<省略>
}
void my_scan(str)
unsigned int *str;
{
EXTIO_SCAN_STROKE = (unsigned int)0x00000000;
EXTIO_SCAN_REQ = (unsigned int)0x00000001;
EXTIO_SCAN_STROKE = (unsigned int)0x00000001;
<省略>
}
void my_print(str)
unsigned int *str;
{
while (*str != ’\0’) {
EXTIO_PRINT_STROKE = (unsigned int)0x00000000;
<省略>
}
25: my scan.c の一部
5.3.2 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験では,MIPS マシン・コード my_scan.bin を使用する.また変換には,変換プロ
グラム bin2v を使用する.bin2v my_scan.bin」で,MIPS マシン・コード my_scan.bin
からメモリ・イメージファイルを作成せよ.この変換によ,論理合成用のメモリ・イメー
ジファイ rom8x1024_DE2.mif と,機能レベルシュレーシン用の命令メモリ Verilog
HDL 記述 rom8x1024_sim.v が得られる.
なお本実験で使用する MIPS マシンコード my_scan.bin は,しいプロセ(ジ
ンプレジスタ命令 jr が実装済みのプロセッサ)で動作させると,以下のような動作をする
命令列を含んだバイナリ・ファイルである.
1. PC = 0x04004d8 番地の命令にジャンプ&リンク
jal 0x04004d8
2. PC = REG[31] 番地の命令にジャンプレジスタ
jr
62
5.3.3 命令メモリに格納される命令列の確認
本実験では,プロセッサの命令メモリに格納される命令列の確認を行う.この確認には
bin2v Verilog HDL rom8x1024_sim.v
を使用する.
26 rom8x1024_sim.v の一部を示す.図 26 case ブロック内の各行は本実験で設
計するプロセッサにおける,命令メモリの 10-bit アドレスとそこに格納される 32-bit 命令
の機械語の記述である.また,各行の // 以降のコメント部には,その行に記述されている
アドレスと命令に関する説明が記述されているコメント部には,実際の MIPS の命令メモ
リにおけるアドレスと,命令名,命令の意味が記述されている.命令の意味の記述では
ンボル REG[0], REG[1], . . . , REG[31] により,レジスタ 0 番から 31 番,$s0, . . . , $s31
表す.また,シンボル RAM[w] により,データメモリの w 番地を表す
<省略>
case (word_addr)
<省略>
10’h00b: data = 32’h03a0f021; // 0040002c: ADDU, REG[30]<=REG[29]+REG[0];   ここが PC=0x002c の命令
<省略>
10’h01f: data = 32’h0c100136; // 0040007c: JAL, PC<=0x00100136*4(=0x004004d8); REG[31]<=PC+4
<省略>
10’h136: data = 32’h27bdfff8; // 004004d8: ADDIU, REG[29]<=REG[29]+65528(=0x0000fff8);
10’h137: data = 32’hafbe0000; // 004004dc: SW, RAM[REG[29]+0]<=REG[30];
10’h138: data = 32’h03a0f021; // 004004e0: ADDU, REG[30]<=REG[29]+REG[0];
10’h139: data = 32’hafc40008; // 004004e4: SW, RAM[REG[30]+8]<=REG[4];
10’h13a: data = 32’h081001f8; // 004004e8: J, PC<=0x001001f8*4(=0x004007e0);
<省略>
10’h1f8: data = 32’h8fc20008; // 004007e0: LW, REG[2]<=RAM[REG[30]+8];
10’h1f9: data = 32’h00000000; // 004007e4: SLL, REG[0]<=REG[0]<<0;
10’h1fa: data = 32’h8c420000; // 004007e8: LW, REG[2]<=RAM[REG[2]+0];
10’h1fb: data = 32’h00000000; // 004007ec: SLL, REG[0]<=REG[0]<<0;
10’h1fc: data = 32’h1440ff3f; // 004007f0: BNE, PC<=(REG[2] != REG[0])?PC+4+65343*4:PC+4;
10’h1fd: data = 32’h00000000; // 004007f4: SLL, REG[0]<=REG[0]<<0;
10’h1fe: data = 32’h03c0e821; // 004007f8: ADDU, REG[29]<=REG[30]+REG[0];
10’h1ff: data = 32’h8fbe0000; // 004007fc: LW, REG[30]<=RAM[REG[29]+0];
10’h200: data = 32’h27bd0008; // 00400800: ADDIU, REG[29]<=REG[29]+8(=0x00000008);
10’h201: data = 32’h03e00008; // 00400804: JR, PC<=REG[31];   ここが 命令メモリ 0x201 の命令
<省略>
endcase
<省略>
26: rom8x1024 sim.v の一部
26 case ブロック内の最後の記述は,本実験で設計するプロセッサの命令メモリ
0x201 番地に機械語 0x03e00008 が格納されることを表している.
また,この命令は実際の MIPS では 0x00400800 に格納され,命令名は jrレジス 31
番に 退避されている値を PC にセットする命令であることを表している.
my_scan.bin ら生成された rom8x1024_sim.v, または,図 26 Verilog HDL 記述を
解析し,以下の 1, 2 について答えよ.
なお,jr はジャンプ・レジスタ命令はである.
1. プロセッサが最初に PC=0x007c 番地の命令を実行した直後のレジスタ 31 番目の値を
予想せよ.
2. プロセッサが最初に PC=0x0804 番地の命令を実行した直後の PC の値を予想せよ.
5.3.4 論理合成
本実験ではjr 令が未実装なプロセッサならびに命令メモリ,その他周辺回路の論
合成を行う.論理合成には,bin2v により生成された論理合成用のメモリイメージファ
63
rom8x1024_DE2.mif と実験 5-2 で完成させたプロサの Verilog HDL 記述一式を使用
する.
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 が生成される.
5.3.5 FPGA を用いた回路実現
本実験では,jr 命令が未実装なプロセサの実際の動作を観察する.察した結果は,
のプロセッサの追加設計 5 において,jr が正しく動くプロセッサを完成させた後,動作確
認の際の比較に用いる.本実験には,論理合成により生成されたプロセッサなど回路一式の
ストリーアウトファイル DE2_115_Default.sof を使用する.DE2_115_Default.sof
quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させよ.
今回プロセサが実行するマシコー my_scan.bin はキーボードからの文字列入力を
プロラムであクロルス PC=0x0000
番地からの命令を実行させディスプレイ下部に文字列が 2 つ表示されるかどうかを確認せ
よ. ディスプレイ下部に文字列は 1 つしか表示されないはずである.
27 に動作実験 4-1 のプロセッサのブロック図を示す
ディスプレイ上部にはプロセッサ内部の主な信号線の現在の値が表示されている.各信号
線は 27 の名前の似た信号線とそれぞれ対応している.ブロク図中の線の幅はビット
幅と対応しており,一番細い線 1-bit の線,一番太い線は 32-bit の配線を表している.
た,ブロック図左下の ROM が,命令メモリであるプロセッサはここから命令を読み,
令毎に決められた処理を行うブロック図右下の RAM は,データメモリである.3 の命令
メモリに格納される命令列の確認の,1, 2 で予想した結果と同じ正しい動作かどうかを確
せよ.予想と異なる正しくない動作のはずである.
プロセッサがjr 命令を正しく実行できていないことが分かる.これらの命令を正し
実行するためにプロセッサ内部で行われるデータ転送や演算などを制御しているメイン制
御回路を,この命令を適切に処理できるものにする必要がある.
64
27: 動作実験 6-1 のプロセッサのブロック図
65
5.4 プロセッサの追加設計 5jr 命令)と C プログラムの動作実験 6-2
本実験では,プロセッサの追加設計と動作実験を行.これにより,プロセッサの追加設
計の手順とプロセッサの動作の理解を目指す
本実験では,jr 令が未実装なプロセッサを例とし,追加設計を行い,両命令が正し
実行されるプロセッサを完成させる.また,その動作を実際に動作させて観察する.
実験 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
5.4.1 jr 命令のためのジャンプ・レジスタ・セレクト・モジュールの追加設計
本実験では,動作実験 6-1 で動作を確認した jr 命令が未実装なプロセッサについて,追
加設計を行う
本実験では,プロセサの最上位階層 Verilog HDL 記述 cpu.v を使用する.cpu.v は,
ディレクトリ mips_de2-115 内のサブディレクトリ MIPS 内にある.
ソースファイル cpu.v 中のコメント追加設計 5 のヒント (1)(4) の周辺にジャンプ
レジスタ・セレクト・モジュールに関する記述を追加せよ.
jr 命令は,レジスタ 31 番に 退避されている値を PC にセットする命令である.
66
jr 命令のためのジャンプレジスセレクモジュールを 28 に示すブロ
図中の破線で囲まれた,未実装,追加設計 5 と書かれた部分が jr 命令のためのジャ
ンプレジスタセレクトモジュールである.以下では,このジャンプレジスタ
セレクト・モジュールをプロセッサの最上位階層の記述に追加する.
5.4.2 jr 命令のためのメイン制御回路の追加設計
本実験では,動作実験 6-1 で動作を確認した jr 命令が未実装なプロセッサについて,追
加設計を行う
本実験では,動作実 6-1 使用したプロセッサのメイン制御回路の Verilog HDL 記述
main_ctrl.v を使用する.main_ctrl.v は,ディレクトリ mips_de2-115 内のサブディレ
クトリ MIPS 内にある.
ソースファイル main_ctrl.v 中のコメント追加設計 5 のヒント (1)(2) の周辺を,
切に変更せよ.
jr 命令実行時のプロセサ内の信号の流れを図 29 に示ブロック図中の青(濃い灰
色)と緑(薄い灰色)の線で書かれた信号が jr 命令の実行に関ている.信号の流
れがブロック図のようになるように,ブロック図中の赤で書かれた制御信号を適切に
設定する.
5.4.3 論理合成
本実験では,追加設計後のプロセッサならびに命令メモリその他周辺回路の論理合成を
行う
論理合成には,追加設計後の main_ctrl.v cpu.v,動作実験 6-1 で使用したその他プ
ロセッサの Verilog HDL 記述一式,my_scan.bin から生成した メモリイメージファイル
rom8x1024_DE2.mif を使用する.
main_ctrl.v cpu.v mips_de2-115
内の,サブディレクトリ MIPS 内に置く
ディレ mips_de2-115 cd my_scan.bin rom8x1024_DE2.mif
そこにあるのを確認して,quartus_sh --flow compile DE2_115_Defaultで論理合成
行う
なお,論理合成には計算機の性能により 5 分から 20 分程度の時間がかかる.論理合成が
完了すると,ディレクトリ mips_de2-115 内に FPGA にダウンロード可能なプロセッサ等
の回路一式のストリーム・アウト・ファイル DE2_115_Default.sof が生成される.
5.4.4 FPGA を用いた回路実現
本実験では,追加設計後のプロッサの実際の動作を観察し動作実験 6-1 で観察した
果との比較を行う.本実験には,論理合成により生成された プロセッサなど回路一式の
トリームアウトファイル DE2_115_Default.sof を使用する.DE2_115_Default.sof
quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させよ.
プロセッサが実行するマシン・コード my_scan.bin はキーボードからの文字列入力を受
けるプログラムである.プロセッサにクロックパルスを次々送りプロセッサ PC=0x0000
67
28: jr 命令のためのジャンプ・レジスタ・セレクト・モジュール
68
29: jr 命令実行時のプロセッサ内の信号の流れ
69
番地からの命令を実行させ,ディスプレイ下部に文字が 2 つ表示されるかどうかを確認せ
よ.ディスプレイ下部に文字が 2 つ表示されるずである.
また,動作実験 6-1 で確認された,動作実験 6-1 2 1, 2 で予想した結果と異なる動
作について,その動作に変化がないかどうかを確認せよ.動作実験 6-1 2 1, 2 で予想
した結果と同じ動作になったはずである.
70
6 シングルサイクル RISC プロセッサの設計「応用編」
4 週目の実験では,素数計算を行 C プログラムと,ステピングモータを制御する C
プログラムを作成し,第 3 週に完成させたプロセッサで実際に動作させる.
6.1 C プログラムの動作実験 7(素数計算)
本実験では,3 以上「キーボード入力された数」以下の素数をディスプレイに次々表示す
る処理を,C プログラムとプロセッサにより行う
実験 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 は,実験 Web ページからダウンロー
ドできる.
71
6.1.1 クロスコンパイル
本実験では,図
30
sosuu.c
を使用する.
クロスコンパイルには,cross_compile.shを使用する.2.2 節に示した環境設定を
たのち,cross_compile.sh sosuu.c」で,sosuu.c MIPS マシン・コードを作成せ
よ.クロスコンパイルによりMIPS マシン・コード sosuu.bin が得られる.
6.1.2 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験ではMIPS マシンコード sosuu.bin を使用する.また変換には変換プログ
bin2v を使用するbin2v sosuu.bin」で,MIPS マシン・コード sosuu.bin からメ
イメージファイルを作成せよ.この変換により論理合成用のメモリ・イメージファイ
rom8x1024_DE2.mif と,機能レベルシミュレーション用の命令メモリ Verilog HDL
rom8x1024_sim.v が得られる.
6.1.3 命令メモリに格納される命令列の確認
本実験では,プロセッサの命令メモリに格納される命令列の確認を行う.この確認には
bin2v Verilog HDL rom8x1024_sim.v
を使用する.
31 rom8x1024_sim.v の一部を示す.図 31 case ブロック内の各行は本実験で設
計するプロセッサにおける,命令メモリの 10-bit アドレスとそこに格納される 32-bit 命令
の機械語の記述である.また,各行の // 以降のコメント部には,その行に記述されている
アドレスと命令に関する説明が記述されているコメント部には,実際の MIPS の命令メモ
リにおけるアドレスと,命令名,命令の意味が記述されている.命令の意味の記述では
ンボル REG[0], REG[1], . . . , REG[31] により,レジスタ 0 番から 31 番,$s0, . . . , $s31
表す.また,シンボル RAM[w] により,データメモリの w 番地を表す
(a) 命令メモリの 0x082 番地の命令は,実験 6-2 で作成したプロセッサでは未実装な命令
であるこれはどのような命令か,参考書 [3](または,参考書 [1]の表紙の次のペー
ジ,緑紙,MIPS リファレンスデータ,丸 3 の表,参考書 [7] p.189,pp.226-227 の表
を参考に,調査せよ0x082 番地の命令についてのみでよいなおfunc=27(10)
func 10 進で 27 を表している.
(b) (a) の命令はC ソース sosuu.c 中の関数 sosuu_check() の処理を行う命令の一つで
ある.具体的に,sosuu_check() のどの記述に対応しているかを予想せよ.
6.1.4 論理合成
本実験では,ロセサなモリの他論理合成を行理合
にはbin2v により生成された論理合成用のメモイメージフイル rom8x1024_DE2.mif
と実験 6-2 で完成させたプロセッサの Verilog HDL 記述一式を使用する.
令メリのモリイメジフ rom8x1024_DE2.mif クト mips_de2-115
にコピーし,ディレクトリ mips_de2-115 cd して,
quartus_sh --flow compile DE2_115_Default」で論理合成を行うなお,論理合成に
は計算機性能によ 5 20 程度の時間がかる.論理合成完了すると,ディ
72
#define EXTIO_SCAN_ASCII (*(volatile unsigned int *)0x0310)
#define EXTIO_SCAN_REQ (*(volatile unsigned int *)0x030c)
#define EXTIO_SCAN_STROKE (*(volatile unsigned int *)0x0308)
#define SCAN_STRORING (unsigned int)0xffffffff
#define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300)
#define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304)
#define TRUE 0x1
#define FALSE 0x0
unsigned int sosuu_check(unsigned int kouho);
unsigned int my_a2i();
void my_i2a();
void my_print();
void my_scan();
main() {
unsigned int i;
unsigned int k;
unsigned int str1[16];
unsigned int str2[16];
<省略>
}
/* unsigned int kouho の素数判定を行う関数 */
/* 素数なら TRUE を返す */
/* 素数でないなら FALSE を返す */
unsigned int sosuu_check(unsigned int kouho) {
unsigned int t, tester, result;
if ((kouho % 2) == 0) {
/* kouho は偶数である == TRUE */
return FALSE;
} else {
result = TRUE;
for (tester = 3; tester < kouho/2; tester += 2) {
/* kouho が本当に素数かどうかをチェック */
if ((kouho % tester) == 0) {
/* kouho tester の倍数である */
result = FALSE;
}
}
return result;
}
}
/* 文字列(数字) srt[] unsigned int に変換する関数 */
/* unsigned int result を返す */
unsigned int my_a2i(str)
unsigned int *str;
{
unsigned int *str_tmp;
unsigned int k;
unsigned int result;
<省略>
}
/* unsigned int i を文字列(数字)に変換して print する関数 */
void my_i2a(unsigned int i) {
unsigned int counter;
unsigned int s[4];
<省略>
}
/* キーボードから入力された文字列を str[] に記憶する関数 */
void my_scan(str)
unsigned int *str;
{
<省略>
}
30: sosuu.c の一部
73
<省略>
10’h00b: data = 32’h03a0f021; // 0040002c: ADDU, REG[30]<=REG[29]+REG[0];   ここが PC=0x002c の命令
<省略>
10’h081: data = 32’h14400002; // 00400204: BNE, PC<=(REG[2] != REG[0])?PC+4+2*4:PC+4;
10’h082: data = 32’h0062001b; // 00400208: R type, unknown. func=27(10)   ここが 命令メモリ 0x082 の命令
10’h083: data = 32’h0007000d; // 0040020c: R type, unknown. func=13(10)
10’h084: data = 32’h00001010; // 00400210: R type, unknown. func=16(10)
10’h085: data = 32’h14400002; // 00400214: BNE, PC<=(REG[2] != REG[0])?PC+4+2*4:PC+4;
<省略>
31: rom8x1024 sim.v の一部
レクトリ mips_de2-115 内に FPGA にダウンロード可能なプロセッサ等の回路一式のスト
リーム・アウト・ファイル DE2_115_Default.sof が生成される.
6.1.5 FPGA を用いた回路実現
本実験では,実 6-2 で作成したプロセッサで sosuu.bin を実行するとどのような動
をするかを観察する.本実験には論理合成により生成されたプロセッサなど回路一式のス
トリーアウトファイル DE2_115_Default.sof を使用するDE2_115_Default.sof
quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させよ.
今回プロセッサが実行するマシン・コード sosuu.bin ,3以上「キーボードから入力さ
れた数」以下の素数を次々とディスプレイに表示するプログラムである.
(a) クロック供給モードを 1000Hz に設定し,ディスプレイ下部に"HELLO\n", "NUM="
表示されたらキーボードから 20\n を入力する\n は改行)3 以上 20 以下の素数
が次々と表示されてほしいが,そうはならないはずである.その結果を観察せよ.
(b) 前項で観察された正しくない動作の原因 6.1.3 (a),(b) にある.この問題を解決
する方法を2つ考えよ.
6.1.6 C プログラムの変更
本実験では,おそらく2つの解決法のうちの1つである,C プログラムの変更を行う
3 から「キーボード入力された数」までの素数をディスプレイに表示する処理が正しく行
えるように,sosuu.c を変更し,実際に動作させて動作を確認せよ.
C プログラムの変更は,次の2点に注意して行う
1. switch 文は使用しない(今のところ,cross_compile.sh, 又は,bin2v, プロセッサ
が対応していない)if 文を使うこと.
2. C プログラムのソースにおいて,main 関数の記述は,他のどの関数の記述よりも先に
書く(今のところ,プロセッサが実行する順番が,記述順に依存している)
74
6.2 C プログラムの動作実験 8(ステッピングモータの制御)
本実験ではキーボードからステッピングモータを制御する処理を,C プログラムとプロ
セッサにより行う
実験 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 は,実験 Web ページからダウンロ
ドできる.
6.2.1 クロスコンパイル
本実験では,図 32 motor.c を使用する.
クロスコンパイルには,cross_compile.shを使用する.2.2 節に示した環境設定を
たのち,cross_compile.sh motor.c」で,motor.c MIPS マシン・コードを作成せ
よ.クロスコンパイルによりMIPS マシン・コード motor.bin が得られる.
6.2.2 MIPS マシン・コードからのメモリ・イメージファイルの作成
本実験では,MIPS マシン・コード motor.bin 使用する.また変換には,変換プログ
ラム bin2v を使用する.bin2v motor.binで,MIPS マシン・コード motor.bin からメ
モリ・イメージファイルを作成せよ.この変換により,論理合成用のメモリ・イメージファ
イル rom8x1024_DE2.mif と,機能レベルシミュレーション用の命令メモリの Verilog HDL
記述 rom8x1024_sim.v が得られる.
75
#define EXTIO_SCAN_ASCII (*(volatile unsigned int *)0x0310)
#define EXTIO_SCAN_REQ (*(volatile unsigned int *)0x030c)
#define EXTIO_SCAN_STROKE (*(volatile unsigned int *)0x0308)
#define SCAN_STRORING (unsigned int)0xffffffff
#define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300)
#define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304)
#define TRUE 0x1
#define FALSE 0x0
#define GPIO0 (*(volatile unsigned int *) 0x0320)
#define COUNTER 5
void my_motor();
void ext_out();
main() {
while(1){
my_motor();
}
}
void my_motor() {
ext_out(8);
ext_out(4);
ext_out(2);
ext_out(1);
}
void ext_out(unsigned int num) {
unsigned int i;
GPIO0 = num;
}
32: motor.c
6.2.3 論理合成
本実験では,ロセサなモリの他論理合成を行理合
にはbin2v により生成された論理合成用のメモリイメージファイル rom8x1024_DE2.mif
と実験 6-2 で完成させたプロセッサの Verilog HDL 記述一式を使用する.
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 が生成される.
6.2.4 FPGA を用いた回路実現
本実験では,実験 6-2 作成したプロセッサで motor.bin を実行するとどのような動作
をするかを観察する.本実験には論理合成により生成されたプロセッサなど回路一式のス
トリームアウトァイ DE2_115_Default.sof を使用する.DE2_115_Default.sof
quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし,動作させよ.
今回プロセッサが実行するマシ・コード motor.bin は,DE2-115 ボードの汎用拡 IO
GPIO0)に,4-bit のモーター制御信号を出力するプログラムである.
本実験では DE2-115 ボード以外に情報工学実験第1(ハードウェア)で使用したステ
ピングモータ駆動回路,ステッピングモータ,直流安定化電源を使用する.
76
(a) DE2-115 ボードの GPIO0 に接続されている 40 ピンケーブルの,ピン番 0,1,2,3 から
(図 33ステピングモータ駆動のデータ入力 0,1,2,3 番にそれぞれ線する.
(b) DE2-115 ボード GPIO0 に接続されている 40 ピンケーブルのピン番号 11GND
ら(図 33)ステッピングモータ駆動回路の GND ピンに配線する.
(c) ステッピングモータ駆動回路とステッピングモータ間を基板上のコメントに従い配線
する.
(d) 直流安定化電源とステッピングモータ間を基板上のコメントに従い配線する.
(e) DE2-115 ボードのクロック供給モードを 1000Hz に設定する.
(f) ステピングモータ DE2-115 ボードからの 1 相励磁方式の制御信号により回転する.
33: ステッピングモータ接続ピン番号
6.2.5 ステッピングモータ制御プログラムの作成
キーードらモター制御るプグラを自に作し,実にその動を確
せよ.
C プログラムの変更は,次の2点に注意して行う
77
1. switch 文は使用しない(今のところ,cross_compile.sh, 又は,bin2v, プロセッサ
が対応していない)if 文を使うこと.
2. C プログラムのソースにおいて,main 関数の記述は,他のどの関数の記述よりも先に
書く(今のところ,プロセッサが実行する順番が,記述順に依存している)
78
6.3 C プログラムの動作実験 9(整数乗算命令 mult の追加)
実験 9 整数乗算命令 multならびにムーブフロLo 命令 mflo のた bin2v の拡
とプロセcpu.v,main ctrl.v,alu ctrler.vの拡を,記の手順でいなさい
実験 9 の手順
1. 整数乗算命 mult ならびにムーブフロLo 命令 mflo のための bin2v
の拡張
2. 整数乗算命令 mult のためのプロセッサの拡張
3. 動作実験
本動作実験で使用する C プログラム mult.c は,実験 Web ページからダウンロー
ドできる.
6.3.1 整数乗算命令 mult ならびにムーブ・フロム・Lo 命令 mflo のための bin2v の拡張
本実験では,整数乗算命令
mult
のための
bin2v
の拡張を行うまた乗算結果が格納され
64-bit レジスタ Hi, Lo の下位 32-bit Lo をレジスタに転送する,ムーブフロムLo 命令
mflo についての拡張も同時に行うbin2v C 記述 bin2v.tar.gz は,実験用 Web サイトから
ダウンロード可能である.
bin2v.tar.gz tar xvfz ./bin2v.tar.gzbin2v bin2v.c Makefile
を得る.
整数乗算命令 mult とムーブ・フロム・Lo mflo 関する拡張を行bin2v.c に図
34 に示すようななコメントを追加する(実験 9 のヒント(1)から(3)
/*
実験 9 ヒン(1)整数乗算命令 mult, ムーブフロムLo 命令 mflo について
コメント追加
‘define R 6’b000000 R 形式 (add, addu, sub, subu, and, or, slt,
jalr, jr, mult, mflo)
*/
/*
実験 9 ヒント(2):整数乗算命令 mult についてのコメント追加
MULT(op = 000000, func = 011000)
MULT {Hi, Lo} <= REG[rs] * REG[rt]; MULT rs,rt
*/
/*
実験 9 ヒント(3):ムーブ・フロム・Lo 命令 mflo についてのコメント追加
MFLO(op = 000000, func = 010010)
MFLO REG[rd] <= Lo; MFLO rd
*/
34: bin2v.c に追加するコメント
追加したコメントを参考に,MFLO 命令の func コードに関する define を追加する(実験
9 のヒント(4)
79
rom8x1024 sim.v 生成用の MULT 命令
(実験 9 のヒント(5)追加したコメントを参考に,rom8x1024 sim.v 生成用 MFLO
命令に関する記述を追加する(実験 9 のヒント(6)
追加したコメントを参考にrom8x1024 DE2.mif 生成用の MULT 命令に関する記述を
更する(実験 9 のヒント(7).追加したコメントを参考に,rom8x1024 DE2.mif 生成用
MFLO 命令に関する記述を追加する(実験 9 のヒント(8)
bin2v.c make し,mult, mflo 命令に対応した bin2v を得る.
6.3.2 整数乗算命令 mult のためのプロセッサの拡張
6-2 Verilog HDL cpu.v, alu.v, main ctrl.v,
alu ctrler.v について追加設計を行う
整数乗算命令 mult ならびにムーフロムLo 命令 mflo に関する拡張を行cpu.v
35 のようなコメントの変更を行う
// 実験 9 のヒント(1)ALU モジュールの実体化に関する記述の変更
//    clock, reset 信号の追加,乗算結果を保持するレジスタ hi lo
// alu
// +----+
// alu_a[31:0]->| |
// alu_b[31:0]->| |->alu_y[31:0]
// alu_ctrl[3:0]->| |->alu_comp[1:0]
// +----+
alu alua(alu_a, alu_b, alu_ctrl, alu_y, alu_comp);
// 実験 9 のヒント(1)ALU モジュールの実体化に関する記述の変更
//    clock, reset 信号の追加,乗算結果を保持するレジスタ hi lo
// alu
// +----+
// clock->| |
// reset->| |
// alu_a[31:0]->| |
// alu_b[31:0]->| |->alu_y[31:0]
// alu_ctrl[3:0]->| |->alu_comp[1:0]
// +----+
alu alua(clock, reset, alu_a, alu_b, alu_ctrl, alu_y, alu_comp);
に変更
35: cpu.v の変更
追加したコメントを参考に, 36 のような alu.v の変更を行う(実験 9 のヒン(2
ら(7)
main ctrl.v に図 37 のようなコメントの追加を行う
alu ctrler.v に,のような追加お変更を行(実 9 のヒ(10)から12
mult, mflo 命令用の ALU コー define (実 9 のヒ(10) mult,
mflo 命令用の ALU 制御コードについてのコメントを追加す(実験 9 のヒント(11)
実行する命令が mult, mflo 命令のときmult, mflo 命令用の ALU 制御コードを生成する処
理を行う記述を追加する(実験 9 のヒント(12)
80
// 実験 9 のヒント(2):コメントの追加 (1)
// mult(multiply)
// mflo(move from Lo)
// 実験 9 のヒント(3):コメントの追加 (2)
// 1011, mult
// 1100, mflo
// 実験 9 のヒント(4)mult, mflo 用の ALU 制御コードの define
‘define ALU_MULT 4’b1011
‘define ALU_MFLO 4’b1100
// 実験 9 のヒント(5)ALU モジュールの入力ポートの拡張
//      clock, reset 追加,乗果をるレ
hi lo
module alu (alu_a, alu_b, alu_ctrl, alu_y, alu_comp); // 入出力ポート
module alu (clock, reset, alu_a, alu_b, alu_ctrl, alu_y, alu_comp); //
出力ポートに変更
// 実験 9 のヒント(6)mult 命令実行時に alu_a * alu_b の結果を {hi, lo}
に格納する記述の追加
input clock, reset; // 入力 クロック, リセット
reg [31:0] hi; //上位
reg [31:0] lo; //下位
always @(posedge clock or negedge reset) begin
if (reset == 1’b0) begin
hi <= 32’h00000000;
lo <= 32’h00000000;
end else begin
{hi, lo} <= (alu_ctrl == ‘ALU_MULT) ? alu_a * alu_b : {hi, lo};
end
end
の追加
// 実験 9 のヒント(7)mflo 命令実行時に {hi, lo} lo result に出力す
る記述の追加
‘ALU_MFLO: begin
result <= lo;
end
36: alu.v  の変更
6.3.3 動作実験
キーボードから入力された数 2 乗を表示するプログラム mult.c を使用して,拡張され
bin2v とプロセッサが正しく動くかどうかを確認せよ.
81
// 実験 9 のヒント(9)mult, mflo 命令に関するコメントの追加
/* R 形式
MULT(op = 000000, func = 011000)
MULT {Hi, Lo} <= REG[rs] * REG[rt]; MULT rs,rt
MFLO(op = 000000, func = 010010)
MFLO REG[rd] <= Lo; MFLO rd
*/
37: main ctrl.v へのコメントの追加
6.4 C プログラムの動作実験 10(符号なし除算命令 divu の追加)
実験 10 符号なし除算命令 divuならびにムーフロムHi 命令 mfhi のための bin2v
の拡張とプロセッサcpu.v,main ctrl.v,alu ctrler.vの拡張を、下記の手順で行い
なさい。
実験 10 の手順
1. 符号なし除算命令 divu ならびにムーブ・フロム・Hi 命令 mfhi のための
bin2v の拡張
2. 符号なし除算命令 divu のためのプロセッサの拡張
3. 実験 7 で使用した素数計算プログラムを使用した動作実験
7 実験レポートについて
各実験について実験の概要,使用機器ならびにソフトウェ,実験の手順,実験の各段
階の説明,動作実験の結果,実験の考察を,文章ならびに図,表を交えてまとめよ.なお,
実験 10 は発展課題なので,実施するかどうかは任意とする(実施してレポートに記載すれ
ば,点数を加点する)
参考文献
[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] パターソ&ヘネシ , 成田光 . コンピータの構成と設計(上巻第5版.
BP , 2014.
82