-1

d フリップフロップを使用してリップル カウンターのテスト ベンチを作成しています。私のプログラムはエラーなしでコンパイルされていますが、undefined結果が得られます。どうすればこの問題を解決できますか?

コードは次のとおりです。

module RCounter;

reg d,d2,d3,d4,clk;
wire q,q2,q3,q4;


DFlipFlop a(d,q,clk);
DFlipFlop a1(d2,q2,q);
DFlipFlop a2(d3,q3,q2);
DFlipFlop a3(d4,q4,q3);

initial

begin

clk =1;


d=0;d2=0;d3=0;d4=0;

#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;

end

always 
begin

#2 assign clk = ~ clk;

end

endmodule

私は何を間違っていますか?どうすればこれを解決できますか?

4

1 に答える 1

2

あなたが持っているのはリップルカウンターではなく、テストベンチとDUT(テスト中のデザイン、またはあなたの場合は「リップルカウンター」)の間の境界を本当に理解していないようです.

あなたが持っているのは、4 つの独立したフリップフロップをシミュレートするテストベンチです。リップル カウンターをシミュレートしている場合は、「RCounter_TB」と呼ばれる別のものの内部でインスタンス化される「RCounter」などと呼ばれるモジュールが必要です。テストベンチは入力 (カウンター、クロック、およびリセット) のみを駆動する必要があり、個々のフロップの d ピンを駆動するべきではありません。これらのフロップ間の接続がテスト対象であるためです。

リップル カウンター モジュール内で、フリップフロップ間の有線接続を定義します。#モジュールには固定時間遅延の概念がないため、このモジュール内に時間遅延があってはなりません。d2 ピンを ~q2 から駆動する場合は、次のように割り当てます。

assign d2 = ~q2

ハードウェアでは、これは ~q2 の出力から d2 にループバックするワイヤにすぎないためです。それは常に存在し、時間の概念はありません。

出力に X が表示される具体的な理由については、最後の質問で投稿したフリップフロップの設計に由来すると思います。

module DFlipFlop(d,q,clk);

input d,clk;
output q;

assign q = clk?( (d==1)? 1:0) : q;

endmodule

ここには状態保持がないため、これはフリップフロップではありません。これは、無限のフィードバック ループを伴う割り当てステートメントにすぎません (基本的には、ワイヤ自体を駆動するだけです)。

フリップフロップをモデル化する場合は、always @(posedge clk)ブロックを使用して、何らかの状態保持が必要であることを示す必要があります。常にブロックを使用してフリップフロップをモデル化する方法を調べるのはあなたに任せます。

于 2013-02-20T18:43:52.600 に答える