ZYNQ搭載 ADCボード「Cosmo-Z」>開発日記>2014年9月

2014年9月

ZYNQがPCI Express Gen2でリンクアップした

2014.09.25

開発中のZYNQボード「Cosmo-Z」が、PCI Express Gen2でリンクアップしました。

Pciegen2_1

Cosmo-Zは、パソコンのPCI Expressアドインカードではないので、パソコンには直接は挿さりません。パソコンとつなぐには、PCI Express External Cablingというものを使います。

PCI Express External Cablingというのは、PCI Expressの信号をそのままケーブルで引き出したものですが、Gen2対応でx1で市販されているものは見つかりませんでした。

そこで、EXPARTAN(Spartan-6LXTのFPGA評価ボード)の生基板を利用して作りました。

Pciegen2_2

このような形で、パソコンのカードエッジとケーブルを直接、ラッピングワイヤでつないでいます。

このラッピングワイヤに5Gbpsの信号が流れるのですから、わくわくしますね。

 

なお、XILINXではREFCLKはコンデンサでカップリングした後で与えなければならないようです。バイアスすなわち直流成分はREFCLKの端子から出てくるので、パソコンのマザーボードとの間はコンデンサで切らなければなりません。

 

さて、ZYNQにPCI Expressのデザインを入れて、内蔵EndPointをリセットしたときのコアの出力する波形を見てみましょう。

ZYNQのPCI Express内蔵EndPointのコアでは、リセット後はPCI Express Gen2であっても2.5Gbps、つまりGen1の速さで動くようです。

コア自身では5Gbpsになりません。

Gen2の速度にするには、ユーザロジックが、コアの入力信号の、pl_directed_link_speedを'1'にして、pl_directed_link_change[1:0]を"10"にします。

Pciegen2_3

すると、コアの出すLTSSMの値が16 (L0)から、1C(Recovery Rcvrlock)→1D(Recovery Rcvrcfg)→1E(Recovery Speed_0)→1F(Recovery Speed_1)へと変化しています。

そして、コアのcfg_link_status_current_speed[1:0]が"01"から"10"になります。cfg_link_status_current_speedの意味は後述します。

Pciegen2_4


それからしばらくして、LTSSMがいろいろ動いた後、1D(Recovery Rcvrcfg)→20(Recovery Idle)→16(L0)と動きます。L0というのが通常動作状態です。

L0に戻るときに、コアが出力するpl_directed_change_doneという信号がアサートされるので、これを見てユーザロジックはpl_directed_link_speedを'0に戻し、pl_directed_link_change[1:0]を"00"に戻します。

cfg_link_status_current_speed[1:0]が"10"になっているということは、5Gbpsで動作していることを示しています。このステータスはPCI Express機能構造体の値で、01が2.5Gbps、10が5Gbpsを示しています。

これでめでたしめでたしです。

さて、Gen2ではない、普通の市販のPCI Express Cabling拡張ボードを使った場合はどうなるでしょうか。例えば、このようなボードです。

Extboards

こういったボードはPCI Express用のバッファが入っています。たいていはPericom社のバッファですが、上記のx1のものはGen1しか対応していないので、5Gbpsの周波数帯域はないでしょう。

やってみました。

リンク速度のスピードアップの指示を出すところまではコアの挙動は同じです。

Pciegen2_5

doneがアサートされたときの速度が"01"を示していて、2.5Gbpsのままであることがわかります。

Pciegen2_6


このようにGen2にはなりませんでした。

バッファを入れなくても、直結で十分なようです。

ZYNQのGTXが動いた

2014.09.21

Cosmo-Zで、ZYNQのGTXを動かすことができました。

GTXというのは、FPGAに内蔵された高速シリアルトランシーバで、6Gbpsの速度で動作します。(FPGAのパッケージとスピードグレードによっては約12Gbpsまで)

今日はこの動作を試してみました。

まず、基板上のコネクタの部分にラッピングワイヤを2本通します。

Gtx6g

6GbpsならこのくらいでOK。

そして、CoreGenで、7 Series FPGAs Transceivers Wizardを起動します。

Gtx6g_1

 

最初の設定項目は、クロックです。まず、Line Rateを6Gbpsにして、Reference Clockを150MHzにします。

そして、絵の部分のGTX_X0Y2を押して選択し、TX QuadPLL、RX Qual PLLを選択します。また、Use GTX X0Y2をチェックします。TX Clock SourceはREFCLK1 Q0を選びます。

これで、REFCLK1から入った150MHzのクロックがQPLLに入って、GTX2に配線され、6Gbpsで動くようになります。

Gtx6g_2

