超前进位加法器

本文最后更新于:Wednesday, September 30th 2020, 8:02 pm

1、1bit全加器

mark

2、4bit行波加法器

mark

可以看到要得到最后的进位要经过9个门的延时。

3、4bit超前进位加法器

判断进位的步骤:

  1. 如果 $g_i$=1 (其他不用看肯定会进位)
  2. 如果 $g_i$=0;看传输信号$p_i$。
  3. 如果 $p_i$=0; 那不用看,已经否决了进位
  4. 如果 $p_i$=1; 那么用同样的方法看下一位是否有进位

判断结果的步骤: 只需把传输信号与进位信号异或。

mark

化简得到:

👇下面是经过综合器优化门个数后的图。可以明显看到虽然门个数减少但是延时变长。

mark

4、超前进位加法器级联

pp: 代表相加结果为1111的时候。那么低一级要是有进位,传到我这一级,会产生想上一级的进位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Author: Wan Li
// time: 2020-04-28
// function: 把4个超前进位组成16位的
// ---------------------------------------------------

/* `include "adder4.v" */

module adder_16(a, b, c_in, sum, c_out);
input[15:0] a, b;
input c_in;
output[15:0] sum;
output c_out;

wire[3:0] p, g, c;

assign c[0] = c_in;
add4_head add1(.a(a[3:0]), .b(b[3:0]), .ci(c[0]), .s(sum[3:0]), .pp(p[0]), .gg(g[0]));
assign c[1] = g[0] | (p[0] & c[0]);
add4_head add2(.a(a[7:4]), .b(b[7:4]), .ci(c[1]), .s(sum[7:4]), .pp(p[1]), .gg(g[1]));
assign c[2] = g[1] | (p[1] & c[1]);
add4_head add3(.a(a[11:8]), .b(b[11:8]), .ci(c[2]), .s(sum[11:8]), .pp(p[2]), .gg(g[2]));
assign c[3] = g[2] | (p[2] & c[2]);
add4_head add4(.a(a[15:12]), .b(b[15:12]), .ci(c[3]), .s(sum[15:12]), .pp(p[3]), .gg(g[3]));
assign c_out = g[3] | (p[3] & c[3]);

endmodule

mark


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!