« 2019年4月 | トップページ | 2019年6月 »

2019.05.09

Visual C#で点描画のやりかたを調べる

画面に点を描きたいと思います。

FPGAからデータを取得して画像を構成するようなアプリを作るイメージです。

いくつかやり方があると思うのですが、最初に試してみて遅かったのがこのやり方。

Bitmap img = new Bitmap(pictureBox3.Width, pictureBox3.Height);
for (int y=0;y< pictureBox3.Height;y++)
{
for(int x=0;x< pictureBox3.Width;x++)
{
img.SetPixel(x, y, Color.FromArgb(x & 0xff, y & 0xff , ((x >> 8) * 20) | (y >> 8) * 2));
}
}
pictureBox3.Image = img;

メモリ上にBitmapを作って(Bitmapは抽象クラスImageを継承したもの?)、Bitmapに対して点を打って、最終的にPictureBoxに転写するという方法です。

PictureBoxへの転写が遅いのではなく、SetPixelが遅いようです。

速くするにはBitmapを作るときに配列を元にして作ればよいそうで、

System.IO.MemoryStream ms = new System.IO.MemoryStream(data);

でMemoryStreamから作ればよいそうなのですが、その後、

Image img = Image.FromStream(ms);

とやっても

Bitmap img = new Bitmap(ms)

とやっても、System.ArgumentException 使用されたパラメーターが有効ではありません。と出てしまいます。

Cs4

一度作ったBitmapに対してLockBitsという関数を使って内部のデータ配列を取り出し、ポインタを使って書き込めば何とかなりました。

private void button8_Click(object sender, EventArgs e)
{
Xorshift xor = new Xorshift();
System.Drawing.Imaging.PixelFormat bmpPixelFormat = System.Drawing.Imaging.PixelFormat.Format32bppRgb;
Bitmap bmp = new Bitmap(pictureBox4.Width, pictureBox4.Height);
Rectangle rect = new Rectangle(Point.Empty, bmp.Size);
unsafe
{
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.WriteOnly, bmpPixelFormat);
IntPtr ptr = bmpData.Scan0;
int* dst = (int*)ptr.ToPointer();
for (int i = 0; i < pictureBox4.Width * pictureBox4.Height; i++)
{
*dst++ = unchecked((int)xor.Next());
}
pictureBox4.Image = bmp;
bmp.UnlockBits(bmpData);
}
}

表示された砂嵐

Cs3

ただし、unsafeで囲った上で、ビルドオプションでunsafeコードを許可しなければならないようです。

Unsafe

SetPixelを使わずにできるのはわかりましたが、unsafeをどうするかという課題が残りました。

 

| | コメント (2)

2019.05.08

Visual StudioでC#のお勉強

Borland C++ 2006で進歩を止めてしまった私も、そろそろ現代風のアプリを開発できるようになりたいと思い、Visual StudioでC#の勉強を始めました。

Windows Formとか、WPFとか、UWPとかあるようなのですが、新しいものほど、のっぺりとした平べったいデザインになるようです。

作りたいのはCAD風の電子回路設計・デバッグ支援ツールなので、やはりWindows Formかな~と。MFCじゃないだけまだマシと思わなければ・・

とりあえず画面に波形を表示したり、四角や点などを描画できなければならないので、いろいろやってみました。

まずは波形を表示する方法を調べてみました。

 

C#で波形を表示するには、Chartというコンポーネントを使うようです。Chartの中にはSeriesというコレクションあって、このSeriesにPointsというのがあって、Series.Pointsに値を登録していけば波形が出ます。Chartは複数のSeriesを持つことができて、個々のSeriesごとに表示方法を変えられます。

Cs2

デフォルトでは棒グラフなのでGUIで設定を変えるか、

Series["<シリーズ名>"].ChartType = SeriesChartType.Line;

で表示方法を変えればよいようです。

作ったプログラムでは、Form1_Loadなどの初期化で以下のようにしました。動的にSeriesを作成して追加することもできそうです。

