« 2020年1月 | トップページ | 2020年3月 »

2020.02.14

ZYNQのLinuxで、PLとの共有データをTCPやUDPを送信する速度を測ってみた

ZYNQのPLで管理しているDDR3メモリ内のデータを次から次へとネットワークに投げるような機能を開発しています。PLに溜めたデータをどれだけの速度でホストPCに転送できるかという実験で、「Cosmo-Z」という12bit 125MHz 8chの計測ボード用の新機能です。

言い換えれば、「ZYNQのLinuxにおいて、PLとの共有メモリ上のデータを、ネットワークにひたすら投げる」というプログラムを作っているわけなのですが、どのくらいの速度が出るでしょうか?実際に試してみました。

 

プログラムの中心となる部分は以下のようなルーチンです。

unsigned char *testbuf = (unsigned char *)malloc(1048576);
int cur = len;
int sent = 0;
struct timeval start,end;
gettimeofday(&start, NULL);
while(len) {
cur = len;
if(cur > 163840) cur = 163840;
sent += write(sock, testbuf , cur);
len -= cur;
}
gettimeofday(&end, NULL);
uint64_t elapse = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
printf("%f[MB/sec] %d[bytes] %lld[us]\n" , (double)sent / elapse, sent, elapse);

 

これを簡単に説明すると、testbufの内容をソケットに送信しているだけです。

gettimeofdayで、送信ルーチンの経過時間を計っています。

簡単ですね。

 

ZYNQ Linuxの最大送信サイズは163840バイトなので(SO_SNDBUFの値をgetsockoptで調べるとわかる)、大きなデータを送信する場合はこのサイズに区切って送ります。また、上のプログラムのwriteをsendtoに変えれば、同様の手口でUDPの速度もわかります。

その結果ですが、

Sendspeed

このように、mallocで確保したローカルバッファから送るのであればTCPでは100Mバイト/秒超(!!)の速度が、UDPでは98Mバイト/秒の速度が出ていました。ギガビットのイーサの速度をほぼ使い切っている計算となります。(TCPの速度はギガビットを超えてしまっていますが、おそらくTCP/IPライブラリの中にバッファされているのでしょう。)

 

Cosmo-Zは計測したデータをFPGA管理下のメモリに置いてLinuxからは直接見えます。計測データをLinuxのプログラムから読み出すために、uio (user mode io)というドライバを使っています。

 

上のプログラムで、送信するデータをuio管理下のバッファにしてみます。

uint32_t *p = uio_mems + offset/4;
sent += sendto(sock, p , cur, 0, (struct sockaddr *)&addr, sizeof(addr));

すると、

Uio_send

なんと!28Mバイト/秒しか出ません。200Mbps程度の速度ということになります。

 

これを、

uint32_t *p = uio_mems + offset/4;
memcpy(testbuf, p, cur);
sent += sendto(sock, testbuf , cur, 0, (struct sockaddr *)&addr, sizeof(addr));

のようにuioのバッファからローカルのバッファにコピーしてから転送した場合、

Cpybuf

40Mバイト/秒の速度が出ました。

 

つまり、

  • UIOのバッファから直接TCP/UDPで送信した場合は28Mバイト/秒くらい
  • UIOのバッファからローカルにmemcpyして送信した場合は40Mバイト/秒くらい
  • ローカルのバッファから送信した場合は98Mバイト/秒くらい

ということになりました。

UIOが遅いのは目をつむるとして、ローカルにmemcpyして送ったほうが速くなるのが意外ですね。

抜本的な速度改善策としては、ZYNQのPLとPSで共有するメモリはスキャッタギャザーDMAを使ってローカルのバッファに直接マッピングするのがよいのだと思われます。ただ、それはとてつもなく難しそうです。

 

| | コメント (0)

2020.02.13

Cosmo-Zの大幅アップデート

本日、Cosmo-ZのFPGA、ファームウェア、Webアプリなどを全面的にアップデートしました。

最も大きな更新内容は、イベントモードでの計測時に、イベント発生の頻度が高い場合にcorruptedと出てデータが壊れることがある不具合の修正です。

corruptedというエラーが出る原因はいくつかあって、

  • イベントモードにおいて、計測開始のタイミングの際にたまたまイベントが発生していた場合
  • 計測データが512MBを超え、ファイルに保存する場合

という場合でした。

イベントを記録するデータのヘッダが壊れてしまうので、corruptedというエラーとなります。

