1. 程式人生 > >有符號數加減法

有符號數加減法

題目:設計一個有符號32位加減法器,輸入opa、opb,控制訊號sub為1時,result=opa-opb,sub為0時,result=opa+opb.輸出nzcv是符號位,result為負時n=1,result為0時z=1,c是加減法器的carry,v是overflow。

分析:對於有符號數,用二進位制補碼的方式表示。對於有符號數的加法,當產生進位時即溢位,對於有符號減法,有借位時結果為負。因此carry無意義。故題目中的carry,在加法器中表示溢位,在減法器中表示結果為負。

程式碼如下:

module adder_sub(opa,opb,sub,result,n,z,c,v);

input [3:0]opa,opb; input sub; output[3:0]result; output n,z, c,v;

wire [3:0]result_s,result_a; wire [4:0]aab,asb; wire [4:0]a={opa[3],opa}; wire [4:0]b={opb[3],opb};

assign aab=a+b; assign asb=a-b;

assign result_a={aab[4],aab[2:0]}; assign result_s={asb[4],asb[2:0]};

assign result=(sub)? result_s:result_a; assign n=result_sim[3]; assign z=(result_sim==0)? 1:0; assign c=0; assign v=(sub)? asb[4]^ asb[3]: aab[4]^ aab[3];