2017-02-10 38 views
-1

私は、クロック増分ごとに符号付き8ビット入力を16ビット出力に追加し、リセット信号を受信するとリセットされるVerilogプログラムに取り組んでいます。加算部分は正常に動作しており、負の1の値を加算しても動作しますが、それより少ない数のシミュレーションでは奇妙な結果が出ます。私がVerilogを最後に使用してから約1年が経ちました。私が考えることができるすべてを試しても、問題は何か不明です。ここで私は限りコードとして持っているものです。Verilog符号付き加算減算エラー

module varcount (clk, reset, in, out); 
input clk, reset; 
input [7:0] in; 
output reg [15:0] out; 
reg [15:0] temp; 
reg [15:0]count; 
parameter X=1000000; 
always @ (posedge clk) 
    begin 
    if (in[7] == 1) 
    begin 
    temp = 16'b00000000000000001 + !in; 
    count = count - temp; 
    if (reset) 
    begin 
     count = 0; 
     out = 0; 
    end 
    out = count; 
end 
    else 
    begin 
     count = count + in; 
     if (reset) 
     begin 
      count = 0; 
      out = 0; 
     end 
     out = count; 
    end 
end 
endmodule 

ここに私のシミュレーション入力です:

enter image description here

そして、ここでは、私が手出力です。

enter image description here

それは私のプログラムでストレートフォワード・エラーのように思えるが、私はそれを識別することはできません。

+2

ようこそすなわち。コードを正しくインデントしていないため、コードを読みにくいです。実際の結果に対して正しい結果が期待されるものは表示されません。 –

答えて

0

問題は、論理否定をinとビット単位で否定することです。

あなたのコードが大幅に

  • はVerilogの-2001スタイルのポート宣言

用を使用してsignedデータ型

  • を使用して、トップレベル
  • reset条件分岐を移動することによって単純化することができ例:

    module varcount (input clk, reset, 
          wire signed [7:0] in, 
        output reg signed [15:0] out); 
    always @ (posedge clk) 
          if (reset) 
           out = 0; 
          else 
           out = out + in; 
    endmodule 
    
  • +0

    符号なし配列から符号付き配列に移動する方法はありますか? – StandardIssue

    +0

    新しい質問として、新しい例を尋ねてください。 –

    0

    私はあなたのコードでこれを参照してください。

    temp = 16'b00000000000000001 + !in; 
    count = count - temp; 
    

    tempがあなたの2の補数を計算しようとしているように見えます。 !は論理NOTです。あなたは少し賢明な逆転のために~がほしいでしょう。

    ので、あなたが持っている可能性があり:

    sum <= a + (~b +1'b1); 
    

    それとも

    sum <= a - b; 
    

    にStackOverflowに-b == (~b +1'b1)