s1 = chart1.Series["Series1"];
s2 = chart1.Series["Series2"];
s3 = new Series("a");
chart1.Series.Add(s3);
s3.ChartType = SeriesChartType.Line;
s3.MarkerStyle = MarkerStyle.Cross;
s1.Color = Color.Red;
s2.Color = Color.Blue;
s3.Color = Color.Green;
random = new System.Random(123456);
s1.BorderWidth = 1;
s2.BorderWidth = 1;
s3.BorderWidth = 1;
chart1.ChartAreas[0].AxisX.Maximum = 1;
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisY.Maximum = 1;
chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].AxisX.Interval = 0.1;
chart1.ChartAreas[0].AxisX.Name = "時刻";
for (int i = 0; i < 100; i++)
{
double x = i / 100.0;
s1.Points.AddXY(x, x);
s2.Points.AddXY(x, x * x);
s3.Points.AddXY(x, x * x * 3);

そして、ボタンが押されたら乱数で波形を更新します。

var stopwatch = new System.Diagnostics.Stopwatch();
int maxIter = int.Parse(textBox1.Text);
cont = true;
stopwatch.Start();
for(int count=0;count < int.Parse(textBox1.Text);count++)
{
if (!cont) break;
s1.Points.Clear();
s2.Points.Clear();
s3.Points.Clear();
for (int i = 0; i < Define.VisibleDataPoint; i++)
{
double x = i / (double)Define.VisibleDataPoint;
s1.Points.AddXY(x, random.NextDouble());
s2.Points.AddXY(x, random.NextDouble());
s3.Points.AddXY(x, random.NextDouble());
}
chart1.Update();
Application.DoEvents();
}
stopwatch.Stop();
TimeSpan ts = stopwatch.Elapsed;
MessageBox.Show((stopwatch.ElapsedMilliseconds / int.Parse(textBox1.Text)) + "ミリ秒");

Cs1

線の太さを太くすると、やはり遅くなります。

速度に影響を与える要因としては、

  • 描画領域のサイズ
  • Seriesに入れた要素数
  • 線の太さ

が効いてきます。Seriesに10000ポイントとか入れるとめっちゃ遅くなります。どうせ表示しきれないので、L1キャッシュに入りきる量にしておくのが良いようです。

C#を触ってみた感想としては、C#では#defineで値を定義することができないことが面倒。

わざわざ

public static class Define
{
public const int VisibleDataPoint = 100;
}

のような値定義クラスを作って、Define.VisibleDataPointとしなければなりません。

乱数の生成もSystem.Random(最大値)でインスタンスを作ってNextで値を生成するようです。

なんでもクラス化してしまうわけですね。

そのわりに、スタティックな関数はクラス名::メソッドで呼び出せればいいのにクラス名.メソッドなので紛らわしい。

 

| | コメント (1)

2019.05.07

Vivadoプロジェクト生成するTclの完成

必要な少数のファイルだけをGITで管理するため、VivadoのプロジェクトをTcl化する件ですが、Block Designを別ファイルにすることができるようになりました。

そのスクリプトをgithubで公開します。

https://github.com/tokuden/NahiViva

NahiVivaは、ビルドや、IP Upgrade、プロジェクトの保存/復元などをトータルにサポートするVivadoの便利なTclスクリプトです。

このうち、本日はNahiSaveという関数を強化し、Block DesignのTcl化と復元をサポートしました。

原理は次のような感じです。

  • Write Tclで出力したTcl化プロジェクトは、プロジェクト再生成時にbdファイルをインポートするのがデフォルトの動作である
  • しかし、MIGを含んだブロックデザインでは、bdファイル以外にも、MIG用のいろいろなファイルが必要になる
  • 一方、Export Block Designの操作を行うと、BD生成Tclが作成され、このTclから元のBlock Designが完全に復元できる。このBD生成Tclには、Block Designのモジュールの配置や、MIGの設定、配線、IPの設定などが書かれている
  • ところが、Tcl化プロジェクトにはBD生成Tclを呼び出す機能がない
  • そこで、Tcl化プロジェクトの適当な場所にsource文を埋め込んで、自動的にBD生成Tclを実行すればよい

こういった操作を自動的に行うのがNahiSaveというコマンドです。

NahiSaveが行っている内容

NahiSaveを行うと、create_project.tclというファイルと、src/<プロジェクト名>_bd.tclが生成されます。

srcというフォルダにTcl化されたBDファイルが作られます。

Viva_bd_gen8

Tcl化プロジェクトはBDファイルが存在することを前提としていますが、この時点ではBDファイルはありません。BDは、Tcl化BDを実行すると生成されるからです。

そこで、Tcl化プロジェクトの中からBD化Tclを出すようにNahiSaveは、生成されたgenerate_project.tclを書き換えます。

# Generate block design and wrapper. (by nahitafu)
source ./src/artsys_bd.tcl
make_wrapper -import -files [get_files ${origin_dir}/${_xil_proj_name_}/${_xil_proj_name_}.srcs/sources_1/bd/${design_name}/${design_name}.bd] -top
# Import local files from the original project
#set files [list \
#[file normalize "${origin_dir}/fx3-axi-ddr/fx3-axi-ddr.srcs/sources_1/bd/artsys/artsys.bd" ]\
#[file normalize "${origin_dir}/fx3-axi-ddr/fx3-axi-ddr.srcs/sources_1/imports/hdl/artsys_wrapper.vhd"]\
#[file normalize "${origin_dir}/fx3-axi-ddr/fx3-axi-ddr.srcs/sources_1/bd/artsys/ip/artsys_mig_7series_0_0/mig_a.prj" ]\
#]
#set imported_files [import_files -fileset sources_1 $files]
#
# Set 'sources_1' fileset file properties for remote files
set file "$origin_dir/src/ledchika.vhd"
set file [file normalize $file]

赤い部分がNahiSaveによって追加された行で、緑の部分がコメントアウトされた行です。

プロジェクトを復元してみた様子

では、実際に試してみます。

Vivadoのプロジェクトフォルダをすべて消した状態で、Artix-7の「USB3.0-DDR3メモリ」デザイン
に必要なソースを用意してopen_project_gui.cmdを実行した様子をお見せします。

(1) まず、DOSプロンプトが立ち上がってVivadoがCUIモードで起動します。

Viva_bd_gen1

(2) VivadoのGUIが起動します

Viva_bd_gen2

(3) プロジェクトの設定を読み込んでいきます

Viva_bd_gen3

(4) 真っ白なBlock Designにモジュールが配置されていきます

Viva_bd_gen4

(5) 真っ白なBlock Designにモジュールが配置されていきます

Viva_bd_gen5

(6) どんどん配置が進みます

Viva_bd_gen6

(7) 配置が終わり、配線が行われます

Viva_bd_gen7

と、このようにエラーなくプロジェクトが再現されました。

ここで、ブロックデザインの中の2つのモジュールを書き換えてみましょう。

まず、元のデザイン。

Viva_bd_gen9

この中のfx3_axi_0_bramを少し下に移動し、axi_traffing_gen_0のパラメータを変えてみます。

Viva_bd_gen11

Viva_bd_gen10_1

そして、NahiSaveを行ったあと、gitでartsys_bd.tclを比較してみると・・・

Viva_bd_gen13

IPのパラメータの変更は反映されていることがわかります。ただ、モジュールの座標は含まれていないようでした。

どうやって使うのか

最低限必要なのは、この中にあるnahiviva.tclです。

Vivadoのtclコンソールから

source nahiviva.tcl

で読み込むか、バッチファイルのopen_project_gui.cmdを実行すると、NahiVivaの各種関数が使用できるようになります。

VivadoのTclコンソールで

NahiSave

というコマンドを打ち込むと、create_project.tclというファイルと、src/<プロジェクト名>_bd.tclが生成されます。

生成されたプロジェクトを読み込むには、open_project_gui.cmdを実行します。

最終的なまとめ

Vivadoのプロジェクトをgitで管理する最小限のファイルはこうなりました。

  • プロジェクトを生成するためのtclファイル (NahiSaveで作成)
  • ブロックデザインを生成するtcl(NahiSaveで作成)
  • 自分のIP(ip_remoフォルダに置く)
    • RTLソース
    • component.xml
    • [<中のXILINX IP名>/<中のXILINX IP名>.xci]
    • xgui/<IP名>_<バージョン>.tcl
  • インタフェース(ip_repoフォルダに置く)
    • <インタフェース名>.xml
    • <インタフェース名>_rtl.xml
  • 制約ファイル

やり方は以下のような感じです。

  1. まずIPのレポジトリと、XDC制約ファイル、RTLソースファイルをVivadoプロジェクトフォルダの外に配置します。
    これらのファイルはgit管理下に置きます。
  2. これらのファイルをプロジェクトに追加する際に、importやcopyするのではなく追加します。
  3. .xprの代わりにWrite Tclで生成したTclを、.bdの代わりにExport Block Designで生成したTclをgit addします。
    生成する際のオプションには気を使う必要があります。
  4. xprやbd、それからsources_1/bd/main/・・・のフォルダはgitで管理する必要はありません

nahiviva.tclを使えば、これらの操作を全自動でやってくれます。

ぜひ、NahiVivaを試してみてください!

| | コメント (0)

2019.05.06

Vivadoのプロジェクトをgitで管理する最小限は何か

Vivadoでプロジェクトを作っていると、あっという間に数百MBのサイズになってしまいます。

自分で書いたソースはごくわずかなのに、XILINXが提供しているIPや一時ファイルで膨れ上がります。そのような巨大なフォルダをgitで管理するのは賢くないので、Vivadoのプロジェクト再生成できるような最小限のgitで管理するべきファイルは何かということを考えてみました。

今回のプロジェクトで使用したのは特電のArtix-7ボード

このボードの標準デザインにはEZ-USB FX3とDDR3メモリをAXIバスでつなぐというものがあります。

Vivadogit1

このプロジェクトには以下のような要素があります。

  • 自作IP (FX3インタフェース、パターンジェネレータ)
  • XILINXのIP (xlconstant、clk_wizなど)
  • 自分で定義したインタフェース
  • ブロックデザイン
  • MIG
  • RTLのソースを直接ブロックデザインに貼ったもの

なお、FX3インタフェースは中でXILINXのFIFOを使っています。

試行錯誤してみた結果、gitで管理するべき最小限のファイルはこうなりました。

  • プロジェクトを生成するためのtclファイル (WriteTclで作成)
  • 自分のIP
    • RTLソース
    • component.xml
    • [<中のXILINX IP名>/<中のXILINX IP名>.xci]
    • xgui/<IP名>_<バージョン>.tcl
  • インタフェース
  • <インタフェース名>.xml
  • <インタフェース名>_rtl.xml
  • ボードデザインのwrapper.vhd
  • MIGの設定ファイル (mig_a.prj)
  • ブロックデザインに直貼りするRTLソース
  • 制約ファイル

Vivadogit2

たったこれだけでOKでした。

BitStreamの生成が終わった時点でのプロジェクトフォルダのサイズは200MBytesくらいあるのに対して、上記で管理しているファイルは全部で490kByteくらいなので、本質は500分の1のサイズだと言えるでしょう。プロジェクトの大半はツールが自動的に生成している一時ファイルなのです。

上のファイル一覧を見ると、ブロックデザインが入っていないことに気が付くかと思います。

ブロックデザインは.bdというファイルで、中はJSON形式でセルの配置や座標などが書かれています。しかし、bdのファイルを利用するには不随するディレクトリやbxmlといったファイルも一緒になければなりません。この付随するディレクトリが大きく、100MBytesくらいになります。ファイルの種類も多くgitで管理するには不向きです。

Vivadogit3

そこで、BDを生成するTclを作ることを考えます。

その方法には2種類あって、まずはFile->Project->Write Tclを行う方法。

Vivadogit4

プロジェクトを完全に再生成してくれるTclファイルを生成してくれるのですが、オプションダイアログでCopy sources to new projectと、Recreate Block Design Using Tclのチェックを入れておくと、出来上がったtclファイルの中でBDファイルを再生成してくれるようになります。

Vivadogit5

 

BDを生成するもうひとつの方法は、File->Export->Export Block Designです。

Vivadogit7

これで生成されたTclファイルを、空のプロジェクトで実行するとBlock Designにいろいろな部品を配置して

Vivadogit8

Vivadogit9

このようにつないでくれます。

つまり人が手作業で行っていたことをTclで自動化し、ゼロからbdを再生成してくれるようです。

しかし、create_project.tclの読み込み時に組み込めないのと、create_project.tclを実行する前にbdが無ければならないので、とりあえずはWrite Tclの方法でやることにします。

さて、Write Tclで生成したファイルの先頭を読んでみると、

# NOTE: In order to use this script for source control purposes, please make sure that the
# following files are added to the source control system:-
#
# 1. This project restoration tcl script (create_project.tcl) that was generated.
#
# 2. The following source(s) files that were local or imported into the original project.
# (Please see the '$orig_proj_dir' and '$origin_dir' variable setting below at the start of the script)
#
# "c:/Users/user/Desktop/fx3-axi-ddr/fx3-axi-ddr/fx3-axi-ddr.srcs/sources_1/bd/artsys/ip/artsys_mig_7series_0_0/mig_a.prj"
#
# 3. The following remote source files that were added to the original project:-
#
# "C:/Users/user/Desktop/fx3-axi-ddr/src/ledchika.vhd"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/bd/artsys/hdl/artsys_wrapper.vhd"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/bd/artsys/ip/artsys_mig_7series_0_0/mig_a.prj"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/config.xdc"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/main.xdc"

プロジェクトの再生成に必要なファイルがすべて書かれています。つまり、これがGITで管理すればよいファイルの答えというわけです。

Vivadoのプロジェクトフォルダはいつでも全消去したいため、自分で作ったソースファイルはVivadoのプロジェクトの外に置きたいのですが、ブロックデザインはVivado管理下の<プロジェクト名>/<プロジェクト名>.srcs/sources_1/bd/<ブロックデザイン名>の下に入ってしまいます。MIGのプロジェクトはさらにその下の/ip/<Ip名>に置かれます。

したがってcreate_project.tclから再生成するとしても<プロジェクト名>/<プロジェクト名>.srcs/sources_1/・・という長ったらしいフォルダ名のファイルを管理しなければならなくなります。プロジェクトフォルダは削除される可能性があるので、そこに設定を格納しておくのはよくありません。

これはVivadoの問題点だと思うのですが、bdファイルは読み込まれた瞬間に<プロジェクト名>/<プロジェクト名>.srcs/sources_1/というフォルダにコピーされてしまうのです。このフォルダを変更するには、create_bd_designを実行するときに-dirオプションを付ければよいようなのですが、GUIからはできません。

既存のプロジェクトのBDをプロジェクト外に出すには、File->Save Block Design Asです。

Vivadogit6

これでBDデザインをプロジェクト外に出せるので、

Vivadogit10

こうしてからWrite Tclすると外に出せます。

create_projectでcreate_bd_designしているところを以下のように書き換えると、プロジェクト外にBDを持ってくれるようになりますが、

set proj_dir [get_property directory [current_project]]
create_bd_design -dir ${proj_dir}/../src/bd/ $design_name

MIGのIPは元になったMIGの設定とは別にもう一つのプロジェクトを作ってしまうので、管理がより複雑になります。

Vivadogit11

元からあったmig_7series_0_0の中身には一切触れられず、mig_7series_0_0_1の中に新しいファイルを生成していきます。スマートではありませんね。

本日のところの結論は

  • ユーザIPで必要なのは、RTLソースと、xguiのtclと、component.xmlと、中のxci
  • Block Designのbdファイルではなく、bdを生成するTclスクリプトをgitで管理
  • Tclからbdを生成するなら個々のIPのxciは管理不要 (もちろん管理してもよい)
  • BDラッパのVHDLは必要

MIG設定が変化したときにかなり面倒なことになります。やはりExport Block DesignのTclを使いこなす方法を考えたほうがスマートでしょう。

 

| | コメント (2)

2019.05.05

EZ-USB FX3とFPGAを便利に扱うための64bit DLL

昨日のEZ-USB FX3用ファームウェアを使って、EZ-USB FX3とFPGAを便利に扱うための64bit DLLを作りました。

githubで公開します。

https://github.com/tokuden/tkusbfx3_multi64

Ezusbfx3_speed

Imagewr

このDLLは特電のArtix-7ボードで動作することを前提に作っていますが、EZ-USB FX3に昨日のファームウェアを入れればどんなボードでもEZ-USB FX3とFPGA間で300MByte/s超の通信ができるようになるでしょう。

USB3.0のアプリの作り方は、こちらのページをご覧ください。

http://www.tokudenkairo.co.jp/art7/apiprog.html

また、FX3に接続されたSPI ROMやI2C ROM、また、FX3のRAM上にファームウェアを転送する機能もあります。

今回、Visual Studio 2019を使用してDLLからアプリまですべて一貫して作りました。いままではBorland C++2006を使っていたのですが、そろそろ諸々のソフトウェアを本格的にVisual Studioで作り直していきたいと考えています。

DLLのソースファイルはこちらです。特電Artix-7ボード をご利用の方は無償でダウンロードできます。

 

| | コメント (0)

2019.05.04

EZ-USB FX3とFPGAをつなぐファームウェア

特電Artix-7ボードで提供している「EZ-USB FX3とFPGAをつなぐファームウェア」を公開します。

このファームウェアをEZ-USB FX3(CYUSB3014)に書き込むと、SlaveFIFOとDMAを利用して、毎秒300MB以上の速度でFPGAとインタフェースすることができるようになります。

Firm5

このファームウェアの主な機能は以下のとおりです。

  • FPGAとの間の高速なデータ転送
  • USB-JTAG

今回の更新で、USBのシリアル番号に対応しました。シリアル番号を使うと1台1台のUSBターゲットを区別して開くことができるようになります。

詳しい説明、ビルド方法、ソースコードの入手方法などは下記のgithubのレポジトリをご覧ください。

https://github.com/tokuden/SlaveFifoNP1064

ソースコードとビルド可能なプロジェクト一式は特電のお客様ページで配布しています。

| | コメント (0)

2019.05.01

VivadoのIPアップデートと論理合成をするスクリプト

Vivadoで作業をしていると、IPを更新したらReport IP Statusをやって、Update Selectedをやって、Generateなんちゃらのダイアログをキャンセルして・・という一連のボタン操作をしてから論理合成をしなければならず、IPの中を更新するのがとても億劫になってしまいます。

そこで、こうした一連の作業を自動化するスクリプトを作りました。

このスクリプトを使うと、子IPの更新から論理合成&配置配線の流れがとても簡単にできるようになります。

Nahiviva_1

それに、GUIを使わないモードでも動作させることができるので、起動も速やかです。

Nahiviva_2

スクリプトの機能は以下のようなものがあります。

  • Tcl形式のプロジェクトからXPRを生成
  • VivadoのGUIを起動しなくても、バッチモードで動作可能
  • DOSプロンプトのバッチファイルで起動 (Vivadoコマンドラインのショートカット不要)
  • 論理合成、配置配線の自動化
  • IPコア・アップデート作業(Report IP Status から Update Selected、Generate)の自動化
  • IPコアの子プロジェクト編集作業の自動化

ユーザ向け関数には以下のようなものがあります。

  • NahiRun [<option>]
    論理合成と配置配線を行う
  • NahiUpdate
    IPのアップデートを行う(Report IP StatusとUpdate Selectedの自動化)
  • NahiChild [<name>]
    IPコアの子プロジェクトをVivadoで開く
  • NahiPackage Re-Package IP
    IPを再パッケージする(子プロジェクトで使用する)
  • NahiSave Write tcl to re-create project.}
    プロジェクトをTclで保存する。

