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

2017.02.20

FPGAにおける浮動小数点の計算速度

FPGAの固定小数点の乗算であれば1クロックで動きますが、浮動小数点はどのくらいかかるのでしょうか?

以前、HLSで演算回路を作ろうとしたら、加算に11クロックかかるとかいうレポートが出てきて唖然としました。HDLで書いて、その実力を探ってみたいと思います。

sun

実験に用いた回路は下の図のようなものです。

Float_1

使ったLogiCoreは、Floating-point 5.0というもの。デバイスは、Kintex-7のXC7K160-1。浮動小数点のフォーマットは単精度です。

Float_7

設定次第で、いろいろな演算回路になります。

Float_8


作る回路は、固定小数点で入ってきたIとQを浮動小数に直して、二乗して和を取って、固定小数点に戻すというものです。これらの回路をISE14.7とCoreGenで作ります。まずはfixed→floatからです。

Float_2Float_3Float_4


レイテンシの部分を変えて、どのくらいリソース使用量が変わるかを試してみました。

latency	LUT	SLICE	DSP    WorstTime
----------------------------------
1	173	58	0
6	204	78	0

fixed2floatはレイテンシを増やしてもLUTやSLICEの使用量が増えるだけで、あまり意味はありませんでした。レイテンシ1でも250MHzで動くようなので、これは1クロックでやるべきだと思います。

sun

次は浮動小数点の乗算です。この場合は同じ値の二乗を取る回路になります。結果は、

latency	LUT	SLICE	DSP    WorstTime
----------------------------------
1	194	139	6    8.2ns 100MHz OK
2	152	81	6    4.4ns 200MHz OK
3	154	76	6    3.6ns 250MHz OK
6 162 64 6    3.6ns

となって、レイテンシ1以上であれば使用量はそれほど変化しないことがわかります。クロックを250MHzにしてImplementすると、タイミングエラーが出て、

   Source:               inst_fix2floatQ/blk00000065 (FF) 
   Destination:          inst_Qsq/blk00000030 (FF) 
   Requirement:          4.000ns 
   Data Path Delay:      8.165ns (Levels of Logic = 5)(Component delays alone exceeds constraint) 
   Clock Path Skew:      -0.022ns (0.702 - 0.724) 
   Source Clock:         adcclk_i_BUFGP rising at 0.000ns 
   Destination Clock:    adcclk_i_BUFGP rising at 4.000ns 
   Clock Uncertainty:    0.035ns 

となるので、レイテンシ1の回路の遅延は頑張っても8.2ns程度かかるということがわかります。

100MHzならレイテンシ1で計算できるのですが、125MHz以上ならばレイテンシ2は欲しいところです。

sun

浮動小数点で一番難しいのは、加減算だと思います。これもCoreGeneratorで作ります。

Float_5Float_6

条件をいろいろ変えて実験してみると、下のような結果となりました。

latency	LUT	SLICE	DSP  WorstTime
----------------------------------
1	183	74	2    15ns
2	213	105	2    7.8ns 100MHzOK
3	234	100	2    5.1ns
4 - - 2    4.7ns 200MHzOK
5 - - 2    3.9ns 6 215 90 2    4.8ns 250MHzOK 11 210 94 2    2.7ns

レイテンシ1では100MHzも通りません。100MHzで動作させるならレイテンシ2、200MHzで動作させるならレイテンシ4。250MHzで動作させるならレイテンシ6は必要です。

sun

回路全体の動作は下の図ようになりました。

Float_9

判明した結果をまとめると、以下のようになります。

one リソース使用量はレイテンシによってあまり変化しない。したがって、クロック速度が間に合えば、レイテンシを遅くする必要はない。

two 浮動小数点数の乗算には8.5nsほど。加算には14~15nsかかる。

three クロック100MHzならば乗算器のレイテンシは1でよく、200MHzならばレイテンシ2にする必要がある。

four 加算は遅く、14~15nsかかる。100MHzならばレイテンシ2、200MHzならばレイテンシ4、250MHzならばレイテンシ6は必要である。

five クロックを速くしてもレイテンシがかさむし、消費電力が増えるので、クロックは100~200MHzくらいがちょうどよい。

sun

