Verilog 使用JK触发器的同步计数器的行为不符合预期
我试图在Sanir Panikkar的Verilog HDL一书中做一个练习:使用JK触发器设计一个同步计数器 书中提供的JK触发器电路: 计数器电路: 我相信上面的电路中有一个错误:3和门的输入应该是从左到右分别为Q0、Q1、Q2;不是第一季度,第二季度,第三季度。通过修改,我编写了以下代码: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
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输入接收到错误的值