また、記録するデータが2GBを超えた場合にfsizeやftellが使えなくなるので問題が発生することがあったため、fgetpos、fsetposに置き換えたり、マルチチャネルアナライザを正式にサポートしました。

Cosmo-Zのアップデートはとても簡単で、Cosmo-Zにコンソールでログインしたら、/rootに移動し、./update-cosmozというコマンドを入力するだけです。

詳しくはこちら

http://cosmoz.jp/update20200213.html

 

| | コメント (0)

2020.02.11

GOWINのGW1NR-9をバウンダリスキャンしてみた

TrenzElectronic製のGOWIN FPGAボード「TEC0117-01 」にJTAGをつないでバウンダリスキャンしてみました。

Tec0117jtag

6ピンのJ4コネクタにJTAGケーブルを接続し、

Sch1

14ピンのJ2から3.3Vを取ります。

Sch2

 

しかし、結果としてはうまくいきませんでした。

Tec0117bscan

2回に1回くらいたまに自動認識に成功することはあっても、バウンダリスキャンをしようとするとエラーとなります。

この基板にはFT2232Hが搭載されていて、このFT2232HがUSB-JTAGを兼ねているのだと思いますが、FT2232Hが出すJTAG信号をDisableにできないため、外から与えたJTAGの信号とぶつかるのだと思われます。

Sch3

ためしにFT2232Hの11番ピンにあるRESETをLに固定してみましたが、それでもだめなようです。

どうやら、MITOUJTAG用にFT2232Hを使ったUSB-JTAGのプログラムを作らないといけなさそうです。

さて、やるかな。

| | コメント (0)

2020.02.10

新しいCosmo-K-の実装完了

Kintex-7搭載のFPGAボード「Cosmo-K」の基板を改版し、実装が上がってきました。

Csk1

この基板は、Kintex-7を中心にDDR3メモリ、USB3.0、10Gbpsの光×3本、PCI Expressという構成をしています。

いろいろな機能が盛りだくさんなので、テストも大変。

やることが多すぎます。

今回の改版ではKintex-7のVCCIO_AUXという電源端子を2.0Vにするために電源を分離してレギュレータを追加しました。改版を伴う場合はいつも一発で動いてくれるかどうかで不安になります。

まずはUSB3.0の試験。

FPGAにUSB3.0とDDR3を使うテスト回路を入れ、乱数を読み書きしてDDR3メモリとUSB3.0の間のスループットを計ります。

20200210

結果は、IN方向、OUT方向ともに377MByte/sec以上を達成できました。

この速度が出ていれば、まず、USB3.0のエラーはあり得ません。

次にPCI Expressのテスト。

ホストPCから、FPGAボード上にある1GByteのメモリを全力で読み書きします。

20200210-1

書き込みが1400MByte/s、読み出しが1200MByte/sと、PCI Express Gen2 x4として納得のいく速度が出ていました。

 

最後は光ファイバのテスト。

Csk2

IBERTという試験を行います。

乱数を読み書きしながら電圧やタイミングを振ってみて、どこまでエラーなく耐えられるかを見るテストです。

20200211-6

10Gbpsの信号を通したときのアイの開きが54%~57%と、過去最高とも思える開きを実現できました。もしかするとオーバークロックすれば20Gbpsくらいいくんじゃないかと思えてくる良さです。

 

| | コメント (0)

2020.02.09

Cosmo-ZのMCA機能を復活

昨年9月にCosmo-Z用に、Webアプリ版MCA(Multi Channel Analyzer)を作っていたのですが、アップデートの手順を間違えて古いもので上書きし、全部消えてしまいました。

ローカルのgitから残骸を収集し、MCAを作る前の状態にまで復活することができたのですが、MCAのWebアプリは全損してしまったので作り直しました。

MCAというのは、こういう放射線のパルスが入ってきたときに、横軸を電圧、縦軸を頻度としたヒストグラム(スペクトラム)を作る機能です。

Mca2

上の波形はNaIシンチレータとフォトマルによるものの波形で、スペクトラムをとるとこうなります。

Mca1

いま開発しているのは、毎秒100万イベントくらいの放射線が入る高レートな環境での動作です。

 

小さなノイズまで含めると50万カウントくらいいく場合でも、

Highrate

リアルタイムにスペクトラムが取れるようになりました。

Highrate2

どんなにレートが高くても大丈夫です。

