verilog中使用T触发器的4位计数器

verilog中使用T触发器的4位计数器,verilog,hdl,Verilog,Hdl,我正在尝试设计一个带有T触发器的4位计数器,我做了如下工作: 1-从D触发器到T触发器: module T_FlipFlop( clk,T, Q); input wire clk; input wire T; output reg Q; wire D; initial begin Q<=1'b0; end assign D= T ^ Q; always @(negedge clk) begin

我正在尝试设计一个带有T触发器的4位计数器,我做了如下工作:

1-从D触发器到T触发器:

module T_FlipFlop( clk,T, Q);
   input wire clk;
   input wire T;
   output reg Q;
   wire D;

   initial
   begin
      Q<=1'b0;
   end

   assign  D= T ^ Q;

      always @(negedge clk)
       begin
        Q<=D;
       end
endmodule
使用RTL示意图:

要遵循此图,请执行以下操作:

我们知道,T-触发器只是一个JK触发器,J和K互相连接,这就是我们这里所说的,所以把它们看作是T-触发器。 3-模拟:

4最后,我的问题:

1) 为什么
Q1
唯一运行正常的输出

2) 为什么
Q2
Q3
Q4
1
开头,尽管我已将它们初始化为
0

我想不出少了什么,我试着到处玩,但没用,我被困在这里了

编辑:我的测试台:

 module test;

  // Inputs
 reg sysclk;

// Outputs
wire Q1;
wire Q2;
wire Q3;
wire Q4;

// Instantiate the Unit Under Test (UUT)
Counters_FreqDividers uut (
    .sysclk(sysclk),
    .Q1(Q1), 
    .Q2(Q2), 
    .Q3(Q3), 
    .Q4(Q4)
    );

   initial begin
    // Initialize Inputs
    sysclk <= 1'b1;

      #200 $finish();
   end

    always #5 sysclk=~sysclk;

endmodule
模块测试;
//投入
注册系统时钟;
//输出
导线Q1;
导线Q2;
导线Q3;
导线Q4;
//实例化被测单元(UUT)
计数器\分频器uut(
.sysclk(sysclk),
.Q1(Q1),
.Q2(Q2),
.Q3(Q3),
.Q4(Q4)
);
初始开始
//初始化输入

sysclk yes它可以正确切换,但方式相反<代码>Q2
应该从
0
开始,然后在
Q1的第一个下降沿处切换到
1
。但是,在模拟中,它在
Q1
的第一个下降沿切换到
0
。因此,“Q3”会切换,因为它见证了“Q2”的下降沿,“Q4”也会切换到“Q3”的下降沿。是的!就像你说的,我该如何解决这个问题呢?它在添加了
reset
信号后工作了!谢谢!您可以使用
sysclk
作为所有T触发器的时钟,并将
T
输入分配给前一个触发器的
Q
输出,从而改进计时。是的,它可以正确切换,但方式相反<代码>Q2
应该从
0
开始,然后在
Q1的第一个下降沿处切换到
1
。但是,在模拟中,它在
Q1
的第一个下降沿切换到
0
。因此,“Q3”会切换,因为它见证了“Q2”的下降沿,“Q4”也会切换到“Q3”的下降沿。是的!就像你说的,我该如何解决这个问题呢?它在添加了
reset
信号后工作了!谢谢!您可以使用
sysclk
作为所有T触发器的时钟,并将
T
输入分配给前一个触发器的
Q
输出,从而改进计时。
 module test;

  // Inputs
 reg sysclk;

// Outputs
wire Q1;
wire Q2;
wire Q3;
wire Q4;

// Instantiate the Unit Under Test (UUT)
Counters_FreqDividers uut (
    .sysclk(sysclk),
    .Q1(Q1), 
    .Q2(Q2), 
    .Q3(Q3), 
    .Q4(Q4)
    );

   initial begin
    // Initialize Inputs
    sysclk <= 1'b1;

      #200 $finish();
   end

    always #5 sysclk=~sysclk;

endmodule