Vivadoにはボードファイルと呼ばれる機能があります.
この機能を使うとブロックデザインでぽちぽちポートを作成しそれに適したIPを別途生成する
作業が一度に完了し,xdcファイルによるポートの指定が必要なくなります.
Xilinx社のリファレンスボードやDigilent社の開発ボードにはボードファイルが
付属もしくは公開されているため簡単に使用することができます.
せっかくなので弊社のexSitckGE用のボードファイルを作成しました.
その使い方について解説します.
バージョンはVivado,Vitisどちらも2020.1です.
ボードファイルの追加
まずボードファイルを追加する必要があります.
GitHubのリポジトリからダウンロードします.
配置場所ですがWindowsで初期設定のインストール場所だと以下のフォルダです.
C:\Xilinx\Vivado\2020.1\data\boards\board_files
注意点はHDMI入出力はDigilent社のIPを使用する指定がしてあるので
別途リポジトリでIPが使えるようにしないといけません.
また,後述しますがDIPスイッチはそのまま使うことができないので
別途xdcファイルを指定する必要があります.
実際に使ってみる
ボードファイルが登録されたのでVivadoから使ってみます.
exStickGEでMicroBlazeを動かしLチカを試します.
プロジェクトの作成
Vivadoから新プロジェクトの作成,適当な名前をつけます.
Add Constraintsまでそのまま進めます.
ボード上にDIPスイッチが存在するのですが,プルダウンしないと使えないので
別途xdcファイルで指定します.(今回は使う予定はありませんが)
リポジトリ内に”constraints.xdc”があるので追加します.
次にDefault Partで今回の目玉であるボードを指定します.
FPGAの種類xc7a200tsbga484をわざわざ探し出すことなく指定することができます.
exSitckGEが選択されているのを確認してFinishで完了です.
今回はシリアル通信の入出力は汎用ポートから行う予定で
ボードファイルには定義されていないので別途xdcファイルで指定します.
Sourcesから先程追加したxdcファイルに追記します.
以下の4行を追記してください.
set_property PACKAGE_PIN H22 [get_ports UART_rxd] set_property PACKAGE_PIN J22 [get_ports UART_txd] set_property IOSTANDARD LVCMOS33 [get_ports UART_rxd] set_property IOSTANDARD LVCMOS33 [get_ports UART_txd]
ブロックダイアグラムの作成
左のFlow NavigatorからCreate Block Designで作成します.
Boardタブから定義済みのインターフェイスが表示されます.
今回はexStickGEを生成するのでまずクロックから作っていきます.
Clock Sources->System Differential Clockをダブルクリック
接続先IPの指定が出てくるのでCLK_IN1_Dが選択されたままOK
生成されたIPをダブルクリックして設定を変更します.
Output Clocksタブで以下のように変更します.
MIGを動かすためにAdd IPからClocking Wizardをもう一個追加します.
以下の設定に変更します.
次にMIGを追加します.
External Memory->DDR3 SDRAMをダブルクリック
そのままOKで作成します.
次にLEDを追加します.
GPIO->3 LEDsで作ります.
次はMicroBlazeです.
Add IPからMicroBlazeを追加,上部のRun Block Automatinをクリック
余裕があるのでローカルメモリを128KB,キャッシュを64KBにしておきます.
デバッグ用にシリアル通信モジュールも追加します.
Add IPからAXI Uartliteを追加します.
自動で生成されたUART入出力ピンはuart_rtlからUARTに名前を変更しておきます.
最後の追加はリセットです.
Reset->System Resetをダブルクリック
設定は以下の図のようにします.
最後に配線を調整します.
clk_wiz_1のclk_in1はclk_wiz0のCLK100Mへ
MIGに接続されているclk_ref_iとsys_clk_iのポートを削除
MIGのclk_ref_iはclk_wiz_0のCLK200Mへ
MIGのsys_clk_iはclk_wiz_1のCLK310Mへ
上部のRun Connection Automationをクリックし全てにチェックを入れOK
以下の画像が完成図です.
保存したら左のFlow NavigatorからPROJECT MANAGERに移動しSourcesから
ブロックデザインを右クリックし,Create HDL Wrapperをクリック
そのままOKをクリックし完成です.
Generate Bitstreamでビットファイルを生成します.
生成されたらVitisで続きを行うためハードウェアファイルをエクスポートします.
メニューバーからFile->Export->Export Hardware …から
OutputでInclude bitstreamを選択し最後まで進めます.
VitisでLチカ
Vitisを起動しVivadoのプロジェクトフォルダ内にワークスペースを指定します.
Create Application Projectからxsaファイルは先程エクスポートしたものを指定し
名前はtest,テンプレートはHello Worldを指定しておきます.
helloworld.cを以下に書き換えます.
#include <stdio.h> #include "platform.h" #include "xil_printf.h" #include "xparameters.h" #include "xgpio.h" XGpio gpio_led; int main() { int status; init_platform(); status = XGpio_Initialize(&gpio_led, XPAR_GPIO_0_DEVICE_ID); if(status != XST_SUCCESS){ xil_printf("XPAR_GPIO_0_DEVICE_ID initialization failed.\n"); return XST_FAILURE; } XGpio_SetDataDirection(&gpio_led, 1, 0x0); print("Hello World\n\r"); print("Successfully ran Hello World application"); int i = 0, t; while(1) { i = (i + 1)%8; XGpio_DiscreteWrite(&gpio_led, 1, i); //Wait for(t=0;t<5000000;t++){} } cleanup_platform(); return 0; }
プロジェクトをビルドします.
シリアル通信モジュールをFPGAと接続します.
ピンアサインは以下のとおりです.
実際に実行してみましょう
上部のメニューからDebug Configurationを開きSingle Application Debugを
ダブルクリックしデバッグ用の設定を作成します.
デバッグを開始してResumeボタンを押せばシリアル通信で文字列が出力され
LEDがチカチカします.
無事に動作確認ができました!
まとめ
ボードファイルを使うことで比較的簡単にブロックダイアグラムで
組むことができるようになりました.
主なピンアサインをxdcファイルで指定する必要がなく明瞭になるのと
間違いが抑えられることから便利な仕組みです.
このボードファイルを作ることは結構面倒なのでそこがネックですが…
コメント
[…] 前回作成したボードファイルを使用します. […]