なお、積和計算を行う場合は、加算の結果が出ないと積算もできないので、レイテンシが2ならばインターバルは2になります。加算の性能がシステム全体の性能に影響します。

今回はISEでやりましたが、HLSで作る場合でもツールにすべて任せるのではなく、どの程度のリソースと計算時間を使うかを頭の中で把握できていれば、高位合成でももっと良い回路が作れるようになると思います。

この成果をもとに、ある種の無線の回路を作ってみたところ、HLSだとインターバルに41クロックかかっていたのが、8クロックでできました。「この結果はここでは使わない」みたいなことが人間の頭ではわかるので、そういったことも含めての最適化なので、単純に5倍とは言えないのですが、最短のクロック数が何クロックであるかというゴールがわかるようになるので、HLSのディレクティブを指定するときにもやりがいが出るのではないかと思います。

これで、私も浮動小数点デビューできそうです。

| | コメント (0)

2017.02.16

Cosmo-Kの新基板が出来てきた

本日、Cosmo-Kの新基板の実装が上がってきました。

Cosmok_6pcs

Cosmo-K0が2個、Cosmo-K+が3個、Cosmo-K-が1個です。

今回の改版の大きなポイントは、DDR3メモリの配線のパターン変更です。

旧基板は、FPGAから2個のDDR3メモリへの配線がT型に分岐していて、しかも片側にしか終端抵抗がついていないという間違った設計になっていました。そのため、1000MHzまでしか動作することができませんでした。

正確に言えば、終端抵抗の付いている方は1600MHzまでいけるのですが、終端抵抗の付いていないほうが1000MHzどまりでした。

オシロで波形を見ると、1.5V振幅のSSTLなのに2V近い反射が見えるなど、ひどいものでした。

sun

そこで、今回の改版では一筆書きのようにFPGAからDDR3メモリへアドレス・コントロール線を配線し、末端に終端抵抗を付けました。

その結果、1600MHzでのアクセスができるようになり、DQSを見ても綺麗に800MHzでトグルしているのがわかります。

Dqs

sun

それから、QSFP+の40Gbpsの信号を4本の10Gbpsにバラして、1本ずつIBERT試験も行いました。

Ibert_1

ちゃんと10Gbpsでリンクアップしています。もちろん、エラーは出ません。

バスタブカーブを描かせてみると、43~50%も開いています。

Ibert_2

アイが50%開いているということは、20Gbpsで0%になると考えていいのでしょうかね。15Gbpsくらいまではいけるのではないかと思えてきます。

少し時間をかけて、2次元のバスタブ試験というものやってみました。

Ibert_3

まぁ、なんというか、完璧に近い性能が出ているのではないでしょうか。

Cosmo-K+は、40Gbpsで通信できます、と胸を張って言えます。

あとは、ブラケットです。ブラケットがないと、PCIeのスロットに挿したとき、がたがたしてしまので、大変危険です。(PCIeのスロットには12Vが来ているので・・)

ブラケットは金属加工業者に特注で作ってもらっていますが、あと1週間くらいかかる見込みです。

とりあえずはEXPARTAN-6Tのブラケットを削って代用しています。

Bracket

そんなこんなで、早速、Cosmo-K+を2台、出荷しました。

サンプルデザイン等が出そろうのは、来週になりそうです。

| | コメント (0)

2017.02.15

Cosmo-Zのアクリルケース入り

納品用のCosmo-Zをアクリルケースに納めました。

1つ目は18bit ADコンバータで拡張されたCosmo-Zです。

Csz18_1

Csz18_2Csz18_3

性能はなかなかのもので、無信号時のノイズは±5LSB程度(156μV程度)でした。

Cosmoz18_3

正弦波を入れてFFTでスペクトラムを見ても、歪率は-80~-90dBは行っていそうです。

sun

もう一つは、全LEMOコネクタ化されたCosmo-Zです。

Cosmoz_lemo_1

Cosmoz_lemo_2

LEMOコネクタは、やはり抜き差しがしやすいですね。

サクサクという感覚がたまりません。

| | コメント (1)

2017.02.14

ZYNQ UltraScale+のボードをさらに輸入

ZYNQ UltraScale+のボードをどんどん輸入しています。

Te0808

下記のオンラインショップから購入できます。

