マシン・コードの動作実験 2-1: ディスプレイへの繰り返し文字出力 1

実験の概要

本実験では、FPGA を搭載した実験基板を使用し、プロセッサを FPGA 上に実現してその動作を確認する。 本動作実験では、 ジャンプ命令(jump:j)が未実装なプロセッサにおいて、その命令を含む簡単な機械語のマシン・コードを実行すると、どのような動作をするかを観察する。 本実験で観察した結果は、次のプロセッサの追加設計 2 において、 j が正しく動くプロセッサを完成させた後、 動作確認の際の比較に用いる。

マシン・コードの動作実験 2-1

ディスプレイに文字 'B' を 繰り返し表示する MIPS マシン・コード print_B_while.bin と、それを実行するプロセッサとして実験 1-2 で完成させたプロセッサを FPGA 上に実現し、その動作を確認せよ。

本動作実験を下記の 1, 2, 3, 4 の手順で行いなさい。
1. MIPS マシン・コードからのメモリ・イメージファイルの作成
2. 命令メモリに格納される命令列の確認
3. 論理合成
4. FPGA を用いた回路実現

なお、本実験で使用する MIPS マシン・コード print_B_while.bin は、下記の URL からダウンロードできる。

MIPS のマシン・コード print_B_while.bin:
http://www.ice.nuie.nagoya-u.ac.jp/jikken/hard/j2hard-mips/k02_j_2_1/print_B_while.bin
(実験 2-1 用の MIPS マシン・コード、バイナリファイル)

1. MIPS マシン・コードからのメモリ・イメージファイルの作成

本実験では、MIPS マシン・コードの例として print_B_while.bin を使用する(ダウンロード )。 また変換には、変換プログラム bin2v を使用する。指導書2.2.1 節に示した環境設定を行ったのち、図 1 のようにして、MIPS マシン・コード print_B_while.bin からメモリ・イメージファイルを作成せよ。
bin2v print_B_while.bin
図 1: bin2v を使った MIPS マシン・コードのメモリ・イメージファイルへの変換

この変換により、論理合成用のメモリ・イメージファイル rom8x1024_DE2.mif と、機能レベルシミュレーション用の命令メモリの Verilog HDL 記述 rom8x1024_sim.v が得られる。

なお、本実験で使用する MIPS マシン・コード print_B_while.bin は、正しいプロセッサ(ジャンプ命令 j が実装済みのプロセッサ)で動作させると、以下のような動作をする命令列を含んだバイナリ・ファイルである。
  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

2. 命令メモリに格納される命令列の確認

本実験では、プロセッサの命令メモリに格納される命令列の確認を行う。この確認には、bin2v により生成された機能レベルシミュレーション用の Verilog HDL 記述 rom8x1024_sim.v を使用する。

図 2 に rom8x1024_sim.v の一部を示す。図 2 の 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'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
<省略>
図 2: rom8x1024_sim.v の一部

図 2 の case ブロック内の最後の記述は、本実験で設計するプロセッサの命令メモリの 0x013 番地に機械語 0x0810000b が格納されることを表している。 また、この命令は実際の MIPS では 0x0040004c に格納され、命令名は j、PC に 0x040002c をセットする命令であることを表している。

print_B_while.bin から生成された rom8x1024_sim.v, または、図 2 の Verilog HDL 記述を解析し、以下の 1 について答えよ。 なお、j はジャンプ命令である。
  1. プロセッサが PC=0x004c の命令を実行した直後の PC の値と、それが指す命令メモリの番地を予想せよ。

3. 論理合成

本実験では、j 命令が未実装なプロセッサならびに命令メモリ、その他周辺回路の論理合成を行う。 論理合成には、bin2v により生成された論理合成用のメモリ・イメージファイル rom8x1024_DE2.mif と実験 1-2 で完成させたプロセッサの Verilog HDL 記述一式を使用する。

命令メモリのメモリ・イメージファイル rom8x1024_DE2.mif をディレクトリ mips_de2-115 にコピーし、ディレクトリ mips_de2-115 に cd して、図 3 のように論理合成を行う。

quartus_sh --flow compile DE2_115_Default
図 3: quartus_sh を使ったプロセッサの論理合成

なお、論理合成には計算機の性能により 5 分から 20 分程度の時間がかかる。 論理合成が完了すると、ディレクトリ mips_de2-115 内に FPGA にダウンロード可能なプロセッサ等の回路一式のストリーム・アウト・ファイル DE2_115_Default.sof が生成される。

4. FPGA を用いた回路実現

本実験では、j 命令が未実装なプロセッサの実際の動作を観察する。 観察した結果は、次のプロセッサの追加設計 2 において、j が正しく動くプロセッサを完成させた後、動作確認の際の比較に用いる。 本実験には、論理合成により生成されたプロセッサなど回路一式のストリーム・アウト・ファイル DE2_115_Default.sof を使用する。 DE2_115_Default.sof を quartus_pgm を用いて DE2-115 ボード上の FPGA にダウンロードし、動作させよ。

今回プロセッサが実行するマシン・コード print_B_while.bin はディスプレイ下部に文字 'B' を繰り返し表示するプログラムである。 key3 を連打してプロセッサにクロックパルスを送り、プロセッサにPC=0x0000 番地から 25 個程度の命令を実行させ、ディスプレイ下部に文字 'B' が繰り返し表示されるかどうかを確認せよ。 ディスプレイ下部に文字は 1 つしか表示されないはずである。

ディスプレイ上部にはプロセッサ内部の主な信号線の現在の値が表示されている。 各信号線は、プロセッサのブロック図中の名前の似た信号線と、それぞれ対応している。 ブロック図中の線の幅はビット幅と対応しており、一番細い線は 1-bit の線、一番太い線は 32-bit の配線を表している。 また、ブロック図左下の ROM が、命令メモリである。 プロセッサはここから命令を読み、命令毎に決められた処理を行う。 ブロック図右下の RAM は、データメモリである。 2 の命令メモリに格納される命令列の確認の、1 で予想した結果と同じ正しい動作かどうかを確認せよ。 予想と異なる正しくない動作のはずである。

プロセッサが、j 命令を正しく実行できていないことが分かる。 これらの命令を正しく実行するために、プロセッサ内部で行われるデータ転送や演算などを制御しているメイン制御回路を、これらの命令を適切に処理できるものにする必要がある。

参考書


中村一博