无符号二进制加法,需要保证两个相加的加数均为无符号数,如果有一个位有符号数,则均为有符号运算,结果为有符号数,即对于减法来讲,不存在无符号减法。
无符号A+无符号B = 无符号C
无符号A+有符号B = 有符号C
有符号A+有符号B = 有符号C
有符号A+有符号B = 有符号C
二进制加法,动态范围会增加,精度保持不变,因此加法的结果需要扩一位,用于存放进位。
1011.1000 =》 8位
+ 0101.1101 =》 8位
------------------
10001.0101 =》 9位
无符号加法Verilog 编码实现
localparam A_WIDTH = 16;
localparam B_WIDTH = 8;
// Sumation result width should be 1 bit more than biggest widht of adder factor
localparam C_WIDTH = if (A_WIDTH > B_WIDTH) ? A_WIDTH + 1'b1 : B_WIDTH + 1'b1;
reg [A_WIDTH-1 : 0] a;
reg [B_WIDTH-1 : 0] b;
reg [C_WIDTH-1 : 0] c;
always @(*) begin
c = {1'b0,a} + {1'b0,{A_WIDTH-B_WIDTH{1'b0}},b};
end
无符号加法编码要点:
1. 和c需要定位位宽比加数最大位宽大1位;
2. 加数a和b需要扩展位宽,扩展到与c位宽相等,且扩展位补0,否则有很多语法检查工具会报位宽不匹配错误,同时不同工具理解不一致,如果自动补1或者补最高位,就功能出问题了;