https://shop.tokudenkairo.co.jp/shopping/detail.php?shpdi=TE0808

(為替レートで少し変動するかもしれませんが)定価で販売しています。

輸入の手数料や国際配達代、海外送金手数料などは要りません。

日本円で取引。送料無料。在庫があれば即納。代引きも可。

大学・官公庁には掛け売り対応します。

見積書、納品書などの書類も発行します。

どうぞよろしくお願いします。

| | コメント (0)

2017.02.13

特電からのバレンタイン基板チョコを送りました

ヴァンアレン帯デー企画として、今年も基板チョコを送りました。

題して「基板の名は&トランプ」チョコ。

ホワイトチョコレートの基盤(原文ママ)に、食用インクで印刷してあります。

Choko1

図柄はこんなのです。

Choko5Choko4

これをスタッフ総出で箱に詰めて、

Choko2

郵便で発送しました!

Choko3

お送りしたのは、今年に入ってから、特電から何かをご購入していただいた方で、かつ、代理店(商社)ではない方です。お送りした総数は50名ほどでした。

関東の方には、2月14日に届くはずです。届いた方は、ぜひ、TwitterとかFacebookで紹介していただけると嬉しいです。

お楽しみに。

happy01

| | コメント (0)

2017.02.09

ZYNQ UltraScale+のボードを輸入

ZYNQ UltraScale+のボード「TE0808」を入荷しました。

正確には、モジュールの「TE0808-03ES2 UltraScale+ Module (ES2)」と、ベースボード「TEBF0808-04」を入荷しました。

Te0808

ZYNQのモジュールは、XCZU9EG-1FFVC900 ES2というFPGAが乗っていて、64bit接続のDDR4メモリが2GByteと、ギガビットトランシーバはGTRが4つ、GTHが16個付いています。

Te0808_up

それでいて52×76mmに納まっている、恐ろしい密度の基板です。

また、ベースボードはMiniITX形状で、パソコンのマザーボードのようにUSBコネクタやHDMIコネクタ Displayportも出ています。USBはUSB3ホストだそうです。また、SFP+が2つと、16レーンのPCI Expressまで付いています。

Te0808base

もはやZYNQでできたパソコンですね。

Te080803es2_0_600x600Tebf080804_0_600x600

実は、ZYNQでできたパソコン(のようなもの)もあるのです。下の写真はTE0808スタータキットといいます。

Zynqpc

今回の輸入した分は販売先が決まっているのですが、ご要望があればどんどんお取り寄せいたします。

下記のオンラインショップで販売します。

https://shop.tokudenkairo.co.jp/shopping/detail.php?shpdi=TE0808

在庫があれば即納ですが、今は在庫がないので、納期1~3週間程度です。

すでに次のオーダーも入れています。その時の為替レートにもよりますが、「定価」で販売しますので、どうぞよろしくお願いします。

| | コメント (0)

2017.02.06

DDR3 DIMMのアクセス不具合の原因を瞬時に発見

Kintex-7にDDR3 DIMMを接続している装置があるのですが、不具合が生じたとのことで、検査依頼が来ました。

この装置は特電製なので、USB3.0からDDR3メモリの読み書きができる例のコアが入っています。そこで、USB3.0を通じたDDR3の読み書きテストをしてみたところ、確かに16384バイト以上のバーストアクセスでエラーが出ています。

今回はDDR3 DIMMを使っているので、データバスは64bitです。8192バイトまではアクセスできるので、A10あたりが切れているのかな・・と思ったのですが、実際の基板でそれを確かめるのは結構大変です。

なぜならば、FPGAとDDR3 DIMMとの接続を調べるだけのために、わざわざFPGAにテスト用の回路をプログラミングするのはとても面倒だからです。

sun

そんなとき、MITOUJTAGというソフトを使うと便利です。MITOUJTAG(みとうジェイタグ)はJTAGバウンダリスキャンを活用するソフトなので、FPGAを書き換えることなく、I/Oの端子だけを自由に操作できます。

画面に表示されたKintex-7の絵を見ながら、マウスクリックで操作したい端子をクリックします。

Ddr3buzz

MITOUJTAGの2.9あたりからは、BUZZ機能といって、クリックした端子から100Hzくらいの矩形波を出す機能を付けました。

