verilog中的加法

这两天调一个项目的时候涉及到了符号数的加法和限幅,调了好久才发现这里面的坑。。瞬间觉得自己基础有待提高啊

符号数的加法

用补码来表示符号数,对两个符号数相加可以直接加法赋值,如下列代码,这是由补码的特性决定的,非常方便。

1
2
3
4
5
wire [31:0] sig_1;
wire [31:0] sig_2;
wire [31:0] add_ans;
assign add_ans = sig_1 + sig_2;

加法溢出的处理

然而固定位数的加法会出现溢出的问题,要为结果考虑进位,因此为结果多添加一位。此时一定要注意!

符号数加法要进行符号位扩展!!

当时没有注意到这个,死活不知道为什么结果的进位消失了…示例代码

1
2
3
4
5
wire [31:0] sig_1;
wire [31:0] sig_2;
wire [32:0] add_ans;
assign add_ans = {sig_1[31], sig_1} + {sig_2[31], sig_2};

加法溢出限幅处理

如果加法结果溢出了,但是要传至的信号位数是固定的,那么就需要限幅。

相对来说这个也很简单,这里占个坑,以后有需要再来填。