クロックの分周 #
よく源振クロックを分周して1/Nされたクロックを生成することがある。クロック生成の方法と注意点を見ていくことにする。
PLLを使用する #
これば最も推奨される方法となる。FPGAの内部にはPLLが内蔵されており、入力クロックから比較的自由にクロックを生成することが出来る。可能な限りこのクロックを使用するようにする。PLLで生成されたクロックは元のクロックと同期しているため、タイミング検証が容易である。
ロジックによる分周 #
こちらも比較的よく使われる分周方法。PLLが内蔵されていなかったり、足りない場合はこちらの方法を選択する。クロックの生成は必ず同期カウンタかステートマシンを採用する。リップルカウンタは使用しないようにしよう。リップルカウンタは検証が非常に難しい。またカウンタの数値をデコードしたものをクロックとしないように注意すること。もしそのようにする場合はFFをデコード出力の最終段に追加する。
リップルカウンタによるクロック生成は非推奨。これでは非同期クロックの生成となる。この方法ではFFの出力が次のFFのクロック端子に入力されるが、これでは配線遅延の分だけクロックの生成が遅れてしまう。カスケードに接続した場合、この遅延が累積され希望のタイミングを生成できない可能性がある。またデバイスやコンパイル条件が変化するとタイミングが変化し、コードの使い回しが不可能となる。
下のように必ず元のクロックをFFのクロックに入力すること。
代替案 #
そもそも本当にクロックを分周する必要があるか否かを検討しよう。例えば源振クロックの1/2の速度で動作させたい場合、分周クロックを作ってしまうのが最も簡単のように思えるが、タイミング設計が難しくならないだろうか。例えば異なるクロック間でのデータの受け渡しがある場合は、データの受け渡しにちょっとしたテクニックが必要となってくる。また生成したクロックは通常グローバルクロックに入れる必要があるが、グローバルクロックの本数は限られている。このような場合はenable信号で対応できないか検討する。