雑誌無償購読申込み 最新号 バックナンバー 広告資料請求 EDN Japanについて お問合せ
雑誌無償購読申し込み
メールニュースレター登録
登録内容変更
アナログ IC/ディスクリート
電源/電池/コントローラー
PLD / メモリー
組み込みシステム
コンピュータ&ボード
EDA/IP/CAE/ソフトウェア
電子部品
計測器
ディスプレイ
デジタル家電
通信・ネットワーク
カーエレクトロニクス/産業機器
EDN Japan 記事検索
検索方法の詳細
雑誌無償購読申込み ニュースレター登録 この記事に対する感想/ご意見
designfeature
2003年11月号
複数クロックの混在回路で
信号同期を取る


最近のデジタル論理回路は、クロック周波数の異なるいくつかの回路ブロックで構成されていることが少なくない。あるクロック・ドメインから別のクロック・ドメインに信号を転送するとき、受信側にとって入力信号は非同期信号になる。同期を取り直す必要がある。同期を取り直すさまざまな手法を検証する。(本誌)

ロマイク・スタイン* 米パラダイム・ワークス社
Mike Stein Paradigm Works, Inc.
 たった1種類のクロックしか使わないデジタル・システムは、現在はほとんど存在しない。極めて基本的な論理回路くらいだろう。ハード・ディスク装置コントローラーや光ディスク装置コントローラー、モデム回路、ネットワーク・インターフェース回路、ネットワーク・プロセッサーなどの回路は、複数のクロック・ドメイン間でデータを転送しなければならない。これはかなり厄介なことだ。あるクロック・ドメインから別のクロック・ドメインへとデータ信号を伝送する場合、受信側のクロック・ドメインとって入力信号は非同期信号となるからである。
 最新のASIC*FPGA*などで100万ゲート級の回路を設計するために、技術者は数多くのソフトウエア・ツールを使用する。しかしこれらのツールは、信号の同期に関連する問題を解決できない。解決できるかどうかは、設計者の技量にかかっている。異なるクロック・ドメイン間で確実に信号をやりとりする回路を設計する技術を備えているかどうかだ。

デジタル信号の不安定さを理解する

 複数のクロックが混在する回路をうまく設計するための最初のステップは、デジタル信号の安定性という問題を理解することである。あるクロック・ドメインから別のクロック・ドメインへと信号が移動するとき、受信側からこの信号は非同期信号に見える。従って受信回路は同期を取り直す必要がある。この作業によって、受信側のクロック・ドメインにおける初段のメモリー素子(フリップフロップ)が不安定状態(メタステーブル状態)になることを防ぐ。
 ここで不安定状態とは、フリップフロップが規定の時間内に規定の状態に到達しないことを指す。フリップフロップが不安定状態に入ってしまうと、出力がある電圧レベルに達するまでの時間(セトリング時間)が予測できなくなり、さらには出力電圧のレベルがどうなるかも分からなくなる。セトリング時間に達するまでの期間は、フリップフロップの出力は中間的な電圧レベルにあるか、あるいは発振している可能性がある。この不安定状態は、後段のフリップフロップにまで伝搬しかねない。
 フリップフロップの入力信号は、クロック信号のアクティブ・エッジを中心とする狭い時間ウインドウの期間は安定に保たれている必要がある。この時間ウインドウは、フリップフロップの設計と製造技術、動作条件、出力の負荷(出力がバッファーされていない場合)によって変化する。入力信号のエッジが鋭ければ、時間ウインドウの幅は狭くなる。クロック周波数が高くなると、不安定性を誘発する時間ウインドウ(脆弱なウインドウ、windows of vulnerability)が広くなる。従ってデータ転送周波数が高くなると、この脆弱なウインドウに出会う確率が増大する。
 FPGAメーカーや半導体ファウンドリーは、フリップフロップの動作を検証してその特性を完全に把握しなければならない。フリップフロップの動作不良確率を示す統計的な指標には、平均故障間隔(MTBF:mean time between failures)がある。入力信号がフリップフロップを不安定な状態に至らしめる時間ウインドウが、MTBFを左右する。またMTBFは、入力信号周波数とフリップフロップのクロック周波数に依存する。
 ASICやFPGAなどのセル・ライブラリーにあるフリップフロップのタイミング仕様は、脆弱なウインドウを把握する手掛りとなる。例えばセットアップ時間からは、クロック・エッジの手前で入力信号を安定させるタイミングが分かる。ホールド時間からは、クロック・エッジの後でどのタイミングまで入力信号を安定に保たなければならないかが求まる。これらの仕様は通常、電源電圧変動や周囲温度の変化、信号波形の変化、製造プロセスの変動といったあらゆる変動要因を考慮して決めている。設計した回路がこういったタイミング仕様を満足しているのであれば、フリップフロップが動作不良を起こす確率は無視できる程度に小さくなる。
 現在のASIC設計やFPGA設計などで利用する論理合成ツールは、フリップフロップのセットアップ条件やホールド条件などを満足するデジタル回路の生成を保証する。しかし、非同期信号はその限りではない。ほとんどの論理合成ツールは、非同期信号がフリップフロップのタイミング仕様を満足しているかどうかを判断できない。フリップフロップが不安定状態にある時間を判定できないため、ある信号がフリップフロップから組み合わせ論理回路を通過して次のフリップフロップに伝わるまでに要する時間を決定できないからである。最善の方法は、非同期信号の影響を小さくできる回路方式を採用することだ。