このスクリプトはTclで作られていますが、上記のような関数にまとめられているため、必要に応じて呼び出すことができます。

配布はgithubで行います。

https://github.com/tokuden/NahiViva/

githubのページにセットアップ方法が書いてありますが、今回の記事の内容を利用するだけならば不要です。ダウンロードしてファイルを置くだけで、どのようなプロジェクトにもすぐに適用できます。

 

使い方

このスクリプトには2つの使い方があります。

1つ目は論理合成や子IPのアップデートの機能だけを使う方法。もう一つはこのスクリプトにプロジェクトの管理をすべて任せる方法です。

まずは、簡単な論理合成とIPのアップデートだけを使う方法を説明します。

セットアップ (簡単版)

まず、githubから全体をダウンロードするか、下記のスクリプトのみをダウンロードします。

https://raw.githubusercontent.com/tokuden/NahiViva/master/scripts/nahiviva.tcl

(右クリックでファイル保存してください。)

そして、Vivadoのプロジェクトがある任意のフォルダにnahiscript.tclを保存します。

Vivadoを起動したら、Tclコンソールに

source nahiviva.tcl

と入力します。人によっては../nahiviva.tclだったり、scripts/nahiviva.tclだったり違うフォルダに置いているかもしれません。

Nahiviva_3

