Spartan6でmicroblaze mcs を動かす①ISE編のつづき
#SDKプロジェクトの生成
File
⇒New
⇒Application Project
を選択
Project Name
⇒好きな名前でOK
Target Hardware
で "Creare New"を選択(New Hardware Projectに移行し、ハードウェア情報を生成します)
Project name
⇒好きな名前でOK
BrowseからCPU情報をもつXMLファイルを選択する。
(CORE generaterでCPUを生成した際のワークディレクトリにあるXMLファイルを選択します)
プログラムのテンプレートを選択します。
なにを選んでもOKですが、今回は"Hello world"をひな形にします。
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です。
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の下準備が完了です。