開発中のZYNQボード「Cosmo-Z」が、PCI Express Gen2でリンクアップしました。
Cosmo-Zは、パソコンのPCI Expressアドインカードではないので、パソコンには直接は挿さりません。パソコンとつなぐには、PCI Express External Cablingというものを使います。
PCI Express External Cablingというのは、PCI Expressの信号をそのままケーブルで引き出したものですが、Gen2対応でx1で市販されているものは見つかりませんでした。
そこで、EXPARTAN(Spartan-6LXTのFPGA評価ボード)の生基板を利用して作りました。
このような形で、パソコンのカードエッジとケーブルを直接、ラッピングワイヤでつないでいます。
このラッピングワイヤに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"にします。
すると、コアの出す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の意味は後述します。

それからしばらくして、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拡張ボードを使った場合はどうなるでしょうか。例えば、このようなボードです。
こういったボードはPCI Express用のバッファが入っています。たいていはPericom社のバッファですが、上記のx1のものはGen1しか対応していないので、5Gbpsの周波数帯域はないでしょう。
やってみました。
リンク速度のスピードアップの指示を出すところまではコアの挙動は同じです。
doneがアサートされたときの速度が"01"を示していて、2.5Gbpsのままであることがわかります。
バッファを入れなくても、直結で十分なようです。
ZYNQのGTXが動いた
2014.09.21
Cosmo-Zで、ZYNQのGTXを動かすことができました。
GTXというのは、FPGAに内蔵された高速シリアルトランシーバで、6Gbpsの速度で動作します。(FPGAのパッケージとスピードグレードによっては約12Gbpsまで)
今日はこの動作を試してみました。
まず、基板上のコネクタの部分にラッピングワイヤを2本通します。
6GbpsならこのくらいでOK。
そして、CoreGenで、7 Series FPGAs Transceivers Wizardを起動します。
最初の設定項目は、クロックです。まず、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で動くようになります。
次の画面では、データバスの幅と、8b/10bなどのエンコード方法を決めます。
6Gbpsで動かす場合はバス幅を32bitの150MHzにします。8b/10bを入れると内部バスは40bitになります。
16bit 20bitの設定だとデータレートが300MHzになって、これでも動かないことはないのですが、いろいろ回路設計に制約が生じます。
TXUSRCLKの設定は上の図のとおりにします。
次の設定画面はとても重要です。この中のRXSLIDEはチェックしてはいけません。
高速シリアル通信を受信したときに、データバスが16bitや32bitの場合、カンマ(K28.5)の入るバイトを最下位か最上位に合わせたいものです。
Spartan-6までは自力でフリップフロップを組み合わせて、カンマが最下位または最上にアラインメントされるようにずらしていたのですが、7シリーズではその必要はないようです。
上の図ののように、Align to Four Byte Boundariesと設定すれば、カンマは必ず最下位バイトにアラインメントされます。
これを手動でやるのがRXSLIDEだと思うのですが、RXSLIDEをチェックすると、受信データが正しく受け取れなくなります。どうやら、RXSLIDEをチェックすると、CoreGenの作るソースでRXMCOMMAALIGNENとRXPCOMMAALIGNENという信号がLに固定されてしまうようです。

これが原因だと思うのですが、受信したデータがすぐに化け化けになって読み取れなくなります。
RXSLIDEのポートを外に出さないようにしたら、うまくいきました。7シリーズではカンマを4バイト境界に自動的に合わせるしくみがあるのでそれを使いましょう。
そこから先の設定項目で特に難しいものはありません。
さて、実際に動作させてみました。QPLLのLOCKED信号で、TXとRXをそれぞれリセットします。RXRESETDONEがアサートされたら、TXUSERRDYをアサートします。

TXUSERRDYをアサートしてから、およそ2.8μ秒で受信データが安定するようになりました。このくらいの時間がかかるようです。
6Gbpsで送受信するには、FPGA内のデータは32bit 150MHzとなります。疑似乱数のXOR Shiftを使って乱数を送信し、受信し、エラーが起きたらRXERRORという信号を出すようにしました。
起動直後はカンマばかりを送信し、しばらくしてからデータを送ります。データを送り始めたら128周期でカンマを送ります。
拡大してみると、ちゃんとXorShiftの系列になっていました。
この記事がGTXで悩んでいる方の役に立てば幸いです。
Power Over Etherの動作を確認
2014.09.17
ZYNQ搭載のADCボード「Cosmo-Z」は、PowerOverEther(以下PoE)で給電することができます。
PoEというのは、Cat5eのイーサネットケーブルを通じて電力を供給するもので、IP電話やネットワーク監視カメラなどを想定した給電方法です。ACアダプタを別途つながなくてもよいのでとても便利です。
Cosmo-Zは人が容易に近づけない場所で放射線や宇宙線などを計測することを想定しているので、PoEができると便利です。
本日、PoEの動作が確認できました。
PoEの原理はとても簡単です。LANケーブルの4つの対の間はそれぞれトランスで絶縁されているので、PoEハブはその4本の対の間に直流を供給しています。
ただし、PoEに対応していないデバイスに電力を供給すると危険なので、ハブはデバイスがPoEに対応しているかどうかを調べています。
ハブがデバイスの存在を調べる方法はとても簡単で、それぞれの対の間に25kΩのシグネチャ抵抗があるかどうかを調べているだけです。だから、こんな治具を作っただけでもPoEデバイスとして認識してくれます。

この実験では電力供給ハブとしてNETGEAR Inc.のGS108PEを使っています。25kΩというのは、意外と適当でもよさそうです。
さて、Cosmo-Zの話に戻りましょう。
PoEは標準的には48Vで供給してきますので、そのままではFPGAに供給できません。ですから、PoEを受電するにはPoE専用のスイッチングレギュレータICを使います。
次の図は、実際にCosmo-Zで受電したときのイーサネットケーブル上の電圧波形です。
①の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でつなぎます。
非常にマイナーなケーブルなのですが、PCI Expressの純正な規格です。PCI Expressの信号線をケーブルでそのまま引っ張り出すものです。
Cosmo-ZのZYNQはXC7Z030なので、ギガビットトランシーバとPCI Express Endpointハードウェアマクロを内蔵しています。だから、すぐにでもPCI Expressが動かせるはずなのです。
で、CoreGenでPCI Express EndPointを作って実際にやってみました。
注目するのはLTSSMの値です。LTSSMというのは、PCI Expressがリンクアップを管理するステートマシンです。下のような遷移をたどってL0ステートに達すればリンクアップ完了というものです。
実際にやってみると、00→02→04という経路をたどって・・
その後、04→05→0B→0C→0D→0E→0F→10→11→15→16となりました。
LTSSMの意味はXILINXのug477_7Series_IntBlock_PCIe.pdfに書かれています。
- 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の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を与えていたことでした。

なんて恐ろしい・・![]()
でも、壊れていなかったみたいです。よかった。
そんで、PLLのロック信号を見てみました。
クワッドPLLがロックするまでの時間は180μ秒くらいでした。
クワッドPLLのほうがロックするまでの時間は長いようです。
各PLLをリセットしてから、FBLOSTなどの信号が出ている時間は30μ秒くらいでした。

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


























