无符号二进制加法

无符号二进制加法,需要保证两个相加的加数均为无符号数,如果有一个位有符号数,则均为有符号运算,结果为有符号数,即对于减法来讲,不存在无符号减法。
    无符号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或者补最高位,就功能出问题了;
posted @ 2023-03-04 17:14  大块头  阅读(218)  评论(0编辑  收藏  举报