信号の同期を取り直す

 あるクロック・ドメインから別のクロック・ドメインに信号を転送したときに信号の同期を取り直すのは、受信側クロック・ドメインの初段にあるフリップフロップが不安定状態になったときに次段以降の論理回路を保護するためである。最も単純な同期化回路(synchronizer)は、2個のフリップフロップを直列接続した回路だ。フリップフロップの間には、組み合わせ論理回路は存在しない。この同期化回路は、次段のフリップフロップが初段のフリップフロップの出力をサンプルする前のタイミングで、初段のフリップフロップが不安定状態から抜け出して出力信号が安定になることを保証する。この回路ではフリップフロップ出力間のスキューを最小化するため、フリップフロップ同士をできるだけ接近させて配置する必要がある。
 半導体ファウンドリーは、信号の同期を取りやすくするために同期化回路セルを用意している。このセルは2つの種類に分けられる。1つのセルは、1個のフリップフロップで構成されるものだ。このフリップフロップは、通常のフリップフロップよりも利得が高く、従って消費電力と回路面積が大きい。入力信号に対するセットアップ時間とホールド時間の要求仕様は通常のフリップフロップよりも緩い。このため、入力信号が不安定状態を引き起こしたとしても、発振に至ることはまずない。
 同期化回路セルのもう1つの種類は、2個のフリップフロップで構成されている。フリップフロップを簡単に近接配置できるとともに、両フリップフロップの間に組み合わせ論理回路を挿入できないようにした。
 同期化回路を正常に機能させるためには、異なるクロック・ドメイン間を伝わる信号を送信側のクロック・ドメインと受信側のクロック・ドメインの間で組み合わせ論理回路を経ずに直接、受信側のフリップフロップに入力する必要がある(図1)。同期化回路の初段は、組み合わせ回路が発生するグリッチに敏感だからである。十分に長いグリッチがフリップフロップの入力タイミング条件を満たしてしまうと、後段に誤った信号を伝送しかねない。
 同期化された信号は2回のクロック・エッジを経て受信側クロック・ドメインで有効なデータ信号となる。すなわち信号遅延は、1クロック・サイクルと2クロック・サイクルの間である。おおよその目安として、同期化回路は受信側のクロック・ドメイン内で2クロック・サイクル相当の遅延を発生する。回路設計者は、異なるクロック・ドメイン間で信号を転送するときに、この遅延が与える影響を考慮する必要がある。

