FPGA组合逻辑设计技巧分享3

N 位二进制数相加需要位宽扩展

两个 N 位二进制数相加,为防止溢出,应将和设置为 N+1 位。

1、无符号数相加

对于无符号 N 位二进制数,最大值为2^N - 1,两个无符号 N 位二进制数的最大和为2*(2^N - 1) = 2^(N+1) - 2,这个值需要 N+1 位二进制数来表示。

例如,8 位无符号数的最大值为 255,255+255=510,510 的二进制表示为111111110,需要 9 位(N+1=9)来表示。

如果不扩展位宽,相加结果会发生溢出,导致结果错误,例如 8 位无符号数 255+255=510,若用 8 位表示则会溢出为11111110(即 254),计算结果错误。

// 8位无符号数相加,结果设置为9位
wire [7:0] a, b;
wire [8:0] sum;
assign sum = {1'b0, a} + {1'b0, b};

2、有符号数相加

对于有符号 N 位二进制数(补码表示),最大值为2^(N-1) - 1,最小值为-2^(N-1),两个有符号 N 位二进制数的最大和为2*(2^(N-1) - 1) = 2^N - 2,最小和为2*(-2^(N-1)) = -2^N,这两个值都需要 N+1 位来表示,避免溢出。

// 8位有符号数相加,结果设置为9位
wire [7:0] a, b;
wire [8:0] sum;
assign sum = {a[7], a} + {b[7], b};

文章来源:FPGA入门到精通