この章では、最も単純な記憶素子であるフリップフロップについて学びます。この講義では、AND, OR, NOT 素子のように、フリップフロップはできあいのパーツとして紹介します。
フリップフロップには様々な種類がありますが、ここでは単純な D-フリップフロップを紹介します。
D-フリップフロップは 2 つの入力端子 D, CK と 1 つの出力端子 Q を持ちます。ただし、これまで見てきた回路のように、入力のパターンだけで出力が決まる訳ではありません。つまり、動作が真理値表では表すことができません。これまでのような入力パターンで出力が決まる回路のことを組み合わせ回路、フリップフロップのように過去の動作に依存して出力が決まる回路を順序回路といいます。
D-フリップフロップで重要な役割を果たすのはクロックと呼ばれる入力 CK です。D-フリップフロップは CK が 0 から 1 になった瞬間の D の値を Q に出力し続けます。CK を書き換え信号だと思うと分かりやすいと思います。クロックの値が 0 から 1 になる瞬間のことをクロックの立ち上がりとも言います。
ある時点で D = 1, CK = 0 だとしましょう。ここで入力が切り替わって CK = 1 になると、Q = 1 と出力します。このあと、D を変更しても CK = 1 であり続ける限りは Q = 1 のままです。CK = 0 と変更してもまだ Q = 1 のままです。しかしここでまた改めて CK = 1 と変更すると、今の D の値で Q が書き換わります。これを時系列順に描くと以下のようになります。クロックの立ち上がりを太字のオレンジで表しています。
時刻 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
D | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
CK | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
Q | ? | ? | ? | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
D-フリップフロップはクロックの立ち上がりの瞬間の値を「記憶」しているので記憶素子と呼ばれます。
フリップフロップは単体では 0 か 1、つまり 1 ビットしか記憶できないので、これを並べることで複数ビットの記憶を実現します。クロックが共通の n ビット並べた D-フリップフロップを DFFn と書くことにしましょう。
これが CPU のうちレジスタと呼ばれるパーツの基本的な形です。レジスタが何か分からない方も次章以降で学んでいくので安心してください。
- フリップフロップはクロックが 1 になった時点での入力を記憶する回路
- フリップフロップを並べることでレジスタを構築できる。