同期化回路を使い分ける

 1種類の同期化回路では、さまざまなデジタル回路に対応できない。基本的には、次の3種類の同期化回路がある(表1)。レベル型とエッジ検出型、パルス型である。このほかにも同期化回路は存在するものの、この3種類の回路でほとんどの分野をカバーできるだろう。
 レベル型の同期化回路では、異なるクロック・ドメイン間を転送される信号は受信側のクロック・ドメイン中で少なくとも2クロック・サイクルは高レベルあるいは低レベルの状態を維持する必要がある。また信号は有効になる前に、一度無効状態に変化させておかなければならない。信号が有効になる都度に、受信側の論理回路はイベントが発生したと見なす。これは信号が有効状態にある期間の長さとは関係がない。レベル型の同期化回路は、そのほかの同期化回路の基本となる回路である。
 エッジ検出型の同期化回路は、レベル型の同期化回路にフリップフロップを追加した回路である(図2)。追加したフリップフロップの出力を反転させた値と、レベル型同期化回路の出力の論理積(AND)を取る。この回路は同期化回路への入力信号の立ち上がりエッジを検出し、高レベルがアクティブで幅がクロック・サイクルのパルスを発生する。ANDゲートのインバーターをスイッチすれば、入力信号の降下エッジを検出する同期化回路を構成できる。またANDゲートをNANDゲートに変更すれば、低レベル・アクティブのパルスを発生できるようになる。
 エッジ検出型の同期化回路は、低い周波数のクロック・ドメインから高い周波数のクロック・ドメインにパルス信号を転送する場合に適している。この回路は、入力信号の立ち上がりエッジあるいは降下エッジを検出してパルスを生成する。ただし入力信号パルスの幅は、同期化回路のクロック周期と、初段の同期化回路のフリップフロップが要求するホールド時間の和よりも長くなければならない。最も安全なのは、入力信号パルス幅を同期化回路のクロック周期の2倍にしておくことである。送信側よりも受信側クロック・ドメインの周波数が低く、入力信号がクロック・サイクル幅のパルス信号である場合は、エッジ検出型の同期化回路は機能しない。この場合は、以下で説明するパルス型の同期化回路を利用すべきである。
 パルス型の同期化回路は、送信側のクロック・ドメインにおけるトグル回路と、受信側のクロック・ドメインにおけるレベル型同期化回路などで構成する(図3)。入力信号は、送信側クロック・ドメイン内のトグル回路にトリガーをかけるクロック・サイクル幅のパルス信号である。トグル回路の出力は、パルス信号を入力する都度に高レベルから低レベル、低レベルから高レベルへと切り替わる。この出力は受信側のレベル型同期化回路を通過して排他的論理和(XOR)ゲートに到達する。XORゲートの別の入力端子には、1クロック・サイクルだけ遅れた信号が到達する。トグル回路の出力が変化するたびに、同期化回路はクロック・サイクル幅のパルスを出力する。
 パルス型同期化回路の基本機能は、送信側のクロック・ドメインでクロック・サイクル幅のパルスを抽出し、受信側のクロック・ドメインでクロック・サイクル幅のパルスを生成することである。ただし入力信号パルスの間隔は、同期化回路のクロック・サイクルで2周期分以上にしなければならない。入力信号パルスの間隔が短いと、受信側クロック・ドメインにおける出力パルス同士が近づく。この結果、1周期分のクロック・サイクルよりも長い幅のパルスを同期化回路が生成してしまう。この問題は、入力信号パルスのクロック周期が同期化回路のクロック周期の2倍よりも長いと、より深刻になる。入力信号パルスの時間間隔が接近してくると、同期化回路は個々の入力パルスを区別できなくなるからだ。

