
加法作为一种基本运算,大量运用在数字信号处理和数字通信的各种算法中。由于加法器使用频繁,因此其速度往往影响着整个系统的运行速度。如果可以实现快速加法器的设计,则可以提高整个系统的处理速度。
加法运算是最基本的算数运算,在多数情况下,无论是乘法、除法还是减法以及FFT等运算,最终都可以分解为加法运算来实现,因此对加法运算的实现进行一些研究是非常必要的。实现加法运算有如下一些方法:
(1) 级连加法器;
(2) 并行加法器;
(3) 超前进位加法器;
(4) 流水线加法器。
1、级连加法器
级连加法器是由1位全加器级连构成的,本位的进位输出作为下一级的进位输入。级连加法器的结构简单,但N位级连加法运算的延时是1为全加器的N倍,延时主要是由于进位信号级连造成的。在需要高性能的设计中,这种结构不宜采用。
moduleadd_jl(sum,cout,a,b,cin);
output [3:0] sum;
outputcout;
input [3:0] ina,inb;
input cin;
wire [3:1] c;
full_add1 f0 (ina[0],inb[0],cin, sum[0],c[1]); //级连描述
full_add1 f1 (ina[1],inb[1],c[1],sum[1],c[2]);
full_add1 f2 (ina[2],inb[2],c[2],sum[2],c[3]);
full_add1 f3 (ina[3],inb[3],c[3],sum[3],cout);
module full_add1(ina,inb,cin,sum,cout); //1位全加器
inputina,inb,cin;
outputsum,cout;
wire s1,m1,m2,m3;
and (m1,ina,inb),
(m2,inb,cin),
(m3,ina,cin);
xor (s1,a,b),
(sum,s1,cin);
or (cout,m1,m2,m3);
endmodule
2、并行加法器
并行加法器可采用Verilog语言的加法运算符直接描述,或称为数据流描述方式,实现容易,其运算速度快,但耗费资源多,尤其是当加法运算的位数较宽时,其耗用资源将会大大增加。
moduleadd_bx(cout,sum,a,b,cin);
output [7:0] sum;
outputcout;
input [3:0] a,b;
input cin;
assign {cout,sum}=a+b+cin;
endmodule
3、超前进位加法器
级连加法器的延时主要是由于进位的延时造成的,因此要加快加法器的运算速度,就必须减小进位延迟,超前进位链能有效地减少进位的延迟。
这里以4位超前进位链的推导为例介绍超前进位的概率。
首先对于1位全加器,其本位值与进位输出可表示如下:
sum=a⊕b⊕cin
cout=(a·b)+(a·cin)+(b·cin)=ab+(a+b)cin
从上面式子可以看出:如果a和b都为1,则进位输出为1;如a和b有一个为1,则进位输出等cin.
另G=ab,P=a+b,则有:
cout=ab+(a+b)cin=G+P·cin
由此可以得出用G和P来写出4位超前进位链如下(设定4位被加数和加数位A和B,进位输入为Cin,进位输出为Cout,进位产生Gi=AiBi,进位传输Pi=Ai+Bi):
C0=Cin
C1=G0+P0C0=G0+P0Cin
C2=G1+P1C1=G1+P1(G0+P0Cin)=G1+P1G0+P1P0Cin
C3=G2+P2C2=G2+P2(G1+P1C1)=G2+P2G1+P2P1G0+P2P1P0Cin
C4=G3+P3C3=G3+P3(G2+P2C2)=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0Cin
Cout=C4
由上面的超前进位链可以看出:各个进位彼此产生,将进位级连传播给去掉了,因此,减少了进位产生的延迟时间。
同样,可推导出下面的式子:
sum=A⊕B⊕Cin=(AB)⊕(A+B)⊕Cin=G⊕P⊕Cin
4、流水线加法器
以上实现的加法器虽然尽量减少了延时,但还是不可避免地有多级门延时和布线延时,随着位数的增加,延迟还会增加。为了设计更快的加法器,可以采用流水线设计技术(Pipeline),以提高系统的运行频率。其基本设计思想是在逻辑电路中插入若干寄存器来暂存中间结果,虽然多了一些寄存器资源,但减少了每一级组合的延时,因为可以提高整个加法器的运行频率,是用于提高所设计系统运行速度的一种有效方法。
流水线操作的概念以下图来说明,在图中,假设某个复杂逻辑功能的实现需要较长时间,我们可以将其分解为几个步聚来实现,每一步延时变为原来的1/3,并在各步之间加入寄存器,以暂存中间结果,这样的话,整个系统的最高工作频率得到很大的提高。
FPGA中关于乘法器的设计 更新于2010-10-27 00:39:16 文章出处:blog
FPGA 乘法器
乘法算是基本运算之一,广泛应用在数字信号处理中,滤波器中乘法运算必不可少,实现乘法器的方法很多,各有各的优缺点,常见的有移位相加法,加法树法,查表法,混合法……
在我们用语言设计电路时,初学时在实现乘法运算时通常很简单的用*号操作,但是这种方法谈不上设计乘法器,其最终的硬件实现要根据综合器综合的结果,好的综合器可以综合出想要的结果,但是实际上这种粗放的设计通常得到的都是劣等的乘法运算,无法满足对乘法速率的要求,在滤波电路中要求数据串行进入接着进行大量的乘法运算,当所设计的乘法器其的速度小于数据进入的速度的时候就会导致结果错……
1,以为相加乘法器其,对两个二进制数进行相乘运算,运用列式求法我们可以得知,乘法最终就是由加法和移位运算构成的,由此可以用高速度的加法和移位实现乘法操作,具体代码如下:
begin
dout=0;
for(i=0;i 2,上面的设计中,由于产生了大量的组合逻辑,这就带来了大量的延迟从而使乘法器的速率受到,为了提高速度,可以采用流水线的方法,将组合逻辑分割成一个一个小的组合逻辑,中间加上触发器用来锁存数据,这样就可以大大提高频率,引入触发器仅仅是带来了延迟而已,具体代码实现如下 begin//流水线实现 din_a_buf<=din_a; din_b_buf<=din_b; buf0<=din_b_buf[0]?din_a_buf:0; buf1<=din_b_buf[1]?din_a_buf<<1:0; buf2<=din_b_buf[2]?din_a_buf<<2:0; buf3<=din_b_buf[3]?din_a_buf<<3:0; buf4<=din_b_buf[4]?din_a_buf<<4:0; buf5<=din_b_buf[5]?din_a_buf<<5:0; buf6<=din_b_buf[6]?din_a_buf<<6:0; buf7<=din_b_buf[7]?din_a_buf<<7:0; buf01<=buf0+buf1; buf23<=buf2+buf3; buf45<=buf4+buf5; buf67<=buf6+buf7; buf02<=buf01+buf23; buf46<=buf45+buf67; dout<=buf02+buf46; end 此种乘法器叫做加法树式乘法器,此方法被广泛使用…… 3,查表法,就是建一个表,里面存放了所有的乘法结果,乘数和被乘数用来作为地址去里面的乘积,此种方法可以大大提高乘法的速率,但是当乘法位数很大时会要求产生很大的表格,所以此种方法适合位数较小的乘法,特别适合有一个乘数为固定的乘法,如滤波器中的乘法就可以采用此种方法设计…… 4,混合,顾名思义就是结合以上各种方法的乘法器……
