建模 JK FF 时输出错误:输出为 x



我正在使用Verilog对JK FLIP Flop进行建模。 在所有情况下,我都x获得输出q。 我case语句用于各种 jk 组合。 我几乎没有发现代码有任何问题。

设计


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

试验台


module tb_jk;  
reg j;  
reg k;  
reg clk;  

always #5 clk = ~clk;  

jk_ff    jk0 ( .j(j),  
.k(k),  
.clk(clk),  
.q(q));  

initial begin  
$dumpfile("test.vcd");
$dumpvars;
j <= 0;  
k <= 0;  

#5 j <= 0;  
k <= 1;  
#20 j <= 1;  
k <= 0;  
#20 j <= 1;  
k <= 1;  
#20 $finish;  
end  

initial  
$monitor ("j=%0d k=%0d q=%0d", j, k, q);  
endmodule

原木


vu2swz@PPDP01:~$ iverilog jk_ff.v 
vu2swz@PPDP01:~$ ./a.out 
VCD info: dumpfile test.vcd opened for output.
j=0 k=0 q=x
j=0 k=1 q=x
j=1 k=0 q=x
j=1 k=1 q=x

输出仅显示x,而不是 0 1 和 Q。

当我运行您的模拟并查看波形时,我发现clk总是未知的(x)。 您将clk声明为reg,这意味着它默认为x。 你的赋值 (clk = ~clk) 不会改变clk的值,因为~clk计算结果为~x,这仍然是x

您需要在测试平台中将clk初始化为已知值。 例如,更改:

reg clk;

自:

reg clk = 0;

这表明:

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

最新更新