2017-02-10 4 views
-1

J'ai travaillé sur un programme Verilog qui est supposé ajouter une entrée 8 bits signée à la sortie 16 bits à chaque incrément d'horloge et réinitialiser à la réception d'un signal de réinitialisation. La partie d'addition fonctionne bien, et même en ajoutant la valeur 1 négative fonctionne, mais j'obtiens des résultats étranges dans la simulation pour des nombres moins que cela. Cela fait environ un an que j'ai utilisé Verilog pour la dernière fois, et malgré tout ce que je peux penser, je ne sais pas quel est le problème. Voici ce que j'ai en ce code:Verilog Signé Addition Erreur de soustraction

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 

Voici mon entrée de simulation:

enter image description here

Et voici la sortie que je reçois.

enter image description here

Il semble comme une erreur droite en avant dans mon programme, mais je ne peux pas l'identifier.

+2

Bienvenue sur StackOverflow. Il est difficile de lire votre code parce que vous ne l'avez pas indenté correctement. Vous ne montrez pas non plus ce que vous attendez d'un résultat correct par rapport au résultat réel. –

Répondre

0

Le problème est que vous effectuez une négation logique de in par rapport à une négation de bit.

Votre code pourrait être grandement simplifiée par

  • déplacer la reset branche conditionnelle au niveau supérieur
  • utilisant signed types de données
  • en utilisant les déclarations du port de style Verilog-2001

Pour exemple:

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

Existe-t-il un moyen de passer d'un tableau non signé à un tableau signé et inversement? – StandardIssue

+0

Vous devriez poser cette question comme une nouvelle question, avec un nouvel exemple. –

0

Je vois dans votre code:

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

temp, on vous essayez de calculer un complément à deux. ! est un NOT logique. vous voudriez ~ pour un inverser peu sage.

vous pourriez ainsi avoir:

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

Ou

sum <= a - b; 

-à-dire -b == (~b +1'b1)