Papilioの本
FPGA版Arduino!!Papilioで作るディジタル・ガジェット CQ出版 発売中

セミナ開催します。
"実習・MAX10 NiosIIプロセッサ活用超入門”
2017年8月23日(水)、CQ出版社セミナルーム
DE10-Liteを使ってMAX10上でNisoIIを動かします.
詳しくはこちらへ


番外編 FPGAでCPU( MicroBlaze MCS )を動かしてみる

 FPGA上でCPU(MicroBlaze MCS)をLX9マイクロボード( LX9 MicroBord )へ実装して、LED制御するまでの手順を紹介します。
MicroBlaze MCSはザイリンクス社の用意したFPGA上で動作するCPUです。ISE WebPackから無償で利用できます。
短時間でシリアル通信やGPIO等を持つ回路が作成できますので、回路評価中に専用テスト冶具が欲しい時などに重宝します。
MicroBlaze MCSの詳細についてはxilinx社のサイトを見てください。
FPGAツールはPlanAheadを使用して、PlanAheadの操作手順も紹介してあります。



目次

準備する物
1.FPGA開発プロジェクト作成(PlanAhead)
 1-1.新規プロジェクトの作成
 1-2.プロジェク名前とファルダ名の指定
 1-3.プロジェクタイプの指定
 1-4.ソースファイル、IP、Constraintsの指定
 1-5.デバイスの指定
2.MicrpBlaze MCSの組み込み(PanAhead/CORE Generator)
 2-1.CORE GeneratorからMicrpBlaze MCSの選択
 2-2.MicroBlaze MCSの設定
 2-3.トップモジュールの記述
 2-4.論理合成の実行
 2-5.ピン配置指定
 2-6.配置配線のオプション設定[追記]
 2-7.配置配線の実行
 2-8.ビットストリームファイルの作成
3.ソフトウェアの作成・実行(Xilinx Software Development Kit)
 3-1.SDK起動、ワークスペースの設定
 3-2.ハードウェアプロジェクト設定
 3-3.ソフトウェアプロジェクト設定
 3-4.ハードウェアの起動(PlanAhead/iMPACT)
 3-5.シリアル通信用ターミナルソフトの起動(TeraTerm)
 3-6.FPGA用ソフトウェアの転送・起動(Xilinx Software Development Kit)
 3-7.LED点灯用プログラム
 3-8.SPIフラッシュ用のMCSファイルの作成[追記]
 3-9.コンフィグレーション用SPIラッシュへの書込み[追記] 


準備する物
  FPGAボード:LX9 マイクロボード
          他のFPGAボードでもXilinx社のFPGAが搭載されていれば利用可能です。
          秋月電子からも入手可能

  FPGA開発ソフト:ISE WebPack/PlanAhead、今回はバージョン14.2を使用

  ソフト開発環境:Xilinx Software Development Kit、ISE WebPackのインストールで一緒にインストールされます

  シリアル通信用ターミナルソフト:TeraTerm

1.FPGA開発プロジェクト作成(PanAhead)
  今回はPlanAheadを使った作成手順を紹介します。PlanAheadを使わずにProject Navigatoでも作業可能です。
 設定値等は同じなので、この資料を参考にしてProject Navigatorを使ってみてください。

 1-1新規プロジェクトの作成.
 Create a New Projectを選択
 
  
 Nextをクリック 
 
 
 1-2.プロジェク名前とファルダ名の指定
 PlanAhedで使うプロジェクトのプロジェク名前とファルダ名を入れます。
 

 1-3.プロジェクタイプの指定
  RTL Projectを選択
 

 1-4.ソースファイル、IP、Constraintsの指定
 ソースファイル、IP、Constraintsソースファイルが既にある場合は指定できます。
 今回は、まだソースがないので何も指定しないで”Next”をクリック
 

    

 
 
 1-5.デバイスの指定
 使用するFPGAボードに合わせます。
 LX9マイクロボードは以下の設定になります。
 

 1-6.プロジェクト設定の完了
  Finishをクリックするとプロジェクト設定完了、PlanAheadが起動します。
 


