在Verilog中使用SR触发器模块创建JK触发器模块

在Verilog中使用SR触发器模块创建JK触发器模块,verilog,hdl,flip-flop,Verilog,Hdl,Flip Flop,我已经为SR锁存器、SR触发器(通过实例化SR锁存器模块)和JK触发器(通过实例化SR锁存器模块)编写了verilog模块。我正在使用Xilinx Vivado 2019版进行模拟和查看输出波形。SR锁存器和SR触发器模块工作正常,我也得到了正确的输出波形。我尝试通过实例化SR锁存模块来创建JK触发器模块。但是我没有得到输出波形。我不知道出了什么问题。我也检查了布尔表达式。一切似乎都很好。有人能指出错误吗 这是密码 SR闩锁模块 module sr_latch(s, r, q, qbar);

我已经为SR锁存器、SR触发器(通过实例化SR锁存器模块)和JK触发器(通过实例化SR锁存器模块)编写了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
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
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
模块sr_ff(s、r、clk、q、qbar);
输入s、r、clk;
输出q,qbar;
reg t1,t2;
始终@(posedge clk)
开始
t1您的输出未知(
X
),因为您的
jk_ff
型号不允许正确初始化SR锁存器

根据这个简单的示意图,您只需在SR锁存器的输入端实现2个与非门:

这是一种使用连续赋值的方法:

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锁存器构建,而不是SR触发器构建,这可能是因为
JK_ff
JK_ff
无关。另外,不要在flop表达式中使用
clk&
。@Serge为什么不使用?如果我实例化了SR触发器模块,就不需要
clk&
。但我正在实例化一个SR闩锁。因此,我必须使用
clk&
。硬件设计社区在这里似乎并不活跃。我在12小时前发布了这个问题,我的问题只有13个视图!有什么平台可以与社区联系吗?这个论坛不是一个硬件设计社区,它是关于编程的。不需要您的clk&语句,因为“posedge clk”保证它为“1”。它还可能混淆合成工具,使它们对时钟做出错误的假设。@serge-aah!我认为你是对的。这是有道理的。我会试试看,然后告诉你