| | 1 | トップ:http://galaxy.u-aizu.ac.jp/note/wiki/CAEX2016 |
| | 2 | |
| | 3 | = 状態遷移図の理解 = |
| | 4 | 制御部を設計するためには、このマルチサイクルプロセッサの状態遷移を理解する必要があります。 |
| | 5 | 状態遷移図は、このファイル dp_ctl.pdf の2ページ目にあります。 |
| | 6 | 講義ノート http://web-int.u-aizu.ac.jp/~miyazaki/comparch-15/lecture/comparch-9-multicycle.pdf も参照してください。 |
| | 7 | なお、ここで設計する状態遷移図は、講義ノートのものにイミディエイト命令が追加されていて、 |
| | 8 | 全部の状態数は13個(0から12)になります。 |
| | 9 | アセンブラプログラム演習で用いたJALとJR命令は後の演習で追加するので、今は扱いません。 |
| | 10 | |
| | 11 | この状態遷移図は、各状態の○の中に記述された信号が変化することを示します。 |
| | 12 | 例えば状態0の命令フェッチでは、!MemRead信号(1bit)が"1'b1"になり(アサート)、ALUSrcA(1bit)は"1'b0"になります(ネゲート)。 |
| | 13 | 他の信号の意味も同様です。全ての信号の幅と意味については、上記講義ノートの11ページを参考にしてください。 |
| | 14 | |
| | 15 | == 命令実行時のデータパスの変化 == |
| | 16 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2014/ori.png)]] |
| | 17 | |
| | 18 | この図で赤いで示された数字は、ORI命令を実行した時に、どのデータパスが利用されるかを示します。 |
| | 19 | ORI命令では、状態は0→1→12→11→0と遷移します。 |
| | 20 | |
| | 21 | 例えば、状態1(命令デコード)の時には、ALUSrcAとALUSrcBとALUOpが変化します。 |
| | 22 | 講義ノートの14ページにあるように、この時におこなわれる操作は、 |
| | 23 | レジスタファイルからレジスタA/Bへのデータ読み出しと、分岐アドレスの計算です。 |
| | 24 | よって、赤い数字1のついたデータパスが利用されます。 |
| | 25 | |
| | 26 | ただし、実行されるが使用されないパス(例えば状態0において、メモリからMemory Data registerへのデータ転送) |
| | 27 | および制御部からの信号には番号をつけていません。 |
| | 28 | ALUの入力は多くの状態で使用されるので番号を省略しています。 |
| | 29 | ただし、状態1においてPCからマルチプレクサ、ALUを経由してALUOutおよび命令レジスタから符号拡張、2bitシフト、 |
| | 30 | ALUを経由してALUOutまでのパスには1をつけています。 |
| | 31 | |
| | 32 | = 制御部の設計(1) = |
| | 33 | 制御部モジュールのテンプレートは以下のようになります。 |
| | 34 | |
| | 35 | {{{ |
| | 36 | module ControlUnit(PCWriteCond, PCWrite, IorD, MemRead, MemWrite, MemtoReg, |
| | 37 | IRWrite, PCSource, ALUOp, ALUSrcB, ALUSrcA, |
| | 38 | RegWrite, RegDST, Op, CK, CLR); |
| | 39 | |
| | 40 | // clock |
| | 41 | input CK; |
| | 42 | input CLR; |
| | 43 | |
| | 44 | // opcode (6 bit) |
| | 45 | input [5:0] Op; |
| | 46 | |
| | 47 | // 1 bit control signal |
| | 48 | output PCWriteCond; |
| | 49 | output PCWrite; |
| | 50 | output IorD; |
| | 51 | output MemRead; |
| | 52 | output MemWrite; |
| | 53 | output MemtoReg; |
| | 54 | output IRWrite; |
| | 55 | output RegWrite; |
| | 56 | output RegDST; |
| | 57 | output ALUSrcA; |
| | 58 | |
| | 59 | // 2 bit control signal |
| | 60 | output [1:0] PCSource; |
| | 61 | output [1:0] ALUOp; |
| | 62 | output [2:0] ALUSrcB; |
| | 63 | |
| | 64 | // register declaration |
| | 65 | reg PCWriteCond; |
| | 66 | reg PCWrite; |
| | 67 | reg IorD; |
| | 68 | reg MemRead; |
| | 69 | reg MemWrite; |
| | 70 | reg MemtoReg; |
| | 71 | reg IRWrite; |
| | 72 | reg [1:0] PCSource; |
| | 73 | reg [1:0] ALUOp; |
| | 74 | reg [2:0] ALUSrcB; |
| | 75 | reg ALUSrcA; |
| | 76 | reg RegWrite; |
| | 77 | reg RegDST; |
| | 78 | |
| | 79 | // state register |
| | 80 | reg [3:0] state; |
| | 81 | |
| | 82 | |
| | 83 | endmodule // ControlUnit |
| | 84 | }}} |
| | 85 | |
| | 86 | 入力信号はOpとCK(クロック信号)とCLR(リセット信号)で、その他は出力になります。 |
| | 87 | Op信号はMIPS命令コードの25-31ビットの部分です。各命令コードごとのOp信号を以下のテーブルに示します。 |
| | 88 | |
| | 89 | == 命令コード == |
| | 90 | || 命令の種類 || opcode(10進数) || |
| | 91 | || R形式 || 0 || |
| | 92 | || Load Word || 35 || |
| | 93 | || Store Word || 43 || |
| | 94 | || Branch on EQ|| 4 || |
| | 95 | || ADD imm || 8 || |
| | 96 | || SLT imm || 10 || |
| | 97 | || AND imm || 12 || |
| | 98 | || ORI imm || 13 || |
| | 99 | |
| | 100 | 注意:R形式命令では、命令コードの0-5ビットの部分で演算の種類を指定します。 |
| | 101 | |
| | 102 | == 例題 == |
| | 103 | 状態遷移図から、R形式命令の実行には4サイクル必要になります。 |
| | 104 | このことを、以下のファイルを使ってシミュレーションを行い確かめなさい。 |
| | 105 | |
| | 106 | 状態遷移のみの制御回路 http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex07%E8%AA%B2%E9%A1%8C2015/ControlUnit_1.v |
| | 107 | |
| | 108 | テストベンチファイル http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex07%E8%AA%B2%E9%A1%8C2015/CUbench_1.v |
| | 109 | |
| | 110 | === 実行例 === |
| | 111 | それぞれのファイルをダウンロードまたは保存して、以下のコマンドを実行。 |
| | 112 | {{{ |
| | 113 | ncverilog CUbench_1.v |
| | 114 | }}} |
| | 115 | |
| | 116 | この状態遷移の回路では、always文の部分はCLKが上向きに変化する時に状態が遷移します。 |
| | 117 | また、CLR信号が真になったら状態0になります(リセット)。 |
| | 118 | そのため状態遷移を行う時にはCLR信号を適切に変化させる必要があります。 |
| | 119 | |
| | 120 | === 実行波形 === |
| | 121 | [[Image(http://galaxy.u-aizu.ac.jp/comparch2014/image/CUbench1.png, 800)]] |
| | 122 | |
| | 123 | == 課題3 == |
| | 124 | LW命令とADDI命令の場合に、例題を参考にテストベンチファイルを作成して、 |
| | 125 | シミュレーションを行い、実行波形を確認してください。 |
| | 126 | それぞれの場合、実行までに何サイクル必要かを考えること。 |