3日目: [半導体回路] Dフリップフロップ
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の3日目の記事です。
昨日はnMOSトランジスタの動作原理を説明し、NANDゲートを作り、さらにANDゲートやORゲートも作った。
今日のメインテーマはDフリップフロップ(DFF)だ。こいつはNANDゲートを元に作られている。 彼こそがCPUの本体であり、CPUそのものだ。
順序回路と組み合わせ回路
我々は情報を記録したい。
ノートに数字を書き込むかのごとく、電子の力で回路に数字を書き込みたい。 しかし、例えばORゲートを考えてみると
入力が変わると出力も変化してしまう。 「記録」を回路の言葉に言い換えると、入力が変わっても出力は変わらないということだ。 ただのORゲートでは、入力が変わると出力も変わるので、情報は記録できない。
そこで、ORゲートの出力を入力に繋いでみると
時刻 | 入力 | 出力 | イベント |
---|---|---|---|
0s | L | L | 開始 |
3s | H | H | 入力を上げたら、出力も上がった |
6s | L | H | 入力を下げたが、出力は変化なし |
「入力電圧が高くなった(ことがある)」という情報が記録できている。嬉しい。
ここまでの話を強引にまとめると
- 出力が入力に戻らないと、情報は記録できない(組み合わせ回路)
- 出力を入力に繋げば、情報が記録できる(順序回路)
記憶素子の作り方が分かり嬉しいわけだが、、、しかし今導入したORのループ回路は不便すぎる。 一度情報を記録すると、(回路全体の電源を落とさない限り)上書きできない。 また入力を常に監視しており、「2秒後の状態を記録してほしい」のような記録タイミング指定機能もない。
もっと良い記憶素子がほしい。 そこで登場するのがDフリップフロップだ。
Dフリップフロップの概要
Dフリップフロップの回路図を見てみる。
ややこしすぎて泣きそうになる。完全に意味不明だと思うが、まず落ち着こう。 とりあえず確認すべきは、左上の入力Dと、左下の入力CLOCKと、右上の出力Qだ。 次に確認すべきは線がナナメになっている箇所。 NANDゲートの出力が入力に繋がっている。 ORゲートで見たように、こういう配線には情報記録の雰囲気がある。
回路図はややこしいので、下のタイムチャートを見よう。 このグラフは、各時刻におけるD(入力)、Q(出力)、クロックの電圧を表しており、右に行くほど新しい時刻になる。 クロックは未説明だが、要するに電圧のHとLが時間変動する素子に繋げば良い1。 そしてここからが重要だが、時間経過を追うと
時刻 | 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個入っている。 よくみると左から順に四段構成になっていることが分かるだろう。
まず第一陣(左端)のNANDペアを見ると、クロックの反転電圧が入ってきている。 ここで、NANDは入力に(1つでも)Lが含れると、出力がHになることに注意しよう。 従ってクロックがHの時間帯は、入力によらず、第一陣の出力が両方Hに固定される。
次に第三陣(中央右)のNANDペアを見ると、クロックと同じ電圧が入ってきている。 従ってクロックがLの時間帯は、入力によらず、第三陣の出力が両方Hに固定される。
こうした事情により、クロックがHのときもLのときも、Q(出力)は一定になる。 入力をガチャガチャと変えても、出力は変化しない。 この結果を見ると、入力は出力に一切伝わらないと結論したくなる。 しかし後で(シンボリックな表現のところで)見るように、クロックが立ち上がる瞬間だけ、入力と出力がつながるのだ。
RSラッチ
今度は第二陣(中央左)のNANDペアと、第四陣(右端)のNANDペアを詳しく見ていこう。 よく見るとこいつらは同じ形をしている。 この2入力2出力回路はRSラッチと呼ばれている。
この動画を見ればRSラッチの仕組みと挙動はわかると思う2が、要するにどちらの入力を下げたか?という情報を保存する回路だ。 * 入力が両方Hの状況は、情報保持モード * 片方をLに変えると、情報が更新される。
シンボリックな表現
第一陣から第四陣までの説明を終えたが、これらを連結すると
白の4本の縦線は第一陣から第四陣までのNANDゲートを表している。 第一陣or第三陣の太線は、出力がHに固定された部分を表している。 第二陣と第四陣の色付きの玉は、RSラッチ保持された電圧情報を表している。
Dフリップフロップの仕組みが理解したければ、黙って5分間この動画を眺めるのが良いと思う3。 特に中央左寄りの、第二陣の玉を眺め続けるのだ。動作原理が理解できることを保証しよう。
重要なのはクロックがLからHになる瞬間で、CLOCK: H edge と書いておいた。 この瞬間、入力のDから出力のQまで一色になる。他の時間帯は入力と出力が切り離されている。
文章による説明
上のgifアニメをしっかり眺めたところで、もう一度回路図を見てみよう。
説明の前に、クロックが下がる直前にD(入力)の電圧は変化しないと仮定しよう4。
クロックがLからHに上がる瞬間
まず第一陣と第二陣のNANDゲートに着目する。
- 動画ではクロックがLの時にD(入力)を変えているので、その電圧変化は第二陣の出力に伝わっている
- クロックが上がると、第二陣のRSラッチの入力は両方共Hになり、情報保持モードに移る
- つまりクロックが上がる直前と下がった後で、第二陣の出力は変化しない
- クロックが上がった後に入力を変更しても、第二陣は以前の状態を保持し続ける
次に第三陣と第四陣のNANDゲートに着目する。
- クロックがLの時、第三陣の出力は両方共Hなので、第四陣のRSラッチは情報保持モードになっている
- つまり第四陣の出力は、前回の状態をキープしたまま動かない
- 次にクロックが下がった後を考える
- クロックが上がる直前と下がった後で、第二陣の出力は一定のまま変化しなかった
- クロックが上がった後は、第二陣の出力が第三陣の出力に引き継がれ、更に第四陣の出力結果(Q)に引き継がれる
クロックがHからLに下がる瞬間
この時に出力は変化しないのだが、その理由は
- クロックがHのとき、D(入力)の情報は第一陣で遮断されてしまう。
- つまり記憶素子のRSラッチまで情報が届かない。
- クロックが下がった後も、D(入力)の情報が第三陣で遮断されるので、Q(出力)には届かない
どうでもいい話
今日はDフリップフロップ(正式名称はマスタースレーブ式立上がりエッジトリガ型Dフリップフロップ回路)の仕組みに全力投球した。 正直、この記事を読んだ人がどれぐらい理解できるか心もとない。 仕組みが完全には理解できなくても
- クロックが上がる瞬間に、入力が出力にコピーされる
- その瞬間以外は、入力をどれだけ変えても出力は変わらない
という挙動さえわかれば、明日以降に支障はない。
Dフリップフロップは圧倒的超絶的に重要だ。 実は彼こそが、CPUの本体であり、CPUそのものなのだ。
明日はDフリップフロップを使い、1bitのCPUを作る予定。