verilog加法溢出判斷(附代碼)

版權聲明:本文爲博主皮皮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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章