« 踊るクロック位相 | トップページ | 特電Spartan-6ボード・リソースCD-ROMができました »

2011.03.04

PCI Expressを扱うFPGAは何m秒でコンフィグすればよいか?

FPGAは揮発性なので、電源投入時にコンフィグしなければ動作しません。
そのため、PCI ExpressをFPGAで実現した場合、PCの認識プロセスが走るまでにFPGAのコンフィグが完了して、動作を開始していなければなりません。

では、いったい何ミリ秒以内にコンフィグすればよいのでしょうか?

XILINXのユーザガイド(s6_pcie_ug654.pdf)によれば、電源が安定しから最小100msでリセットがかかるからそれまでに起動していなければならないと書かれています。このリセット時間をTpvperlといいます。
Tpvperlの具体的な値は規格では定められていません。

したがって、FPGAは 「100ms+(電源が安定するまでの時間)」 にコンフィギュレーションが完了して動いていなければならないそうです。
このタイミングを図にしたものがユーザガイドに載っています。

Tpvperl

「電源が安定するまでの時間」は、ATXのマザーボードでは最小100msです。ATXの電源は、電源が規定の電圧に達した後、100ms以上経った後にPWR_OKの信号がアクティブになると書かれています。つまり、FPGAは電源投入後200ms以内に起動していなければならないということです。

また、XILINXのユーザガイドによれば、FPGAの初期化にも50msくらい要するとされています。
ということで、
  FPGAの初期化(50ms) + コンフィグ時間 < Tpvperl(100ms) + 電源安定時間(100ms)
という式が出ています。つまり、150ms以内にコンフィグしなければならないというわけです。
ATXのマザーボードでなければ電源安定時間は最小0msなので、トータルで50ms以内でコンフィグしろと書かれています。

一方、Spartan-6LXTのビットストリームのサイズは、XC6SLX45Tでは11,875,104bitありますので、150ms以内にコンフィグするには、CCLKは80MHzの速度が必要です。しかし、ISEの設定画面では26MHzまでしかいかないので、これでは間に合いません。
そこで、XILINXではSPI x4かSelectMap (x8のパラレルコンフィグ)を推奨、と書かれています。

Table8283

上の表で黄色や赤になっているのは危険ゾーンということです。しかし、この表にも問題があって、まず、CCLKの速度は45MHzや33MHzには設定できません(少なくとも現在のISEでは)。XC6SLX150Tなんて、どんな方法を使っても推奨時間内にコンフィギュレーションできないわけです。
(なるほど、こういう問題があるから、XILINXの評価ボード(SP605)は、SPI ROMを使わずに、SystemAceとコンパクトフラッシュでx8のSelectMapを採用しているのかもしれません。)

この問題に対しては、XILINXのユーザガイドには以下の解決策が示されています。
 ・マザーボードのBIOSを設定して、リセット信号を複数回出す出すように設定する。
 ・最初の電源投入後、PCをwarm resetをするようにスクリプトを組む。
要するに、FPGAのコンフィグが間に合わないことを最初から認めているようです。

というのが、XILINXのユーザガイドに書かれている内容ですが、実際のところどうなのか。バイト君に手伝ってもらって何台かのPCで試してみました。

まず、EXPARTAN-6TのコンフィグROMをWinbondのW25Q32に乗せ変えます。W25QはSPI x2とx4モードをサポートするので、コンフィグ時間をいろいろな値に変化させられるためです。

実際のPCではどのくらいの時間でリセットがかかるかを測ってみました。

次の図は、FPGAをSPIx2モード、22MHzでコンフィグした際の波形です。約200msでコンフィグが完了し、最初のリセットの前に起動しています。もちろん、PCI Expressは完璧に動作します。
驚くべきことに、PCI Expressのリセット信号は2回出ていました

Spi22x2

電源が投入されてからPERST#信号がアサートされるまでに約400ms、最初のリセット(Tpvperl)が250ms、二度目のリセット(Tpvperl)が200ms。リセット信号は2回やってきていました。電源を入れてからリセットが立ち上がるまで、トータルで800msという結果でした。
もちろん、PCI Expressの動作は完璧です。


