加法运算是最基本的算术运算,常用的加法器有:级联加法器、并行加法器、超前进位加法器和流水线加法器。
1、 级联加法器
级联加法器是由1位全加器级联构成的,本级的进位输出作为下一级的 进位输入。优点是结构简单,缺点是n位级联加法运算的延时是1位全加器的n倍。
Moduleadd_jl(sum,cout,a,b,cin);
Input[7:0] a,b;
Inputcin;
Output[7:0]sum;
Outputcout;
Full_addu0(a[0],b[0],cin,sum[0],cin1);
Full_addu1(a[1],b[1],cin1,sum[1],cin2);
Full_addu2(a[2],b[2],cin2,sum[2],cin3);
……
Full_addu7(a[7],b[7],cin7,sum[7],cout);
Endmodule
2、 数据流描述的加法器
Verilog语言中的加法运算符可以直接描述加法器。
Moduleadder(cout,sum,a,b.cin);
Input[7:0] a,b;
Inputcin;
Outputcout;
Output[7:0]sum;
Assign{cout,sum} = a+b+cin;
Endmodule
但是,借助于EDA综合软件综合出来以后,会发现其实现的电路基本也是级联实现的。
3、 超前进位加法器
超前进位加法器不想写了,位数多了的话那公式感觉好复杂。
4、 流水线加法器
两级流水线8位加法器
Moduleadder8(cout,sum,a,b,cin,clk);
Input[7:0] a,b;
Inputcin,clk;
Outputreg[7:0] sum;
Outputreg cout;
Reg[3:0]temp_a,temp_b,first_s;
Regfirst_c;
Always@ (posedge clk)
Begin
{first_c,first_s}= a[3:0]+b[3:0]+cin;
Temp_a= a[7:4]; temp_b = b[7:4];
End
Always@(posedge clk)
Begin
{cout,sum[7:4]}= temp_a +temp_b +first_c;
Sum[3:0]= first_s;
End
上面电路通过增加寄存器来实现两级流水加法器。Verilog语言中的加法运算符经过EDA软件综合之后形成的加法电路基本上都是级联实现的。当加法位数过多时,延时会很大。上面电路第一个always语句块将低四位运算出来并把结果暂存在中间寄存器中,第二个always语句块从中间寄存器取中间结果进行高四位的运算。跟八位级联加法器相比,这样就把延时几乎降低了一半。