行波进位加法器和超前进位加法器比较

1.行波进位加法器

行波进位加法器就是将全加器串联起来,将低位的进位输出作为高位的进位输入。

由全加器公式可知:

S = A ⊕ B ⊕ C i n C o u t = A B + B C i n + A C i n S=A\oplus B\oplus C_{in}\\ C_{out}= AB+BC_{in}+AC_{in} S=ABCinCout=AB+BCin+ACin

我们可以发现,单级的全加器产生和(将Cin视作已知量)需要1个三输入异或门,即1级电路;产生进位需要两级门电路,即AB/BCIN/ACIN之间的与门以及三项之间的或门。如果将全加器串联起来,后级全加器的进位输入需要前级全加器计算出进位之后才能进行计算,因此串联的全加器越多,其产生进位以及和的链路越长,延迟越大

4bit行波进位加法器verilog如下:

module twave_carry #(
    parameter width = 4
)(
    input  [width-1:0] A,
    input  [width-1:0] B,
    output [width-1:0] S,
    
    input  C_i,
    output C_o
);
    wire [width:0] C;
    genvar i;
    generate
        for (i=0; i<width; i=i+1)begin
            full_adder myadder(
                .A    (A[i]),
                .B    (B[i]),
                .C_i  (C[i]),
                .S    (S[i]),
                .C_o  (C[i+1])
            );
        end
    endgenerate
    assign C[0] = C_i;
    assign C_o  = C[width];
endmodule



module full_adder(
    input  A,
    input  B,
    input  C_i,
    output S,
    output C_o
);
    assign S    = A ^ B ^ C_i;
    assign C_o  = A & B | C_i&(A^B);
endmodule


其RTL电路如下图:

在这里插入图片描述

将myadder展开:

在这里插入图片描述

2.超前进位加法器

超前进位加法器的本质就是并行计算各个进位,无需通过进位传递计算,缩短关键路径

我们定义生成项G和传输项P:

