补码加法运算溢出判断三种方法:
一、符号位判断
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,则负溢出。
补码加法运算溢出处理
以变形补码的方案为例,代码如下:
always @ (* )
begincase(dout[DATA_WIDTH-1:DATA_WIDTH-2])2'b01: dout <= {1'b0,{(DATA_WIDTH-1){1'b1}}}; //正溢2'b10: dout <= {1'b1,{(DATA_WIDTH-1){1'b0}}}; //负溢2'b00,2'b11: dout <= {dout[DATA_WIDTH-1],dout[DATA_WIDTH-3:0]}; //无溢出default: sum <= {dout[DATA_WIDTH-1],dout[DATA_WIDTH-3:0]};endcase
end