2017-05-21 16 views
0

私のコードはコンパイルはしていますが、シミュレーションするとうまくいきません。 「エラー・ロード・デザイン」と表示されます。 私はこれらのモジュール間で入出力ポートが間違っていると思います。 しかし、私はそれらを見つけることができません.. 私のコードにどこにエラーがあるの助けてください。 modulo_60_binarymodelsim programming 60 counter(エラー読み込みデザイン)

module tb_modulo_60_binary; 

    reg t_clk, reset; 
    wire [7:0] t_Y; 
    parameter sec = 30; 

    always #(sec) t_clk = ~t_clk; 
    modulo_60_binary M1 (t_Y, t_clk, reset); 

    initial begin 
    t_clk = 1; reset =1; #10; 
    reset = 0; #3050; 
    $finish; 
    end 
endmodule 

module modulo_60_binary(y, clk, reset); 
    output [7:0] y; 
    input reset, clk; 
    wire TA1, TA2, TA3, JA2, JA4; 
    reg [7:0] y; 

    assign TA1 = 1; 
    assign TA2 = (~y[6]) && y[4]; 
    assign TA3 = (y[5] && y[4]) || (y[6] && y[4]); 
    assign JA2 = ~y[3]; 
    assign JA4 = y[1]&&y[2]; 

    jk_flip_flop JK1 (1, 1, clk, y[0]); 
    jk_flip_flop JK2 (JA2, 1, y[0], y[1]); 
    jk_flip_flop JK3 (1, 1, y[1], y[2]); 
    jk_flip_flop JK4 (JA4, 1, y[1], y[3]); 
    t_flip_flop T1 (TA1, clk, y[4]); 
    t_flip_flop T2 (TA2, clk, y[5]); 
    t_flip_flip T3 (TA3, clk, y[6]); 
    always @(negedge clk) 
    begin 
    if(reset) 
     y <= 8'b00000000; 
    else if(y == 8'b01110011) 
     y <= 8'b00000000; 
    end 
endmodule 

module t_flip_flop(t, clk, q); 
    input t, clk; 
    output q; 
    reg q; 

    initial q=0; 
    always @(negedge clk) 
    begin 
    if(t == 0) q <= q; 
    else q <= ~q; 
    end 

endmodule 

module jk_flip_flop(j, k, clk, Q); 
    output Q; 
    input j, k, clk; 
    reg Q; 

    always @(negedge clk) 
     if({j,k} == 2'b00) Q <= Q; 
     else if({j,k} == 2'b01) Q <= 1'b0; 
     else if({j,k} == 2'b10) Q <= 1'b1; 
     else if({j,k} == 2'b11) Q <= ~Q; 
endmodule 
+0

'y'の各ビットには1つのドライバが必要です。あなたは2つ(モジュールインスタンスと別個の常時ブロック)を持っています。また、モジュールインスタンスの出力は、ネットタイプ(すなわち、 'wire')に接続する必要があります。あなたはあなたの残りの論理を再考する必要があります – Greg

+0

詳細を教えてください。どの部分を変更する必要がありますか?私はVerilogを使うのは初めてです... – kyubihn

答えて

0

あなたy信号は、2つの場所で駆動されている:ビットJK#とT#インスタンスによって

  • ゼロ
yのすべてのビットを割り当て、リセット・ロジック

フロップとコームロジックには1つのクリアドライバが必要です。これはソフトウェアとハ​​ードウェアの基本的な違いの1つです。

JKとTフロップの使用を前提とした残りの回答は設計要件です。したがって、yを0に割り当てているalwaysブロックを削除し、ywireタイプにする必要があります。

ロジックをTフロップに固定するのは簡単です。条件文を追加するだけです。例:

wire do_rst = reset || (y == 8'b01110011); 
assign TA1 = do_rst ? y[4] : 1; 
assign TA2 = do_rst ? y[5] : (~y[6]) && y[4]; 
assign TA3 = do_rst ? y[6] : (y[5] && y[4]) || (y[6] && y[4]); 

1つのフロップの出力が別のフロップの出力であるため、JKフロップはより硬い。私は、各JKフロップのクロック入力はclkでなければならないとアドバイスします。そうでなければ、yビットが2の1のべき乗から1の値(例えば1,3,7,15)であるときにリセットのための設計上の頭痛を要求します。つまり、JA#ロジックを再評価し、KA#ロジックを追加する必要があります(上記のdo_rstが役立ちます)。私はこれ以上あなたのために仕事をするつもりはない。

非同期リセット手法の選択肢がありますが、この設計では私はそれを年齢主義者にアドバイスします。リセットパルスがシリコン上で短すぎる可能性があり、条件付きリセットy ==を特定の値に設定した場合、部分的リセットが無効になる可能性があります。プッシュを十分に広げるために合成制約/ルールを追加することもできますが、それは脆いデザインにパッチを当てるだけです。最初は堅牢に設計する方がよいでしょう。

FYI:y[7]にドライバがなく、インスタンスT3のモジュール宣言にタイプミスがあります。

関連する問題