Pergunta

Eu estou tentando projetar uma víbora subtracter em Verilog de 4 bits. Esta é apenas a segunda coisa que eu já escrito em Verilog, e eu não sei toda a sintaxe correta ainda. Este é o módulo que tenho até agora:

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

O meu compilador (Xilinx 10.1), continua dizendo "Erro de sintaxe próximo se." Eu tentei muitas maneiras diferentes de fazer a conversão, incluindo apenas usando um caso que leva Y como um argumento, em seguida, verifica todas as combinações de 4 bits possíveis, e os converte em complemento de dois.

Z é o que determina se o componente não subtração ou adição. Se for 0, isso significa subtração, e eu quero converter y para complemento de dois, em seguida, basta fazer disso regular. Tenho certeza que o resto da víbora está correto, eu só não sei o que está errado com a parte onde eu estou tentando converter.

Foi útil?

Solução

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

Um par de pontos importantes.

  1. Coloque a instrução if dentro do sempre bloquear. Não use dois sempre blocos, você vai criar uma condição de corrida no simulador.
  2. Eu criei uma nova variável, Y_ porque usar Y, que é uma entrada, lembre-se, no lado esquerdo de uma atribuição provavelmente inferir travas ou fazer outra coisa desagradável quando você sintetizar.
  3. Eu sugiro usar o operador bit a bit inversão '~' para inverter Y em vez se o 'não' primitivo. A ferramenta de síntese tem mais liberdade para otimizar o código desta forma.
  4. Verifique para resultados corretos, já faz algum tempo desde que eu construí uma víbora.

Outras dicas

Está usando uma minúscula "y" em "Y = não (y) + 4'b0001;"

Além disso, você está usando mais adições do que você precisa. X-Y é a mesma coisa que NOT (NÃO (X) + Y).

colocar a instrução if dentro de um bloco
inicial http://www.asic-world.com/verilog/vbehave1.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top