ハンドシェークで同期を取る

 あるクロック・ドメインから別のクロック・ドメインへと伝送される情報は、1種類の信号だけとは限らない。データ信号やアドレス信号、制御信号などのバスを構成するすべての信号を転送することがある。このような場合に同期を取る手段としては例えば、ハンドシェーキング・プロトコルがある。
 ハンドシェーキング・プロトコルは、送受信の一方あるいは両方の応答時間を予測できない場合に相互通信を可能にする方法だ。フル・ハンドシェークとパーシャル・ハンドシェークという2つの方式がある。両方とも同期化回路を使用する。それぞれに一長一短がある。
 フル・ハンドシェーク方式の手順を図4に示す。始めは送受信のどちら側も待機状態にある。最初に回路Aが、リクエスト(要求)信号をアサートする。回路Bは受信したリクエスト信号が有効であることを確認し、アクノリッジ(応答確認)信号をアサートする。回路Aは、受信したアクノリッジ信号が有効であることを検知すると、リクエスト信号の完了を通知する。回路Bはリクエスト信号の完了を受信してリクエストが無効になったことを検知すると、アクノリッジ信号の完了を通知する。回路Aは、アクノリッジ信号が完了したことを検知するまでは、新しくリクエスト信号を送出することはない。なおフル・ハンドシェーク方式では、レベル型の同期化回路を利用する。
 フル・ハンドシェーク方式を回路設計者が採用するのは、受信側回路(回路B)がリクエストに対応できると送信側回路(回路A)に通知する必要がある場合である。送信側回路は、アクノリッジ信号が無効になるまで、次のリクエスト信号を送出してはならない。フル・ハンドシェーク方式では、シーケンスの完了に回路A側で5クロック・サイクル、回路B側で6クロック・サイクルを要する。合計で11クロック・サイクルかかる。この所要時間は、信号がクロック・ドメインを横切るのに2クロック・サイクルかかり、信号を受信してバッファーに格納してから応答を送信するまでに1クロック・サイクルかかることから決まる。フル・ハンドシェーク方式では送受信回路がリクエスト信号とアクノリッジ信号を確認するので動作は極めて安定である。ただし、処理の完了にはかなりのクロック・サイクルを要する。
 パーシャル・ハンドシェーク方式は、フル・ハンドシェーク方式に比べて処理手順を短くしたものである。送信側と受信側の回路はお互いの状態に関する情報を確認しないまま、処理手順を続行する。従ってフル・ハンドシェーク方式よりも通信の安定性は低い。一方、相手側回路からの信号を待たないので、処理に要する時間は短くなる。
 パーシャル・ハンドシェーク方式を使用する場合、アクノリッジ回路は適切なタイミングでアクノリッジ信号を発生しなければならない。アクノリッジ回路がリクエストの処理を完了してからほかの回路の信号を処理する必要がある場合は、アクノリッジ信号のタイミングが重要になる。任意の処理が完了したことを通知するために、アクノリッジ信号を使用するからだ。
 パーシャル・ハンドシェーク方式には、以下の2種類がある。1つはレベル信号とパルス信号の組み合わせを使用する。もう1つは、パルス信号だけを利用する。
 前者の場合は、回路Aがまずリクエスト信号をアクティブ・レベルにアサートする。このリクエストに対して回路Bは、クロック・サイクル幅のパルスでアクノリッジ信号を返す(図5)。回路Bは、回路Aがリクエスト信号を完了させるタイミングについては気にしない。ただし、回路Aは少なくとも1クロック・サイクル以上はリクエスト状態を維持する必要がある。さもないと、回路Bが古いリクエスト信号と新しいリクエスト信号を区別できなくなってしまう。
 この方式の場合、回路Bはリクエスト信号に対してレベル型の同期化回路を使用し、回路Aはアクノリッジ信号に対してパルス型の同期化回路を使用する。アクノリッジ・パルスは、回路Bがリクエスト信号を検知したときにだけ生成する。従って回路Aは、リクエスト信号の送出タイミングを制御することによって同期化回路が受信するパルスの間隔を調整できる。
 ハンドシェーク処理を完了させるためには、回路A側で3クロック・サイクル、回路B側で5クロック・サイクルを要する。フル・ハンドシェーク方式に比べてそれぞれ2サイクル、1サイクル短い。
 一方、パーシャル・ハンドシェーク方式でも後者の場合は、回路Bのアクノリッジ信号だけでなく、回路Aのリクエスト信号でもクロック・サイクル幅のパルスを使用する(図6)。必要なクロック・サイクル数はさらに減少する。この方式では、両方の回路とも、リクエストが保留中であることを示すためにその状態を保持(バッファー)しておく必要がある。
 この方式ではパルス型の同期化回路を使用する。ただし一方の回路のクロック周波数がもう一方の2倍以上ある場合は、エッジ検出型の同期化回路を利用できる。ハンドシェーク処理を完了させるためには、回路A側で2クロック・サイクル、回路B側で3クロック・サイクルを要する。フル・ハンドシェーク方式に比べると回路A側と回路B側で3サイクルずつ短くなっている(表2)

