Spartan6でmicroblaze mcs を動かす②SDK編

[Spartan6でmicroblaze mcs を動かす①ISE編](https://qiita.com/cyebu1103/items/be327836084940eed003)のつづき

#SDKプロジェクトの生成
`File`⇒`New`⇒`Application Project`を選択
![sdk1.jpg](https://qiita-image-store.s3.amazonaws.com/0/204268/30808598-a4f6-5e21-6988-57055fdaa061.jpeg)

`Project Name`⇒好きな名前でOK
`Target Hardware`で "Creare New"を選択（New Hardware Projectに移行し、ハードウェア情報を生成します）
![sdk2.jpg](https://qiita-image-store.s3.amazonaws.com/0/204268/f6bfa53d-a867-d6c3-3a16-207cfaa89b76.jpeg)

`Project name`⇒好きな名前でOK
BrowseからCPU情報をもつXMLファイルを選択する。
（CORE generaterでCPUを生成した際のワークディレクトリにあるXMLファイルを選択します）
![sdk3.jpg](https://qiita-image-store.s3.amazonaws.com/0/204268/9bacfe50-485d-2234-27db-70ceebc98cfc.jpeg)


プログラムのテンプレートを選択します。
なにを選んでもOKですが、今回は"Hello world"をひな形にします。
![sdk4.jpg](https://qiita-image-store.s3.amazonaws.com/0/204268/57adb99a-f96c-2f4d-6e2d-3ddf81be7679.jpeg)

# BMMファイルの編集
ハードウェアプロジェクトのディレクトリ（今回の例ではmcs_infoというディレクトリ）に`system_bd.bmm`というファイルがデフォルトで生成されています。

このBMMファイルは、Cのプログラムで使うメモリ領域と　FPGA内部メモリ（BRAM）との関係示しています。
自動生成されたままだと、BRAMのロケーション（具体的な場所）が示されていないため、プログラムをアップロードする際にエラーになりますので、手動で編集します。

エラーになる原因は、FPGAの回路データ（bitファイル）にCで書いたプログラムの実行ファイル（elfファイル)を入れ込む処理（data2mem.exeが実行されるとき）をする際に、”elfファイルを張り付ける先のメモリの場所が分からないよ”的なエラーで怒られます。

編集後のBMMファイルを下記に示します。
編集した箇所は各行の　`LOC=X*Y*;` の部分です。XYの数字はISEで合成する際に使用したUCFファイルの数値と合っていればOKです。


```system_bd.bmm
ADDRESS_MAP CPU MICROBLAZE-LE 100
  ADDRESS_SPACE lmb_bram COMBINED [0x00000000:0x0000ffff]
    ADDRESS_RANGE RAMB16
      BUS_BLOCK
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[0].RAMB16_S1_1  [31:31] INPUT = CPU.lmb_bram_0.mem   LOC=X0Y30;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[1].RAMB16_S1_1  [30:30] INPUT = CPU.lmb_bram_1.mem   LOC=X1Y30;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[2].RAMB16_S1_1  [29:29] INPUT = CPU.lmb_bram_2.mem   LOC=X2Y30;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[3].RAMB16_S1_1  [28:28] INPUT = CPU.lmb_bram_3.mem   LOC=X3Y30;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[4].RAMB16_S1_1  [27:27] INPUT = CPU.lmb_bram_4.mem   LOC=X0Y28;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[5].RAMB16_S1_1  [26:26] INPUT = CPU.lmb_bram_5.mem   LOC=X1Y28;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[6].RAMB16_S1_1  [25:25] INPUT = CPU.lmb_bram_6.mem   LOC=X2Y28;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[7].RAMB16_S1_1  [24:24] INPUT = CPU.lmb_bram_7.mem   LOC=X3Y28;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[8].RAMB16_S1_1  [23:23] INPUT = CPU.lmb_bram_8.mem   LOC=X0Y26;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[9].RAMB16_S1_1  [22:22] INPUT = CPU.lmb_bram_9.mem   LOC=X1Y26;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[10].RAMB16_S1_1 [21:21] INPUT = CPU.lmb_bram_10.mem  LOC=X2Y26;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[11].RAMB16_S1_1 [20:20] INPUT = CPU.lmb_bram_11.mem  LOC=X3Y26;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[12].RAMB16_S1_1 [19:19] INPUT = CPU.lmb_bram_12.mem  LOC=X0Y24;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[13].RAMB16_S1_1 [18:18] INPUT = CPU.lmb_bram_13.mem  LOC=X1Y24;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[14].RAMB16_S1_1 [17:17] INPUT = CPU.lmb_bram_14.mem  LOC=X2Y24;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[15].RAMB16_S1_1 [16:16] INPUT = CPU.lmb_bram_15.mem  LOC=X3Y24;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[16].RAMB16_S1_1 [15:15] INPUT = CPU.lmb_bram_16.mem  LOC=X0Y22;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[17].RAMB16_S1_1 [14:14] INPUT = CPU.lmb_bram_17.mem  LOC=X1Y22;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[18].RAMB16_S1_1 [13:13] INPUT = CPU.lmb_bram_18.mem  LOC=X2Y22;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[19].RAMB16_S1_1 [12:12] INPUT = CPU.lmb_bram_19.mem  LOC=X3Y22;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[20].RAMB16_S1_1 [11:11] INPUT = CPU.lmb_bram_20.mem  LOC=X0Y20;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[21].RAMB16_S1_1 [10:10] INPUT = CPU.lmb_bram_21.mem  LOC=X1Y20;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[22].RAMB16_S1_1 [9:9]   INPUT = CPU.lmb_bram_22.mem  LOC=X2Y20;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[23].RAMB16_S1_1 [8:8]   INPUT = CPU.lmb_bram_23.mem  LOC=X3Y20;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[24].RAMB16_S1_1 [7:7]   INPUT = CPU.lmb_bram_24.mem  LOC=X0Y18;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[25].RAMB16_S1_1 [6:6]   INPUT = CPU.lmb_bram_25.mem  LOC=X1Y18;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[26].RAMB16_S1_1 [5:5]   INPUT = CPU.lmb_bram_26.mem  LOC=X2Y18;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[27].RAMB16_S1_1 [4:4]   INPUT = CPU.lmb_bram_27.mem  LOC=X3Y18;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[28].RAMB16_S1_1 [3:3]   INPUT = CPU.lmb_bram_28.mem  LOC=X0Y16;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[29].RAMB16_S1_1 [2:2]   INPUT = CPU.lmb_bram_29.mem  LOC=X1Y16;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[30].RAMB16_S1_1 [1:1]   INPUT = CPU.lmb_bram_30.mem  LOC=X2Y16;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S1.The_BRAMs[31].RAMB16_S1_1 [0:0]   INPUT = CPU.lmb_bram_31.mem  LOC=X3Y16;
      END_BUS_BLOCK;
    END_ADDRESS_RANGE;
  END_ADDRESS_SPACE;
END_ADDRESS_MAP;
```

ここまででSDKの下準備が完了です。