📅  最后修改于: 2021-01-11 15:05:30             🧑  作者: Mango
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触发器。它由两个门控锁存器构成:一个是主门控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