2016-10-15 103 views
0

這是我的代碼:當所述操作碼的第一個比特是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 

加法,否則通過二進制補碼執行減法。看着波形,兩種操作都能正確執行。然而,只有執行添加時才執行(Cout)。

例如,當試圖從1100_0110中減去0110_0011時。操作應該是1100_0110 + 1001_1101,這會導致溢出。波形仍顯示正確答案:0110_0011。但是Cout低不高。任何想法,爲什麼是這種情況?

編輯: 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