信号処理からMCAまで、すべてFPGAで実現した結果と言えます。

 

| | コメント (0)

2020.02.05

Spartan-7ボード用の箱を作る

Spartan-7ボードを出荷するにあたって、箱を作らなければなりません。

最近では、RasPiとか見てみると厚紙を折って小さな箱を作るのがトレンドのようなので、自分でもやってみました。

N式箱というものです。

箱ラクというソフトがあるので、

https://www.graphic.jp/lineup/package/hacoraku

これをインストールして作ってみました。

私のIllustratorのバージョンはCS3なので、インストールがうまくいきませんでしたが、必要そうなファイルをIllustratorのフォルダやC:\UsersのAppData配下にコピーするなどして無理やりインストールしました。

箱の作成自体は結構楽にできました。

N1

基板のサイズが72×52mmで、箱が80×60だとけっこうキツキツなので少し大きくします。

そして、真っ黒だと黒いので少し紫にしてみると・・

N2

ちょっとキモイ色になりました。

やはり、黒がシンプルでいいですね。

N3

N式箱は上の写真のように紙と紙が手をつなぐようにひっかかるので、糊付け不要で組み立てられます。

厚紙に印刷すると十分な強度になります。

 

 

 

| | コメント (0)

2020.02.04

Data2Memが動かないのでROM化ができない

MicroBlazeのデータをROM化するにはdata2memというユーティリティを使います。

data2memはexeファイルで与えるのではなく、vivadoのtclコンソールや、XSDKのxsct、Vivado HLS Tcl Shellなどから起動します。

使い方は、

data2mem -bm vivado/vivado.runs/design_1_wrapper_bd.bmm -bt vivado/vivado.runs/impl_1/design_1_wrapper.bit -bd ../sdk/spi/Debug/spi.elf tag microblaze_0 -o b download.bit

 

です。

ただ、これを実行しても

ERROR:Data2MEM:4 - Unrecognized device type in .bit file, '7s50csga324'.

と出てしまいます。

Vivado 2018.3や2019.1のXSDKには7s50の情報が入っていないようです。

1580831352_data2mem_notfound

| | コメント (0)

MicroBlazeてんこもりサンプルの出来上がり

Spartan-7用MicroBlazeのサンプルプロジェクトが出来上がりました。

1580831628_sp7_microblaze_sample

AXI QSPIというIPを追加しました。

使っているIPは、GPIO、Timer、EthernetLite、QSPI、Uartlite、MIGです。

これに対するPeripheral Test、Memory Test、lwIP echoを試しました。

1580831914_periph_test

EmacLitePolledExampleはFAILEDになりますが、lwIPのechoではDHCPが取れていて、echoサーバも動いているので、ネットワークの機能にも問題はないのだと思われます。

1580832230_echo

メモリテストはもちろんPASSです。

1580832069_memtest

下記のURLにSpartan-7 MicroBlazeサンプルを置いておきます。

https://github.com/tokuden/Spartan7/tree/master/microblaze_sample

| | コメント (0)

AXI EthernetとDMAを使ったデザインを作ってみる

XSDKにあるサンプルのPerfテストというのを動かしてみようとすると、Ethernet MAC IPが入っていないとダメだと言ってきます。

1580832320_not_available_perf

いままで使っていたのはEthernetLiteというもので、ここで必要になっているのはEthernetコアで、別物のようです。

EthernetコアはAXI 1G/2.5G Ethernet Subsystemというコアで、これはAXI DMAとセットで使うようです。

1580833551_axi_ether_sample

 

ごちゃごちゃしているので、EtherとDMAのあたりを拡大します。

1580833584_axi_ether_sample2

このデザインがどうなっているかというと、要点は4つです。

  • AXI Ethernetの出すrxdとrxcというAXI StreamをDMAのM_AXIS_S2MMとM_AXIS_STSに入れ、DMAコアのM_AXIS_MM2SとM_AXIS_CNTRLをEthernetコアのtxdとtxcにつなぎます。
  • DMAコアから4つのリセット信号が出てくるので、mm2s_prmry_reset_outをtxd_arstnに、ctrl_reset_outをtxc_arstnに、s2mm_reset_outをrxd_arstnに、s2mm_sts_reset_outをrxs_resetにそれぞれつなぎます。
  • Ethernetコアの出すmac_irq、interrupt、DMAコアのmm2s_introut、s2mm_introutはconcatで束ねてintcにつなぎます。
  • DMAコアはM_AXI_SG、M_AXI_MM2S、M_AXI_S2MMの3つのAXIバスを出してきますが、これをSmartConnectで束ねてMIGに送るか、メインのインターコネクトのSlavePort(左側)につなぎます。

 

