【问题标题】:verilog counter not starting from 0verilog 计数器不是从 0 开始
【发布时间】:2021-10-10 05:34:56
【问题描述】:

我将此计数器用作多路复用器选择引脚,我需要它从 0 开始,但在第一个周期的模拟中它从 1 开始,在下一个周期它从 0 开始。

module upcounter(clk,reset,out);
input clk,reset;
output reg [2 : 0]out = 3'b000;


always @(posedge clk or posedge reset)
begin
if(reset)
  out <= 3'b000;
else 
  out <= out + 3'b001;
end
endmodule

这是我的测试台代码:

module counter_tst;
reg clk;
wire [2 : 0] out;
reg rst;

upcounter u0(clk,rst,out);

initial
   clk = 1'b1;
always
#1 clk = ~clk;

initial
begin
   rst=0;
end
endmodule

【问题讨论】:

  • @Md.shah 你怎么知道它没有?你的测试台在哪里?您发布的代码没有任何问题。无需在声明中初始化 'out'。
  • @serge 我已经添加了模拟波。
  • @ToTamire 我认为它不会有效解决我的问题。
  • @ToTamire 你来了。

标签: verilog counter simulation


【解决方案1】:

正如@Serge 所说,测试台对于解释您所看到的内容很重要。

您的测试台只会将rst 设置为0,因此我们可以放心地完全忽略以reset 为条件的代码。无需担心1 的正边缘或值。

0 时,您的测试平台强制 clk1。这被视为上升沿,因此在out 立即递增到1 之后。由于您在增加out 时没有&lt;= #n 延迟,因此它似乎会立即生效。对于这类事情,我发现包括模拟延迟有助于调试。

考虑这个版本的代码和测试台。我将时钟滴答声减慢了 10 倍,并在 out 值递增中插入了 #1 延迟。我还删除了所有孤立的 rst/reset 代码,以专注于您所看到的效果:

// code.v
module upcounter(clk,out);
   input clk;
   output reg [2 : 0] out = 3'b000;

   always @(posedge clk)
     out <= #1 out + 3'b001;

endmodule

module counter_tst;
   reg clk;
   wire [2 : 0] out;

   upcounter u0(clk,out);

   initial
     begin
       clk = 1'b1;
       $monitor("time = %0d", $time, " clk = %b out = %d", clk, out);
       $dumpvars();
       #1000 $finish();
     end

   always
     #10 clk = ~clk;

endmodule

编译运行如下:

$ iverilog code.v
$ ./a.out
VCD info: dumpfile dump.vcd opened for output.
time = 0 clk = 1 out = 0
time = 1 clk = 1 out = 1
time = 10 clk = 0 out = 1
time = 20 clk = 1 out = 1
time = 21 clk = 1 out = 2
time = 30 clk = 0 out = 2
time = 40 clk = 1 out = 2
time = 41 clk = 1 out = 3
< etc >

由于观察到posedge clk,您现在应该能够看到out 的第一个增量正在发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2012-11-27
    • 2023-03-22
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多