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.

È stato utile?

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.

  1. Inserisci l'istruzione if all'interno del blocco sempre. Non usare due blocchi sempre, creerai una condizione di competizione nel simulatore.
  2. 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.
  3. 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.
  4. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top