Question

J'essaie de concevoir un soustracteur d'additionneur 4 bits dans Verilog. Ce n'est que la deuxième chose que j'ai jamais écrite dans Verilog, et je ne connais pas encore la syntaxe correcte. C'est le module que j'ai jusqu'à présent:

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 de if". J'ai essayé de nombreuses manières différentes d'effectuer la conversion, notamment en utilisant simplement un cas qui prend Y comme argument, puis vérifie toutes les combinaisons possibles à 4 bits et les convertit en complément à deux.

Z est ce qui détermine si l'additionneur effectue une soustraction ou une addition. Si la valeur est 0, cela signifie une soustraction et si je veux convertir y en complément à deux, effectuez simplement une addition régulière. Je suis sûr que le reste de l'additionneur a raison, je ne sais pas ce qui ne va pas avec la partie où j'essaie de convertir.

Était-ce utile?

La solution

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. Placez l'instruction if dans le bloc always. N'utilisez pas toujours deux blocs, vous allez créer une situation de concurrence critique dans le simulateur.
  2. J'ai créé une nouvelle variable, Y_, car utiliser Y, qui est une entrée, rappelez-vous, sur le côté gauche d'une affectation déduira probablement des verrous ou fera quelque chose de désagréable lors de la synthèse.
  3. Je suggère d'utiliser l'opérateur d'inversion au niveau des bits "~" pour inverser Y à la place si "non" primitif. L’outil de synthèse a plus de liberté pour optimiser votre code de cette façon.
  4. Vérifiez que les résultats sont corrects. Cela fait longtemps que je n'ai pas construit d'additionneur.

Autres conseils

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

De plus, vous utilisez plus d’additions que nécessaire. X-Y est la même chose que NOT (NOT (NOT (X) + Y).

met l'instruction if dans un bloc initial
http://www.asic-world.com/verilog/vbehave1.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top