2.MicrpBlaze MCSの組み込み(PanAhead/CORE Generator)
 2-1.CORE GeneratorからMicroBlaze MCSの選択
 起動したPlanAheadのFlowNaviigatorでIP CatalogをクリックするとIP Catalogが起動します。IP Catalogで生成したいIPを選択しダブルクリックすると
 CORE Generatorが起動します。MicrpBlaze MCSはEmbeddedの下のProcessorにあります。
 
 
 2-2.MicroBlaze MCSの設定
 Conponent Nameは任意の名前
 Instanse Hierarchical Nameは任意、今回はデフォルトのまま、この名前が上位階層でインスタンスする時のインスタンス名になります[追記]
 InputCLkFrequencyはLX9マイクロボードに合わせて100MHz
 Memory Sizeは32KB
 Enable Debug Supportにチェックを入れる。デバッカを使えるように構成されます。
 

 UARTの設定
 

 FITとPITは今回は設定しないで、GPIO出力を設定します。
 LEDの数に合わせて4に設定
 

 GPIO入力設定
 DIPスイッチの数に合わせて4に設定
 設定後にGenerateでユザープロジェクトに追加
 
 
 PlanAheadのSourceのIP Sourceに登録される。
 

 2-3.トップモジュールの記述
 FPGAのトップ階層になるモジュールを記述します。
 SourceのDesignSourceの上にカーソルを合わせてマウス右ボタンを押してAdd Source選択
 

 Add or Create Design Sourcesにチェックを入れNextをクリック
 

 CreateFileをクリックして新規ソースを作成します
 

 トップモジュールにするソースファイル名の指定してOKをクリック
 

 Finishをクリックする
 

 入出力信号を聞かれるますが、後でソースコードに直接書込むので、何も設定せずにOKをクリック
 

 SourceのHierarchyに作成したファイルが登録される。ソースの上にカーソールの合わせマウス右ボタンを押してOpenFileを
 選ぶとエディタが起動する
 

 エディタでトップモジュールのソースコードを記述する。
 入出力端子はMicroBlaze MCSの信号をそのまま外部に接続してあります。
 インスタンス例は”プロジェクト名\プロジェクト名.srcs\sources_1\ip\IP名\IP名.veo"に作られるので参考してください。 
 だだし、インスタンス名をMicroBlaze MCSの設定で指定した”mcs_0”にしてください。インスタンス名が違うとbitファイルとelfファイルのマージが失敗します[追記]
 以下は今回のトップモジュールのソースコードです。

module mb_mcs_p1_top(
Clk, Reset, UART_Rx, UART_Tx, GPI1_Interrupt, GPI1, GPO1
);
input Clk;
input Reset;
input UART_Rx;
output UART_Tx;
output GPI1_Interrupt;
input [3 : 0] GPI1;
output [3 : 0] GPO1;

//microblaze_mcs your_instance_name(
microblaze_mcs mcs_0 ( //インスタンス名はMicroBlaze MCS設定で指定したmcs_0
.Clk(Clk), // input Clk
.Reset(Reset), // input Reset
.UART_Rx(UART_Rx), // input UART_Rx
.UART_Tx(UART_Tx), // output UART_Tx
.GPO1(GPO1), // output [3 : 0] GPO1
.GPI1(GPI1), // input [3: 0] GPI1
.GPI1_Interrupt(GPI1_Interrupt) // output GPI1_Interrupt
);


 2-4.論理合成の実行
 トップモジュールのソースコードのセーブ後にFlowNavigatorでRunSynthesisをクリックして論理合成を実行
 

 論理合成が完了したら以下のダイアログが表示されます。PIN配置指定をするためOpenSynthedizedDesignをチェックしてOKをクリック
 

 2-5.ピン配置指定
 ピン配置指定はLayoutでI/O Planningを選択します。
 

 I/O Portsの信号上でマウス右ボタンを押しながら移動して、配置図上の指定したい位置でボタンを離すと配置ができます。
 配置した結果は”プロジェクト名\プロジェクト名.srcs\constrs_1\new\トップ回路名.ucf"に保存されます。
 エディタでトップ回路名.ucfを直接変更してピン配置指定も可能です。
 以下は、今回のピン配置指定です。

