Frage

Ich versuche, einen 4-Bit-Addierer Subtrahierer in Verilog zu entwerfen. Dies ist erst das zweite, was ich je in Verilog geschrieben habe, und ich weiß nicht, alle die richtige Syntax noch. Dies ist das Modul Ich habe so weit:

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

Mein Compiler (Xilinx 10.1), sagt immer wieder "Syntaxfehler in der Nähe, wenn." Ich habe viele verschiedene Wege versucht, die Umwandlung zu tun, darunter nur ein Fall verwenden, die Y als Argument übernimmt, dann alle möglichen 4-Bit-Kombinationen überprüft, und wandelt sie in Zweier-Komplement.

Z ist, was bestimmt, ob der Addierer Subtraktion oder Addition der Fall ist. Wenn es 0 ist, bedeutet dies, Subtraktion, und ich möchte y Zweier-Komplement konvertieren, dann nur regelmäßige Zugabe tun. Ich bin sicher, dass der Rest des Addierers richtig ist, ich weiß nur nicht, was mit dem Teil falsch ist, wo ich versuche zu konvertieren.

War es hilfreich?

Lösung

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

Ein paar wichtige Punkte.

  1. Legen Sie die if-Anweisung innerhalb der immer blockieren. Sie zwei nicht immer Blöcke verwenden, werden Sie eine Race Condition im Simulator erstellen.
  2. Ich habe eine neue Variable, Y_ weil Y verwendet, die eine Eingabe ist, denken Sie daran, auf der linken Seite einer Zuweisung wird wahrscheinlich Riegel schließen, oder etwas anderes böse tun, wenn Sie synthetisieren.
  3. Ich schlage vor, mit dem bitweise Inversion Operator ‚~‘ Y statt invertieren, wenn das ‚nicht‘ Primitive. Die Synthese-Tool verfügt über mehr Freiheit Code auf diese Weise zu optimieren.
  4. Überprüfen Sie für korrekte Ergebnisse, es eine Weile her, seit ich einen Addierer aufgebaut.

Andere Tipps

Sie verwenden einen Kleinbuchstaben "y" in "Y = nicht (y) + 4'b0001;"

Auch Sie verwenden mehr Zusätze als Sie benötigen. X-Y ist das Gleiche wie NOT (NOT (X) + Y).

legen Sie die if-Anweisung in einem Anfangsblock
http://www.asic-world.com/verilog/vbehave1.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top