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

阿布·何塞·乔治

我正在使用Verilog建模JK FLIP触发器。我得到的输出qx在所有情况下。我使用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)。您声明clkreg,这意味着它默认为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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章