首页 > 解决方案 > 在 Verilog 中使用 SR 触发器模块创建 JK 触发器模块

问题描述

我已经为 SR Latch、SR Flip Flop(通过实例化 SR Latch 模块)和 JK Flip Flop(通过实例化 SR Latch 模块)编写了 verilog 模块。我正在使用 Xilinx Vivado 2019 版本进行仿真和查看输出波形。SR 锁存器和 SR 触发器模块工作得很好,我也得到了正确的输出波形。我尝试通过实例化 SR 锁存器模块来创建 JK 触发器模块。但我只是没有得到输出波形。我不知道出了什么问题。我也检查了布尔表达式。一切似乎都很好。有人可以指出错误吗?

这是代码。

SR 锁存模块

module sr_latch(s, r, q, qbar);
    input s, r;
    output q, qbar;
    nand(q, s, qbar);
    nand(qbar, r, q);
endmodule

使用 SR 锁存器的 SR 触发器模块

module sr_ff(s, r, clk, q, qbar);
    input s, r, clk;
    output q, qbar;
    reg t1, t2;
    always @(posedge clk)
        begin
            t1 <= !(clk & s);
            t2 <= !(clk & r);
        end
    sr_latch SRL(t1, t2, q, qbar);
endmodule

使用 SR 锁存器的 JK 触发器

module jk_ff(j, k, clk, q, qbar);
    input j, k, clk;
    output q, qbar;
    reg t1, t2;
    always @(posedge clk)
        begin
            t1 <= !(clk & qbar & j);
            t2 <= !(clk & q & k);
        end
    sr_latch SRL(t2, t1, q, qbar);
endmodule

JK 触发器测试台

module jk_ff_tb();
    wire q, qbar;
    reg j, k, clk=1;
    integer i;
    jk_ff JKFF(j, k, clk, q, qbar);
    always #25 clk = !clk;

    initial
        begin
            for(i=0; i<4; i=i+1)
                begin
                    {j, k} <= i; #50;
                end
        $stop;
        end
endmodule

标签: veriloghdlflip-flop

解决方案


您的输出未知 ( X),因为您的jk_ff模型不允许正确初始化 SR Latch。

根据这个简单的原理图,您只需在 SR 锁存器的输入上实现 2 个 NAND 门:

jkff 示意图

这是一种方法,使用连续分配:

module jk_ff (j, k, clk, q, qbar);
    input j, k, clk;
    output q, qbar;
    wire sn = clk & qbar & j;
    wire rn = clk & q    & k;
    sr_latch SRL (sn, rn, q, qbar);
endmodule

这使得输出变得已知。

另一种方法是添加 2 个nand基元。

请注意,JK 触发器可以由 SR Latch构造,而不是 SR触发器


推荐阅读