本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。
次の図に、マスタスレーブ型のフリップフロップ(Flip Flop、FFと略す)の回路を示す。
この図のように、マスタスレーブ型フリップフロップはラッチを2段 直列に接続し、G入力には互いに逆の信号を入力した形をしている。後段のラッチは前段のQの値を言われたままにコピーするので、前段がマスタ(主人)で後段はスレーブ(奴隷)と名付けられている。動作としては、CKが"0"の状態ではマスタのGは"1"であり、D入力がそのままマスタのQとなり、スレーブのD入力となる。しかし、スレーブのG入力は"0"であるので、スレーブのQ出力は以前の値を保持している。
CKが"0"から"1"に変化すると、スレーブのG入力が"1"になるのでスレーブはD入力の値をQに出力する。同時にマスタのG入力は"0"になるので、マスタのQ出力は直前のD入力の値を保持する。CK入力が"1"の期間はスレーブラッチはD入力がそのままQ出力に影響するのであるが、マスタは保持状態でありQ出力は変化しないので、スレーブのQ出力も一定の値を保持する。
このようにマスタスレーブ型FFは、クロック入力CKが"0"から"1"に変化する瞬間のD入力の値を記憶するが、それ以外の場合は以前の状態を保持する回路である。
ラッチもFFも状態を記憶する回路であるが、ラッチを使って、その間に論理回路を挟んだ、次のような回路を作る場合を考えてみよう。
この構成は左側の波形のように、クロックの立ち上がりから次のクロックの立ち上がりまでの1サイクルで論理回路の処理を終わり、2回目のクロックの立ち上がりで処理結果を2段目のラッチに取り込むという回路である。
しかし、右側の波形のように論理回路の遅延が短い場合は、CKが"1"の間に、論理回路の出力が2段目のラッチのD入力に届いてしまう。このため2段目の出力は意図した2回目のクロックの立ち上がりではなく、1回目のCKが"1"の間に変化してしまう。このように意図したサイクルより早く信号が出て来て誤動作してしまうことをレーシング(Racing)と呼ぶ。
このようにラッチ‐ラッチ間でデータを伝送する回路では、CKが"1"の期間以上に長い論理回路遅延を必要とするという制約があり、設計が難しくなる。
これを避けるには次のような回路が用いられる
Φ1、Φ2の2種類のクロックを使う2相式の回路では、前の図の論理回路を論理回路Aと論理回路Bに分割する。こうすると、Φ1が"1"の間に論理回路Aの出力が変化しても、Φ2は"0"であるので2段目のゲート入力信号は伝搬しない。第2段の出力はΦ2が"1"になった直後に変化し、論理回路Bの出力はΦ1が2回目に"1"になるまでに第3段のラッチの入力に到着していれば良い。そして、この図では省略されているが、3段目のラッチの出力は論理回路Cを経由してΦ2をゲート入力とする4段目のラッチに入力されるという構造をとる。
このように2相式回路では、論理回路A、B、Cの遅延が小さくともレーシングは発生しない。
また、次の回路のように、ラッチではなく、FFを用いると1相のクロックでもレーシングを起こさない。ラッチはG入力が"1"の期間は入力から出力へデータが筒抜けになるのでレーシングを起こすが、FFはクロックの"0"→"1"変化の瞬間の入力データを取り込んで保持するため、ラッチのようにデータが筒抜けになる期間が存在しないからである。前に回路図を示したようにマスタスレーブ型のFFは、実は内部に2個のラッチが入っており、マスタ側の*CKがΦ1であり、スレーブ側のCKがΦ2と同じ役目を果たしているので、2相式の回路で論理回路Aを無くして、全部の論理を論理回路Bに押し込んだ構成と考えても良い。
このようにFFを用いるとレーシングの心配が少なく(大きなチップでは、クロック分配系の遅延にバラツキが出るので、レーシングが皆無とは言えない)回路が作りやすいので、現在ではFFを使った設計が一般的である。