これで、使用する準備が整いました。

子IPの更新

Vivadoで子IPを更新したら、憎きこの通知が出るでしょう。↓

Nahiviva_4

普通ならRefresh IP Catalogを押して、ReRunを押して、Upgrade Selectedを押して、Generate Output ProductsのダイアログでSkipを押して、再度ReRunを押すという面倒なプロセスが待っているのですが、

Nahiviva_5 Nahiviva_6

 

これからは、tclコンソールで、

NahiUpdate

と入力するだけです。(NahiUまででOK)

Nahiviva_7

上の一連の操作をスクリプトが自動的に行います。面倒なダイアログでボタンを押す必要もありません。

ビルド(論理合成と配置配線)

論理合成と配置配線およびBitStreamの生成は、Tclコンソールに

NahiRun [オプション]

と入力するだけでできます。

下の図のように複数のRUNが存在している場合でも、アクティブなRUNを探して自動的に実行してくれます。

常にRUNを最初からやり直すのではなく、途中までできている場合には途中から開始します。(もちろん最初からやり直すこともできる)

Nahiviva_8

オプションには以下のようなものがあります。

  • -update  コアの更新も一緒に行う
  • -restart  Runをリセットして、最初から開始する
  • -report   使用率、タイミング、IOのレポートを作成する