データ・パスの設計

 ここまで説明してきたハンドシェーク処理は、あるクロック・ドメインから別のクロック・ドメインに転送する信号が1種類の場合だった。しかし複数の信号群で構成するバスが複数のクロック・ドメインを横切ることもある。こうなると設計者は、より複雑な方式を採用しなければならない。
 信号群を同期させるとき、同期させるのは1カ所だけにしておく。これは回路設計での重要な条件である。同期を取るには1〜2クロック・サイクルを要する。従って複数の信号が複数のクロック・ドメインを渡って到着するタイミングを正確に予測することはできない。受信側のクロック・ドメイン内で信号群を構成する信号を個別に同期化しようとしてもそのタイミングは、入力信号が同期化回路に到着したタイミングに依存する。しかも遅延時間は1クロック・サイクルであったり、2クロック・サイクルであったりする。
 こうなると、個別に同期化された信号間に「レース状態(race condition)」を発生させてしまう。このレース状態は、データ信号やアドレス信号、制御信号などの信号群でも起こり得る。従ってデータ・バス信号やアドレス・バス信号などの同時に有効にする必要のある信号群に対しては、個々の信号に対して同期化回路を使用してはならない。
 このバス信号における同期化の問題を解決する方法の1つは、状態保持レジスター(信号バッファー)とハンドシェーク方式を併用することである(図7)。すなわち信号バスの状態を保持するレジスターと、ハンドシェーク回路で同期化回路を構成する。ハンドシェーク回路の信号は、受信側クロック・ドメイン内の回路がバス信号をサンプリングするタイミングと、送信側クロック・ドメイン内の回路が状態保持レジスターの内容を書き換えるタイミングを指示する。
 図7の回路では、送信側の回路はリクエスト信号をアサートするとき、バス信号の内容を状態保持レジスターに格納する。受信側の回路がリクエスト信号を検知するには少なくとも1クロック・サイクルかかる(最小ハンドシェーク同期遅延)。受信側の回路はバス信号の内容をサンプリングするとき、アクノリッジ信号をアサートする。ハンドシェーク手順はフル・ハンドシェーク方式なので、データ転送を完了するまでには長い時間がかかる。あまり効率的ではない。転送時間を短くしたければ、パーシャル・ハンドシェーク方式を採用することも可能である。
 この回路によるバス同期化方式では、ハンドシェーク信号は同期化しているがバス信号は同期化していない。バス信号の内容は送信側回路の状態保持レジスターから、受信側回路のサンプル・レジスターに転送されて保持される。なお送信側回路によるデータ転送速度が高くて受信側回路がデータを処理しきれない場合、この回路はうまく動かないことがある。注意されたい。

