しかくいさんかく

解答略のメモ

3日目: [半導体回路] Dフリップフロップ

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の3日目の記事です。

昨日はnMOSトランジスタの動作原理を説明し、NANDゲートを作り、さらにANDゲートやORゲートも作った。

今日のメインテーマはDフリップフロップ(DFF)だ。こいつはNANDゲートを元に作られている。 彼こそがCPUの本体であり、CPUそのものだ。

順序回路と組み合わせ回路

我々は情報を記録したい。

ノートに数字を書き込むかのごとく、電子の力で回路に数字を書き込みたい。 しかし、例えばORゲートを考えてみると

f:id:kaitou_ryaku:20171202130105g:plain:w200

入力が変わると出力も変化してしまう。 「記録」を回路の言葉に言い換えると、入力が変わっても出力は変わらないということだ。 ただのORゲートでは、入力が変わると出力も変わるので、情報は記録できない。

そこで、ORゲートの出力を入力に繋いでみる

f:id:kaitou_ryaku:20171202130111g:plain:w200

時刻 入力 出力 イベント
0s L L 開始
3s H H 入力を上げたら、出力も上がった
6s L H 入力を下げたが、出力は変化なし

「入力電圧が高くなった(ことがある)」という情報が記録できている。嬉しい。

ここまでの話を強引にまとめると

  • 出力が入力に戻らないと、情報は記録できない(組み合わせ回路)
  • 出力を入力に繋げば、情報が記録できる(順序回路)

記憶素子の作り方が分かり嬉しいわけだが、、、しかし今導入したORのループ回路は不便すぎる。 一度情報を記録すると、(回路全体の電源を落とさない限り)上書きできない。 また入力を常に監視しており、「2秒後の状態を記録してほしい」のような記録タイミング指定機能もない。

もっと良い記憶素子がほしい。 そこで登場するのがDフリップフロップだ。

Dフリップフロップの概要

Dフリップフロップの回路図を見てみる。

f:id:kaitou_ryaku:20171202130152g:plain:w600

ややこしすぎて泣きそうになる。完全に意味不明だと思うが、まず落ち着こう。 とりあえず確認すべきは、左上の入力Dと、左下の入力CLOCKと、右上の出力Qだ。 次に確認すべきは線がナナメになっている箇所。 NANDゲートの出力が入力に繋がっている。 ORゲートで見たように、こういう配線には情報記録の雰囲気がある。

回路図はややこしいので、下のタイムチャートを見よう。 このグラフは、各時刻におけるD(入力)、Q(出力)、クロックの電圧を表しており、右に行くほど新しい時刻になる。 クロックは未説明だが、要するに電圧のHとLが時間変動する素子に繋げば良い1。 そしてここからが重要だが、時間経過を追うと

f:id:kaitou_ryaku:20171202132646p:plain:w600

時刻 D(入力) Q(出力) クロック イベント
0 L L L 開始
1 H L L 入力を上げたが、出力は変化なし
2 H H H クロックが上がる瞬間に、入力が出力にコピーされた
3 H H L クロックがLに戻ったが、出力は変化なし
4 L H L 入力を下げたが、出力は変化なし
5 L L H クロックが上がる瞬間に、入力が出力にコピーされた

簡潔にまとめると

  • クロックが上がる瞬間(タイムチャート黄色)に、出力が入力と同じ状態になる
  • その瞬間以外(タイムチャート白色)は、入力をどれだけ変化させても出力は変わらない (タイムチャートの白色のところ)

さっきのORループ回路にはなかった記録タイミング指定機能と、上書き機能が搭載されていることが分かるだろう。

ここから先は、Dフリップフロップがなぜこのような挙動を示すのか、回路図から理解していく。

入力の遮断

回路図の分析に移ろう。 この回路にはNANDゲートが8個入っている。 よくみると左から順に四段構成になっていることが分かるだろう。

f:id:kaitou_ryaku:20171202132712g:plain:w600

まず第一陣(左端)のNANDペアを見ると、クロックの反転電圧が入ってきている。 ここで、NANDは入力に(1つでも)Lが含れると、出力がHになることに注意しよう。 従ってクロックがHの時間帯は、入力によらず、第一陣の出力が両方Hに固定される。

次に第三陣(中央右)のNANDペアを見ると、クロックと同じ電圧が入ってきている。 従ってクロックがLの時間帯は、入力によらず、第三陣の出力が両方Hに固定される。

こうした事情により、クロックがHのときもLのときも、Q(出力)は一定になる。 入力をガチャガチャと変えても、出力は変化しない。 この結果を見ると、入力は出力に一切伝わらないと結論したくなる。 しかし後で(シンボリックな表現のところで)見るように、クロックが立ち上がる瞬間だけ、入力と出力がつながるのだ。

