2012-11-21 65 views
3

我在設計一個16位進位向前加法器在Verilog中遇到一些複雜問題。我的代碼在這裏:如何在verilog中設計一個16位進位向前加法器

module fulladder(a, b, c, s, cout); 
    input a, b, c; 
    output s, cout; 

    xor #0 
    g1(w1, a, b), 
    g2(s, w1, c); 
    and #0 
    g3(w2, c, b), 
    g4(w3, c, a), 
    g5(w4, a, b); 
    or #0 
    g6(cout, w2, w3, w4); 
    endmodule 

我明白如何端口工作,但我使用矢量?

p.s.它的結構化verilog。請不要給我完整的代碼。只需要一些理解。謝謝

+0

你問的是如何使端口比1位寬? – Morgan

+0

@Munkymorgy - 是的。我已經做了16位脈動進位加法器,但不能完成我的腦海裏圍繞設計一個16位進位前瞻加法器。 – cyberspace009

回答

3

我們的朋友Wikipedia has a bit about Carry Look-Ahead。這些通常以4位階段組合在一起。 4個fulladders用額外的邏輯來計算進位。

假定fulladder如問題指定,增加的產生g和傳播p輸出,一個4比特的塊可能看起來有些東西一樣:

module four_bit_carry_lookahead (
    input [3:0] a, 
    input [3:0] b, 
    input  c, //Carry in 
    output [3:0] s, //Sum 
    output  cout //Carry 
); 

    wire [3:1] carry; // 3:1 to align numbers with wikipedia article 
    wire [3:0] p; 
    wire [3:0] g; 

    fulladder add0(.a(a[0]), .b(b[0]), .c(c),  .s(s[0]), .cout() .g(g[0]), .p([0])); 
    fulladder add1(.a(a[1]), .b(b[1]), .c(carry[1]), .s(s[1]), .cout() .g(g[1]), .p([1])); 
    fulladder add2(.a(a[2]), .b(b[2]), .c(carry[2]), .s(s[2]), .cout() .g(g[2]), .p([2])); 
    fulladder add3(.a(a[3]), .b(b[3]), .c(carry[3]), .s(s[3]), .cout() .g(g[3]), .p([3])); 

    carry_lookahead(
    .p (p ), //input [3:0] 
    .g (g ), //input [3:0] 
    .c (carry), //output [3:1] 
    .cout (cout) //output 
); 

endmodule 

所需的相加輸出是g = a & b;p = a | b;

實施carry_lookahead的邏輯仍然是必需的,wikipedia article應該告訴你需要什麼。在這個代碼中,它們是C1,C2,C3和C4,它們將進位[1],進位[2],進位[3]和cout。

要創建一個16位加法器,您可以使用這些4位部分中的4個。

+0

哇,我看了看維基百科的文章,並試圖實現電路設計爲我的項目。這幫助我瞭解了正在發生的事情。非常感謝你 – cyberspace009

相關問題