2019.06.11

AXI Stream to MMで画像生成

AXI Stream to DDR3 SDRAMの最終的な構造はこのようになりました。

Axi_dma_system

DDR3メモリに書き込んだテスト画像をUSB3.0でPCに取り込みます。

まずは水平グラデーション。

Yoko

それから垂直グラデーション

Tate

斜めのグラデーション。

Naname

すべてうまくいきました。

| | コメント (0)

2019.06.10

AXI Stream to MMにFIFOを入れた

昨日の記事では、AXI DataMoverでAXI StreamをDDR3メモリに転送することはできましたが、MIG(と、その手前にあるInterConnect)がTREADYを下げてくるので、データを出すだけの単純なAXI4 Streamだと対処できませんでした。

そこで、Streamのソースと、AXI DataMoverの間にAXI FIFOを入れることにしました。

VivadoのIP IntegratorでAXI FIFOを探すと3種類くらい出てきますが、使用したのは「AXI4-Stream Data FIFO」です。

出来上がったデータパスの全体構成はこんな感じです。

Axi_fifo_dm

FIFOの設定は以下のとおりです。

Fifo_2

Fifo_1

 

これで動かしてみると、TREADYは相変わらず下がっていますが・・・

Axi_dmin

 

AXI Streamのソースは、データを止めることなく出し続けることができるようになりました。

FIFOの残数を見ると_/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\__という動きをしているのがわかります。

Axis_src

 

次の図は、AXI DataMoverの後ろのAXI Interconnectの部分です。綺麗にトランザクションが発行されています。

Burst

ステータスも正常に返ってきています。15とか出ているので一瞬驚きましたが、TVALIDのときには85なので大丈夫でした。

Axi_sts

転送の全体です。DDR3が相手なので最初や最後の部分で少し乱れていますが、問題なく転送できました。

Axi_mm

このように、AXI DataMoverの前にFIFOを入れると、AXI Streamのソースは単純に出すだけのタイプで良くなるので楽に作れるようになります。

| | コメント (0)

2019.06.09

XILINXのAXI DataMoverを使う

XILINXのAXI DataMoverというのを使うと、AXI StreamからDDR3メモリへのデータ転送が簡単にできるようです。

今回はStreamからMemory Mapへの書き込みをしたいのでS2MMというモードで作ってみます。

Axi_datamover

S_AXIS_S2MMにAXI Streamを入れるとM_AXI_S2MMからFull AXIが出てきてDDR3メモリなどに接続できるという優れもののコアのようです。

S_AXIS_S2MM_CMDというのがコマンドを与えるポートで、これ自体もAXI Streamでできています。

下の図ような72bitのコマンドを与えて、tvalidを1にします。

Command_layout

  • BTTが転送したいバイトサイズ(1~8388607)
  • Typeは0だとアドレス固定、1だとアドレスが増えていく
  • DRRとDSAはMM2Sで使うらしく、今回は調べていない
  • EOFはMM2Sで最後の転送のときに1にしておくとTLASTを立ててくれる
  • SADDRは転送先アドレス
  • TAGはAXIのパケットに付ける目印のタグ
  • RSVDは0
  • xUSERとxCACHEはとりあえず存在しない

となっています。

実際に下の図のようなデザインを作り、XILINXのIPであるVIOを使ってトリガやパラメータを与え、ILAで波形を取ってみました。

Design

TAGが5、SADDRは0、BTT(転送バイト数)が0x20のコマンドを与えました。下の波形はコマンド用AXI Streamの波形です。

Axis_wrcmd_16byte

その後、データポートのAXI Streamに8ワード(32バイト)のデータを与えます。

Axis_wr_16byte

AXI MMのポートからは以下のような信号が出てきました。これはごく普通のAXIの転送です。

Axis_wraxi_16byte

最後にSTSというAXI Streamのポートに返ってきたステータスを確認しますが、今回はIBTTモード(転送サイズを途中で打ち切ることができるモード)を使っているので、ステータスは32bitの幅があります。

Ibttstatus

波形は以下のとおりです。1クロック分しか出てこないのでロジアナで読みにくいですね。

Axis_wrsts_16byte

値は0x80002085で、EOP(End of Packe)とOkayフラグが立ち、転送したバイトサイズは0x20のようです。

確かにAXI StreamからAXI MMへのデータ転送は簡単にできそうです。

が、大事なことを見落としていました。それは、AXI DataMoverがTREADYを0に下げることがあるということです。S2MMの先が詰まっているときや、転送の始まりの部分ではTREADYがいったん0に下がります。

そうすると、AXI Streamのデータソースはデータの送信をいったん中止しなければなりません。データソースは普通、ADCや画像だったりするので止められないですね。

だから、ADCや画像データをそのままAXI S2MMにつないでDDR3に格納するのは無理がありそうです。間にFIFOを一回挟まなければならなさそうです。

<追記>

 

» 続きを読む

| | コメント (0)

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で値を生成するようです。

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

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

 

| | コメント (0)

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を使いこなす方法を考えたほうがスマートでしょう。

 

| | コメント (0)

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)

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