无符号二进制加法
无符号二进制加法,需要保证两个相加的加数均为无符号数,如果有一个位有符号数,则均为有符号运算,结果为有符号数,即对于减法来讲,不存在无符号减法。
无符号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或者补最高位,就功能出问题了;
无符号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或者补最高位,就功能出问题了;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人