FC2カウンター FPGAの部屋 プリント基板の作成過程
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

うちのボードのリセット回路とFPGAのコンフィギュレーション

最近ブログのコメントで、うちのボードのリセットがどうなっているのかを聞かれた。関係のないブログにコメントで聞かれたので、ブログに関連のないコメントはご遠慮くださいとお伝えした。皆様もご質問の際はProfileに書いてあるメールアドレスにメールください。ご質問に答えられないかもしれませんが。。。
M3_reset_curcit_070504.png

それはさて置き、うちのボードのリセット及び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もリセットすることにした。
  1. 2007年05月05日 11:32 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:10

続:SDRAM動作不良

”SDRAM動作不良”で書いたとおりに小さい基板のうち3枚のうち2枚がSDRAMの書き読みで1bit間違ってしまうという不具合があった。業者に送って調べてもらったところダンピング抵抗用の抵抗アレイで隣同士がショートしていたようだ。
そのうちの一枚は更にPowerPCのコア電圧用DC-DCコンバータの電圧を決定する抵抗が実装不良でオープンになっていた。PowerPCが動作しないのでコア電圧を測ったら1.3Vのはずが0.8Vになっていたのでわかったのだった。
他のところの実装は大丈夫だろうか?これでは他のところも怪しいだろう。そのつもりでチェックしなければ。。。

DWMの1月号を見ていたら表面実装品の半田付けの特集があった”チップ部品はんだ不良の原因とその処方せん”やはりここに書いてあったのと同様に電極両端のはんだのぬれがアンバランスでチップ立ちしてしまったのかな?そんなに浮いているようには見えなかったのだが。。。
  1. 2006年12月14日 16:40 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:0

SDRAM動作不良

周波数の偏差はプロトコル側とLVDS側の動作周波数に明確な差をつけて動作するようになった。
SDR SDRAMの読み書きが1ビット反転する状況は変わらない。どうやらSDRAMの根本かダンピング抵抗当たりでとなりのデータビットとショートしているようだ。それでオール0とオール1の読み書きは大丈夫でも、0x55555555や0xaaaaaaaaは1bit間違ってしまうのだろう。業者に送り返して手直しを依頼しようと思う。しかし、3枚作ったうちの2枚がこんな状態で、正常の基板が1枚のみでは非常に困る
最初にブログに公開した時はかなり規則的に誤るビットがずれているように思えたのだが、それはSDRAMテストプログラムのバグだったようだ。
  1. 2006年11月21日 22:36 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:0

プリント基板のデータバスの信号品質

またまた、プリント基板のデータバスの信号品質について問題が出ている。
データバスはFPGA-SDRAM-PowerPCとつながっている。
以前は実際の配線前の目安ということで波形を出してもらったのだが、実際に配線したら長くなったということで今度はSDRAMからの出力信号も信号の変化点で乱れるようになってしまった。
こうなると信号が安定してる場所にセットアップ時間を設定するためにPowerPCへのクロックを遅らせることになる。そうするとPowerPCからSDRAMへのデータ転送のときにセットアップ時間がきつくなり破綻してしまう。
解決策としては今FPGAの元にダンピング抵抗を入れてもらってシミュレーションしてもらっているが、それでもだめならレイアウトを見直すしかないかもしれない。
それとも今FPGAからSDRAMとPowerPCへつながっているデータバスを分けるとか。小さい基板だけだが、大きなほうはピンの余裕がないのでその場合は周波数を落とすことになるだろう。

スパルタン3Eスタータキットはまだ本格的に使っていない。ちょこちょこサンプルプロジェクトをやっている。今はLCDをどう表示するか知るためにマニュアルを読んでいる。
  1. 2006年04月19日 05:42 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:2

伝送線路シミュレーションの解析に苦戦中