{ P k = A k ⊕ B k , k = 0 , … , N − 1 G k = A k B k k = 0 , … , N − 1 \left\{\begin{array}{ll}P_{k}=A_{k} \oplus B_{k}, & \mathrm{k}=0, \ldots, \mathrm{N}-1 \\ G_{k}=A_{k} B_{k} & \mathrm{k}=0, \ldots, \mathrm{N}-1\end{array}\right. {Pk=AkBk,Gk=AkBkk=0,,N1k=0,,N1

则和与进位对应的关系表达式为:

{ S k = P k ⊕ C k , k = 1 , … , N C k = G k − 1 + C k − 1 P k − 1 k = 1 , … , N C N = C out  C 0 = C in  \left\{\begin{array}{ll}S_{k}=P_{k} \oplus C_{k}, & \mathrm{k}=1, \ldots, \mathrm{N} \\ C_{k}=G_{k-1}+C_{k-1} P_{k-1} & \mathrm{k}=1, \ldots, \mathrm{N} \\ C_{N}=C_{\text {out }} & \\ C_{0}=C_{\text {in }} & \end{array}\right. Sk=PkCk,Ck=Gk1+Ck1Pk1CN=Cout C0=Cin k=1,,Nk=1,,N

我们将各个进位展开:

{ C 1 = G 0 + C 0 P 0 C 2 = G 1 + C 1 P 1 = G 1 + G 0 P 1 + C 0 P 1 P 0 C 3 = G 2 + C 2 P 2 = G 2 + G 1 P 2 + G 0 P 2 P 1 + C 0 P 2 P 1 P 0 C 4 = G 3 + C 3 P 3 = G 3 + G 2 P 3 + G 1 P 3 P 2 + G 0 P 3 P 2 P 1 + C 0 P 3 P 2 P 1 P 0 \left\{\begin{array}{l}C_{1}=G_{0}+C_{0} P_{0} \\ C_{2}=G_{1}+C_{1} P_{1}=G_{1}+G_{0} P_{1}+C_{0} P_{1} P_{0} \\ C_{3}=G_{2}+C_{2} P_{2}=G_{2}+G_{1} P_{2}+G_{0} P_{2} P_{1}+C_{0} P_{2} P_{1} P_{0} \\ C_{4}=G_{3}+C_{3} P_{3}=G_{3}+G_{2} P_{3}+G_{1} P_{3} P_{2}+G_{0} P_{3} P_{2} P_{1}+C_{0} P_{3} P_{2} P_{1} P_{0}\end{array}\right. C1=G0+C0P0C2=G1+C1P1=G1+G0P1+C0P1P0C3=G2+C2P2=G2+G1P2+G0P2P1+C0P2P1P0C4=G3+C3P3=G3+G2P3+G1P3P2+G0P3P2P1+C0P3P2P1P0

在上述公式中,以C4举例,比如对于G0P3P2P1这一项,G0、P3、P2、P1四个是并行结构,并且他们四个都是只有一级门电路(与门/或门),因此对于C4来说其一共有三级门电路,从低层次往高层次看分别是G或P中的与门/或门、G与P的相与(与门)、各项(G3、G2P3、…、G0P3P2P1P0)的或门。其结构如下:

在这里插入图片描述

S k = P k ⊕ C k S_{k}=P_{k} \oplus C_{k} Sk=PkCk

则产生和的门电路级数比Ck的门电路多一级(Pk和Ck的异或门,Pk自己内部的异或门和Ck内部的三级门电路视作是并行结构),即4级

无论加法器位宽是多少,其产生和的级数均为4级,产生进位的级数均为3级。

其verilog如下:

module carry_ahead #( width=4 ) (
    input  [width-1:0] op1,
    input  [width-1:0] op2,
    input  C_i,
    output [width-1:0] S,
    output C_o
);
    wire [width-1:0] G;
    wire [width-1:0] P;
    wire [width:0] C;

    genvar i;
    for( i=0; i<width; i=i+1) begin
        pg_gen u_pg_gen(
            .A( op1[i]),
            .B( op2[i]),
            .G( G[i]  ),
            .P( P[i]  )
        );
    end

    assign C[0] = C_i;
    assign C[1] = G[0] || ( C[0] & P[0] );
    assign C[2] = G[1] || ( (G[0] || ( C[0] & P[0]) ) & P[1] );
    assign C[3] = G[2] || ( (G[1] || ( (G[0] || (C[0] & P[0]) ) & P[1])) & P[2] );
    assign C[4] = G[3] || ( (G[2] || ( (G[1] || ( (G[0] || (C[0] & P[0]) ) & P[1])) & P[2] )) & P[3]);
    assign C_o = C[width-1];

    genvar k;
    for( k=0; k<width; k=k+1) begin
        assign S[k] = P[k] ^ C[k];
    end
endmodule



module pg_gen(
    input A,
    input B,
    output G,
    output P
);
  assign G = A & B;
  assign P = A ^ B;
endmodule

RTL电路结果如下图:

在这里插入图片描述

在这里插入图片描述

### 行波进位加法器的设计方法与Vivado FPGA实现 尽管现代FPGA综合工具已经相当智能化,通常建议直接利用这些工具自动生成加法器或采用预构建的IP核来完成加法操作[^1]。然而,了解如何手动设计行波进位加法器(Ripple Carry Adder, RCA),对于深入理解数字逻辑设计仍然具有重要意义。 #### 1. 基础概念回顾 行波进位加法器是一种基于二进制数相加原理工作的电路单元集合。它通过一系列全加器(Full Adders)串联而成,其中每一位的结果不仅取决于当前输入位还依赖于来自低位产生的进位信号。这种结构虽然简单易懂,但由于较长的进位传播路径限制了整体运算速度,在高性能应用场景下表现不佳[^3]。 #### 2. 使用Verilog描述RCA模块 为了在Vivado环境中创建一个简单的4位行波进位加法器模型,可以按照如下方式编写Verilog代码: ```verilog module ripple_carry_adder_4bit( input wire [3:0] a, input wire [3:0] b, input wire cin, output reg [3:0] sum, output reg cout); always @(*) begin {cout,sum} = a + b + cin; end endmodule ``` 这段程序定义了一个名为`ripple_carry_adder_4bit`的功能模块,接受两个四位宽的数据输入ab以及一位初始进位cin作为参数;计算完成后输出相应的求结果sum及最终进位标志cout。 #### 3. 创建并配置Vivado项目 启动Xilinx Vivado IDE之后新建工程文件夹,并指定目标器件型号。接着导入上述编写的RTL源码至工程项目内,设置好顶层实体名称后即可运行合成(Synthesis)过程验证语法正确性初步功能仿真测试。 #### 4. 进一步优化考虑 值得注意的是,考虑到实际硬件资源利用率与时序收敛等因素的影响,在真实产品开发过程中很少会单独使用此类低效架构进行算术处理。因此当面对更复杂的需求时应当优先选用更高效率的算法方案或是调用官方提供的高效能库函数/组件来进行替代[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值