2008-10-27 7 views
4

J'essaye de concevoir un soustracteur d'additionneur de 4 bits dans verilog. C'est seulement la deuxième chose que j'ai jamais écrite dans Verilog, et je ne connais pas encore la syntaxe correcte. Ce module est que j'ai jusqu'à présent:Comment convertir un nombre en complément à deux dans verilog?

module Question3(carryin, X, Y, Z, S, carryout, overflow); 
    parameter n = 4; 
    input carryin, Z; 
    input [n-1:0]X, Y; 
    output reg [n-1:0]S; 
    output reg carryout, overflow; 

    if(Z==0) 
    begin 
     Y = not(y) + 4'b0001; 
    end 

    always @(X, Y, carryin) 
     begin 
      {carryout, S} = X + Y + carryin; 
      overflow = carryout^X[n-1]^Y[n-1]^S[n-1]; 
     end 

endmodule 

Mon compilateur (Xilinx 10.1), ne cesse de dire « Erreur de syntaxe proche si. » J'ai essayé de nombreuses façons de faire la conversion, y compris en utilisant un cas qui prend Y comme argument, puis vérifie toutes les combinaisons 4 bits possibles et les convertit en complément à deux.

Z est ce qui détermine si l'additionneur fait la soustraction ou l'addition. Si c'est 0, cela veut dire soustraction, et je veux convertir y en complément à deux, juste faire des ajouts réguliers. Je suis sûr que le reste de l'additionneur est correct, je ne sais pas quel est le problème avec la partie où je suis en train de convertir.

Répondre

5
reg [n-1:0] Y_compl; 

always @(Z, Y, X, carryin) begin 
    Y_ = (~Y + 4'b0001); 
    if (Z == 1'b0) begin 
    {carryout, S} = X + Y_compl + carryin; 
    overflow = carryout^X[n-1]^Y_compl[n-1]^S[n-1]; 
    end 
    else begin 
    {carryout, S} = X + Y + carryin; 
    overflow = carryout^X[n-1]^Y[n-1]^S[n-1]; 
    end 

end 

Quelques points importants.

  1. Mettez l'instruction if dans le bloc always. N'utilisez pas deux blocs toujours, vous allez créer une condition de concurrence dans le simulateur.
  2. J'ai créé une nouvelle variable, Y_ parce qu'utiliser Y, qui est une entrée, rappelez-vous, sur le côté gauche d'une affectation va probablement déduire des verrous ou faire quelque chose d'autre désagréable lorsque vous synthétisez.
  3. Je suggère d'utiliser l'opérateur d'inversion de bits '~' pour inverser Y à la place de la primitive 'non' . L'outil de synthèse a plus de liberté pour optimiser votre code de cette façon.
  4. Revérifiez pour des résultats corrects, ça fait longtemps que j'ai construit un additionneur.
+1

Est-ce que 'Y_' est censé être' Y_comp1'? –

+0

Personnellement, je ne voudrais pas envelopper l'additionneur entier dans un 'if'. Ce que vous avez écrit implémente deux additionneurs et met ensuite un multiplexeur sur la sortie. Ce que vous voulez, c'est un additionneur avec un multiplexeur sur l'entrée. Vous demandez à l'optimiseur de faire beaucoup. –

1

Vous utilisez une minuscule "y" dans "Y = not (y) + 4'b0001;"

En outre, vous utilisez plus d'ajouts que nécessaire. X-Y est la même chose que NOT (NOT (X) + Y).

Questions connexes