JKフリップフロップの論理式

logic

JKフリップフロップの真理値表(表1)から等価な論理式を求めます。表1の\(Q_{PREV}\)は、JKフリップフロップの現在の値を表します。また、\(Q\)はJ,K,\(Q_{PREV}\)の値から決定される次の値を表します。

真理値表とカルノー図から論理式を作成する題材としてJKフリップフロップを取り上げていますが、実際の論理回路設計で基本ゲートの組み合わせによってJKフリップフロップを実現することはまずありません。

表1: JKフリップフロップの真理値表
入力出力
JK\(Q_{PREV}\)\(Q\)
0000
0011
0100
0110
1000
1011
1101
1110

表1から主加法標準形で直接論理式を作成することもできますが、論理式を最適化できる可能性を検討するために、まずQについてカルノー図を作成します。表1から作成したカルノー図が図1です。

JKフリップフロップのカルノー図
図1: JKフリップフロップのカルノー図

図1のg1とg2について、それぞれ最適化を行ます。
まず、g1で囲んだ部分の論理式が(1)です。Kはブール代数の相殺則を適用して省略できます。

\begin{equation}
\begin{split}
g1
&= J \cdot K \cdot \overline{Q_{PREV}} + J \cdot \overline{K} \cdot  \overline{Q_{PREV}}\\
&=J \cdot  \overline{Q_{PREV}} (K + \overline{K} )\\
&=J \cdot \overline{Q_{PREV}} \ \ \ \ \ \text{(1)}
\end{split}
\end{equation}

次に、g2で囲んだ部分の論理式が(2)です。Jはブール代数の相殺則を適用して省略できます。

\begin{equation}
\begin{split}
g2
&= J \cdot \overline{K} \cdot Q_{PREV} + \overline{J} \cdot \overline{K} \cdot Q_{PREV}\\
&= \overline{K} \cdot Q_{PREV}(J + \overline{J} ) \\
&= \overline{K} \cdot Q_{PREV} \ \ \ \ \ \text{(2)}
\end{split}
\end{equation}

よって、JKフリップフロップの出力Qの論理式は、主加法標準形で(3)になります。

$$Q = g1 + g2 = J \cdot \overline{Q_{PREV}} + \overline{K} \cdot Q_{PREV}\ \ \ \ \ \text{(3)}$$

Verilogシミュレーションで動作を確認

(3)の論理式を記述したJKフリップフロップのモジュールを作成し、JとKの値を10ナノ秒単位で切り替えてQの値を確認します。シミュレーションではQの初期値を0としています。

`timescale 1ns/1ns
// JKフリップフロップのモジュール
module jk_ff (
  input J,
  input K,
  output reg Q,
  output Qn
);
 
 
assign Qn = ~Q;
 
initial Q = 0;  //初期値は0
 
always @*
  Q = (J & ~Q) | (~K & Q);  // Qの論理式
 
 
endmodule
// シミュレーション用モジュール
module top;
  reg J,K;
  wire Q,Qn;
   jk_ff u_jk_ff(.J(J),.K(K),.Q(Q),.Qn(Qn));  // JK-FFのインスタンス
 
  initial begin
    $dumpvars;  // 波形出力
    J = 0;
    K = 0;
    #10;        // 10nS進める
    J = 1;
    K = 0;
    #10;
    J = 0;
    K = 0;
    #10;
    J = 0;
    K = 1;
    #10;
    J = 0;
    K = 0;
    #10;
    J = 1;
    K = 1;
    #10;
    J = 0;
    K = 0;
    #10;
    $finish;
  end
endmodule

結果確認

シミュレーションで出力される波形を確認すると、確かにJ=1,K=0でQ=1、J=0,K=1でQ=0となっていることがわかります。また、J=1,K=1でQの値が反転していることがわかります。それ以外のJ=0,K=0でQの状態を保持していることがわかります。

図2: JKフリップフロップのシミュレーション結果波形

module jk_ffは論理式の動作を確認することを目的としたシミュレーション用であり、実際のFPGAやASIC向けの論理設計でこのような記述のJKフロップフロップを実装することはまずありません。

参考

実際に論理合成可能なJKフロップフロップは、次のようなVerilogコードになります。

タイトルとURLをコピーしました