verilog 实现加法器

verilog 实现加法器
(1)半加器的实现
原理:半加器是由两个一位输入实现的,与全加器的区别是不带进位加,相对比较简单,其逻辑关系为:
 进位输出:Ci+1=Ai*Bi
 和输出:Si = Ai^Bi
      其中*为与逻辑,^为异或逻辑。verilog 实现:
module half_adder(a,b,sum,cout);
input  a;
input b;

output sum;
output cout;

 assign sum = a^b;assign cout = a&b;endmodule
(2)全加器
     原理:相对与半加器带进位运算,相应的逻辑关系都是通过真值表简化得到的。
进位输出:Ci+1= AiBi+AiCi+BiCi=AiBi+(Ai+Bi)Ci
和输出:Si=Ai^Bi^Ci
以下代码是用两个半加器和一个或门写成的。
module full_adder(a,b,co,sum,cout);
input a;
input b;
input co;

output sum;
output cout;

wire sum1;
wire cout1,cout2;

half_adder  half_adder1(.a(a),.b(b),.sum(sum1),.cout(cout1));
half_adder  half_adder2(.a(co),.b(sum1),.sum(sum),.cout(cout2));
assign cout =  cout1|cout2;
endmodule


(3)行波进位加法器(CPA)
它是将全加器串接起来的,并将前一个全加器的进位输出作为下一级全加器的输入。
(4)进位旁路加法器
先定义两个加法器中经常用到的变量Gi、Pi,作为生成(generate)和 传递(propagate)函数
     Gi =  AiBi  ;Pi=Ai+Bi;根据G0、P0和C0来展开C1 = A0B0+C0(A0+B0)=G0+C0P0;
C2 =  A1B1+C1(A1+B1)=G1+C1P1;
C3= G2+C2P2;
C4= G3+C3P3;等等。
当P0=P1=P2=P3=1时,Ai、Bi中一个为1,一个为0.因此G都为零。所以C4=C0。
(5)超前进位(CLA)
将其(4)中的关系迭代进去展开
    C2= G1+G0P1+C0P0P1;C3= G2+G1P2+G0P1P2+C0P0P1P2;等等。 
CLA不太容易扩展,在处理大数据操作时,可采用两种方法:
a:建立小的模块,然后扩展成大的模块。
b:将CLA功能公式化。
CLA 的总延迟时间是O(lgk),速度比CPA快很多,但面积大。
(6)对数超前进位加法器
  将G0、P0、G1、P1......等操作数按二叉树的形式两两运算。 
(7)进位保存加法器
CSA实际上是将3个数相加的和用两个数表示出来。是一位全加器。
CSA的两个缺点:
a、并没有真正的解决两数相加产生一个输出的问题。
b、符号位的检测比较困难。
本代码实现的是a,b,c三个数相加。用CSA的方法实现主要在前边的体现其思想,后边实现偷懒了代码如下:
module csa(a,b,c,sum,cout);
input [3:0] a,b,c;

output [3:0] sum;
output cout;

wire [3:0] cout1;
wire [3:0] sum1;

always@(*)begin
integer i;
for(i=0;i<4;i=i+1)begin
sum1[i] = a[i]^b[i]^c[i];
cout1[i] = a[i]&b[i]|(a[i]|b[i])c[i];
end
end
wire [4:0] cout2;
assign cout2 = {cout1,1'b0};


assign {cout,sum}=sum1+cout2;


endmodule

你可能感兴趣的:(fpga,verilog,fpga)