« 秋葉原で事務所探し | トップページ | 今日からIPAXが開催されます »

2007.06.20

Spartan3E DCMからクロックが出てこない

Spartan3Eの500を使っていて「DCMで3逓倍したクロックが出てこない」というトラブルがありました。

48MHzのクロックをいれてDCMで3倍して144MHzを取り出すという回路で、DCMと付随するBUFG等はCoregenを使って生成するというごくありふれた回路です。

DCMの使い方の例(この回路は問題があるので注意)

Coregenで作る「Single DCM」はリセット機能を持っていないので、DCMのリセット回路は自分で作らなければなりません。DCMのリセットは使わずに'0'固定でも一応動くのですが、クロックが停止したり再開したりするような回路だと、クロックが再開したときにDCMがロックしないことがあります。そういう回路ではDCMにリセット信号を入れなければなりません。

このリセット回路というのは、DCMのロックが外れる(='0')とリセットパルスを送る、という動作をします。DCMにリセットを送った直後はDCMのロックは当然はずれるので、リセット回路には不感時間を設けます。不感時間を作るために中にカウンタを作るのでクロックが必要になりますが、リセット回路のクロックにはDCMが出力するクロックは使えないので、IBUFGを通った後の「生クロック」を使います。
なお、Spartan3EのDCMは、データシートによればロックするまでに最大5msかかるとなっているので、不感時間は5ms以上にします。

このように普通のDCMの回路なのですが、とても質の悪いクロックが与えられた場合に、CLKFXがちゃんと出てこないという現象が発生しました。
質が悪いクロックというのは、あるときは48MHzでちゃんと発振しているのに、止まったり再開する、というのを何度も繰り返すクロックです。


データシートを見ると、DCMの中にはDLL(遅延ロックループ)の部分と、DFS(ディジタル周波数合成)と書かれた部分があります。

Spartan3E DCMの構造(データシートより)

クロックをM倍やD分周してくれるのはDFSの部分なのですが、DCMのLOCKED信号はDLLのCLKINとCLKFBが同相であることを示す信号であって、DFSがロックしたかどうかは関係ないようなのです。

DCMのロック信号

DFSがロックしたかどうかは、STATUS[2]を見るとわかるようです。

DCMにリセット信号を送ってから5ms後に、LOCKEDが'0'か、もしくはSTATUS[2]信号が'1'ならばDCMが正常に動作していない、と判断してリセットを送るようにしたところ、質の悪いクロックでもちゃんと動作するようになりました。

まとめ
Spartan3EのDCMを使ってM倍やD分の1のクロックを作る場合には、LOCKED信号とSTATUS信号を必ず見るようにして、CLK0とCLKFXの両方がちゃんと発振しているかどうかを確認する必要がある、ということがわかりました。

|

« 秋葉原で事務所探し | トップページ | 今日からIPAXが開催されます »

コメント

なひたふさん,こんにちわ.
ご無沙汰しています.

この情報,いまさらながら,おととい役に立ちました.

助かりました.
#トラ技の付録雑誌,おもしろいですね!基板,さっそくハンダ付けして使ってみます.

御礼まで.

投稿: いくらまさみ | 2007.12.12 00:58

いくらさん、こんにちは
コメントありがとうございます。

この情報がお役に立てたようで何よりです。
CLKFXの停止はDCMのLOCKEDに出てこないって、ハマりますよね。
私は某USBのチップから出力されるクロックを利用しようとしていて、この現象に遭遇しました。

トラ技の基板は自分で作るのはちょっと面倒な、便利小物シリーズです。私はRS232C-TTL変換基板とUSBマルチ電源を気に入っています。ぜひぜひご活用ください。

投稿: なひたふ | 2007.12.15 06:58

コメントを書く



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




« 秋葉原で事務所探し | トップページ | 今日からIPAXが開催されます »