版權聲明:本文爲博主皮皮http://blog.csdn.net/pipisorry原創文章,未經博主允許不得轉載
補碼加法運算溢出判斷三種方法:
[方法一]
Xf、Yf分別兩個數的符號位,Zf爲運算結果符號位。
當Xf =Yf =0(兩數同爲正),而Zf=1(結果爲負)時,負溢出;
當出現Xf =Yf =1(兩數同爲負),而Zf=0(結果爲正),正溢出.
[方法二]
Cs表示符號位的進位,Cp表示最高數值位進位,⊕表示異或。
若 Cs⊕Cp =0 ,無溢出;
若 Cs⊕Cp =1 ,有溢出。
[方法三]
用變形補碼進行雙符號位運算(正數符爲00,負數符號以11)
若運算結果的符號位爲"01",則正溢;
若結果雙符號爲10,則負溢出;
若結果的雙符號位爲00或11,無溢出
自己寫了段小代碼如下:
reg signed [4 : 0] a = -5'd3;
reg signed [3 : 0] b = -4'd4;
reg signed [4 : 0] sum;
wire signed [5 : 0] sum_temp;
//tb
initial begin
a = -5'd14;
b = -4'd4;
#100;
a = -5'd15;
b = 4'd4;
#100;
a = 5'd15;
b = 4'd4;
#100;
a = -5'd2;
b = 4'd4;
#100;
a = 5'd3;
b = 4'd4;
#100;
a = -5'd5;
b = -4'd4;
end
assign sum_temp = a + b;
always @ (posedge clka )
begin
case(sum_temp[5:4])
2'b01: sum <= 5'd15; //正溢
2'b10: sum <= -5'd16; //負溢
2'b00,2'b11: sum <= {sum_temp[5],sum_temp[3:0]}; //無溢出
default: sum <= {sum_temp[5],sum_temp[3:0]};
endcase
end