伝送線路シミュレーションが出てきたがその意味の解析に苦戦中だ。
クロックの伝送線路シミュレーション結果はこの前のブログに書いたし、きれいな波形にしなければいけないというので、どういう波形が必要がわかるため楽だった。
でもデータバスなどはFPGA,SDRAM,PowerPCの3つ一筆書きでつながっているので、端から真ん中のSDRAMにデータ転送する場合の波形が悪くなる。
タイミングのダイアグラムは考えてあったのだが、波形の乱れによって、だいぶマージンが減りそうだ。どのように計算したらよいかが良くわからないので困っている。おまけにクロックはフェーズシフトする予定なのでどの位置に来ればよいかがいまいちイメージがわかない。
データにクロックを重ね合わせて自分で見られれば一発なんだけど。考えすぎて胃が痛くなってきた。
一応、ターミネータをつけてもちょっと改善できないかどうかをやってみてもらえることになった。
やはりLVCOMSデータバス133MHzは反射が多いのか?スルーレートを変えるという方法もあるな。。。
でもあまりシミュレーションお願いしていると悪そうだし。。。ああ.....自分でやりたい。

それから伝送線路シミュレーションは67MHzのクロックでやっているが、例えばLVDS受信用ICだとLVDSで来た信号を受けてLVCOMSでクロックとデータを送ってくる。実際のデータはクロックのようには変化はしない。
そのクロックに対してデータの有効時間が仕様で指定されている。これがクロックの前、少なくとも2ns前から有効になっていると書いてあったら、伝送線路シミュレーションの立ち上がり、立下りから2ns付近の点で反射が起こってスレッショルド近くまで反射があったらまずいのだろうか?

いろいろ詳しく解析すると悩んでくるが、なるべく波形を改善してもらって作ってもらえばいいのだろうか?
LVDS受信ICの件は違うが、なまじクロックをシフトできると悩んでくる。
  1. 2006年04月04日 05:52 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:4

高速?(133MHz)クロックの配線について

今の基板のクロックの配分は水晶発信器からFPGAへ入力し、FPGAのDCMを使って0ディレイで、その他のデバイスに供給している。
そのやり方はVirtex2pro users guide ver.4.0の91ページに図がある。下に転載する。
DCM_ext_out_1_060331.png


このように出力したクロックを他のデバイスに供給するが、またFPGAの入力に戻しフィードバックをかけ、ディレイをキャンセルする。
Spartan3でもXAPP462(v1.0)の31ページに外部クロック信号でのスキュー削減方法が載っている。下に図を転載する。こちらは外部バッファのディレイもキャンセルして良いようだ。
DCM_ext_out_2_060331.png


このようにしてプリント基板でクロックを分配することにする。分配するのはSDRAM4個とPowerPCだ。
初めにFPGAの1つの出力からフィードバック(FB)と全てのデバイスにクロック(133MHz)を供給することにする。トポロジーは一筆書き。PowerPCへのクロック配線はセットアップ時間の関係から約7cm(400ps)余計に長さを増やしてデータより遅延させることにする。以下の図ではダンピング抵抗と水晶発信器を省略してある。
CLK_dist_toplogy_1_060331_.png


上図でクロック出力は緑の点、クロック入力は赤の点だ。FPGA内にはDCMを最上図のFigure3-23に様に実装する予定だ。シミュレーション時に、これだと特に真ん中のSDRAMの波形が乱れ、波形がなくなってしまうような感じになるようだ。この辺のトポロジーをいろいろ変えてもらったが、やはりだめだった。やはり後ろのPowerPCの負荷が重いとのことだったので、PowerPCだけ専用のDCMを使用することになった。これだとDCMを2個使用することになる。それは出力を2つ出すとFPGA内の配線ルートが異なるので内部遅延が異なり、FBがかかっているクロック出力とそうでないのとで、クロックの位相が変化してしまうからである。
そこでDCMを2つに増やして負荷を減らし波形の改善を試みる。さらにSDRAMだけになったので分岐配線にした。
CLK_dist_toplogy_2_060401.png


