図48.フリップフロップ回路14
ここまで見てきた回路の動作をまとめてみます。入力端子Aに「1」、入力端子Bに「0」を入力した場合には出力端子Cが「0」出力端子Dが「1」になることが分かりました。逆に入力端子Aに「0」、入力端子Bに「1」を入力した場合には出力端子Cが「1」出力端子Dが「0」になります。
この回路の入力側にある「OR回路」の入力は、片方の端子が出力側から戻ってくるような構造になっているため最初の段階では片方の端子の状態しか分からないのですが、「OR回路」の特性上、片方の端子でも「1」が入力されていれば出力が「1」になることが決まっているため、上で説明したような順番で回路の状態が決まっていきました。
しかし入力端子Aと入力端子Bが両方とも「0」の時には回路の状態はどうなるのでしょうか?上下の「OR回路」には両方とも片側の入力端子が「0」である、ということしか分からないため、この条件だけでは上下の「OR回路」は両方とも出力が決まらない状態になってしまいます。
図49.フリップフロップ回路15
そこで一度、入力端子Aに「1」、入力端子Bに「0」を入力した場合の回路の状態へ戻ってみましょう。入力端子Aに「1」、入力端子Bに「0」を入力した場合には最終的に回路の状態は次のような状態になったと思います。
図50.フリップフロップ回路7
この状態から入力端子Aを「1」から「0」へ変更するとどうなるでしょうか?入力端子Aが接続されている上側の「OR回路」はもともと両方の入力端子が「1」の状態であったため、片方の入力端子が「0」に変わったとしても出力は変わらず「1」のままです。結果、出力端子Cは「0」、出力端子Dは「1」のままです。
図51.フリップフロップ回路16
そして今度は入力端子Aに「0」、入力端子Bに「1」を入力した場合の回路の状態へ戻って考えてみましょう。入力端子Aに「0」、入力端子Bに「1」を入力した場合には最終的に回路の状態は次のような状態になったと思います。
図52.フリップフロップ回路14
この状態から入力端子Bを「1」から「0」へ変更するとどうなるでしょうか?入力端子Bが接続されている下側の「OR回路」はもともと両方の入力端子が「1」の状態であったため、片方の入力端子が「0」に変わったとしても出力は変わらず「1」のままです。結果、出力端子Cは「1」、出力端子Dは「0」のままです。
図53.フリップフロップ回路17
入力端子Aと入力端子Bが両方とも「0」の場合、その直前の回路の状態が維持されることが分かりました。この性質をうまく利用することでデジタル信号の状態を記憶する回路を作ることができます。
まずは「入力端子Aと入力端子Bが両方とも「1」になる状況を作らない」というルールを作ります。このルールに従っている限り、下記の条件で回路が動作することが分かります。
1:出力端子Cを「0」にしたい場合には入力端子Aには「1」を、入力端子Bには「0」を入力する。
2:出力端子Cを「1」にしたい場合には入力端子Aには「0」を、入力端子Bには「1」を入力する。
3:出力端子Cを現在の状態で維持したい場合には入力端子AとBの両方に「0」を入力する。
上記の条件を作るために下図のように回路を追加します。
図54.フリップフロップ回路18
条件の3番の状態を作るために、マルチプレクサ回路の説明に出てきた「AND回路」の門番機能を使います。上図のように端子A、Bの前段に「AND回路」を接続すると、入力端子Eに「0」を入力することで端子Aと端子Bを強制的に「0」にすることができます。
逆に入力端子Eに「1」が入力されている状態では、入力端子Fの状態によって端子AとBの状態が決まります。
入力端子Fが「0」の場合には端子Aが「1」、端子Bが「0」の状態になり、反対に入力端子Fが「1」の場合には端子Aが「0」、端子Bが「1」の状態になります。
条件の1番と2番の状態を作るために入力端子Fと、端子Fを「NOT回路」で反転した信号で端子AとBの状態を作っていて、もともと端子Fという1つの状態から反転させた2つの信号を使うことによって「入力端子Aと入力端子Bが両方とも「1」になる状況を作らない」というルールも守られるようになっています。
その結果、回路全体では以下のような動作が実現します。これは入力端子Fの状態を入力端子Eの状態によって記憶する回路として使用できます。
入力端子Eが「1」:入力端子Fが「1」の時は出力端子Cは「1」。入力端子Fが「0」の時は出力端子Cは「0」。
入力端子Eが「0」:出力端子Cの状態を維持する(記憶する)。
入力端子Fの状態が記憶されるのは入力端子Eが「0」に切り替わった瞬間です。
図55.フリップフロップ回路19
基本的には上記の回路で信号を記憶する回路として使えるのですが、使いやすさの面から以下のような2段重ねの回路にして使用されることが多いです。
図56.フリップフロップ回路20
上図の回路では端子Eが「1」になった瞬間に記憶する回路(前段)と端子Eが「0」になった瞬間に記憶する回路(後段)を2段重ねにすることで端子Fの信号を2段階で記憶します。この回路では状態を記憶する時に端子Eへの入力信号を以下のように変化させます。
図57.フリップフロップ回路21
上図の矢印で記した時点(信号が0から1へと変化する瞬間、「立上り」とも言う。)で端子Fの信号が前段の回路に記憶されます。これと同時に前段の回路が保持した信号の状態が後段の回路へも伝わります。その後端子Eの信号が0へと戻り、後段回路が保持の状態になります。次の信号の立上り時まで、後段の回路が記憶した信号を保持し続けます。
今回、端子Eへと入力したような0→1→0と状態が変化する信号のことを「クロック信号」と呼びます。クロック信号はフリップフロップ回路が信号を記憶するタイミングを指示するための信号として使用されます。
フリップフロップ回路は一般的に以下のような記号で表されます。上図での出力端子CはQの文字で表されています。端子Dは常に端子Cを反転した信号が出てくるので、Qに上線を引いた文字で表されています。入力端子のFはDの文字で表されます。クロック信号の入力端子Eは三角の矢印のような形で表されます。
図58.フリップフロップ回路22
前のページで説明したようにコンピュータの中では「1」と「0」の組合せであらゆる情報を表現しています。ですので情報を記憶する回路であるフリップフロップ回路も単体で使用されることは珍しく、大抵は複数のフリップフロップ回路が1セットになって1つの情報を記憶しています。例えば8ビットコンピュータでは8つのフリップフロップ回路が1セットになって情報を記憶しています。8つのフリップフロップ回路が記憶できる情報の組合せは256通りになります。また、複数のフリップフロップが1セットになって情報を記憶する回路のことを「レジスタ」と言います。
図59.レジスタ回路