Verilog 建模JK FF时输出错误:输出为x
我正在用Verilog模拟一个JK触发器。在所有情况下,我都将输出Verilog 建模JK FF时输出错误:输出为x,verilog,flip-flop,Verilog,Flip Flop,我正在用Verilog模拟一个JK触发器。在所有情况下,我都将输出q作为x。我对各种jk组合使用了case语句。我几乎没有发现代码有任何问题 设计 module jk_ff ( input j, input k, input clk, output q); reg q; always @ (posedge clk) case ({j,k})
q
作为x
。我对各种jk组合使用了case
语句。我几乎没有发现代码有任何问题
设计
module jk_ff ( input j, input k, input clk, output q);
reg q;
always @ (posedge clk)
case ({j,k})
2'b00 : q <= q;
2'b01 : q <= 1'b0;
2'b10 : q <= 1'b1;
2'b11 : q <= ~q;
endcase
endmodule
输出仅显示
x
,而不是0 1和Q。当我运行您的模拟并查看波形时,我发现clk
始终未知(x
)。您将clk
声明为reg
,这意味着它默认为x
。您的赋值(clk=~clk
)不会更改clk
的值,因为~clk
的计算结果为~x
,仍然是x
您需要在测试台上将clk
初始化为已知值。例如,更改:
reg clk;
致:
这表明:
j=0 k=0 q=x
j=0 k=1 q=x
j=0 k=1 q=0
j=1 k=0 q=0
j=1 k=0 q=1
j=1 k=1 q=1
j=1 k=1 q=0
有两种方法可以调试此问题。正如我提到的,一种方法是观察波形;您已经创建了VCD文件。这是最有效的方法。iverilog网站称GTKWave“是Icarus Verilog首选的波形查看器” 另一种方法是将
clk
信号添加到$monitor
语句中:
$monitor ("j=%0d k=%0d q=%0d clk=%b", j, k, q, clk);
那么你会看到:
j=0 k=0 q=x clk=x
j=0 k=1 q=x clk=x
j=1 k=0 q=x clk=x
j=1 k=1 q=x clk=x
j=0 k=0 q=x
j=0 k=1 q=x
j=0 k=1 q=0
j=1 k=0 q=0
j=1 k=0 q=1
j=1 k=1 q=1
j=1 k=1 q=0
$monitor ("j=%0d k=%0d q=%0d clk=%b", j, k, q, clk);
j=0 k=0 q=x clk=x
j=0 k=1 q=x clk=x
j=1 k=0 q=x clk=x
j=1 k=1 q=x clk=x