2>如果 a+b 结果为负数(最高位为 1),那么结果错误,因为移
位运算新移入的位将用 0 来填补,此时负数将变为正数,显然错误。
所以综上,在进行有符号数运算的时候,最好像如下这样写:
reg signed [3:0] a;
reg signed [3:0] b;
reg signed [3:0] c;
always @(posedge clk)
c<=(a+b)/2;
这样就可以避免不必要的错误。
凌波微步心得:可以-->用补码,或扩展符号位。
//-----------------------------------------------
20input[3:0]i_a,i_b,i_c;
21inputi_mode;
22output[7:0]o_answer;
23
24wire[7:0]answer_unsigned,answer_signed;
25
26//forunsignedoperation
27assignanswer_unsigned=i_a*i_b+{4'h0,i_c};
28
29//forsingedoperation
30assignanswer_signed={{4{i_a[3]}},i_a}*{{4{i_b[3]}},i_b}+{{4{i_
c[3]}},i_c};
31
32assigno_answer=(i_mode==1'b0)?answer_unsigned:answer
_signed;
//------------------------------------------------------------------------------
39 行為 signed operation