【问题标题】:JK Flip-flop using D Flip-flop and gate level simulation does not stop使用 D 触发器的 JK 触发器和门级仿真不停止
【发布时间】:2020-10-31 09:01:02
【问题描述】:

我正在尝试使用 D 触发器和门级实现 JK 触发器,但问题是当我运行代码时,终端没有显示任何内容。就像它一直在计算,但什么也没显示。我需要按crtl + c 来停止该过程,这是 cmd 显示某些内容的时候,但这不是完整的结果。我附上了我的代码和 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

top进程前的终端:

停止后的终端流程:

我正在尝试实现的 JK 触发器:

我不知道为什么会这样。

【问题讨论】:

    标签: verilog system-verilog flip-flop


    【解决方案1】:

    这是在 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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      相关资源
      最近更新 更多