Ddr3_buzz2

これを使うと端子の状態が自動的にHLHLHL・・・とチカチカするので、DDR3のソケットにオシロのプローブを当てておけば、問題のある個所が瞬時にわかります。

Ddr3_conn


実際にやってみると、BA0やA15、RAS、CASなどの端子は1.8Vくらいの振幅でトグルするのですが、

Ddr3_ba0

A10の端子だけは、なぜか、振幅が異常に小さいという結果になりました。

Ddr_a10

MITOUJTAGを使ったら、あっという間にDDR3メモリの不具合の原因が発見できました。

もし、MITOUJTAGを使わなかったら、どれだけ面倒なことになっていたでしょう。

| | コメント (0)

2017.02.05

Artix-7のDDR3メモリで1066MHz動作

あるお客様から、Artix-7ボードのDDR3メモリで1066MHz動作させるとビットエラーが出るという、ご連絡を受けました。

A7ddr3


特電の用意しているUSB3-AXI-DDR3のリファレンスデザインは、800MHzで動作させています。このリファレンスデザインのMIG設定を変えて試したみたところ、確かに1066MHzにするとエラーが出ます。

Artix-7は、スピードグレードが3段階あって、-1と-2は800MHzまで、-3は1066MHzまで対応できるはずです。Artix-7ボードを最初に作ったときにはMicron製のメモリを使っていたのですが、いつしか入手できなくなったため、Alliance Memory社のDDR3を使うようになりました。Alliance Memory社のDDR3が800MHzまでと書かれていたので、それが原因かと思ったのですが、どうやら800MHzまでというのはクロックであって、データレートは1600MHzまでという意味でした。

つまり、FPGAもメモリも1066に対応しています。

そこで、昔作ったMIGのサンプルデザインを呼び出してきて、試してみると、1066MHzでも動きました。

動いているときの様子をオシロで見てみました。

まずは、クロック。

Ddr3_clock

綺麗な533MHzが見えています。

次は、DQSです。

Dqs_1Dqs_2

おそらく読み書きで波形が違うのですが、こちらも綺麗です。

単純なMIGアプリでは、波形的には全く問題ありませんでした。

では、なぜビットエラーが出たのかというと、おそらくAXIの部分での速度変換が原因です。

XILINXのMIGは、DDR3のデータレートの1/8の速度のクロックでアクセスします。DDR3が1066MHzならば、MIGのユーザポートのクロックは133MHzになります。

特電のAXI-USB3コアは、データレートが100MHzなので、そこでのミスマッチが原因だと思います。Vivadoで論理合成したときにもタイミングエラーが出ていました。

Timing_error


本当はAXIインタコネクトでクロック変換ができるのだと思いますあ、まだ上手くいくデザインを書いたことがありません。

| | コメント (0)

2017.02.03

FIRフィルタの実機テスト

Cosmo-ZにFIRフィルタを入れて、実機でテストしています。

まずは、生の信号を見てください。

Firj_1_2

これは、ある高い周波数の正弦波をCosmo-Zでアンダーサンプリングし、デシメーションを行なった後、IQ検波した信号です。ADCの周波数と正弦波の周波数がずれているため、うなりの成分が位相が90度ずれた2つの正弦波として見えています。

信号の説明はともかく、ノイズが乗っています。

これに、帯域300kHzのFIRフィルタを通してみました。

Firj_2

パッと見、ノイズが減っています。

一部分を拡大してみますと、

Firj_3

28クロックほど遅延し、ノイズがかなり平滑化されているのがわかります。

周波数で見てみると、300kHzあたりで綺麗にカットオフされているのがわかります。

Firj_4

カットオフを600kHzと1.2MHzに変えてみると、

Firj_5Firj_6

このように、狙ったとおりに帯域が広がっていくのがわかります。

sun

係数を変えればHPFにもなります。

Firj_10

HPFを通すと、時系列でみたときの1つ1つの振幅がめちゃめちゃ協調されますね。

Firj_11

sun

最後にバンドパスフィルタを試してみます。

FIRフィルタの設計は、「石川高専 山田洋士 研究室ホームページ」のページが便利です。望みの特性を入力すると、オンラインでFIRの計数を生成することができます。