NET "Clk" LOC = C10;
NET "GPI1_Interrupt" LOC = E4;
NET "Reset" LOC = V4;
NET "UART_Rx" LOC = R7;
NET "UART_Tx" LOC = T7;
NET "GPO1[0]" LOC = P4; #LED0
NET "GPO1[1]" LOC = L6; #LED1
NET "GPO1[2]" LOC = F5; #LED2
NET "GPO1[3]" LOC = C2; #LED3
NET "GPI1[0]" LOC = B3; #DIPSW0
NET "GPI1[1]" LOC = A3; #DIPSW1
NET "GPI1[2]" LOC = B4; #DIPSW2
NET "GPI1[3]" LOC = A4; #DIPSW3

 
 2-6.配置配線のオプションの設定[追記]
 配置配線実行の前に、レイアウト情報の入ったBMMファイルを作成するためのオプション設定をするtclスクリプトを実行します。
 TclConsoleで”source プロジェクトフォルダ\プロジェクト名.srcs\constrs_1\ip\IP名_バージョン\IP名_setup.tcl”と入力[追加]
 
 
 次に、XL9マイクロボードのSPIフラッシュメモリのビット幅が4bitなので、これに対応するためのオプションを設定します。
 FlowNavigatorのImplementation をクリックして、ProjectSetingを開きます。
 
 
 ProjectSetingのInplementation→Bit file generation→MoreOptionsへ”-g SPI_buswidth:4”を入力して、OKをクリック
 この設定でSPIフレッシュ用のデータ幅が4bitにされます。
 
 
 2-7.配置配線の実行
 オプション設定が終わったらしFlowNavigatorのRunImplementationをクリックして配置配線を行います。
 


 2-8.ビットストリームファイルの作成
 配置配線が完了したら以下のダイアログが表示されます。GenerateBitstermをチェックしてOKクリックします。
 FPGAにダウンロードするビットストリームファイルが生成されます。
 FlowNavigatorのGenerateBitstreamをクリックしてもビットストリームファイルを生成できます。
 

 配置配線完了後のリソースの使用率です。メモリは半分使っていますが、回路の方は、まだ大分残っています。
 