次の画面では、データバスの幅と、8b/10bなどのエンコード方法を決めます。

6Gbpsで動かす場合はバス幅を32bitの150MHzにします。8b/10bを入れると内部バスは40bitになります。

16bit 20bitの設定だとデータレートが300MHzになって、これでも動かないことはないのですが、いろいろ回路設計に制約が生じます。

Gtx6g_3

TXUSRCLKの設定は上の図のとおりにします。

 

次の設定画面はとても重要です。この中のRXSLIDEはチェックしてはいけません。

Gtx6g_4

高速シリアル通信を受信したときに、データバスが16bitや32bitの場合、カンマ(K28.5)の入るバイトを最下位か最上位に合わせたいものです。

Spartan-6までは自力でフリップフロップを組み合わせて、カンマが最下位または最上にアラインメントされるようにずらしていたのですが、7シリーズではその必要はないようです。

上の図ののように、Align to Four Byte Boundariesと設定すれば、カンマは必ず最下位バイトにアラインメントされます。

これを手動でやるのがRXSLIDEだと思うのですが、RXSLIDEをチェックすると、受信データが正しく受け取れなくなります。どうやら、RXSLIDEをチェックすると、CoreGenの作るソースでRXMCOMMAALIGNENとRXPCOMMAALIGNENという信号がLに固定されてしまうようです。

Gtx6g_5

これが原因だと思うのですが、受信したデータがすぐに化け化けになって読み取れなくなります。

RXSLIDEのポートを外に出さないようにしたら、うまくいきました。7シリーズではカンマを4バイト境界に自動的に合わせるしくみがあるのでそれを使いましょう。

そこから先の設定項目で特に難しいものはありません。

さて、実際に動作させてみました。QPLLのLOCKED信号で、TXとRXをそれぞれリセットします。RXRESETDONEがアサートされたら、TXUSERRDYをアサートします。

Gtx6g_6

TXUSERRDYをアサートしてから、およそ2.8μ秒で受信データが安定するようになりました。このくらいの時間がかかるようです。

6Gbpsで送受信するには、FPGA内のデータは32bit 150MHzとなります。疑似乱数のXOR Shiftを使って乱数を送信し、受信し、エラーが起きたらRXERRORという信号を出すようにしました。

起動直後はカンマばかりを送信し、しばらくしてからデータを送ります。データを送り始めたら128周期でカンマを送ります。

Gtx6g_7

送受信間の遅延は168nsくらいでした。

拡大してみると、ちゃんとXorShiftの系列になっていました。

Gtx6g_8


というわけで、6GbpsでのGTXの動作確認ができました。

この記事がGTXで悩んでいる方の役に立てば幸いです。

Power Over Etherの動作を確認

2014.09.17

ZYNQ搭載のADCボード「Cosmo-Z」は、PowerOverEther(以下PoE)で給電することができます。

PoEというのは、Cat5eのイーサネットケーブルを通じて電力を供給するもので、IP電話やネットワーク監視カメラなどを想定した給電方法です。ACアダプタを別途つながなくてもよいのでとても便利です。

Cosmo-Zは人が容易に近づけない場所で放射線や宇宙線などを計測することを想定しているので、PoEができると便利です。

本日、PoEの動作が確認できました。

Cosmozpoe

PoEの原理はとても簡単です。LANケーブルの4つの対の間はそれぞれトランスで絶縁されているので、PoEハブはその4本の対の間に直流を供給しています。

ただし、PoEに対応していないデバイスに電力を供給すると危険なので、ハブはデバイスがPoEに対応しているかどうかを調べています。

ハブがデバイスの存在を調べる方法はとても簡単で、それぞれの対の間に25kΩのシグネチャ抵抗があるかどうかを調べているだけです。だから、こんな治具を作っただけでもPoEデバイスとして認識してくれます。

Poe_con

この実験では電力供給ハブとしてNETGEAR Inc.のGS108PEを使っています。25kΩというのは、意外と適当でもよさそうです。

 

さて、Cosmo-Zの話に戻りましょう。

PoEは標準的には48Vで供給してきますので、そのままではFPGAに供給できません。ですから、PoEを受電するにはPoE専用のスイッチングレギュレータICを使います。

次の図は、実際にCosmo-Zで受電したときのイーサネットケーブル上の電圧波形です。

Poe_proto

①のDetectionのフェーズでは、ハブは2.8~10Vの間の電圧をかけて電流を測ってきます。ここで測った25kΩの抵抗が挟まっているかどうかを探ってきます。実測では下側が4.38V,上側が6.62Vでした。

