最近ブログのコメントで、うちのボードのリセットがどうなっているのかを聞かれた。関係のないブログにコメントで聞かれたので、ブログに関連のないコメントはご遠慮くださいとお伝えした。皆様もご質問の際はProfileに書いてあるメールアドレスにメールください。ご質問に答えられないかもしれませんが。。。
それはさて置き、うちのボードのリセット及びFPGAのコンフィギュレーションはCPLDが取り仕切っている。PowerON時のリセット信号は MAX6861 で出力している。これでCPLDをリセットして、FPGAのリセット信号DCM reset, Logic resetをアサートする。FPGAのコンフィギュレーションが終了してDONEがアサートされたら、ある一定時間経過後にDCMのリセット信号DCM resetをディアサートする。
ここでDCMだけリセットをはずすと、DCMが入力クロックにロックしてクロックを出力するのに時間がかかり、また、DCMの出力クロックを入力しているPowerPCのPLLもロックするのに時間がかかるので、それらの時間を合計しただけFPGAのロジック用のリセット信号(Logic reset) を遅延している。
DCMはlocked信号があって、周波数をロックした時には信号を出力するが、エンジニアリングサンプルを使っていた時になんか怪しそうなことがあったのと、DCMのlocked信号をCPLDにフィードバックする必要があるため、使用していない。現在はあくまでデータシートに書いてある、DCMの最大ロック時間だけWAITしている。
FPGAのコンフィギュレーションは汎用FLASH ROMにコンフィギュレーションデータを入れておいて、アドレスをCPLDから入れながらFPGAにスレーブセレクトマップモードでコンフィグしている。
この前、FPGA BBSで質問されていたxilinx LogiCOREだが、うちのVirtex2-1000ボードのコンフュギュレーション時間は61msだと回答した。でも、電源安定後100ms以内のコンフィギュレーションは、64ビットデータバスコネクタに入ることが決定されている(うちの)ボードには関係ないので、それまでに動作する仕様にはなっていない。つまりRST#がディアサートされるときのREQ64#を見ていないのだ。
PCI仕様書リビジョン2.2でのRST#がディアサートされてから最初のPCIコンフィギュレーションアクセスまでに2の25乗クロックだそうだ。これは33,554,432クロックなので15nsをかけると約500msなので、これを満たせばよいと思っている。この辺はPCIボードの起動時間に書いてある。
更に今度作ったボードのコンフィグ時間を検証してみる。今回のFPGAはVirtex2pro-30なのでコンフィギュレーションするビットは11,584,984ビットである。これをバイトにするために/8すると1,448,748バイト。1バイト当たり、とりあえず120nsかかるので、* 120ns = 173.85msで100ms以上かかってしまう。
まだコンフィグレーション用汎用FLASH ROMのアクセスタイムには余裕があるので、75nsまで縮めたとすると、* 75ns = 108.66msでぎりぎりだ。更にページモードを使用するとアクセスタイムが短くなるので100msに収まるだろう。
更に、FPGAからFPGAのリセットするための信号をCPLDに出力している。これをアサートするとFPGA自身をCPLDからリセットする。ここで問題になるのはPCIバスのベースアドレスレジスタだ。FPGAをリセットするとホストから書かれたベースアドレスも普通はクリアしてしまう。今のところクリアしているのでFPGAをリセットするとパソコンをリブートする必要がある。
FPGAからリセットした時だけ、ベースアドレスレジスタだけをクリアしないとそのまま動作できるかな?と思っている。(当然、その間に、そのアドレスにアクセスがあるとデッドロックしてしまうが。。。)
追加:上の図には書いていないがPCIバスのRST#もCPLDのリセットの条件に入っている。RST#がアクティブになるとDCM、ロジックのリセットシーケンスを再度行う。ロジックのリセットだけで良いと思うかもしれないが、以前、リブート時にPCIのクロックが停止するマザーボードがあったので、DCMがおかしくなってしまったことがあった。そのためDCMもリセットすることにした。
それはさて置き、うちのボードのリセット及びFPGAのコンフィギュレーションはCPLDが取り仕切っている。PowerON時のリセット信号は MAX6861 で出力している。これでCPLDをリセットして、FPGAのリセット信号DCM reset, Logic resetをアサートする。FPGAのコンフィギュレーションが終了してDONEがアサートされたら、ある一定時間経過後にDCMのリセット信号DCM resetをディアサートする。
ここでDCMだけリセットをはずすと、DCMが入力クロックにロックしてクロックを出力するのに時間がかかり、また、DCMの出力クロックを入力しているPowerPCのPLLもロックするのに時間がかかるので、それらの時間を合計しただけFPGAのロジック用のリセット信号(Logic reset) を遅延している。
DCMはlocked信号があって、周波数をロックした時には信号を出力するが、エンジニアリングサンプルを使っていた時になんか怪しそうなことがあったのと、DCMのlocked信号をCPLDにフィードバックする必要があるため、使用していない。現在はあくまでデータシートに書いてある、DCMの最大ロック時間だけWAITしている。
FPGAのコンフィギュレーションは汎用FLASH ROMにコンフィギュレーションデータを入れておいて、アドレスをCPLDから入れながらFPGAにスレーブセレクトマップモードでコンフィグしている。
この前、FPGA BBSで質問されていたxilinx LogiCOREだが、うちのVirtex2-1000ボードのコンフュギュレーション時間は61msだと回答した。でも、電源安定後100ms以内のコンフィギュレーションは、64ビットデータバスコネクタに入ることが決定されている(うちの)ボードには関係ないので、それまでに動作する仕様にはなっていない。つまりRST#がディアサートされるときのREQ64#を見ていないのだ。
PCI仕様書リビジョン2.2でのRST#がディアサートされてから最初のPCIコンフィギュレーションアクセスまでに2の25乗クロックだそうだ。これは33,554,432クロックなので15nsをかけると約500msなので、これを満たせばよいと思っている。この辺はPCIボードの起動時間に書いてある。
更に今度作ったボードのコンフィグ時間を検証してみる。今回のFPGAはVirtex2pro-30なのでコンフィギュレーションするビットは11,584,984ビットである。これをバイトにするために/8すると1,448,748バイト。1バイト当たり、とりあえず120nsかかるので、* 120ns = 173.85msで100ms以上かかってしまう。
まだコンフィグレーション用汎用FLASH ROMのアクセスタイムには余裕があるので、75nsまで縮めたとすると、* 75ns = 108.66msでぎりぎりだ。更にページモードを使用するとアクセスタイムが短くなるので100msに収まるだろう。
更に、FPGAからFPGAのリセットするための信号をCPLDに出力している。これをアサートするとFPGA自身をCPLDからリセットする。ここで問題になるのはPCIバスのベースアドレスレジスタだ。FPGAをリセットするとホストから書かれたベースアドレスも普通はクリアしてしまう。今のところクリアしているのでFPGAをリセットするとパソコンをリブートする必要がある。
FPGAからリセットした時だけ、ベースアドレスレジスタだけをクリアしないとそのまま動作できるかな?と思っている。(当然、その間に、そのアドレスにアクセスがあるとデッドロックしてしまうが。。。)
追加:上の図には書いていないがPCIバスのRST#もCPLDのリセットの条件に入っている。RST#がアクティブになるとDCM、ロジックのリセットシーケンスを再度行う。ロジックのリセットだけで良いと思うかもしれないが、以前、リブート時にPCIのクロックが停止するマザーボードがあったので、DCMがおかしくなってしまったことがあった。そのためDCMもリセットすることにした。