FPGAは揮発性なので、電源投入時にコンフィグしなければ動作しません。
そのため、PCI ExpressをFPGAで実現した場合、PCの認識プロセスが走るまでにFPGAのコンフィグが完了して、動作を開始していなければなりません。
では、いったい何ミリ秒以内にコンフィグすればよいのでしょうか?
XILINXのユーザガイド(s6_pcie_ug654.pdf)によれば、電源が安定しから最小100msでリセットがかかるからそれまでに起動していなければならないと書かれています。このリセット時間をTpvperlといいます。
Tpvperlの具体的な値は規格では定められていません。
したがって、FPGAは 「100ms+(電源が安定するまでの時間)」 にコンフィギュレーションが完了して動いていなければならないそうです。
このタイミングを図にしたものがユーザガイドに載っています。

「電源が安定するまでの時間」は、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のパラレルコンフィグ)を推奨、と書かれています。

上の表で黄色や赤になっているのは危険ゾーンということです。しかし、この表にも問題があって、まず、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回出ていました。

電源が投入されてからPERST#信号がアサートされるまでに約400ms、最初のリセット(Tpvperl)が250ms、二度目のリセット(Tpvperl)が200ms。リセット信号は2回やってきていました。電源を入れてからリセットが立ち上がるまで、トータルで800msという結果でした。
もちろん、PCI Expressの動作は完璧です。
CCLK=10MHzにすると、1回目のリセットの直後にコンフィグが完了するようにできました。これでも問題なく起動できています。

これでも、PCI Expressの動作は完璧です。
もう少し遅らせて、二度目のリセットの後0.5秒くらい後にコンフィグされるようにしても、PCI Expressは認識されました。
しかし、それ以上遅らせていくと問題が出てくるようになりました。PCI Expressは認識されるけれども、Windowsのデバイスマネージャで?マークがついたりとか、不安定な症状が少しずつ出てきます。
めちゃめちゃコンフィグが遅い場合はどうなるでしょう?SPI x2モードで2MHzにしてみたところ、コンフィグに3秒くらいかかり。ここまでくると、さすがに認識はされませんでした。

結果としては、
・BIOSは複数回のリセットパルスを出していて、最後のリセットが終了するまでにコンフィグできていればいい。実際のマシンでは、電源投入後、だいたい1秒くらいでリセットが完了する。
・しかも、リセット信号が立ち上がった後にすぐにPCI Expressの認識が行われるのではなく、実際にはBIOSがセルフチェックを行った後らしいので、電源投入後1.5秒くらいまでは許容範囲である。
・1.5~3秒くらいは不安定ゾーン。
・3秒だと確実にアウト。
結論は
・600msくらいでコンフィグが完了すれば、実際のPCでは1発目のリセットに間に合う
・SPI x1モードでもCCLK=26MHzなら400msで起動するから、まず大丈夫
ということになります。
最近のコメント