41タップ、0.2~0.4ωc、Hamming窓のBPFを生成し、各係数を33554432倍してCoreGenに入れます。CoreGenで表示された周波数特性はこんな感じでした。

Firj_7

実際に動かしてみると、

Firj_8

黄色いのが入力信号、青が出力信号ですが、リップルの数も含めてぴたりと一致した特性が出ています。これが面白いものです。

BPFを通った信号というのは時系列でみると、どうしてもよくわからないものです。

Firj_9

sun

CoreGenでFIRを作るとき、係数が動的に変えられるようにしてあるので、いろいろなフィルタを試すことができて、なかなか面白いものです。

| | コメント (0)

2017.02.02

XILINXのCoreGenでFIRフィルタを作る

FIRフィルタというのがあります。乗算と加算を繰り返してLPFやHPFを作るディジタルフィルタの代表的なやつです。

で、XILINXユーザなら、CoreGeneratorを使ってディジタルフィルタを簡単に作れるはずなのですが、使い方や精度がよくわからないのでシミュレーションしてみました。

結果としては、XILINXのFIRフィルタは25bit精度の計数が利用できて、レートの変換も自由自在という素晴らしいものでした。

sun

FIRは、入力と、遅延させたものにいろいろな係数をかけて積和したものです。

原理的には、こういう回路なのですが、

Fir1

これを真面目に作ると和の部分が非常にたくさんの値を足し算しなければならないので、大変なことになります。

そこで、いろいろなアーキテクチャが用意されています。

sun

フィルタの型

まず、Transposed Direct Formというアーキテクチャです。乗算と遅延の順序が逆になっています。これなら加算が重くならないので楽にできそうですね。

Fir3

デフォルトは、Systolic Multiply-Accumulate(シストリック:収縮の意味)というアーキテクチャになっています。SystolicなFIRというのは

Fir2

という構造をしています。上側の遅延が2段になっていて、下側の遅延が1段です。

他にはSerial Distribute Arithmetic型というのもあるそうですが、詳細は割愛します。

実装する型は、この画面で選択できます。

Fir4


それぞれの型でどういう利点があるのかを調べたところ、基本的にはSystolic型が最も優れていて何でもできます。

FIRはたくさんの乗算器を使います。FIRの計数は対照的な形をしていることが多いのですが、Systolic型を選べば対称性を利用してフィルタの次数の約半分の数の乗算器で実装できます。Transpose型では、対称性を利用した乗算器の削減ができないようです。

sun

フィルタの計数

CoreGenのFIRの画面で、最初に入力するのがフィルタの計数です。ここに入れる値で、次数と、ビット演算の精度が決まります。

フィルタの計数というのは、こういう感じの数値です。sync関数にしておけば、それなりのLPFが作れます。下の図は0.19ωcがカットオフのsinc関数です。

Fir6

上の図は41次のFIRのものですが、シミュレーションしていてよくわからなくなるので、動作テストのために中央の7個の数字だけでやってみます。

値を32767倍して、

Fir5_2

こんな感じです。すると、画面左側に周波数特性が表示されます。

Fir7_2

なんとなく、0.19のあたりでカットオフになっていますね。

この係数を入力したら、その係数の絶対値をすべて足してみてください。17858+25520+30856+32767+30856+25520+17858=181235なので、これを表現するには18bit必要です。

CoreGenは入力信号数+18bitの内部精度で演算しようとします。入力が16bitなら生の出力は34bitになります。(※切り捨てたり丸めたりして必要なビット数だけを取り出すオプションはある)

また、7シリーズの乗算器は18bit×25bitなので、計数の精度をケチっても、大きくとっても、コストは一緒です。25bitまでは乗算器のコストは追加でかかりません。また、加算部分のビット数は(たぶん)48bitあるので、そう簡単に溢れることもありません。

必要な乗算器の数=係数の数ですが、対照的にすれば約半分になります。(奇数のときには(次数+1)/2になる)

重要なことは、

  • 計算は整数で行われる。精度落ちしない。出力のときに切り捨てられる。
  • 係数の絶対値の総和を入れるのに必要十分な精度が自動的に選択される
  • 係数を25bit精度まで高めてもコストはかからない
  • 係数を対称的にすると、乗算器の使用量が約半分になる
  • 内部の演算精度を上げてもコストはかからない

