它应该是一个MOD10计数器,但它从0计数到9并重置为4。为什么?

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

它应该是一个MOD10计数器,但它从0计数到9并重置为4,为什么? 如果可能的话,请给我解决方案作为代码和解释。

module MOD10 (clk, clr, q);
    input clk, clr;
    output [3:0] q;
   
    wire x, w;
  
    assign x = q[3] & q[1];  // Detects when the count reaches 10 (binary 1010)
    assign w = x | clr;      // Reset or clear condition
  
    TFF tff1(clk, w, 1'b1, q[0]);  // First TFF for q[0]
    TFF tff2(q[0], w, 1'b1, q[1]); // Second TFF for q[1]
    TFF tff3(q[1], w, 1'b1, q[2]); // Third TFF for q[2]
    TFF tff4(q[2], w, 1'b1, q[3]); // Fourth TFF for q[3]
  
endmodule

module TFF (clk, clr, t, q);
    input clk, clr, t;
    output reg q;
  
    always @(posedge clr or negedge clk) begin
        if (clr)
            q <= 0;  // Clear or reset the flip-flop
        else begin
            if (!t)
                q <= q;  // Maintain the state when T = 0
            else
                q <= ~q; // Toggle the output when T = 1
        end
    end
endmodule


module MOD10_TB();
    reg clk, clr;
    wire [3:0] q;
  
  // Instantiate the MOD10 module
    MOD10 uut (clk, clr, q);
  
  // Clock signal generation (50% duty cycle)
    initial begin
        clk = 0;
        forever #5 clk = ~clk;  // Toggle clock every 5 time units
    end
  
  // Reset logic and test sequence
    initial begin
        clr = 1;  // Reset active
        #10 clr = 0;  // Deactivate reset after 10 time units
        #110 $finish;  // End simulation after 110 time units
    end
endmodule

Simulation of the given code from Xilinx Vivado

它应该是一个MOD10计数器,所以我期望它从0计数到9并再次重置为0,但它从0计数到9并重置为4。

verilog counter system-verilog digital vlsi
1个回答
0
投票

tff3
实例的时钟输入故障会导致意外结果。 我能够使用 Synopsys VCS 模拟器清楚地看到波形中的毛刺。

您的代码不遵循良好的设计实践。 对于同步设计,所有触发器应使用相同的时钟信号,但您的代码使用多个时钟信号。

这是执行您想要的操作的代码:

module MOD10 (clk, clr, q);
    input clk, clr;
    output reg [3:0] q;
   
    always @(posedge clr or negedge clk) begin
        if (clr) begin
            q <= 0;  // reset the counter
        end else if (q == 9) begin
            q <= 0;  // reset when count is 9
        end else begin
            q <= q + 1;
       end
    end  
endmodule

最好在最高抽象级别进行建模。 无需创建切换触发器,只需创建一个简单的计数器即可。

© www.soinside.com 2019 - 2024. All rights reserved.