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

问题描述

我正在使用 Verilog 对 JK FLIP Flop 进行建模。在所有情况下,我都将输出 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...