2016-10-15 9 views
0

Вот мой код:Почему Cout только учитываются в процессе добавления и не вычитание в моем сумматоре/вычитателе (Verilog)

module Adder_8b_df (A, B, opcode, S, Cout); 
input [7:0] A, B; 
input [3:0] opcode; 
output [7:0] S; 
output Cout; 

wire [8:0] tmp; 

    assign tmp = (opcode[0] == 0) ? (A + B) : (A + (~B + 8'b1)); 
    assign S = tmp [7:0]; 
    assign Cout = tmp [8]; 

endmodule 

Сложения выполняется, когда первые бит опкод является 0, в противном случае вычитание через два дополнения. Рассматривая форму волны, обе операции выполняются правильно. Однако, когда выполняется добавление, выполняется только выполнение (Cout).

Например, при попытке вычесть 0110_0011 с 1100_0110. Операция должна быть 1100_0110 + 1001_1101, что приводит к переполнению. Форма сигнала покажет правильный ответ: 0110_0011. Но Cout невысока. Есть идеи, почему это так?

Edit: Waveform shot

ответ

0

Я думаю, что это происходит потому, что «~ B» будет увеличен до 9 бит (например, TMP), а затем она переполняется битой 10, которые вы не имеете.

0

Это, кажется, решить эту проблему:

module Adder_8b_df (A, B, opcode, S, Cout); 
input [7:0] A, B; 
input [3:0] opcode; 
output [7:0] S; 
output Cout; 

wire [8:0] tmp; 
wire [8:0] twos_comp; 

    assign twos_comp = (opcode[0] == 1) ? (~B + 8'b1) : 0; 
    assign tmp = (opcode[0] == 0) ? (A + B) : (A + (twos_comp [7:0])); 
    assign S = tmp [7:0]; 
    or(Cout, twos_comp[8], tmp[8]); 

endmodule