FPGA设计_加法器

前言

在之前一篇介绍7系列FPGA底层资源的时候,我们提到过每一个slice当中有一个CARRY4,CARRY4本质上就是用来实现最基本的加、减法运算的,在了解CARRY4之前,我们需要对1bit以及多bit的二进制加法及其FPGA实现做一个了解。
1bit的二进制加法可以分为两类:无底层进位的半加器与有底层进位的全加器。减法运算本质上仍是一种加法运算,在二进制电路中采用加上负数的补码实现。

补充:各种门电路符号

图片来自:https://blog.csdn.net/qq_36001281/article/details/126831226
在这里插入图片描述

一、半加器

半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。
在这里插入图片描述

结果 S = A ^ B;
进位 C = AB;
VIVADO当中的RTL电路图:
在这里插入图片描述

二、全加器

全加器是在半加器的基础上的升级版,除了加数和被加数加和外还要加上前上一级传进来的进位信号。
在这里插入图片描述
结果 S= A ^ B ^ Cin;
进位 C = (A&B) | (Cin & (A^B) ;
在这里插入图片描述

三、串行进位加法器

多bit加法(以4bit为例)
有了单个bit的二进制加法电路(全加器)后,我们就可以通过级联来实现多bit的二进制加法了,但是多个全加器如何级联则是一个需要考虑的问题。
参考链接:https://cloud.tencent.com/developer/article/2097257
进行两个4bit的二进制数相加,就要用到4个全加器。那么在进行加法运算时,首先准备好的是1号全加器的3个input。而2、3、4号全加器的Cin全部来自前一个全加器的Cout,只有等到1号全加器运算完毕,2、3、4号全加器才能依次进行进位运算,最终得到结果。 这样进位输出,像波浪一样,依次从低位到高位传递, 最终产生结果的加法器,也因此得名为行波进位加法器(Ripple-Carry Adder,RCA)。

在这里插入图片描述
RCA的优点是电路布局简单,设计方便, 我们只要设计好了全加器,连接起来就构成了多位的加法器。 但是缺点也很明显,也就是高位的运算必须等待低位的运算完成, 这样造成了整个加法器的延迟时间很长。要对一个电路的性能进行分析,我们就要找出其中的最长路径。 也就是找出所有的从输入到输出的电路连接中,经过的门数最多的那一条,也称为关键路径。
在这里插入图片描述
从第一个全加器的A-S这条通路来看,产生第一个S输出,需要通过两个门的延迟。 所以它显然不是最长的路径,当然,从A出发或着从B出发都是一样的, 所以对于第一个全加器,它的最长路径,是红色线标记的那条,后面的全加器关键路径同理可得。那么,假设经过一个门电路的延迟时间为T,那么经过4个全加器所需要的总延迟时间就是:2T x 4 + T(第一个全加器产生3个T) = 9T。所以推出,经过n个全加器所产生的总延迟时间为2T x n + T = (2n+1)T。
对于一个32bit的RCA,有总延迟时间:(2n+1)T =(2×32+1)×T =65T,这是什么概念呢?举个例子,iPhone 5s的A7 SoC处理器采用28nm制造工艺,主频1.3GHz(0.66ns)。按照这个工艺水平,门延迟T设为0.02ns,那么32-bit RCA的延迟时间为1.3ns ,时钟频率为769MHz,远超A7处理器的主频延迟时间,更别说这个32bit的RCA只是一个加法运算器,更更别说,我们在计算过程中只考虑了门延迟,还有线延迟等各种延迟没有加入计算……

3.1、verilog代码设计

4bit行波进位加法器

module RCA_4(
	input		[3:0]       A_in  ,
	input	    [3:0]		B_in  ,
    input                   C_1   ,
 
 	output	 wire			CO    ,
	output   wire [3:0]	    S
);
//RCA
wire  [3+1 :0] C;
assign C[0] = C_1;
assign CO	= C[3+1];

genvar i;
generate
for(i = 0; i < 4; i = i + 1)begin
 		full_adder full_adder_u(
 			.a	(A_in[i]),
 			.b	(B_in[i]),
 			.ci	(C[i]),
 			.s	(S[i]),
 			.co	(C[i+1])
 		);
 	end
endgenerate

endmodule

//1bit全加器是行波进位加法器的基础
module full_adder(
	input	a,
	input	b,
	input 	ci,//进位输入
	output 	s,
	output 	co//进位输出
);

assign s = a ^ b ^ ci;
assign co = a & b | (ci & (a^b));

endmodule

四、超前进位加法器

对于RCA,上一位的进位输出需要作为下一位的进位输入,因此,随着加法器位宽的增大,加法器的延时也会线性增大,究其原因,就是下一个比特位对上一个比特位的依赖造成的,超前进位加法器就是解决了这个问题,而实现低延时的效果。那我们的优化思路就是‘能否提前计算出“进位输出信号”
首先根据进位 Ci= (A&B) | (Ci-1 & (A^B) ;我们可以知道该了第i+1位的进位输出和第i位的进位输出之间的关系,如果我们用Ci-1代替上式中的Ci,则可以得到Ci+1和Ci-1之间的关系,进一步将Ci-1用Ci-2表示,一直迭代到C0,即Cin,我们发现,此时进位输出不再依赖于前面任何一级加法器的结果,因此也就达到了我们要的效果。
图片来源:https://cloud.tencent.com/developer/article/2097257
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.1、verilog代码设计

module lca_4(
	input		[3:0]       A_in  ,
	input	    [3:0]		B_in  ,
    input                   C_1   ,
 
 	output	 wire			CO    ,
	output   wire [3:0]	    S
);

//LCA
wire [3 :0] G;
wire [3 :0] P;
wire  [3+1 :0] C;

assign C[0] = C_1;
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 CO = C[4];

genvar i;
for( i=0; i<4; i=i+1) begin
    pg_gen u_pg_gen(
        .A( A_in[i]),
        .B( B_in[i]),
        .G( G[i]  ),
        .P( P[i]  )
    );
end

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

endmodule
//生成信号G与传播信号P生成模块
module pg_gen(
    input A,
    input B,
    output G,
    output P
);
    assign G = A & B;
    assign P = A ^ B;
endmodule

五、进位链CARRY4

Xilinx 7系列FPGA底层的加法器(进位链)CARRY4是一种超前进位的加法器(U+系列为CARRY8),但是为了面积与普适性其实现原理与上述的CLA电路还是有一点区别。每个SLICE中都有1个(每个CLB则有2个)CARRY4用来实现进位逻辑,不同的进位链可级联以形成更宽的加/减逻辑:
在这里插入图片描述

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FPGA(Field-Programmable Gate Array)是一种可编程逻辑器件,可以用于实现各种不同的逻辑电路。有符号加法器是其中一种用于实现加法运算的电路。 在计算机中,有符号加法器被用来对带符号数进行加法操作。有符号数在二进制表示中的最高位被用作符号位,0表示正数,1表示负数。有符号加法器可以实现对带符号数进行相加,并考虑了进位和溢出的情况。 FPGA中的有符号加法器可以通过组合逻辑电路的方式来实现。首先,需要将输入的带符号数进行位扩展,即将符号位复制到更高位,以便在加法运算中保持符号一致。接下来,使用全加器或组合电路来实现位级的加法运算。最后,检查最高位的进位和溢出情况,通过输出信号来表示运算结果。 有符号加法器的实现需要考虑到多个方面,如进位的传递、符号位的处理和溢出的检测等。因此,设计一个有效和高性能的有符号加法器是一项具有挑战性的任务。FPGA作为可编程器件,可以根据需求灵活地配置有符号加法器的结构和功能,以满足不同应用的要求。 有符号加法器在很多领域中都有广泛的应用,如数字信号处理、图像处理、通信系统等。通过在FPGA中实现有符号加法器,可以提供高度定制化的加法运算能力,满足不同应用对于处理速度、精度和功耗等方面的要求。同时,FPGA的可编程性还使得有符号加法器的功能可以根据需求进行灵活调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺子学不会FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值