1. 补码简介
补码只不过是用来表示带符号数而已.补码的原则是:
正数的补码是其本身,也就是原码.
负数的补码是各位取反后加1.也就是其反码加1.
eg1:
+0 :0_000_0000
-0 :反码:1_111_1111,加1后溢出了,仍然为:0_000_0000;
所以正负0的补码表示是一样的。
eg2:
+1 :0_000_0001 ;
-1 :1_111_1111 ;
eg3:
+4 :0_000_0100 ;
-4 :1_000_1001 ;
2. verilog实现补码加法
实现功能:diff + ipred ,并且clip;
其中 diff 可正可负,ipred为正数。
function [PIX_WIDTH-1:0] complty_adder
input [PIX_WIDTH-1:0] diff;
input [PIX_WIDTH-1:0] ipred;
input sign;
reg [PIX_WIDTH :0] complty_of_diff;//最高位用来做符号位
reg [PIX_WIDTH+1:0] sum; //加之后可能会进位
complty_of_diff = sign ? {1'b1,~diff} + 1'b1 : {1'b0,diff};
complty_adder[PIX_WIDTH-1:0] = complty_of_diff[PIX_WIDTH+1] ? {PIX_WIDTH{1'b0}} : complty_of_diff[PIX_WIDTH] ? {PIX_WIDTH{1'b1}} : complty_of_diff[PIX_WIDTH-1:0];
endfunction