MENU

初学者向け!クロックドメインの概念

はじめに

FPGAやデジタル回路設計を進めると必ず出てくるのが「クロックドメイン」という言葉です。
「クロックドメインとは何か?」、「なぜ大事なのか?」、「どう対応すればいいのか?」を一つ一つ解説し、設計で迷わないように実用上のポイントをお伝えします。


1. クロックドメインとは何か?

クロックドメイン」とは、同じクロック信号で動作する回路のまとまりを意味します。
FPGAでは、異なるクロックを使うことがよくあり、これが設計の複雑さの原因にもなります。

  • FCLK_CLK0 → 125MHz(周波数)で動作する回路
  • FCLK_CLK1 → 250MHz(周波数)で動作する回路

これらのクロックは別々のクロックドメインになります。


2. クロックドメインが違うと何が問題なのか?

クロックドメインが異なると、次のような問題が発生します:

  1. タイミングのずれ
    異なるクロックでは、データが送られた瞬間と受け取る瞬間のタイミングが合わず、データが破損することがあります。
    • :125MHzのクロックで「1」を送ったが、250MHzのクロックでは読めずに不安定な状態になる。
  2. メタステーブル
    異なるクロックドメイン間でデータをやり取りすると、信号が「0」でも「1」でもない不安定な状態(メタステーブル)になることがあります。

3. クロックドメインの具体例

FPGA設計では、クロックドメインの違いがよく見られます。

ケース1: 単一クロックドメイン

同じクロックで全体を動かす場合は問題なし

  • FCLK_CLK0(125MHz)
  • すべてのIPコア、インタフェースがこのクロックで動く

設計ポイント

  • クロックを「1本」に統一することで同期の問題は起きません。

ケース2: 複数のクロックドメイン

例えば、以下のように動く場合:

  • FCLK_CLK0 → 125MHz(AXIインタフェース)
  • FCLK_CLK1 → 250MHz(高速処理IP)

設計ポイント

  • クロックドメイン間のデータ転送には対策が必要です。
    • FIFO(First-In First-Out Buffer)を使う
    • 同期レジスタを挟んで信号を安定させる

4. 実際にVivadoでの確認方法

クロックソースの確認

Vivadoでは「PS(Processing System)」から生成されるクロックがよく使われます。

  • FCLK_CLK0:125MHz
  • FCLK_CLK1:250MHz

これらのクロックを各IPコアやAXIバスに接続することで、クロックドメインを設定します。

どのクロックが供給されているか?

各IPコアやAXIインタフェースには「ACLK」や「CLK」のピンがあり、ここにどのクロックドメインが供給されているか確認できます。

  • M_AXI_GP0_ACLKFCLK_CLK0
  • S_AXI_HP0_ACLKFCLK_CLK1

5. クロックドメイン間の設計のコツ

複数のクロックドメインを使う場合、次の対策が必要です:

1. FIFOを使ったデータ転送

FIFO(First-In First-Out)バッファは、データを安全にクロックドメイン間で転送するための回路です。

  • 書き込み側 → クロックA
  • 読み出し側 → クロックB

FIFOが自動的にデータをバッファし、ドメイン間のタイミング問題を解消します。

2. 同期レジスタ

データや制御信号が単一ビットの場合は、同期レジスタを使って安定化させます。
→ 2段または3段のフリップフロップを使うことで、メタステーブルを回避します。


6. まとめ:設計で困らないためのポイント

  • 単一クロックドメイン:シンプルで設計が楽
  • 複数クロックドメイン:FIFOや同期レジスタを使って対策する
  • クロックソース:Vivadoの FCLK_CLK や外部クロックを確認
  • ACLKCLK ピンがどのクロックドメインに紐づいているか確認する

次にすべきこと

Vivadoでブロックデザインを開き、クロックの接続やACLKの供給元を確認してみましょう。
複数のクロックドメインが存在する場合は、FIFOを追加する練習もしてみてください!

目次