| 44 | | |
| 45 | | = 補足1: xc4000のライブラリを利用して出力がzになる場合の対処 = |
| 46 | | Run Directoryを作り直してください。そのためには、シミュレータのウィンドウに表示されているRun Directoryの末尾を、run1, run2などの存在しないものに変更し、Initialize Designボタンを2度押してください。その後出てくるダイアログには"No"を選んでください。 |
| 47 | | |
| 48 | | = 補足2: レジスタファイルについて補足 = |
| 49 | | MIPSプロセッサにおいて、プログラマから見える汎用レジスタには $0 から $31 までの32個があります。 |
| 50 | | このうち $0 は値が常にゼロである仮想的なレジスタなので、実際のハードウェアでは31個のレジスタからなるレジスタファイルが使われます。 |
| 51 | | 各レジスタの入出力データのビット幅は32ビットです。 |
| 52 | | |
| 53 | | レジスタファイルに対する書き込み口や読み出し口のことをポートと呼びます。 |
| 54 | | 今回利用するレジスタファイルは2つの読み出しポートと1つの書き込みポートを備えています。 |
| 55 | | このことは、2つの異なるレジスタの読み出しと、さらに異なる1つのレジスタへの書き込みを、 |
| 56 | | 1つのクロックサイクルの中で同時に行えるということを意味します。 |
| 57 | | |
| 58 | | [[Image(http://web-int.u-aizu.ac.jp/course/comparch/kadai2_1.gif)]] |
| 59 | | |
| 60 | | === 入出力信号の説明 === |
| 61 | | * ReadReg1 と ReadData1 は1つ目の読み出しポートのための信号です。ReadReg1 にレジスタ番号を (0~31) を入力すると該当するレジスタの値が ReadData1 から出力されます(レジスタ番号が 0 のときは常に 0 が出力される)。 |
| 62 | | * ReadReg2 と ReadData2 は2つ目の読み出しポートのための信号です。動作は1つ目の読み出しポートと同じです。 |
| 63 | | * !WriteData、!WriteEn、および!WriteRegは書き込みポートを構成します。WriteRegにレジスタ番号を入力し、WriteDataには書き込むデータをセットして、!WriteEn を 1 にすると、次のクロックの立ち上がりでデータが該当レジスタに書き込まれます。!WriteEN が 0 のときは、クロックの立ち上がりがあってもデータは書き込まれません。また、レジスタ番号が 0 のときは、レジスタへの書き込みは行われません。 |
| 64 | | * CK はクロック信号、CLR はクリア信号です。 CLR が 1 になると全てのレジスタが 0 に初期化されます。 |
| 65 | | |
| 66 | | = レジスタの利用のためのテストベンチ例 = |
| 67 | | 以下のテストベンチは、$a0レジスタに"0xffffffff"を書き込んでいる。(そのまま使うことはできない) |
| 68 | | {{{ |
| 69 | | `timescale 1ns/1ps |
| 70 | | `include "Registers.v" |
| 71 | | |
| 72 | | module RegTest; |
| 73 | | reg [4:0] readreg1, readreg2, writereg; |
| 74 | | reg [31:0] writedata; |
| 75 | | reg writeen; |
| 76 | | reg ck,clr; |
| 77 | | wire [31:0] readdata1, readdata2; |
| 78 | | |
| 79 | | initial |
| 80 | | begin |
| 81 | | #0 |
| 82 | | ck = 1'b1; |
| 83 | | clr = 1'b1; |
| 84 | | |
| 85 | | #110 |
| 86 | | clr = 1'b0; |
| 87 | | |
| 88 | | #190 |
| 89 | | readreg1 = 5'b00100; |
| 90 | | |
| 91 | | #100 |
| 92 | | writeen = 1'b1; |
| 93 | | writereg = 5'b00100; |
| 94 | | writedata = 32'hffffffff; |
| 95 | | |
| 96 | | #100 |
| 97 | | writeen = 1'b0; |
| 98 | | |
| 99 | | #900 |
| 100 | | |
| 101 | | $finish; |
| 102 | | end // initial begin |
| 103 | | |
| 104 | | always #50 ck = ~ck; |
| 105 | | endmodule |
| 106 | | }}} |
| 107 | | |
| 108 | | |