Come faccio a convertire un numero in complemento a due in verilog?
Domanda
Sto cercando di progettare un sottotipo di sommatore a 4 bit in verilog. Questa è solo la seconda cosa che abbia mai scritto in Verilog e non conosco ancora tutta la sintassi corretta. Questo è il modulo che ho finora:
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
Il mio compilatore (xilinx 10.1), continua a dire " Errore di sintassi vicino se. " Ho provato molti modi diversi di fare la conversione, incluso solo usando un caso che prende Y come argomento, quindi controlla tutte le possibili combinazioni a 4 bit e le converte in complemento a due.
Z è ciò che determina se l'adder fa sottrazione o aggiunta. Se è 0, significa sottrazione e voglio convertire y in complemento a due, quindi basta fare un'aggiunta regolare. Sono sicuro che il resto dell'adder sia corretto, semplicemente non so cosa c'è che non va nella parte in cui sto cercando di convertire.
Soluzione
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
Un paio di punti importanti.
- Inserisci l'istruzione if all'interno del blocco sempre. Non usare due blocchi sempre, creerai una condizione di competizione nel simulatore.
- Ho creato una nuova variabile, Y_ perché l'uso di Y, che è un input, ricorda, sul lato sinistro di un compito probabilmente inferirà i latch o farà qualcosa di brutto quando sintetizzi.
- Suggerisco di usare l'operatore di inversione bit per bit '~' per invertire Y se invece 'non' primitivo. Lo strumento di sintesi ha più libertà per ottimizzare il tuo codice in questo modo.
- Ricontrolla i risultati corretti, è passato un po 'di tempo da quando ho creato un sommatore.
Altri suggerimenti
Stai utilizzando una lettera minuscola " y " in " Y = not (y) + 4'b0001; "
Inoltre, stai utilizzando più aggiunte del necessario. X-Y è la stessa cosa di NOT (NOT (X) + Y).
inserisce l'istruzione if in un blocco iniziale
http://www.asic-world.com/verilog/vbehave1.html