-1

我编写了这段代码来模拟使用 D 触发器的异步计数器。该程序为第一次迭代提供了正确的输出,但随后输出根本没有改变。我究竟做错了什么?

这是代码:

第一个模块:

module DFF(d,q,reset,clk);
  input      d,reset,clk;
  output reg q;

  always @(posedge reset, posedge clk) begin
    if(reset) begin
      q=0;
    end
    if(d)
      q=d;
    else
      q=q;
   end
endmodule

第二个模块:

module RippleCounter(d,clk,reset,out);
  input  [3:0] d;
  input        clk, reset;
  output [3:0] out; // 4bit

  DFF a(d[0],out[0],reset,clk);
  DFF b(d[1],out[1],reset,out[0]);
  DFF c(d[2],out[2],reset,out[1]);
  DFF dx(d[3],out[3],reset,out[2]);
endmodule

第三个模块:

module RippleCounterTOP;
  reg  [3:0] d;
  reg        clk, reset;
  wire [3:0] out;

  RippleCounter r(d,clk,reset,out);

  initial begin
    d=0;clk=0;reset=1;
  end

  always begin 
    #5 d=d+1; clk=~clk;
  end
endmodule
4

2 回答 2

1

看看这张波纹计数器的图片,测试工具的唯一输入应该是时钟。

使用的翻牌类型通常看起来像:

always @(posedge reset, posedge clk) begin
  if(reset) begin
    q <= 'b0;
  end
  else begin
    q <= ~q;
  end
end

在模块 1always@(posedge clk ..中,您应该使用非阻塞<=赋值而不是=.

在模块 3 中,你有一个没有敏感度列表的 always 块,我会添加@*, 这看起来你真的想要一个带有重复或 for 循环的初始值来执行你的测试,然后$finish()在完成后调用。我在下面使用了SystemVerilog,但如果需要#5ns,您可以更改为。#5

integer i;
initial begin 
  d=0;clk=0;reset=1;
  #5ns
  reset=0;

  for (i=0; i<5'b1000; i=i+1) begin
    #5ns d=d+1; clk=~clk;
    $display("%4b, %4b", d, out);
  end
  $finish;
end

尝试您的示例,这就是我最终得到的结果,我认为这是您尝试做的事情:注意正确答案是~out.

模块 1可以扩展为 q 和 q_bar 输出。

module DFF(q,reset,clk);
  input      reset,clk;
  output reg q;

  always @(posedge reset, posedge clk) begin
    if(reset) begin
      q<=0;
    end
    else begin
      q<=~q;
   end
 end
endmodule

模块 2

module RippleCounter(clk,reset,out);
  input        clk, reset;
  output [3:0] out; // 4bit

  DFF ax(out[0],reset,clk);
  DFF bx(out[1],reset,out[0]);
  DFF cx(out[2],reset,out[1]);
  DFF dx(out[3],reset,out[2]);
endmodule

模块 3(测试工具)

module RippleCounterTOP;
  reg        clk, reset;
  wire [3:0] out;

  RippleCounter r(clk,reset,out);

  integer i;

  initial begin
    clk=0;reset=1;
    #5ns
    reset=0;

    for (i=0; i<6'b10000; i=i+1) begin
      #5ns clk=~clk;
      $display("%4b", ~out);
    end
    $finish;
  end
endmodule
于 2013-02-27T17:36:59.147 回答
0

我不确定你希望你的输出做什么,但一个问题是你总是在重置你的 DFF。

于 2013-02-27T17:16:52.043 回答