You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

4位秒级递增计数器仿真输出始终为xxxx的问题求助

问题分析与解决

核心问题

你的4位计数器仿真输出始终为xxxx,根源在于两个关键问题:

  1. 寄存器未初始化:counterled寄存器没有在复位时初始化,初始状态为未知态x,后续累加操作会持续保持x;
  2. 仿真时钟与计数阈值不匹配:设计中count==28'h2FAF080对应50MHz时钟下的0.5秒,但测试平台采用1us时标、20us周期的时钟,要达到该计数需要极长的仿真时间,导致clk1s永远不会翻转,counterled的触发条件从未满足。

修正后的设计代码

//`timescale 1ns / 1ps

module FourBitLedToggle(
    input res,
    input Clk,
    output [3:0] led
);
    
reg [27:0] count;//for 1 second check
reg clk1s;//1 second clock
reg [3:0]counterled;

always @(posedge Clk)
begin
    if(res==1'b1)  //CHECK RESET
    begin
        clk1s <= 1'b1;
        count <= 0;
        counterled <= 4'b0000;  // 复位时初始化计数器
    end
    else begin
        if(count==28'h2FAF080)//0.5 sec //CHECKS IF SEC COMPLETED
        begin
            clk1s <= ~clk1s;
            count <= 0;
        end
        else begin
            count <= count+1;
        end
    end
end

always @(posedge clk1s or posedge res)  // 加入复位敏感信号
begin
    if(res) begin
        counterled <= 4'b0000;
    end else begin
        counterled <= counterled+4'b0001;
    end
end

assign led=counterled;

endmodule

适配仿真的测试平台代码

为快速验证功能,将测试平台时钟改为50MHz(匹配设计假设),并添加仿真结束控制:

`timescale 1ns / 1ps

module FourBitToggleCheck;

    // Inputs
    reg res;
    reg Clk;

    // Outputs
    wire [3:0] led;

    // Instantiate the Unit Under Test (UUT)
    FourBitLedToggle uut (
        .res(res), 
        .Clk(Clk), 
        .led(led)
    );

    // 生成50MHz时钟(周期20ns)
    initial begin
        Clk = 0;
        forever #10 Clk=~Clk;
    end

    // 复位序列与仿真控制
    initial begin
        res = 1;
        #20;
        res = 0;
        // 仿真足够长时间观察计数效果
        #2000000000;
        $finish;
    end
endmodule

仿真提速技巧

如果仅需验证计数逻辑,无需等待真实1秒,可以临时将设计中的28'h2FAF080替换为极小值(比如28'h3),这样仿真几纳秒就能看到clk1s翻转和计数器递增。

内容的提问来源于stack exchange,提问作者Muhammad Hamza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:27:07