3.ソフトウェアの作成・実行(Xilinx Software Development Kit)
 ソフトウェアの作成はXilinx Software Development Kit(以下SDK)を使用します。
 現在はISE WebPackでSDKが利用可能になっています。

 3-1.SDK起動、ワークスペースの設定

 EDKの下のXilinx Software Development Kitを起動します。
 

 workspaceを聞かれるので任意のフォルダを指定します。
 今回はPlaenAheadのプロジェクトディレクトリの下のSDK\workspaceにしました。
 

 3-2.ハードウェアプロジェクト設定
 SDKでFile→New→Xilinx HardWare Platform Specificationを選んでハードウェアの情報を定義します。
 

 Project Nameは任意、
 Provide....のファイルは、”プロジェクト名\プロジェクト名.srcs\constrs_1\ip\IP名_バージョン\IP名_sdk.xml”を指定
 IP名_sdk.xmlにはソフトウエアで必要なMicroBlaze_MCSの情報が入っています。
 
 
 3-3.ソフトウェアプロジェクト設定
  次にFile→New→Xilinx C Plrojectを選んでソフトウエアプロジェクトを設定します
 

 ソフトウエアプロジェクトの雛形にHello Wordを選んでNextをクリック
 

 Bord Support Pakage の指定はデフォルトのままで、Finishをクリック
 

  雛形のソフトウェアプロジェクトが作成された後に自動でビルドされます。elfファイルが作成されるとビルド完了です。
  helloworld.cにメインの処理が書かれています。pritの出力先はUARTになります。
 

 3-4.ハードウェアの起動(PlanAhead/iMPACT)
 LX9マイクロボードとPCを接続します。接続はダウンロード用USBとUART用USBの2本を接続します。
 LX9マイクロボードと初めて接続するときは、ドライバーのインストールが必要です。LX9マイクロボードの付属してるドライバーを
 インストールしてください。
 接続が完了したらPlanAheadのFlowNavigatorからiMPACTを起動します。
 

 起動したらiMPACT FlowsのBoundaryScanをダブルクリックして、ウィンドの右側の空白部分ででマウス右ボタンを押して
 InitializeChainを選びます。ダウンロー用ケーブルからJTAG経由で接続されているデバイスを検索してれます。
 

 FPGAを検出するとconfiguration fileの設定を行うか聞かれるのでyesをクリックする
 

 PleanAheadで作成したビットストリームファイル(プロジェクト名\プロジェクト名.runss\プロジェクト名_runs\ip\impl_1\トップ回路名.bit)を指定
 このファイルにはFPGAの回路情報が入っています。
 

 コンフィグレーション用ROMの設定をするか聞かれるので、Noを選択
 
 
 Device Programming Propertiesは、OKをクリック
 
 
 デバイスの上にカーソルを合わせてマウス右ボタンを押して、Programを選択するとFPGAへbitファイルが書き込まれ、FPGAが起動します。
 
 
 3-5.シリアル通信用ターミナルソフトの起動(TeraTerm)
 FPGAとのシリアル通信(UART)を表示するためのターミナルソフトを起動します。今回のteratermを使いました。
 シリアル通信のポート設定は使用するPCによって番号が違うので、お使いのPCで認識されたポートを指定してください。
 他の設定はMicroBlaze MCSを生成した時のUARTの設定と同じにしてください。
 

 3-6.FPGA用ソフトウェアの転送・起動(Xilinx Software Development Kit)
 SDKからソフトウェアの実行ファイルをFPGAへ転送します。SDKでhello_word_0をクリックしたあとにRun→Run As→1Lanch on Hardwareを選択すると、
 SDKでビルドしたelfファイルがFPGA上のメモリに転送されてMicroBlaze MCSでソフトウェアが起動します。
 
 
 実行に成功するとFPGAからUARTへ出力した”Hello Word”がターミナルソフトに表示されます。
 

 3-7.LED点灯用プログラム
 次にhelloworld.cをLED点灯用のプログラムに書き換えます。PCのキーボードからAを押し、ターミナルに入力するととLED点灯、
 Bを押すと消灯します。LED点灯度に内部カウンタをインクリメントしてカウンタ値をGPOレジスタへ書き込んで、LEDの点灯を変化させます。
 GPO等のレジスタのアドレスは、http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_1/ds865_microblaze_mcs.pdfの24Pに書いてあります。

#include <stdio.h>
#include "platform.h"

void print(char *str);
//PIO用のレジスタアクセスの定義
#define PIO_0_LED (*(volatile unsigned char *) 0x80000010)

int main()
{
 init_platform();
 //print("Hello World\n\r"); //入力されたデータ保存用変数
 int key_data;
 int led_count;
 //起動時はLEDを消灯
 PIO_0_LED = 0x00;
 led_count = 0;
 //起動時の表示メッセージ
 print("LED ctrl Start\n");
 /* Event loop never exits. */
 while (1){
  //コンソールから1文字入力
  key_data = getchar();
  //入力文字の判定
  if (key_data==0x41){ //Aの場合
   led_count++; //カウントアップ
   print("on\n"); //onメッセージ表示
   PIO_0_LED = led_count;} //PIOレジスタへ0を書込みしてLED点灯
  else
   if (key_data==0x42){ //&quot;B&quot;の場合
    print("off\n");//offをメッセージ表示
    PIO_0_LED = 0x00;} //PIOレジスタへ0xffを書込みしてLED消灯
 }
 cleanup_platform();
 return 0;
}
//空白区部分の全角スペースがあります。
//コピー&ペーストして使う場合は半角スペースに置換してください


 変更後のソースのビルド結果
 
 
 Run→Run As→1Lanch on Hardwareを選択するとファイルが転送されて実行が開始します。
 実行の様子です。
 


 3-7.ソフトウェア実データ入りビットストリームファイルの作成[追加]
 回路情報とelfファイルをマージした新しいビットストリームファイルを作成します
 SDKでXilinxTools→ProgramFPGAを選択
 


 BirstreamにPlanAheadで作成したビットストリームファイルを指定(プロジェクトファルダ\プロジェクト名.runs\impl_1\トップモジュール名.bit)
 BMM fileはデフォルトで入ってるBMMファイルはロケーション情報が入っていないのでマージでエラーになるので、”プロジェクトファルダ\プロジェクト名.srcs\constrs_1\ip\IP名_バージョン\IP名_db.bmm”に変更
 Software ConfigurationにはSDKで作成したelfファイルを指定、今回は”D:\home\design\lx9\mb_mcs_p1\SDK\workspace\hello_world_0\Debug\hello_world_0.elf”を指定 
 Programを実行すると”D:\home\design\lx9\mb_mcs_p1\SDK\workspace\mb_msc_p1_hw\download.bit"が作成されてFPGAにダウンロードされます。
 SDKのxmd実行中にはMPACTからSPIフラッシュ書込みがエラー終了するので、SDKを終了させます。
 
  