今度はPowerPCへの配線に余分な長さはない。波形も乱れるし専用DCMなので位相をシフトして辻褄を合わせることにする。
FPGAの出力プロパティはFastの24mAだが、SDRAMは負荷が重いのか波形の立ち上がり、立下りがかなりなまっている。SDRAMの規格からCLK High time、CLK low timeは両方とも2.5nsだが、CLK low timeの方は規格に入らない。
そこで仕方が無いので、DCMを3個使うことにしてSDRAMを2個ずつに分けることにした。
CLK_dist_toplogy_3_060401.png


これでシミュレーションによる波形もだいぶ良くなり、これで行くことになった。DCMを3個も使用することになってしまったが。。。
FPGA出力1個に付きSDRAM1個負荷のシミュレーションもしてもらったが、さらに立ち上がりが良くなっていた。これが理想なのだが、ちょっと無理である。

これは余談だが、DDR SDRAMコントローラのタイミングを書いた文書ftp://ftp.xilinx.com/pub/applications/misc/ar19385.pdfの3ページ目の図にもあるがIOBのDDRレジスタで送信クロックを生成している。こうするとFPGA内部のクロックに対してもDDRレジスタなどの遅延が発生するが、これらの遅延をDCMにフィードバックすることによってキャンセルすることが出来ないだろうか?
キャンセルすることが出来れば、IOB間のスキューは残るがDCM1個でSDRAM1個に対して1個のピン(IOB)を割り当てられるのではないか?
具体的には下の図のような構成である。
CLK_dist_toplogy_4_060401.png


上図は水晶発信器からDCMのCLKINに入力してCLK0出力からBUFGを通しグローバルクロックラインを使ってFDDRRSEのクロックに入力する。FDDRRSEのD0に1をD1に0を入れておくと入力クロックと同じクロックが出力に出る。それを5つ並べてそのうちの4つのFDDRRSEの出力をSDRAMのクロックとして出力する。残りの1つのFDDRRSEの出力は一旦FPGAの外に出して、もう一度グローバルクロック入力から入れてDCMのCLKFBにフィードバックする。
そうすると、うまく動けば入力クロックと同期したクロックがSDRAMへ出力できるはずだ。グローバルクロックラインのスキューがあるが、1個のDCMで4個のSDRAMへのクロックが同期できるはずだ。
ただしこれは構想だけで確かめたことは無いから動くかどうかわからない。
誰か確かめた人がいらしたら教えてください。
自分でも、今度の基板は3個のDCMを使う構想だが、うまく動いたら一番下の図のようにDCMを1個減らして試してみようと思う。
  1. 2006年04月01日 06:17 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:7

クロックの信号品質

クロックの信号品質はなかなか問題が多い。
FPGAに水晶発信器からクロックを入力して、そのクロックをFPGAのほかのピンから出力してSDRAM4個とPowerPCにクロックを供給している。クロック周波数は133MHzだ。
クロック供給のトポロジーはFPGA→SDRAM→PowerPCという順で一筆書きで供給することにした。おまけにPowePCのセットアップ時間の関係で、SDRAM→PowerPC間をデータバスより7cm程度(400ps)わざと長くしてもらった。これで伝送線路シミュレーションをしてもらったところ、まったく波形が乱れてだめだった。
トポロジーをいろいろ変えてやってもらったが満足できない。
そこでFPGA→PowerPCをFPGAの別のピンにしたところ、だいぶ良くなった。つまりFPGA→SDRAM4個とFPGA→PowerPCにクロックを分けた。
これでだいぶ良くなったが、まだSDRAMの仕様に波形が入らないので条件を変えてシミュレーションをお願いした。
まあこれで大丈夫だと思う。しかし、これでDCMを1個余計に使うことになった。
FPGA→SDRAM4個のクロックが予定よりもだいぶ遅れるようなので、133MHzではFPGAの0度の内部動作クロックではSDRAMのデータがサンプルできそうもない。
もう1つDCMを使ってフェーズシフトしたクロックでデータをサンプルしなくてはいけないようである。かなり厳しい状況になってきた。動作周波数が高いといろいろ難しいようだ。
  1. 2006年03月30日 19:33 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:2
»