フリップフロップをつくろう

今回は記憶素子であるフリップフロップを基本演算素子の組み合わせで作っていきます。まず、インバーターの出力を入力に接続するとどうなるでしょうか?

答えは高速に0と1を繰り返す「発振」状態になります。どんな演算子でも実際には入力と出力の間に遅延が生じます。このため演算器の遅延時間が発振周期になります。

 

では2つインバータを繋げて出力を入力に戻す場合はどうでしょう?

この回路では、2回反転したものが戻ってくるので発振はせずに安定です。そして、2つのインバータの出力が{0,1}の場合と{1,0}になる場合の2つ安定状態が存在することがわかります。このままの回路ではどちらの状態になるかはわかりません。そこで、2つのインバータの入力を強制的に0にするスイッチをつけてみます。

インバータの出力に抵抗がつけてスイッチONの入力の方が強くなるようにします。左右のインバータ出力が{1,0}の場合に左スイッチをON→OFFにするとそれぞれのインバータ出力は{0,1}に変わります。この状態で右スイッチをON→OFFにすると{1,0}に戻ります。これで2つの状態を制御できるようになりました。これは1bitの記憶素子に他なりません。

 

Cube-Dで確認してみましょう。2つのマルチブロック機能をインバータ(NOT)に切り替えます。確認しやすいようにパラメータは1にして出力にLEDが繋がっているインバータを選択します。Cube-Dのマルチブロックの出力は抵抗が入っていますので、そのままスイッチに接続します。スイッチを押した時のみ状態が変化してOFF状態では前の状態を維持することが確認できます。

強制設定の代わりにANDを入れてもう少しスマートな回路にしてみます。スイッチにつながるAND入力はプルアップしている前提です(スイッチOFFで1)。

ANDとインバータを合わせてNANDにして回路を書き直します。

NANDの配置を少し変えます。

やっと見覚えのあるフリップフロップの形が見えてきました。

Cube-Dで動作を確認してみます。NAND出力確認用にLEDを接続しています。スイッチS1を押すとLEDが緑にまたはS2を押すとLEDが赤に変わること、スイッチを押さない場合には前の状態を維持することが確認できます。

先の回路の入力を反転し、入力信号R/S,出力信号Q/~Qを書き足すと、よくみなれたRSフリップフロップになりました。SはSet、RはResetの意味です。フリップフロップの本質は2回反転のフィードバックにあります。

RSフリップフロップ

RSフリップフロップの真理値表


真理値表の入力S=R=1の場合は、実際にはQと~Qが両方とも1になり安定です。しかし、この後でS=R=0にすると出力は直前の値を保持するはずが内部遅延の状態により0にも1にもなる可能性があります。このためR=S=1を禁止にしています。

 

この禁止タイミングが発生しないようにしたものでDラッチがあります。C=0の場合には前段の2つのNAND出力は1になりQは状態を保持します。C=1の場合には、DとDの反転が後段の2つのNANDに入力されるため、Q=Dとなり前述の禁止入力にマスクされます。

Dラッチ

Dラッチの真理値表


DラッチではC=1の期間にDが変化するとQも変化します。論理回路ではある瞬間の値を取り込んで保持することが良く行われます。このDラッチを2つ連結したDフリップフロップが一般的です。CLKの立上がりタイミングのDの値を保持して出力します。Cube-DのFFブロックに相当します。

インバータから初めてRS-FF、Dラッチ、D-FFを説明しました。他にJK-FFなどもあるのですが、筆者のこれまでの回路設計ではお目にかかったことがないこともあり割愛させていただきました。