1580834494_dma_to_mig

このようにぐるっと回して出すか、SmartConnectを使ってDMAコアの出力とメインのインターコネクトからの出力を束ねてMIGに渡します。

1580835449_dma_to_mig2

 

これで設計は問題ないはずなのですが、Generate Bitsteamの段階でbd_929b_mac_0_coreの生成が許可されていないというエラーが出てしまいます。

1580832832_licerr

XILINXのTEMACは、Vivado System Editionか何かを買えば無償で使えるそうなのですが、WebPack Editionではそのままでは使えないような感じです。

XILINX License Managerからライセンスを取得し、インストールします。

1580832807_getlic

ライセンスをインストールしたら、axi_ethernetのライセンスがHardware Evaluationになります。

1580835687_lic

一度、Reset Output Productsを行ってから論理合成をします。

これで論理合成はできてBitStreamの生成もできるのですが、残念ながら「何も」動きませんでした。実機にダウンロードしてもHelloWorldさえも動きません。

MicroBlazeがJTAGデバッグに反応しないというエラーが出て、コンソールに何も出てきません。

Hardware Eavaluationのライセンスはコンフィグしてから2~8時間動作するということなので、もしかしたらそのあたりが悪さをして、MicroBlazeが何も動作をしないのかもしれません。

AXI EthernetとAXI DMAを使う案は失敗しましたが、下記のURLにプロジェクトのソースを置いておきます。だれか挑戦してみたい人はどうぞ。

https://github.com/tokuden/Spartan7/tree/axi_ether_dma/microblaze_sample

| | コメント (0)

2020.02.03

Spartan-7のMicroBlazeでイーサネットが動いた

MicroBlazeでSpartan-7ボードのイーサネットを動かすことに成功しました。

特電Spartan-7ボードにはLANのPHYチップが乗っていて、基板上の8ピンのピンヘッダにTXD+やRXD+などが出ています。ここにパルストランス付きのLANコネクタ(例えば秋月で売っているRJLD-260TC1)をつなぐことでLANが使えるようになります。

1580842245_sp7lan

本当に直結するだけで動きます。

作ったデザインは以下のような感じです。

XSDKに含まれているサンプルプロジェクトのひな型を使うのですが、lwIPを使ったエコーサーバを動かします。AXI EthernetLiteのほか、AXI Timerも必要になります。

AXI EthernetLiteとAXI Timerの割込み出力はxlconcatで結合して割込みコントローラに入れます。

PHYに与えるRESETは、内部のaxi_reset_nをそのまま出力すればよいのですが、FPGAがコンフィギュレーションされたときに1回しかLになりません。そのためか、Peripheral Testは最初の1回だけパスします。

1580842319_sp7landesign

こうしてEcho Serverが動くようになりました。

1580842459_echoserver

XSDKのEcho serverは全く実用的ではありませんが、DHCPが動く、意外と優れものです。

少なくともLANチップが動作しているかはわかります。

| | コメント (0)

駒場に行ってきました

駒場に行ってきました。

それだけです。

Komaba

駒場の駅の広告って家庭教師ばっかりだ・・。上の写真は広告の映らないアングルで。

 

途中、渋谷駅で乗り換える際に岡本太郎の「明日の神話」という巨大な壁画を見てきました。

これってエヴァのサキエルか?と思ったのですが、エヴァが作られた時(1995年ごろ)には明日の神話はメキシコかどこかのホテルで埋もれていて表に出てきていないから庵野監督も見ていないだろうのこと。

まったく関係がないのに同じようなデザインになるとは。

 

| | コメント (0)

Spartan-7ボードのGPIOを順番にテストしていく回路

特電Spartan-7ボードには64本のI/Oがあります。

 

Sp7brd

I/Oの1本1本から順番に短いHレベルのパルスを出して、それをオシロで確認することでオープンやショートがないかを確認します。

そういうプロジェクトをGithubに上げました。

https://github.com/tokuden/Spartan7/tree/master/gpio_test

もちろん、GPIO検査の結果は正常でした。

| | コメント (0)

« 2020年1月 | トップページ | 2020年3月 »