« Artix-7ボードが出荷可能になりました | トップページ | EZ-USB FX3でEndPointを追加する »

2013.07.13

Artix-7にMicroBlazeを入れてみた

特電Artix-7ボードに、MicroBlazeを入れてみました。

ISEからNew SouceでEmbedded Processorを追加し、XPSを起動します。

100MHz動作、50MHzクロック入力、内蔵RAMは32kBにしておきます。パフォーマンスは変更しなくても大丈夫でしょう。

XPSが起動したデフォルトの状態では、DDR3はMT41J128M8になっているので、まずはそれを追加しておいて、あとからMT41J256M8に直します。

それからGPIOやUARTなども追加しておきます。GPIOやUARTの線はExternalにして、ISEの中のロジックから使えるようにします。

Clockのモジュールをそのまま作ってしまうと、差動クロック入力になってしまうので、クロックのPortを一度削除して、External Port:clock_generator_0_CLKIN_pinを追加するようにしたらシングルエンドのクロックを

Art7xps

次にISEに戻ってきたら、メインのHDLを書きます。

XPSが作る信号線の名前は冗長なので、適当に切り上げた信号線を自分で作ってFPGAの外に出すようにします。

Art7mbise

ちなみに、論理合成が成功した状態で、occupied Slicesは22%でした。XC7A100Tの約5分の1しか使っていません。

次にXPSからデザインをExportし、SDKを起動します。

ハードウェア記述とBSPを作ったら、テストアプリを作ります。ここではXILINXの用意しているメモリテストをひな形にしました。

Art7sdk

XILINXのメモリテストは、実はメモリ全域をテストしてくれません。先頭の4096バイトとかです。

実際に全域をテストすると10分くらいかかります。ソフトウェアは、FPGAのハードウェアの100~1000分の1の速度でしか動かないといえます。

そのため、自分でテストルーチンを作りました。最初に先頭1MBにXOR128の乱数を詰めて読み書きし、次にメモリ256MB全体を1024バイト単位でアドレスをインクリメントしながら粗く乱数を読み書きするテストを行いました。これなら数秒で終わります。

実行結果をLEDではなく文字として読みたいので、Artix-7ボードからUARTの配線を引き出します。特電の基板は裏にFPGAのピン番号が書いてあるので、回路図を見なくてもどのピンにつながっているかがわかって便利です。

Art7uart_1

そしてRS232Cレベル変換基板と、Platform USBケーブルをつなぎます。

Art7uart_2_3

Platform USBを使うのはSDK上でプログラムをデバッグしたりしたいためです。

実行中の画面はこんな感じ。TeraTermに結果を表示しています。

Art7memtest

◆追記

さて、作ったELFファイルを毎回毎回SDKからダウンロードするのは面倒です。できればBitファイルの中に埋め込みたいものです。

そういうとき、data2memというツールを使います。data2memは、出来上がったBitStreamの中のBlockRAMにデータを埋め込んでくれるツールです。XILINXのISEをインストールしていれば、デフォルトでインストールされていて、パスは通っているはずです。

ですから、コマンドラインから、

data2mem -bm BMMファイル名 -bd ELFファイル名 -bt BITファイル名

のようにすれば使えます。

Art7data2mem


ここで、BMMファイルというのは、出来上がったデザインの中でどのBRAMに何のデータが書かれているかを記述したファイルです。BitStreamができているフォルダに自動的に作られているはずです。2つある場合は、ファイル名の最後に_bdが付いている方を選びましょう。_bdのほうはBRAMのロケーションまで指定されています。

こんな感じのファイルです。

// BMM LOC annotation file.
//
// Release 14.5 -  P.58f, build 3.0.7 Mar 3, 2013
// Copyright (c) 1995-2013 Xilinx, Inc.  All rights reserved.
///////////////////////////////////////////////////////////////////////////////
//
// Processor 'microblaze_0', ID 100, memory map.
//
///////////////////////////////////////////////////////////////////////////////
ADDRESS_MAP microblaze_0 MICROBLAZE-LE 100
    ///////////////////////////////////////////////////////////////////////////////
    //
    // Processor 'microblaze_0' address space 'microblaze_0_bram_block_combined' 0x00000000:0x00007FFF (32 KBytes).
    //
    ///////////////////////////////////////////////////////////////////////////////

    ADDRESS_SPACE microblaze_0_bram_block_combined RAMB32 [0x00000000:0x00007FFF]
        BUS_BLOCK
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_0 RAMB32 [31:28] [0:8191] INPUT = microblaze_0_bram_block_combined_0.mem PLACED = X2Y12;
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_1 RAMB32 [27:24] [0:8191] INPUT = microblaze_0_bram_block_combined_1.mem PLACED = X2Y13;
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_2 RAMB32 [23:20] [0:8191] INPUT = microblaze_0_bram_block_combined_2.mem PLACED = X2Y19;
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_3 RAMB32 [19:16] [0:8191] INPUT = microblaze_0_bram_block_combined_3.mem PLACED = X2Y14;
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_4 RAMB32 [15:12] [0:8191] INPUT = microblaze_0_bram_block_combined_4.mem PLACED = X1Y14;
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_5 RAMB32 [11:8] [0:8191] INPUT = microblaze_0_bram_block_combined_5.mem PLACED = X2Y18;
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_6 RAMB32 [7:4] [0:8191] INPUT = microblaze_0_bram_block_combined_6.mem PLACED = X1Y15;
            mb_i/microblaze_0_bram_block/microblaze_0_bram_block/ramb36e1_7 RAMB32 [3:0] [0:8191] INPUT = microblaze_0_bram_block_combined_7.mem PLACED = X1Y16;
        END_BUS_BLOCK;
    END_ADDRESS_SPACE;
END_ADDRESS_MAP;

ELFファイルは、SDKが生成したDebugフォルダにあるはずです。

これでbitファイルにELFが埋め込まれます。出来上がったbitファイルは、元のファイル名_rp.bitになります。

このmain_rp.bitファイルなら、MITOUJTAGから書き込めます。

Artixmbjtag

100MHzで動くカスタマイズ可能なCPUがArtix-7内に簡単に作れて、しかも、何も苦労しなくてもprintfまで使えるというのは素晴らしいことです。

MicroBlazeはソフト開発環境が非常によく作りこまれていて、fatfsやlwipのライブラリまでXILINXが提供してくれているようなので、いずれ、それらも試してみたいと思います。

|

« Artix-7ボードが出荷可能になりました | トップページ | EZ-USB FX3でEndPointを追加する »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Artix-7ボードが出荷可能になりました | トップページ | EZ-USB FX3でEndPointを追加する »