です。

乗算器の数が増えないように注意しながら係数の精度を上げていったほうが良いでしょう。

sun

係数の動的変更

XILINXのFIRの素晴らしいとことは、係数を動的に変更できるところです。基本的には、coef_ldを'1'にすると係数受け入れモードになって、coef_weを'1'にしたときにcoef_dinが書き込まれます。

Use Reloadable Coefficientsをチェックすると、この機能が使えるようになります。

Fir8

注意しなければならないのは、最初に入力した係数を「対称的」にして、Coefficient StructureをInffered(推論)にすると、乗算器を減らしたアーキテクチャで作られてしまいます。こうなると、非対称な係数のフィルタにはならなくなります。

どんな係数でも再設定できるフィルタを作るには、Coefficient StructureをNon Symmetricにしておきます。もちろん、Non Symmetricにしておいて実際には対照的な係数を設定しても問題ありません。

また、Reloadableにすると、演算精度は入力ビット数+係数のビット数+log2(次数)になります。7次のFIRで、入力ビット数が16bit、係数が16bitなら、35bitになります。つまり、オーバーフローすることはありません。

係数を動的に変更するときのシミュレーション波形はこんな感じです。

Fir9_2

なお、係数はフィルタの次数の数だけ入れます。今回は7次のFIRなので、

17858,25520,30856,32767,30856,25520,17858

と7個分の値を入れています。この値は後ろから入れます。つまり、この7個の数字はa(6),a(6),a(5),a(4),a(3),a(2),a(1),a(0)と解釈されます。

対称フィルタにした場合は、a(3),a(2),a(1),a(0)の順に中央の値から順に入れます。対称フィルタの場合は係数の数が少なくなるので注意してください。

sun

演算の確認

それではインパルス応答を入れてみましょう。

ずっと0の信号を作って、ある1クロックだけ32767の信号を入れてみます。

11クロック遅れて、FIRの計数の値がそのまま出てきました。

Fir10

もちろん、どんな値を入れてもオーバーフローはしません。十分なビット精度が確保されているためです。

sun

FIRの計数はどうやって作ればいいのか

Excelを使ってSinc関数を作り、それを適当な係数をかけて整数にすればよいでしょう。

Fir11

上の表の計数だと、0.19ωcに設定してあって、特性は下の図のようになります。

Fir12

Reloadableにすると、係数が17bit精度、41タップ(6bit分)なので、39bitの精度が必要になります。

係数固定ならば、係数の絶対値の総和が299628で19bit必要になるので、35bitの精度となります。

この35bitという精度は、絶対にオーバーフローしないような安全なビット幅なので、実際に出力される値は3FFF8000程度が最大値になります。したがって、計算結果の下位19bitを切り捨てると、かなり小さな値しか出てこないことになります。

したがって、通常想定する大きさのパルスが入力されたときの最大値をあらかじめ見当を付けておき、途中の何ビットかを取り出すようにしないと、勿体ない結果となってしまいます。

このあたりは今後追求していきたいと思います。

sun

まとめ

  • 演算は整数で行われる
  • 演算結果を単純に切り捨てると、普通は結果がかなり小さくなる
  • 係数は25bitまではコストの増加はない
  • 対称的なSystolicフィルタがお得
  • Reloadableにするときには、フィルタの型によって係数を入れる順序が変わる。
  • Reloadableにすると、演算精度がオーバーフローしないように増える。

| | コメント (0)

2017.02.01

基板チョコレートを作りました!

ホワイトチョコレートに食用インクで基板の絵を描いた「基板チョコレート」を作りました!!

Choco2

元の絵はこんなのです。

Choko3

空から落ちてきているのは、彗星ではなく、QSFPの光ファイバです。

かなり高精細に印刷できているので、食べるのが惜しいですね。

こんなチョコレートを60個ほど作りました。

Choco1

今年の1月以降に、特殊電子回路㈱の製品をお買い上げいただいた方にプレゼントしたいと思います。(送付対象者が60名を超えてしまった場合は、先着とさせていただきます。ご了承ください。)

発送は2月10日ごろを予定しています。

届いたら、是非、オフィスや研究室の皆さまに見せてください。

お楽しみに。

| | コメント (1)

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