RSラッチ

今度は第二陣(中央左)のNANDペアと、第四陣(右端)のNANDペアを詳しく見ていこう。 よく見るとこいつらは同じ形をしている。 この2入力2出力回路はRSラッチと呼ばれている。

f:id:kaitou_ryaku:20171202132858g:plain:w300

この動画を見ればRSラッチの仕組みと挙動はわかると思う2が、要するにどちらの入力を下げたか?という情報を保存する回路だ。 * 入力が両方Hの状況は、情報保持モード * 片方をLに変えると、情報が更新される。

シンボリックな表現

第一陣から第四陣までの説明を終えたが、これらを連結すると

f:id:kaitou_ryaku:20171202132912g:plain:w400

白の4本の縦線は第一陣から第四陣までのNANDゲートを表している。 第一陣or第三陣の太線は、出力がHに固定された部分を表している。 第二陣と第四陣の色付きの玉は、RSラッチ保持された電圧情報を表している。

Dフリップフロップの仕組みが理解したければ、黙って5分間この動画を眺めるのが良いと思う3。 特に中央左寄りの、第二陣の玉を眺め続けるのだ。動作原理が理解できることを保証しよう。

重要なのはクロックがLからHになる瞬間で、CLOCK: H edge と書いておいた。 この瞬間、入力のDから出力のQまで一色になる。他の時間帯は入力と出力が切り離されている。

文章による説明

上のgifアニメをしっかり眺めたところで、もう一度回路図を見てみよう。

f:id:kaitou_ryaku:20171202130152g:plain:w600

説明の前に、クロックが下がる直前にD(入力)の電圧は変化しないと仮定しよう4

クロックがLからHに上がる瞬間

まず第一陣と第二陣のNANDゲートに着目する。

  1. 動画ではクロックがLの時にD(入力)を変えているので、その電圧変化は第二陣の出力に伝わっている
  2. クロックが上がると、第二陣のRSラッチの入力は両方共Hになり、情報保持モードに移る
  3. つまりクロックが上がる直前と下がった後で、第二陣の出力は変化しない
  4. クロックが上がった後に入力を変更しても、第二陣は以前の状態を保持し続ける

次に第三陣と第四陣のNANDゲートに着目する。

  1. クロックがLの時、第三陣の出力は両方共Hなので、第四陣のRSラッチは情報保持モードになっている
  2. つまり第四陣の出力は、前回の状態をキープしたまま動かない
  3. 次にクロックが下がった後を考える
  4. クロックが上がる直前と下がった後で、第二陣の出力は一定のまま変化しなかった
  5. クロックが上がった後は、第二陣の出力が第三陣の出力に引き継がれ、更に第四陣の出力結果(Q)に引き継がれる
クロックがHからLに下がる瞬間

この時に出力は変化しないのだが、その理由は

  1. クロックがHのとき、D(入力)の情報は第一陣で遮断されてしまう。
  2. つまり記憶素子のRSラッチまで情報が届かない。
  3. クロックが下がった後も、D(入力)の情報が第三陣で遮断されるので、Q(出力)には届かない

どうでもいい話

今日はDフリップフロップ(正式名称はマスタースレーブ式立上がりエッジトリガ型Dフリップフロップ回路)の仕組みに全力投球した。 正直、この記事を読んだ人がどれぐらい理解できるか心もとない。 仕組みが完全には理解できなくても

  • クロックが上がる瞬間に、入力が出力にコピーされる
  • その瞬間以外は、入力をどれだけ変えても出力は変わらない

という挙動さえわかれば、明日以降に支障はない。

Dフリップフロップは圧倒的超絶的に重要だ。 実は彼こそが、CPUの本体であり、CPUそのものなのだ。

明日はDフリップフロップを使い、1bitのCPUを作る予定。


  1. 電圧が振動する素子は色々な作り方がある。例えばトランジスタとコイルで構成される非安定マルチバイブレータを元に作ることもできる。本格的なCPUでは水晶発振子が使われるらしい。

  2. RSラッチの入力を両方Lにするのはヤバい行為として禁止されている。両方のNANDが切り替わる僅かな時間差に応じて、出力状態が変わるため、論理的に予測できない挙動が起きてしまう。Dフリップフロップでは、入力の片方は必ずHなので問題ない。

  3. なぜ僕の作るgifアニメはキモい感じになるのだろう。

  4. 仮定というか、そうなるように回路全体を構成する必要がある。