4位秒级递增计数器仿真输出始终为xxxx的问题求助
问题分析与解决
核心问题
你的4位计数器仿真输出始终为xxxx,根源在于两个关键问题:
- 寄存器未初始化:
counterled寄存器没有在复位时初始化,初始状态为未知态x,后续累加操作会持续保持x; - 仿真时钟与计数阈值不匹配:设计中
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
相关产品推荐
相关产品推荐

