-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

2 番目のモジュール:

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

3番目のモジュール:

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

モジュール1では、の代わりにalways@(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

出力が何を期待しているのかわかりませんが、問題の 1 つは、常に DFF をリセットしていることです。

于 2013-02-27T17:16:52.043 に答える