FIFOを使ったデータ・パス設計

 多くの回路において、あるクロック・ドメインから別のクロック・ドメインに一定量のデータを次々と転送する処理が行われている。この場合は、1個の状態保持レジスターでは対応できない。例えばデータを高い速度でバースト転送したために、受信側のサンプリングが不可能になるといった現象が起こる。また、受信側のデータ・バス幅が送信側のデータ・バス幅より狭い場合も同様である。このような回路では、同期を取るためにFIFO*を使う必要がある。
 FIFOは通常、データ転送速度の違いやデータ・バス幅の違いを整合するために組み込まれる。転送速度の違いを処理する場合、FIFOの高速側ポートがバースト転送を処理し、低速側ポートが一定速度の転送を処理する。ただし、入出力するデータの平均的な転送速度は高速側と低速側で同じでなければならない。さもなければ、FIFOはオーバーフローするかアンダーフローしてしまう。
 FIFOは単一の保持レジスターを使った回路と同様に、データを書き込むタイミングと読み出すタイミングを指示する状態信号と同期を取りながら、FIFO内のレジスターにデータを保持する。転送速度の違いを整合させる場合、書き込みポートと読み出しポートは異なるクロック周波数で動作する。FIFO内のレジスターは書き込みポートのクロックを利用する。これは状態保持レジスターがその内容を変更する回路のクロックを使うのと同様である。信号の同期化はポインター回路の中で実行される。これはハンドシェーク方式よりも設計が複雑である。
 ポインター回路による同期化には、いくつかの設計手法がある。代表的な手法は、読み出しストローブ信号と書き込みストローブ信号を同期させるために、各クロック・ドメイン内のカウンターを使ってFIFO内の利用可能なエントリーを追跡する方法である。カウンターは、読み出しあるいは書き込みに利用可能なFIFOエントリーの数を表示する。そしてカウンターは、読み出しポートと書き込みポートのそれぞれに同期させる。読み出しカウンターは格納してあるデータのエントリー数を、書き込みカウンターはデータを保存できるエントリー数を順次表示する。
 ポインター回路をリセットすると、読み出しカウンターはゼロになる。読み出せるデータがないからである。書き込みカウンターの数値はFIFOの最大エントリー数になる。FIFOのすべてのエントリーをデータ保存に利用できるからだ。
 読み出しストローブ信号は、読み出しカウンターの数値を1つ減らし、書き込み側のクロック・ドメインに同期化される。その後、書き込みカウンターの数値を1つ増やす。書き込みストローブ信号は、書き込みカウンターの数値を1つ減らし、読み出し側のクロック・ドメインに同期化される。それから読み出しカウンターの数値を1つ増やす。
 読み出しと書き込みのストローブ信号を同期化するためには、1クロック周期のパルスで動かすパルス型の同期化回路を必要とする。これは低速のクロック・ドメインから高速のクロック・ドメインへと信号を転送するときに、高速のクロック・ドメインではより多くのクロック・サイクル期間、信号を保持するためである。パルス型の同期化回路は、あるクロック・ドメイン内における1クロック周期のパルス信号を、転送先のクロック・ドメイン内で1クロック周期のパルス信号に変換する。それぞれのパルス信号は、FIFOの読み出しあるいは書き込みを指示する。
 ただし、FIFOを使ったこの設計には問題がいくつかある。まず、読み出しポートと書き込みポートの状態表示で生じる。FIFOのすべてのエントリーにデータが格納されているとき、書き込みポートの状態表示はフル(満杯)になる。ところが読み出しストローブがトリガーした後でも、しばらくはフル状態が継続する。ストローブの同期化が終わってから書き込みカウンターの数値を書き換えるからだ。同期化による遅れがある。読み出しポートがエンプティー(完全に空き)状態であるときも、同様の現象が起こってしまう。書き込みストローブ信号の同期化による遅れがあるからだ。
 もう1つの問題は、適切なタイミングで状態表示のフルとエンプティーを検知できるかどうかである。FIFOのエントリーが1つだけ空いている状態で書き込みストローブ信号が発生した場合、FIFOはすぐにフル状態に状態表示を変更しなければならない。この場合、FIFOがオーバーフローしないように十分なタイミング余裕をもって次の書き込みを禁止するためには、1クロック・サイクルだけ早くフル状態を表示する必要がある。同様の条件は読み出しポートについても生じる。FIFOのエントリーが1つだけ埋まっていて読み出しストローブ信号が発生した場合、完全に空になったFIFOからの読み出しを禁止するように十分なタイミング余裕をもってエンプティー状態を表示させる必要がある。
 こういった条件を満足するポインター回路は、回路がクロック・サイクルごとにFIFOにアクセスするように制限を加えている。これはクロック周波数が低くても同様である。すなわち、回路がFIFOにアクセスするときは、FIFOの状態を把握するためのタイミング余裕を少なくとも1クロック・サイクルだけ持てるということである。従ってFIFOはデータをオーバーライトさせる恐れなしに各データ・エントリーをデータで満たせる。また誤って読み出す恐れなしにエンプティー状態にできる。さらに、書き込みカウンターと読み出しカウンターのどちらの数値からも、利用可能なエントリー数を検知できる。回路設計者はアンダーフローあるいはオーバーフローを起こさずに、複数のデータの読み出しあるいは書き込みにこのFIFO回路を使える。
 この回路の欠点は、読み出しポインターと書き込みポインターを直接比較するのではなく、カウンターが状態を決めていることである。FIFOの容量が大きくなると、カウンターの規模もまた大きくなってしまう。またデータ転送速度が低い。低速側回路のクロック周波数の半分になる。パルス型の同期化回路では、高速側回路のパルス信号の幅が低速側回路の2クロック周期以上なければならないからだ。こういった欠点を解決するには、ポインターを直接比較する必要がある。

