セミナ開催します
手ぶらでOK!IoTプログラミング教室
-- IoT開発キットM5StickC Plus2で作る通信ガジェット
2025年2月28日(金)CQ出版社セミナルーム CQ出版社セミナ・ルーム
詳しくはこちらへ
ZYBOの本
FPGAパソコンZYBOで作るLinux I/Oミニコンピュータ CQ出版 発売中
Papilioの本
FPGA版Arduino!!Papilioで作るディジタル・ガジェット CQ出版 発売中
番外編 FPGAでCPU( MicroBlaze MCS )を動かしてみる
☆ARTY版のページはこちら
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){ //"B"の場合 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) 改版