我正在使用Verilog建模JK FLIP触发器。我得到的输出q
为x
在所有情况下。我使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句