Como faço para converter um número em complemento de dois em Verilog?
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.
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.
- 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.
- 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.
- 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.
- 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