📜  Verilog | JK触发器

📅  最后修改于: 2021-01-11 15:05:30             🧑  作者: Mango

JK人字拖

JK触发器是最基本的触发器。时钟时序逻辑电路中使用JK触发器来存储一位数据。

它在函数上的SR触发器几乎相同。唯一的区别是消除了S和R均为1的不确定状态。由于有了这个额外的时钟输入,JK触发器具有四个可能的输入组合,例如“逻辑1”,“逻辑0”,“不变”。和“切换”。

硬件原理图

我们将在Verilog中编写JK触发器,并为相同的代码编写一个测试平台。

module jk_ff ( input j, input k, input clk, output q);

   reg q;

   always @ (posedge clk)
      case ({j,k})
         2'b00 :  q <= q;
         2'b01 :  q <= 0;
         2'b10 :  q <= 1;
         2'b11 :  q <= ~q;
      endcase
endmodule

试验台

module tb_jk;
   reg j;
   reg k;
   reg clk;

   always #5 clk = ~clk;

   jk_ff    jk0 ( .j(j),
                  .k(k),
                  .clk(clk),
                  .q(q));

   initial begin
      j <= 0;
      k <= 0;

      #5 j <= 0;
         k <= 1;
      #20 j <= 1;
          k <= 0;
      #20 j <= 1;
          k <= 1;
      #20 $finish;
   end

   initial
      $monitor ("j=%0d k=%0d q=%0d", j, k, q);
endmodule

边沿触发JK触发器

此处描述的JK触发器的类型是边沿触发的JK触发器。它由两个门控锁存器构成:一个是主门控D锁存器,一个是从门控SR锁存器。

这是边沿触发D触发器的修改版本。触发器的输出被反馈并与输入组合。主机接收触发器的输入,例如J(置位),K(复位)和C(时钟)。

时钟输入被反相并馈入D锁存器的栅极输入。从机将主机的输出作为输入(Q到S和Qn到R),并对主机的时钟输入进行补充。从机的输出是触发器的输出。两个锁存器之间时钟输入的这种差异使它们断开连接,并消除了触发器输入和输出之间的透明性。

下面的示意图显示了一个正边沿触发的JK触发器。两个输入J和K分别用于设置和重置数据。它们也可以用于切换数据。时钟输入C用于控制主锁存器和从锁存器,确保在任何给定时间只有一个锁存器可以设置其数据。

当C的值为0时,主锁存器可以设置其数据,而从锁存器不能。当C的值为1时,从机可以设置其数据,而主机则不能。当C从0转换为1时,主机设置其输出,该输出反映了转换发生时触发器的输入。

输出Q和Qn是触发器存储的数据和触发器存储数据的补码。

下面显示了7476边沿触发JK触发器的原理图符号。该芯片具有用于异步设置和重置触发器数据的输入。

下面是一个正边沿触发JK触发器的Verilog代码。已添加一个低电平有效复位输入以异步清除触发器。

module jk_ff_edge_triggered(Q, Qn, C, J, K, RESETn);
   output Q;
   output Qn;
   input  C;
   input  J;
   input  K;
   input  RESETn;

   wire   Kn;                      // The complement of the K input.
   wire   D;   
   wire   D1;                      // Data input to the D latch.   
   wire   Cn;                      // Control input to the D latch.
   wire   Cnn;                    // Control input to the SR latch.
   wire   DQ;                     // Output from the D latch, inputs to the gated SR latch (S).
   wire   DQn;                   // Output from the D latch, inputs to the gated SR latch (R).

   assign D1 = !RESETn ? 0 : D;                           // Upon reset force D1 = 0

   not(Kn, K);   
   and(J1, J, Qn);
   and(K1, Kn, Q);   
   or(D, J1, K1);   
   not(Cn, C);
   not(Cnn, Cn);   
   d_latch dl(DQ, DQn, Cn, D1);
   sr_latch_gated sr(Q, Qn, Cnn, DQ, DQn);   
endmodule                                      // jk_flip_flop_edge_triggered

module d_latch(Q, Qn, G, D);
   output Q;
   output Qn;
   input  G;   
   input  D;

   wire   Dn; 
   wire   D1;
   wire   Dn1;

   not(Dn, D);   
   and(D1, G, D);
   and(Dn1, G, Dn);   
   nor(Qn, D1, Q);
   nor(Q, Dn1, Qn);
endmodule                                     // d_latch

module sr_latch_gated(Q, Qn, G, S, R);
   output Q;
   output Qn;
   input  G;   
   input  S;
   input  R;

   wire   S1;
   wire   R1;
   
   and(S1, G, S);
   and(R1, G, R);   
   nor(Qn, S1, Q);
   nor(Q, R1, Qn);
endmodule                                    // sr_latch_gated