3-8.SPIフラッシュ用のMCSファイルの作成
 iMPACTを使って、回路情報とelfファイルをマージしたビットストリームファイルをコンフィグレーション用SPIラッシュへの書込用MCSファイルへ変換します。
 PlanAhedからiMPACTを起動してCreate PROM File をダブルクリックします。
 
 
 Step1でSPI Flash->Configure FPGAを選択
 Step2でStorage Deviceに128Mを選択してAdd Storage Deviceをクリック
 Step3でoutputfileにdownload,OutputFileLocatioに出力先ファルダを指定、今回は”D:\home\design\lx9\mb_mcs_p1\mb_mcs_p1.data¥”
 OKをクリック
 

 ファイルを追加するか聞かれるのでOKをクリック
 

 3-7で作成した回路情報とelfファイルをマージしたビットストリームファイルを指定して"開く"をクリック
 今回は”D:\home\design\lx9\mb_mcs_p1\SDK\workspace\mb_msc_p1_hw\download.bit"になります。
 

 さらにファイルを追加するか聞かれるのでNOをクリック
 

 OKをクリック
 

 iMPACT ProcessesのGenerateFileをダブルクリックするとMCSファイルが作成される。
 

3-9.コンフィグレーション用SPIfラッシュへのMCSファイル書込み
 ※コンフィグレーション用SPIラッシュへ書込みを行ううと出荷時に書き込まれた回路データを上書きします。ご注意ください。
 LX9マイクロボードのコンフィグレーション用SPIfラッシュへの回路情報とソフトウェアの入ったMCSファイルを書込みます。  
 ”3-4.ハードウェアの起動の手順”をフラッシュROMの設定をするかきかれるところまで進み、ここでYesをクリックします。
  

 ”3-8.SPIフラッシュ用のMCSファイルの作成”で作成したMCSファイルを指定する
 今回は”D:\home\design\lx9\mb_mcs_p1\mb_mcs_p1.data¥download.bit”を指定
 
 
 ROMのタイプを聞かれるのでSPI PROM,N25Q128 1.8.3.3Vを選択
 DataWidthは4を指定、OKをクリック
 
 
 FLASHの上にカーソルを載せてマウス右ボタンを押してProgramを選択
 
 
 OKを押すと書込みが開始します。
 iMPACTがエラーになる時は、SDKとPlanAheadをいったん終了させてから書込みを行ってください。
 エラーが解消されない場合は、PCの再起動で書き込みに成功することがあります。
 

 書込みには5分くらいかかります。ProgramSucceededと表示されれば書込み完了です。
 LX9マイクロボードを再起動すると書き込んだ回路とソフトウェアが起動します。
 

今回、作成したシステムをベースに変更を加える形で開発する作業がスムーズですので、活用してみてください。

紹介した回路を試す場合は、自己責任でお願いします。

ページ先頭へ戻る


リンクフリーです。
リンクされた場合にご連絡をいただけると嬉しです。
メール:


変更履歴
(2012/11/15) 初版
(2012/11/20) 改版


TOPページへ戻る