使用 JK 触发器的 Mod-6 计数器总是显示未知输出

问题描述 投票:0回答:1

我正在尝试使用 mod-8 计数器实现 mod-6 计数器,但无法获得所需的输出波形。

module mod_six_counter(clk,rst,q,qbar);
  input clk;
  input wire rst;
  output wire  [2:0]q;
  output [2:0]qbar;
  assign rst = ~((~q[0])&q[1]&(q[2]));
  jkff ff1(1'b1,1'b1,clk,rst,q[0],qbar[0]);
  jkff ff2(1'b1,1'b1,q[0],rst,q[1],qbar[1]);
  jkff ff3(1'b1,1'b1,q[1],rst,q[2],qbar[2]);
endmodule

module jkff(j,k,clk,rst,q,qbar);
  input j,k,clk,rst;
  output reg q;
  output qbar;
  always@(posedge clk or negedge rst)
  begin
        if (!rst)       q <= 1'b0;
  else begin
    case({j,k})
      2'b00 : q<=q;
      2'b01 : q<=1'b0;
      2'b10 : q<=1'b1;
      2'b11 : q<=~q;
      endcase
    end
  end
     assign  qbar = ~q;
endmodule

测试台代码:

module tbmod_sixcounter;
  reg clk,rst;
  wire[2:0] q,qbar;

  mod_six_counter DUT(.clk(clk),.rst(rst),.q(q),.qbar(qbar));

  always #10 clk=~clk;

  initial 
  begin
    clk<=0;
    rst<=0;
    #7 rst<=1;
  end
endmodule

这段代码有什么错误?有人可以帮忙解决吗? 波形简单地显示为 xxx。

verilog simulation system-verilog test-bench
1个回答
0
投票

问题是您正在从

input
模块的
within
分配给模块 rst 端口 (
mod_six_counter
)。这会导致争用,因为您还从测试台驱动
input
端口。你永远不应该这样做。

如果删除以下行,x(未知数)就会消失:

  assign rst = ~((~q[0])&q[1]&(q[2]));

或者,如果您确实想使用不同的复位信号驱动各个

jkff
实例,那么您可以在
mod_six_counter
模块内创建一个具有不同名称的信号,例如:

wire rst_int; // Internal reset
© www.soinside.com 2019 - 2024. All rights reserved.