②のClassificationのフェーズでは、ハブは15.5~20.5Vの電圧をかけて、流れる電流を測ります。その電流によってデバイスのクラスを決定します。

  • 0~4mAならばクラス0で、最大12.95W
  • 9~12mAならクラス1で、最大3.84W
  • 17~20mAならクラス2で、最大6.5W
  • 26~30mAならばクラス3で、最大12.95W
  • 40mAならばクラス4で、最大30W

です。

Classificationが終了すると通電開始です。PoEは44V~57Vを供給するのでスイッチングレギュレータICで5Vに直して使います。

Cosmo-Zは、LinearTechnologyのLTC4267CGN-3を使いました。LTC4267はクラス4にも対応しているそうなのですが、現時点ではクラス3までしか使ってはいけないそうで最大12.95Wです。つまり、5Vでは2A近くの電流が取り出せます。

現在、Cosmo-Zの消費電力は5Vで0.7Aくらいですから、まだまだ余裕がありそうです。フォトマルのHigh voltageくらい作れるかもしれませんね。

ZYNQのXC7Z030でPCI Expressが動いた!

2014.09.06

ZYNQ搭載のADCボード「Cosmo-Z」で、PCI Expressが動くようになりました。

Cosmo-Zは、PCI Express External Cablingというケーブルを使ってパソコンとPCI Expressでつなぎます。

Zynq_pcie1

非常にマイナーなケーブルなのですが、PCI Expressの純正な規格です。PCI Expressの信号線をケーブルでそのまま引っ張り出すものです。

Cosmo-ZのZYNQはXC7Z030なので、ギガビットトランシーバとPCI Express Endpointハードウェアマクロを内蔵しています。だから、すぐにでもPCI Expressが動かせるはずなのです。

で、CoreGenでPCI Express EndPointを作って実際にやってみました。

注目するのはLTSSMの値です。LTSSMというのは、PCI Expressがリンクアップを管理するステートマシンです。下のような遷移をたどってL0ステートに達すればリンクアップ完了というものです。

Zynq_pcie5

実際にやってみると、00→02→04という経路をたどって・・

Zynq_pcie2

その後、04→05→0B→0C→0D→0E→0F→10→11→15→16となりました。

Zynq_pcie3

LTSSMの意味はXILINXのug477_7Series_IntBlock_PCIe.pdfに書かれています。

Zynq_pcie6

  • 0: Detect Quiet
  • 2: Detect Active
  • 4: Polling Active
  • 5: Polling Configuration
  • B: Configuration Linkwidth, State 0
  • C: Configuration Linkwidth, State 1
  • D: Configuration Linkwidth, Accept 0
  • E: Configuration Linkwidth, Accept 1
  • F: Configuration Lanenum Wait
  • 10: Configuration Lanenum, Accept
  • 11: Configuration Complete x1
  • 16: L0

という経路で遷移したことがわかります。

その後、どんなコンフィギュレーションパケットが流れたかを見ることはできないのですが、Windows PCでは、VID=1BC8、DEVID=1068、ClassCode=110000のデバイスとしてはっきりと認識されました。

Zynq_pcie4

VID=1BC8というのは、特電のベンダIDです。

ということで、ZYNQのPCI Expressが認識されました!

ZYNQのGTXを動かす(1)

2014.09.06

今週はZYNQのGTXを動かそうとして頑張っていました。

GTXを動かすには、まずGTXの中にあるPLLを動かさなければなりません。PLLには、チャネルごとにあるCPLLというものと、4つのチャネルを束ねる「クワッド」にあるQPLLというものがあります。

クワッドPLLは内蔵LCタンク回路で発振させているらしいのでジッタが少ないとかなんとか。

このどちらのPLLを使ってもいいのですが、どうもうまく動いてくれませんでした。

PLLを使う前にリセットをかけるのですが、ロック信号がどうしてもアサートされませんでした。それで1週間ほど悩んできたのですが、ついに謎が解けました!

原因は、MGTAVCCという電源には1.0Vを与えなければならないところを1.8Vを与えていたことでした。

V10err
 

なんて恐ろしい・・coldsweats02

でも、壊れていなかったみたいです。よかった。

 

そんで、PLLのロック信号を見てみました。

クワッドPLLがロックするまでの時間は180μ秒くらいでした。

Qpll_lock

チャネルPLLがロックするまでの時間は32μ秒くらい。

Cpll_lock

 

クワッドPLLのほうがロックするまでの時間は長いようです。

各PLLをリセットしてから、FBLOSTなどの信号が出ている時間は30μ秒くらいでした。

Cqpll_unlock


これで、ようやくXILINX 7 SeriesのGTXを使った実験に進むことができます。

 

 

 


© 2015 TokushuDenshiKairo Inc. All rights reserved