CCLK=10MHzにすると、1回目のリセットの直後にコンフィグが完了するようにできました。これでも問題なく起動できています。
Spi10x2

これでも、PCI Expressの動作は完璧です。
もう少し遅らせて、二度目のリセットの後0.5秒くらい後にコンフィグされるようにしても、PCI Expressは認識されました。

しかし、それ以上遅らせていくと問題が出てくるようになりました。PCI Expressは認識されるけれども、Windowsのデバイスマネージャで?マークがついたりとか、不安定な症状が少しずつ出てきます。

めちゃめちゃコンフィグが遅い場合はどうなるでしょう?SPI x2モードで2MHzにしてみたところ、コンフィグに3秒くらいかかり。ここまでくると、さすがに認識はされませんでした。
Spi2x2

結果としては、
・BIOSは複数回のリセットパルスを出していて、最後のリセットが終了するまでにコンフィグできていればいい。実際のマシンでは、電源投入後、だいたい1秒くらいでリセットが完了する。
・しかも、リセット信号が立ち上がった後にすぐにPCI Expressの認識が行われるのではなく、実際にはBIOSがセルフチェックを行った後らしいので、電源投入後1.5秒くらいまでは許容範囲である。
・1.5~3秒くらいは不安定ゾーン。
・3秒だと確実にアウト。

結論は
・600msくらいでコンフィグが完了すれば、実際のPCでは1発目のリセットに間に合う
・SPI x1モードでもCCLK=26MHzなら400msで起動するから、まず大丈夫
ということになります。

|

« 踊るクロック位相 | トップページ | 特電Spartan-6ボード・リソースCD-ROMができました »

コメント

FPGAは不揮発性なので → FPGAは不揮発性ではないので

投稿: 上山完 | 2011.03.04 08:49

マザーボードによってリセット時間などは変動するかもしれませんね。

私もPCIバスボードですが、コンフィグ時間を検討してみたことがあります。
http://marsee101.blog19.fc2.com/blog-entry-133.html

投稿: marsee | 2011.03.04 18:54

PCI-Eは扱ったことがないのでこの記事を読む限りのことしかわかりませんが、USBをちょっとだけかじっているので、これと共通するお話を。
 すでにお知りになっているかとも思いますが、USBのデバイスエニュメレーションでは(特にバスパワーで動作するデバイスでは)デバイス自体の初期化に時間がかかりUSB規格で規定されている最低時間以内に応答を返すことができないことが多々発生しており、ホスト側からリセットを複数回行ったり、接続速度の確認も規定されたこと以上に行うなど実際には規格より冗長性を持たせた仕様となっているものはほとんどのようです。
 最近の高速通信系の規格は、最低限度の仕様をつくった上であとは実際の開発側にお任せなのでしょうかね?

投稿: にょろ~ん | 2011.03.04 23:04

みなさんコメントありがとうございます。

marseeさん
いろんなマザーボードで試してみましたが、やはり似たようなものですね。マザーボード側も相当な余裕を見て作っているのでしょう。PCI Expressは、LinkのDetectで相手が見つからなかったら数十ミリ秒待って再チャレンジするというのがあるので、マージンはさらに大きいかもしれません。

まぁ、XILINXのUG654も書いてあることは結構怪しいのですが・・
XC2V1000は4Mbitでしたか。今のFPGAはでかくなったものです。Virtex-6の大きいやつなんて、絶対間に合わないかもしれません。Vccauxは電流取り出せないからFPGAの電源にするなんて無理ですし。

にょろーんさん
>ホスト側からリセットを複数回行ったり、
USBが認識されなくても、10秒くらいたつと認識されるあれですね。

マザーボードを作る側も、接続性向上のためにWAITしてくれているのだと思います。

投稿: なひたふ | 2011.03.05 08:45

コメントを書く



(ウェブ上には掲載しません)




« 踊るクロック位相 | トップページ | 特電Spartan-6ボード・リソースCD-ROMができました »