哎,作为一个xx貌似我只会盗用别人的code。这个还是“copy”真OO 无双大师的手笔写的
1 //date:2013/6/15 2 //designer :pengxiaoen 3 //function:signed number add 4 5 module signed_add ( 6 clock,reset, 7 p_i,n_i, 8 sum_o 9 ); 10 input clock,reset; 11 input [3:0] p_i; 12 input [2:0] n_i; 13 output[3:0] sum_o; 14 15 reg [4:0] sum_reg; 16 always @ (posedge clock or negedge reset) 17 if(!reset) 18 sum_reg <= 5'd0; 19 else 20 sum_reg <= {p_i[3],p_i} + {{2{n_i[2]}},n_i}; 21 22 assign sum_o = (~sum_reg[4] & sum_reg[3]) ? 4'b0111 : // + overflow 23 (sum_reg[4] & ~sum_reg[3]) ? 4'b1000 : // - overflow 24 sum_reg [3:0] ; 25 26 endmodule
这个code值得学习的 地方是这个overflow,大家知道在硬件中使用加法实现减法,除法和乘法。那么在signed运算时,这个时候不免要多留个心眼了。本code中给出了一个检测方法,
+overflow 表示 sum 超出了正上限
-overflow 表示 sum 超出了负下限