2017-02-10 1 views
-1

Ich habe an einem Verilog-Programm gearbeitet, das bei jedem Clock-Inkrement einen vorzeichenbehafteten 8-Bit-Eingang zum 16-Bit-Ausgang hinzufügen und nach Erhalt eines Reset-Signals zurücksetzen soll. Der Additionsabschnitt funktioniert einwandfrei, und sogar das Hinzufügen des negativen 1-Werts funktioniert, aber ich bekomme merkwürdige Ergebnisse in der Simulation für weniger als das. Es ist ungefähr ein Jahr her, dass ich Verilog zum letzten Mal benutzt habe, und obwohl ich alles versucht habe, was ich mir vorstellen kann, bin ich mir nicht sicher, was das Problem ist. Hier ist, was ich so weit wie Code haben:Verilog Signed Addition Subtraktionsfehler

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 

Hier ist meine Simulation Eingang:

enter image description here

Und hier ist die Ausgabe, die ich bekomme.

enter image description here

Es scheint wie ein Straight-Forward-Fehler in meinem Programm, aber ich kann es nicht identifizieren.

+2

Willkommen bei Stackoverflow. Es ist schwierig, den Code zu lesen, weil Sie ihn nicht ordnungsgemäß eingerückt haben. Sie zeigen auch nicht, was Sie erwarten, um das richtige Ergebnis gegenüber dem tatsächlichen Ergebnis zu sein. –

Antwort

0

Das Problem ist, dass Sie eine logische Negation von in gegenüber einer bitweisen Negation machen.

Ihr Code stark von

  • Bewegen des reset bedingte Verzweigung auf die oberste Ebene Erklärungen
  • mit signed Datentypen
  • mit Verilog-2001-Stil-Port Für

vereinfacht werden Beispiel:

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

Gibt es eine Möglichkeit, von einem vorzeichenlosen Array zu einem vorzeichenbehafteten Array zu gelangen und umgekehrt? – StandardIssue

+0

Sie sollten das als eine neue Frage mit einem neuen Beispiel stellen. –

0

Ich sehe dies im Code:

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

Temp sieht aus wie Ihre eine Zweier-Komplement zu berechnen versuchen. ! ist ein logisches NICHT. Sie würden ~ für ein bisschen weise invertieren wollen.

so könnten Sie haben:

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

Oder

sum <= a - b; 

dh -b == (~b +1'b1)