1

次のコードBCDtoSevenDecodeでは、4 ビット入力を受け取り、それを 7 セグメント表示用にデコードします。デコード結果はresultx変数に格納されます。その後、resultx 変数はすべて 4x1 Mux に渡されます。この Verilog コードをコンパイルするためにザイリンクスを使用しています。コードは次の警告でコンパイルされます。

WARNING:Xst:647 - Input <clk> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

WARNING:Xst:647 - Input <reset> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

WARNING:Xst:1306 - Output <select> is never assigned.

問題を把握できないため、ここで専門家に相談しています。

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

 module Counter(input clk, input reset, output[3:0]SsdEnable, output [6:0]DecodedOut, output reg [3:0]temp1, output reg [3:0]temp2 , output reg [3:0]temp3, output reg [3:0]temp4);


wire [6:0] Result1,Result2,Result3,Result4;
reg [3:0] count1,count2,count3,count4;

wire [25:0]loop;
wire [11:0]counter;

reg [1:0]Sel;

SevenDecoder u1(count1,Result1);
SevenDecoder u2(count2,Result2);
 SevenDecoder u3(count3,Result3);
SevenDecoder u4(count4,Result4);

Mux u5(Result1,Result2,Result3,Result4,Sel,DecodedOut );
Decoder_2x4 u6(Sel,SsdEnable);


always @(posedge clk or negedge reset)
begin
 if(!reset)
  begin
count1<=0;
count2<=0;
count3<=0;
count4<=0;

//counter=0;
 end
 else
  begin
if(loop==49999999)
begin
    count1<=count1+1;
    if(count1==10)
    begin
        count1<=0;
        count2<=count2+1;
    end

    if(count2==10)
    begin
        count2<=0;
        count3<=count3+1;
    end

    if(count3==10)
    begin
        count3<=0;
        count4<=count4+1;
    end

    if(count4==10)
    begin
        count1<=0;
        count2<=0;
        count3<=0;
        count4<=0;
    end

    temp1<=count1;
    temp2<=count2;
    temp3<=count3;
    temp4<=count4;
end
  loop=loop+1;
 end

end



always @(posedge clk or negedge reset)
begin

if(!reset)
Sel=0;
else
    begin
    if(counter==1000)
    begin
    Sel=0;
    end

end
 counter=counter+1;
end


endmodule


module SevenDecoder(input [3:0]i , output[6:0] out);

assign out[0]= (i == 0 || i == 2 || i == 3 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9) ? 0 : 1;
assign out[1] = (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 7 || i == 8 || i == 9) ? 0 : 1;
assign out[2] = (i == 0 || i == 1 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9) ? 0 : 1;
assign out[3]= (i == 0 || i == 2 || i == 3 || i == 5 || i == 6 || i == 8 || i == 9) ? 0 : 1;
assign out[4]= (i == 0 || i == 2 || i == 6 || i == 8) ? 0 : 1;
assign out[5]= (i == 0 || i == 4 || i == 5 || i == 6 || i == 8 || i == 9) ? 0 : 1;
assign out[6]= (i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 8 || i == 9) ? 0 : 1;

endmodule

module Mux(input [6:0]in1,input [6:0]in2,input [6:0]in3,input [6:0]in4, input [1:0]sel, output [6:0]out);

assign out=(sel==0)?in1:
            (sel==1)?in2:
            (sel==2)?in3:
            (sel==3)?in4:0;
endmodule



module Decoder_2x4(input [1:0]sel, output [3:0]selSSD);

 assign selSSD=(sel==0)? 4'b1110 :
                (sel==1)? 4'b1101 :
                (sel==2)? 4'b1011 :
                (sel==3)? 4'b0111 :0;

endmodule

この問題の原因は何ですか?

編集:

ここにコード全体を投稿しました。デバッグしようとしましたが、このコードのバグを見つけることができませんでした。

このコードは何も出力しません。cnt1,cnt2,cnt3,cnt4値が増加している証拠として変化する値を表示する必要がありますが、そうではありません。

4

2 に答える 2

3

問題のコードの現在のリビジョンに基づいて回答を更新しています。詳細情報の一部は、質問の最新バージョンには適用されない場合があります。

質問には、次のコード ブロックが含まれています。

always @(posedge clk or negedge reset)
begin

if(!reset)
Sel=0;
else
    begin
    if(counter==1000)
    begin
    Sel=0;
    end

end
 counter=counter+1;
end

私はそれを次のように更新します:
counterリセットされていないのでxになります、x + 1はxまでです。

always @(posedge clk or negedge reset) begin
  if(!reset) begin
    Sel     <= 0;
    counter <= 0;
  end
  else begin
    counter <= counter+1;
    if(counter==1000) begin
      Sel <= 0;
    end
  end
end
endmodule

コードの一部でこれに気付きました。必要な動作が得られません。

  if(iterator==20) begin
    if(out[3:0]==9) begin
      out[3:0] <= 0;
      out[7:4] <= out[7:4]+1;
    end
    ...
    out[3:0]<=out[3:0]+1;

ノンブロッキング割り当ては、タイムステップが終了して値がコピーされるまで、シミュレーターの実行をブロックしないことを意味します。out[3:0]<=0したがって、無条件にオーバーライドされるため、どのように実行されるかわかりませんout[3:0]<=out[3:0]+1;

最上位モジュールは CounterTOP で、出力 [7:0] 出力があり、これは MUX の [6:0] 出力 'out' によって駆動されます。したがって、out の MSB (最上位ビット) は z になり、駆動されません。

以下にいくつかの推奨される改善点を示します。

変数の大文字と小文字、Sel と Mux と呼ばれるモジュールを混在させることは避けたいと思います。大文字の(ローカル)パラメーターを除いて、すべて小文字のままにすることを好みます。アンダー スコア区切りは、キャメルケースよりもよく使用されます。つまり、モジュール SevenDecoder を Seven_decoder として記述します。これは読みやすさに役立ち、一部のシミュレーターは大文字と小文字を区別しないため、大文字と小文字が混在する場合、変数が大文字と小文字で区別され、互いに干渉し始める可能性があります。変数の大文字と小文字を混在させると、タイプミスが発生しやすくなります。

バグは、コードが正しく配置されていると見やすくなり、エディターの列モードの使用を開始できるため、編集も高速になります。

名前付きポートを使用すると、コードのレビューがはるかに簡単になりますが、接続エラーを見つけるのは非常に困難です。

Mux az(
  .sel(        ), 
  .in1( result1),
  .in2( result2),
  .in3( result3),
  .in4( result4),
  .clk( clk    ),
  .rst( reset  ),
  .out( out    )
);

現在表示されているエラーとは関係ありませんが、always @(posedge clk)ブロック単位で割り当てを修正することをお勧めします。

=現在、シミュレーションとハードウェアの違いにつながる可能性のあるブロッキング割り当てを使用しています。これはデバッグが非常に困難になります。クロック トリガー ブロックでは、ノンブロッキング<=割り当てを使用する必要があります。

ネストされた if ステートメントは、case ステートメントに置き換えることもできます。

always @(posedge clk or negedge reset) begin
  if(~reset) begin
    iterator <=0;
    i        <=0;
  end 
  else begin
    case(iterator)
    10, 20, 30 : begin
      i <= i+1;   
      iterator <= iterator + 1;
    end
    40 : begin
      i        <= i+1;
      iterator <= 0;
    end
    default : iterator <= iterator+1;
  endcase
end
于 2013-03-07T17:10:22.060 に答える
1

selectマルチプレクサに回線が接続されていないようです。

于 2013-03-07T16:26:09.867 に答える