Wie kann ich eine Nummer Zweier-Komplement in Verilog-Format konvertieren?
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.
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.
- Legen Sie die if-Anweisung innerhalb der immer blockieren. Sie zwei nicht immer Blöcke verwenden, werden Sie eine Race Condition im Simulator erstellen.
- 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.
- 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.
- Ü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