グレイ符号を利用する

 読み出しポインターと書き込みポインターを直接比較してFIFOの状態を判定することは、非同期回路では簡単ではない。それぞれのポインターが異なるクロック・ドメインに存在することと、バス信号を同期化するハンドシェーク処理中にはバスの状態が変化してはならないからである。ポインターを同期化するのでは、どうしても回路動作が低速になってしまう。この問題を解決するため、ポインターにバイナリー符号ではなく、グレイ符号*を使用する。
 グレイ符号の特徴は、データ・カウントが1つ増加あるいは減少するときに、常に1ビットしか変化しないことである(表3)。グレイ符号のバスでは、バスが変化するときに1つの信号しか変化しない。従って、同期化回路を使用しても、異なる同期化回路間でデータを転送するときのレース状態を回避できる。
 ポインターにはグレイ符号カウンターを使う。バイナリー符号のポインターは使えない。バイナリー符号をグレイ符号に変換してからポインターの値を同期化しなければならないからだ。この変換論理回路がクロック・ドメイン間に入ると、送信側クロック・ドメインと受信側クロック・ドメインの間にいかなる組み合わせ論理回路も存在しないという制約条件を破ることになる。
 グレイ符号カウンターは、符号変換回路付きのバイナリー加算器で構成される(図8)。グレイ符号とバイナリー符号の変換は排他的論理和(XOR)演算である。バイナリー・カウンターに比べると回路の論理ゲート数はわずかに増える。
 グレイ符号からバイナリー符号への変換は次の論理演算によって実行される。
BN=GN; BN−1=BN+GN−1; BN−2=BN−1+GN−2... B1=B2+G1; B0=B1+G0
 バイナリー符号からグレイ符号への変換は次の論理演算によって実行される。
