使用JK触发器的同步计数器无法达到预期的效果

时间:2018-09-03 16:08:48

标签: verilog

我正在Sanir Panikkar的《 Verilog HDL》一书中尝试练习:使用JK触发器设计同步计数器。

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

计数器电路: enter image description here

我认为上述电路有误:3 AND门的输入应从左至右分别为Q0,Q1,Q2;不是Q1,Q2,Q3。经过修改,我编写了以下代码:

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条非工作路径,且时钟偏斜大于数据延迟。有关详细信息,请参见编译报告。

     

警告:电路可能无法运行。检测到由时钟“ CS”提供时钟的1条非工作路径,且时钟偏斜大于数据延迟。有关详细信息,请参见编译报告。

     

警告:电路可能无法运行。检测到1条由时钟“ clr”提供时钟且时钟偏斜大于数据延迟的非工作路径。有关详细信息,请参见编译报告。

我认为最后3条警告是其不起作用的原因。 仿真结果: enter image description here

放大: enter image description here

Q0的行为符合预期,但其余部分则不然。为什么?

1 个答案:

答案 0 :(得分:1)

在连接计数器模块中的“与”门时,您只会遇到一个简单的错误:

loaders: [
  {
    test: /\.(eot|svg|ttf|woff|woff2|png|jpg)$/,
    loaders: ['do-nothing-loader']
},

应该是

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]; 是唯一正确运行的输出,因为所有其他FF的JK输入接收到错误的值。