JK触发器使用D触发器和门级模拟不停
JK Flip-flop using D Flip-flop and gate level simulation does not stop
我正在尝试用 D 触发器和门级实现 JK 触发器,但问题是当我 运行 代码时,终端没有显示任何内容.就好像它一直在计算,但什么也没有显示出来。我需要按 crtl + c
来停止进程,这是 cmd 显示一些东西的时候,但这不是完整的结果。我附上了我的代码和命令的图像。
module D_flip_flop (input D,clk,Reset,enable,output reg F);
always @(*)
begin
if (Reset)
F<='b0;
else if (enable && clk)
F<=D;
end
endmodule
module JK_flip_flop(input J,K,clk,Reset,enable,output Q);
wire S1,S2,S3,S4,S5;
D_flip_flop D1(S4,clk,Reset,enable,Q);
not N2(S5,Q);
and A1(S1,J,S5);
not N1(S3,K);
and A2(S2,S3,Q);
or O1(S4,S1,S2);
endmodule
测试台:
module testbench();
reg clk,reset,enable,J,K;
wire Q;
JK_flip_flop J1(J,K,clk,reset,enable,Q);
initial begin
$display("\n");
$display("Flip Flop JK");
$display("J K clk Reset Enable | Q ");
$display("----------------|---");
$monitor("%b %b %b %b %b | %b", J,K,clk,reset,enable,Q);
J=0;K=0;reset=1;enable=0;clk=0;
#1 reset=0;enable=1;
#10 J=0;K=1;
#10 J=1;K=0;
#10 J=0;K=1;
#10 J=1;K=1;
#10 J=0;K=0;
#50 $finish;
end
always
begin
#5 clk =~clk;
end
initial begin
$dumpfile("Ej3_tb.vcd");
$dumpvars(0, testbench);
end
endmodule
进程顶部之前的终端:
停止后的终端流程:
我正在尝试实现的 JK 触发器:
我不知道为什么会这样。
这是在 Verilog 中为 DFF 建模的不正确方法。这是推荐的方式,触发时钟的上升沿:
module D_flip_flop (input D,clk,Reset,enable, output reg F);
always @(posedge clk) begin
if (Reset)
F <= 1'b0;
else if (enable)
F <= D;
end
endmodule
以上代码使用同步复位。
此更改允许模拟干净地终止(没有 Ctrl-C
)。
我正在尝试用 D 触发器和门级实现 JK 触发器,但问题是当我 运行 代码时,终端没有显示任何内容.就好像它一直在计算,但什么也没有显示出来。我需要按 crtl + c
来停止进程,这是 cmd 显示一些东西的时候,但这不是完整的结果。我附上了我的代码和命令的图像。
module D_flip_flop (input D,clk,Reset,enable,output reg F);
always @(*)
begin
if (Reset)
F<='b0;
else if (enable && clk)
F<=D;
end
endmodule
module JK_flip_flop(input J,K,clk,Reset,enable,output Q);
wire S1,S2,S3,S4,S5;
D_flip_flop D1(S4,clk,Reset,enable,Q);
not N2(S5,Q);
and A1(S1,J,S5);
not N1(S3,K);
and A2(S2,S3,Q);
or O1(S4,S1,S2);
endmodule
测试台:
module testbench();
reg clk,reset,enable,J,K;
wire Q;
JK_flip_flop J1(J,K,clk,reset,enable,Q);
initial begin
$display("\n");
$display("Flip Flop JK");
$display("J K clk Reset Enable | Q ");
$display("----------------|---");
$monitor("%b %b %b %b %b | %b", J,K,clk,reset,enable,Q);
J=0;K=0;reset=1;enable=0;clk=0;
#1 reset=0;enable=1;
#10 J=0;K=1;
#10 J=1;K=0;
#10 J=0;K=1;
#10 J=1;K=1;
#10 J=0;K=0;
#50 $finish;
end
always
begin
#5 clk =~clk;
end
initial begin
$dumpfile("Ej3_tb.vcd");
$dumpvars(0, testbench);
end
endmodule
进程顶部之前的终端:
停止后的终端流程:
我正在尝试实现的 JK 触发器:
我不知道为什么会这样。
这是在 Verilog 中为 DFF 建模的不正确方法。这是推荐的方式,触发时钟的上升沿:
module D_flip_flop (input D,clk,Reset,enable, output reg F);
always @(posedge clk) begin
if (Reset)
F <= 1'b0;
else if (enable)
F <= D;
end
endmodule
以上代码使用同步复位。
此更改允许模拟干净地终止(没有 Ctrl-C
)。