GN=BN; GN−1=BN+BN−1; GN−2=BN−1+BN−2... G1=B2+B1; G0=B1+B0
 グレイ符号ポインターとバイナリー比較論理との間に変換器を追加することによって、グレイ符号ポインターの値を比較できる。
 このポインター回路を備えたFIFOは高速に動作する。回路はFIFOへの書き込みあるいはFIFOからの読み出しをクロック・サイクルごとに実行できる。ただし、FIFOの状態表示として「ほぼ満杯(almost full)」および「ほとんど空き(almost empty)」を用意しておく必要がある。FIFOにアクセスする回路を止めるタイミング余裕を持たせるためだ。ここで「ほぼ満杯」とは、1つのエントリーだけを書き込める状態を指し、「ほとんど空き」とは、1つのエントリーだけが読み出されずに残っている状態を指す。
 こういったFIFOの状態表示はここでも問題を抱えている。FIFOがデータで満たされているとき、書き込みポートの状態表示はフル状態となる。ところが回路がデータを読み出した後も、フル状態がしばらく継続する。読み出しポインターから書き込み側比較論理回路への同期化に要する遅延時間があるからだ。読み出しポートが完全に空き(エンプティー)状態のときも、同様の現象が生じる。書き込みポインターから読み出し側比較論理回路への同期化による遅れがある。
 ここまで、異なるクロック・ドメイン間で信号を転送するためのさまざまな回路設計を紹介してきた。受信側のフリップフロップが不安定になることを防ぐためには、同期化回路を使用する。レベル型の同期化回路は、ある状態を複数クロックの期間に維持する信号の場合に適している。受信側のクロック・ドメインで信号がパルスに変化する場合、低速側クロック・ドメインのレベル信号に対してはエッジ検出型の同期化回路を使用できる。パルス信号が異なるクロック・ドメインを横切る場合は、パルス型の同期化回路が使える。
 バス信号のような信号群がクロック・ドメイン間を移動するときは、信号群は同一のクロック・サイクル内に受信側クロック・ドメインに到着しなければならない。それぞれの信号に対して同期を取るのではなく、状態保持レジスターとハンドシェーク処理を適用する。この手法はデータ・バスには有効であるものの、同時に1データ・ワードしか受信側クロック・ドメインに送出できないという欠点がある。

用語解説 / 会社情報

マイク・スタイン氏は米パラダイム・ワークス社のプリンシパル・コンサルティング・エンジニアを務める。ASICおよびFPGAの設計と合成、静的タイミング解析を担当している。米ノースウエスタン大学卒。電気工学士。
▲本文へ戻る
【ASIC】
application specific integrated circuit
特定用途向けIC。ここではセミカスタムLSIを指す。
▲本文へ戻る
【FPGA】
field programmable gate array
ユーザーが設計した論理回路を手元で書き込める半導体デバイス(PLD)のなかで、論理ブロックの構造がゲートアレイに近いタイプを指す。
▲本文へ戻る
【FIFO】
first-in first-out
最初に入力したデータが最初に出力される構造のデータ・バッファー(レジスター)。
▲本文へ戻る
【グレイ符号】
Gray code
データが1つ増減するときに、データを構成するビットのどれか1つしか常に変化しない符号。
▲本文へ戻る
参考文献
1)
Davis, Leroy, Logic Metastability, www.interfacebus.com/Design_MetaStable.html, September 2002.
2)
Seed, Luke, Introduction to VLSI/Clocked CMOS Circuits, The University of Sheffield, UK, February 2002.
3)
Haseloff, Eilhard, "Metastable Response in 5-V Logic Circuits," Texas Instruments Application Note SDYA006, www-s.ti.com/sc/psheets/sdya006/sdya006.pdf, February 1997.
4)
Cummings, Clifford E, "Synthesis and Scripting Techniques for Designing Multi-Asynchronous Clock Designs," Synopsys Users Group Conference, San Jose, CA, www.sunburst-design.com/papers, March 2001.
5)
"A Metastability Primer," Philips Semiconductors Application Note AN219, www.semiconductors.philips.com/acrobat/applicationnotes/AN219_1.pdf, Nov 15, 1989.
6)
Wakerly, John F, Digital Design: Principles and Practices, Prentice Hall, 1990.
雑誌無償購読申込み ニュースレター登録 この記事に対する感想/ご意見
Reed Electronics Group
Electronic BUSINESS Japan | Design News Japan | Semiconductor INTERNATIONAL | DETAIL JAPAN
EDN Japanについて | 広告掲載について | サイトマップ | お問合せ
 Copyright (C) 2000-2007 Reed Business Information Japan K.K. 
個人情報に関する方針 | 著作権・リンクについて | 会社情報