Verilog 使用JK触发器的同步计数器的行为不符合预期

Verilog 使用JK触发器的同步计数器的行为不符合预期,verilog,Verilog,我试图在Sanir Panikkar的Verilog HDL一书中做一个练习:使用JK触发器设计一个同步计数器 书中提供的JK触发器电路: 计数器电路: 我相信上面的电路中有一个错误:3和门的输入应该是从左到右分别为Q0、Q1、Q2;不是第一季度,第二季度,第三季度。通过修改,我编写了以下代码: module verilogtest(clk, CS, q, clr); input clk, CS, clr; output[3:0] q; counter co

我试图在Sanir Panikkar的Verilog HDL一书中做一个练习:使用JK触发器设计一个同步计数器

书中提供的JK触发器电路:

计数器电路:

我相信上面的电路中有一个错误:3和门的输入应该是从左到右分别为Q0、Q1、Q2;不是第一季度,第二季度,第三季度。通过修改,我编写了以下代码:

module verilogtest(clk, CS, q, clr);
    input clk, CS, clr;
    output[3:0] q;
    
    counter count(clk, CS, q, clr);
    
endmodule

module counter(clk, CS, q, clr);
    input clk, CS, clr;
    output[3:0] q;
    
    wire t1, t2, t3;
    
    assign #1
        t1 = CS & q[0],
        t2 = t1 & q[1],
        t3 = t2 & q[2];
    
    mJKff ff1(q[0], CS, CS, clk, clr);
    mJKff ff2(q[1], t1, t1, clk, clr);
    mJKff ff3(q[2], t2, t2, clk, clr);
    mJKff ff4(q[3], t3, t3, clk, clr);
    
endmodule

module mJKff(Q, J, K, clk, clr);
    output Q;
    input J, K, clk, clr;
    
    wire
        a, b, c, d, y, ybar, cbar, qbar;
    
    assign #1
        a    = ~(qbar & J & clk & clr),
        b    = ~(clk & K & Q),
        y    = ~(a & ybar),
        ybar = ~(y & clr & b),
        c    = ~(y & cbar),
        d    = ~(ybar & cbar),
        cbar = ~clk;
        
    assign #1
        qbar = ~(Q & clr & d),
        Q    = ~(c & qbar);
        
endmodule
我使用Quartus II成功编译并得到一系列警告:

警告:时序分析正在将一个或多个组合环路分析为锁存

警告:未指定保留所有未使用的引脚设置,将默认为“作为输出驱动接地”

警告:发现引脚作为未定义的时钟和/或内存启用

警告:在时钟路径中发现7个节点,它们可能充当纹波和/或选通时钟-节点被分析为缓冲区,导致时钟偏移

警告:电路可能不工作。检测到时钟clk计时的2条非操作路径,时钟偏差大于数据延迟。详见汇编报告

警告:电路可能不工作。检测到1条由时钟CS计时的非操作路径,时钟偏差大于数据延迟。详见汇编报告

警告:电路可能不工作。检测到1条由时钟clr计时的非操作路径,时钟偏移大于数据延迟。详见汇编报告

我认为最后3个警告是它不起作用的原因。 模拟结果:

放大:


Q0的行为与预期一致,但其余的则与预期不同。为什么?

计数器模块中的AND门接线有一个简单错误:

assign #1
    t1 = CS & q[0],
    t2 = t1 & q[1],
    t3 = t2 & q[2];
应该是

assign #1
    t1 = CS & q[1],
    t2 = t1 & q[2],
    t3 = t2 & q[3];
Q[0]是唯一正确运行的输出,因为所有其他FFs的JK输入接收到错误的值