同期設計とは, システムの状態が単一のクロックに同期して変化するものと理想化することによって, 設計を簡単化するものである. しかし現実世界はそれほど単純ではないので, 現実をモデルに近づけるための技術が必要とされる.
1つの論理ゲートの出力に接続されている次段の論理ゲートの入力の数を, 出力側の論理ゲートの ファンアウト という. 通常のゲートのファンアウトは, 1から, 多くても10程度である. それに対してクロックとリセットはシステム中のほとんどすべてのFFに配られるため, それ以外の信号に比べて何桁も多いファンアウトを持ち, その総配線長も非常に大きなものとなる. そのため, 各素子に信号が到着する時刻の間にずれが生じることが避けられない. このずれのことを スキュー と呼ぶ.
下に示した回路では, クロック, リセットそれぞれのスキューによって, どのような想定していない動作が生じるだろうか?
クロック・スキューは, 論理ゲートの遅延時間と同様に, システムのサイクル・タイムに影響を及ぼす. 実際 最新のプロセッサでは, 論理ゲートの遅延と共に, クロック・スキューがサイクル・タイムを規定する大きな要因の1つになっている.
本実験で使用する Xilinx の LCA では, クロックとシステム・リセットのそれぞれに対して, グローバル・ラインと呼ばれるスキューが小さい特別な配線が用意されている. クロックに対してこれを利用するためには, 入力バッファに BUFGP を用いればよい . BUFGP は高いドライブ能力を持つバッファであり, グローバル・ラインと相まって, 低スキュー/低遅延のクロック分配を実現する. BUFGP を使用するためには, 専用の入力ピンを用いる必要があるが, KITE ボードはちゃんとそのように作られている. システム・リセットについては後述する.
クロックに同期していない信号 ─── 例えば KITE ボードのスイッチの出力を FF の入力とすると, セットアップ/ホールド時間を守れない状況を避けることができない.
セットアップ/ホールド時間が守れない場合には, メタステーブル と呼ばれる現象が発生することがある. メタステーブルとは, FF の出力が長い間 閾値付近の電位にとどまる現象である. メタステーブルが発生すると, 誤作動を起こすだけでなく, 素子の劣化の原因にもなる.
メタステーブルを回避する本質的な方法は存在しない. ただし, 2つの D-FF を直列に接続することにより, その出力における発生頻度を実用上問題ない程度にまで低減することができる. 下に, その回路図を示す.
この回路では, たとえ1段目のFFがメタステーブル状態に陥っても, その期間が1サイクル以内であれば, 2段目の FF でその影響を除去することができる. この回路を, 非同期信号の同期化回路と呼ぶ.
システムのクロックは普通, 水晶発振器を源発振として供給される. 水晶発振子とは,水晶(クォーツ)に電圧をかけると 非常に高い精度で周期発振する現象を利用したものである. 水晶発振器は, 電源投入とほぼ同時に発振を開始する.
電源投入直後のFFの値は, 予測がつかない. クロックは電源投入直後から入力されているので, そのままでは想定していない動作を行った末に自壊してしまうこともあり得る). したがって電源投入直後は, 速やかにシステムを既知の初期状態に遷移させる必要がある.
このため電子回路には通常, パワーオン・リセットと呼ばれる回路が付設されていて, 電源投入からしばらくの間(数mから数十msec程度) 自動的にシステムのリセット信号をactiveにする.
このリセット信号が切れる ─── inactive になるタイミングは普通, クロックとは非同期である;すなわち, クロック周期のどこでリセットが切れるか予測がつかないし, 毎回同じタイミングで切れるとも限らない.
したがって, リセットされる値とリセット直後に書き込まれる値が異なる回路は, 正しくリセットされない; クロック・エッジの直前にリセットが切れた場合, FF のセットアップ/ホールド時間を保つことができないからである.
SIMPLE/B では, 例えば制御回路とプログラム・カウンタなど, リセットが切れた後に自動的/能動的に「動き出す」レジスタは, リセットされる値と直後に書き込まれる値が異なるFFを少なくとも1つ含むため, 正しくリセットされない. 一方, IRなど, 受動的にしか動かないレジスタは, 正しくリセットできる (もしあれば, NOP 命令のパタンにリセットするとよい). 汎用レジスタ, AR, BR, DR など, その他のほとんどのレジスタは, そもそもリセットする必要が無い.
リセットが正しく動作するように対策がなされていない場合には, 確率的にリセットがかからないシステムができる. 本実験では, 確率的に0番地ではなく1番地からプログラムの実行を開始する プロセッサが時々見られる. リセット・ボタンを何度も押さないとうまく動かないようなら, この辺りを疑うべきである.
システム・リセットに関する問題は, そもそもシステム・リセットがクロックと非同期であることに起因している. したがって,能動的に動き出すレジスタに対するリセットを クロックに同期化してしまえばよい.
Xinlix の LCA では, 以下のようにすれば, ここで述べた, スキュー, 非同期信号, システム・リセットの, それぞれの問題を解決することができる .
LCA には, グローバル・セット/リセットという特別な低スキューの配線があり, すべてのFFの非同期リセット(セット)端子に信号を分配する. 上図の STARTUP シンボルの GSR ピンは, このグローバル・セット/リセットに接続されている.
回路図入力では, セットまたはリセット付きの FF のシンボルを用いるだけで, 生成される FF の非同期セット/リセット端子は このグローバル・セット/リセットに接続される. したがってこのシンボルのセット/リセット端子は, 回路図上では解放したままでよい.
なお, KITE ボードがそうであるように, システム・リセットなどのチップ外部の制御信号は, 負論理であることが多い. 一方 Xilinx LCA では, 基本的にすべて正論理であるので注意すること.