終了したらBitStreamファイルをプロジェクトのフォルダの上までコピーします。

Vivadoは生成したBitStreamを<project>\<project_1.runs>\<impl_x>\という深いフォルダに保存してしまうので、とても探しにくくなります。また、Runをリセットしたり再度Runするとbitファイルが消されてしまいます。
このスクリプトは<project>のディレクトリまでコピーするので、

  • bitファイルが探しやすくなる
  • 再度Runしたときにも前のbitファイルが消されない

というメリットもあります。

プロジェクトを開く

DOSのバッチファイルからプロジェクトを開くこともできます。

レポジトリをダウンロードしたら、これらのファイルをVivadoのプロジェクトのあるフォルダか、その一つ上のフォルダに置きます。

Nahiviva_9

そして、SETTINGS.CMDを編集します。SETTINGS.CMDの内容は

@SET VIVADO_PATH=D:\Xilinx\Vivado\
@SET VIVADO_VERSION=2018.3

という簡単なものですが、ここにVivadoをインストールしたフォルダのパスと、Vivadoのリビジョンを設定します。

そして、open_project.cmdまたはopen_project_gui.cmdのアイコンをクリックします。

このコマンドファイルを実行すると、現在のディレクトリと同じか、一つ下のディレクトリからxprファイルを探してそれを指定されたバージョンのVivadoで開きます。Vivadoをたくさん入れている方でも、指定したバージョンのVivadoで開くことができます。

open_project.cmdを実行するとVivadoがテキストモードで開きます。開いたらNahiRunを実行すると論理合成をしてBitファイルが生成されます。

Nahiviva_10

open_project_gui.cmdを実行すると見慣れたVivadoのGUIが起動します。

GUIの起動は時間がかかるので、論理合成をするだけならテキストモードで実行したほうが早いでしょう。

 

| | コメント (0)

« 2019年4月 | トップページ | 2019年6月 »