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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章