Brent Kung Adder : Circuit, Working, Advantages, Disvantages & Its Applications

Subukan Ang Aming Instrumento Para Sa Pagtanggal Ng Mga Problema





Ang Brent–Kung adder ay iminungkahi noong 1982 nina Hsiang Te Kung at Richard Peirce Brent. Isa itong Parallel Prefix adder o tree adder na malawakang ginagamit sa Digital Design dahil sa flexibility nito. Ang mga Parallel Prefix Adders ay maaaring itayo sa maraming paraan batay sa bilang ng mga antas ng lohika, mga pintuan ng lohika kasangkot, ang fan-out mula sa bawat gate at ang mga kable sa pagitan ng mga antas. Mayroong iba't ibang uri ng tree adders na magagamit, ang pangunahing Tree adders ay Sklanskym KoggeStone & Brent-Kung, Kung ikukumpara sa KSA (Kogge–Stone adder), ang adder na ito ay nagbibigay ng mataas na regularity sa structure ng adder at ito ay may mas kaunting wiring blocking na humahantong sa mas mahusay na pagganap at hindi gaanong kinakailangang lugar ng chip. Ang artikulong ito ay nagbibigay ng maikling impormasyon sa a Brent Kung Adder .


Ano ang Brent Kung Adder?

Ang isang adder na gumagamit ng minimum na circuitry upang makuha ang resulta ay kilala bilang Brent Kung Adder at kilala rin ito bilang isang low-power adder o parallel adder. Ang adder na ito ay inilaan upang i-save ang laki ng chip upang maging mas madali ang paggawa ng mga adder na ito. Ang simetrya ng adder na ito at karaniwang istraktura ng konstruksiyon ay lubos na magpapababa sa mga gastos sa produksyon at pinapayagang gamitin sa mga pipeline na topologies. Ang paggamit ng pantulong na pass transistor logic ay nakakatulong sa pagpapahusay ng pagganap ng disenyo sa multiplexer diskarte sa iba't ibang disenyo ng cell.



Brent Kung Adder Circuit

Ang brent-kung parallel prefix adder diagram ay ipinapakita sa ibaba na kinabibilangan ng stage 1 (pre-processing stage), stage 2 hanggang 7 ay carry generation stages at stage 8 ay post-processing. Ito ay isang advanced na arkitektura at napakasimpleng gawin at nagbibigay ng mas kaunting pagsisikip ng mga kable. Kaya, ang mas kaunting mga kable nito ay magbabawas sa dami ng kinakailangang espasyo upang maisagawa ang arkitektura. Bilang karagdagan, ang pagruruta ay nagiging mas madali dahil sa pagtawid (o) pag-overlay ng mas kaunting mga wire. Gayunpaman, ang parusa ay tataas sa pagkaantala dahil sa tumaas na bilang ng mga yugto, Ang fan out para sa adder na ito ay tataas, at pagkatapos ay ang pagkaantala ay tataas.

  Brent Kung Adder
                                                        Brent Kung Adder

Paano Gumagana ang Brent Kung Adder?

Gumagana ang Brent Kung Adder sa pamamagitan ng pagkalkula ng mga prefix para sa dalawang bit group na kapaki-pakinabang sa paghahanap ng 4 bit group prefix. Ang mga prefix na ito ay ginagamit para sa pag-compute ng mga prefix ng 8-bit na grupo, atbp. Pagkatapos nito, ang mga prefix na ito ay gagamitin para sa pag-compute ng carry-out ng partikular na yugto ng bit. Ang mga dala na ito ay ginagamit kasama ng Group Propagate ng susunod na yugto upang kalkulahin ang Sum bit ng yugtong iyon. Gumagamit ang Brent Kung Tree ng 2log2N – 1 stage.



32-bit na Brent Kung Adder

Ang 32-bit na Brent Kung adder layout ay ipinapakita sa ibaba. Sa simula ng layout na ito, ang mga pangunahing logic gate ay idinisenyo tulad ng NAND, inverter, XOR, NOR, atbp. Pagkatapos nito, ang mga kinakailangang cell tulad ng mga black cell, gray na mga cell, buffer, at PG logic ay idinisenyo gamit ang mga logic gate.

  32-bit na Brent Kung Adder
                                  32-bit na Brent Kung Adder

Sa ibabang 32-bit na Brent Kung adder, ang mga inverting gate tulad ng AOI at OAI ay alternatibong ginagamit para sa mga grey at black cell. Kaya ang mga itim at kulay abong mga cell ay kinakatawan ng kulay abo at itim na mga bloke samantalang ang mga buffer ay kinakatawan ng mga bilog.

  PCBWay   Mga Pangunahing Cell sa Adder
Mga Pangunahing Cell sa Adder

Ang mga input tulad ng A & B ay ibinibigay sa PG logic na ipinapakita sa block diagram. Para sa isang 32-bit adder, 32 PG logic blocks ang kailangan at ang propagate (P) at generate (G) signal ay ang mga output ng block na ito. Ang mga signal na ito ay ibinibigay sa Brent Kung adder tree structure. Kasama sa istruktura ng adder na ito ang mga gray na selula at itim na selula.

Ang isang gray na cell ay may kasamang tatlong input at solong output. Ang nagpapalaganap at bumubuo ng mga signal mula sa kasalukuyang yugto at bumubuo ng mga signal mula sa nakaraang yugto ay mga input samantalang ang grupo ay bumubuo ng mga signal ay ang o/p. Sa anumang istraktura ng puno, ang bawat yugto ay magtatapos sa isang kulay-abo na cell at ang o/p ng cell na ito ay ang grupong bumubuo ng signal. Ang senyas na ito ay itinuturing na simpleng dala ng yugtong iyon. Kasama sa Black cell ang apat na input at dalawang output. Ang mga input para sa cell na ito ay ang kasalukuyang yugto ng P & G signal at P, G signal mula sa nakaraang yugto.

Kasama sa PG logic ang AND & XOR gate kung saan ginagamit ang AND logic gate para sa pagbuo ng G signal at ang XOR logic gate ay nagbibigay ng P signal. Upang alisin ang mga hindi kinakailangang inverter, dalawang uri ng gray na mga cell at itim na mga cell ang ginagamit. Ang inverting gate na ginagamit sa isang row para sa gray na cell ay AOI o AND-OR-Inverter at ang inverting gate para sa black cell sa loob ng susunod na row ay gumagamit ng OAI o OR-AND-Inverter. Ginagamit ng AOI cell ang mga normal na input upang magbigay ng mga inverted na output samantalang ang OAI ay gumagamit ng mga inverted input upang magbigay ng mga normal na output.

Brent Kung Adder Operation

Ang Brent Kung adder ay isang parallel prefix adder na ginagamit para sa pagpapatakbo ng high-performance na karagdagan. Ang adder na ito ay mukhang isang istraktura ng puno na nagsasagawa ng operasyon ng aritmetika. Kasama sa adder na ito ang mga black cell at gray na cell. Ang bawat black cell ay may dalawang AND gate at single OR gate at bawat gray na cell ay may iisang AND gate lang.

Kasama sa Brent-kung adder ang dalawang yugto; ang yugto ng pre-processing at yugto ng henerasyon. Sa unang yugto, ang pagbuo at pagpapalaganap ay magmumula sa bawat pares ng mga input. Dito ang propagate ay nagbibigay ng isang 'XOR' na operasyon para sa input bits samantalang ang bumubuo ay nagbibigay ng isang 'AT' na operasyon para sa input bits. Ang propagate at bumuo tulad ng 'Pi' at 'Gi' ay ibinigay sa ibaba.

Pi = Ai XOR Bi at Gi = Ai AT Bi.

Sa ikalawang yugto, ang carry ay bubuo para sa bawat bit na kilala bilang carry generate 'Cg' at carry ay nagpapalaganap para sa bawat bit ay kilala bilang carry generate 'Cp'. Para sa karagdagang operasyon, bubuo ng carry propagate at carry gene. Ang huling cell na magagamit sa loob ng bawat bit operate ay nagbibigay ng carry. Kaya't ang huling bit carry ay tutulong sa kabuuan ng susunod na bit nang sabay-sabay hanggang sa huling bit. Ang carry na bumubuo at nagpapalaganap ay ibinibigay bilang;

Cp = P1 AT P0 at Cg=G1 O (P1 AT G0)

Ito ay pangunahing ginagamit para sa pagdaragdag ng operasyon ng dalawang tatlumpu't dalawang bits at bawat bit ay nakakaranas ng preprocessing stage at generation stage pagkatapos ay nagbibigay ito ng huling kabuuan.

Ang mga pangunahing input bit ay nasa ibaba ng pre-processing stage at gumagawa sila ng propagate at generate. Kaya ang mga ito ay nagpapalaganap pati na rin ang bumubuo ay sumasailalim sa yugto ng henerasyon ay bumubuo ng mga carry na bumubuo at nagdadala ng mga nagpapalaganap at nagbibigay ng panghuling kabuuan. Ang hakbang-hakbang na proseso ng Brent-kung adder ay ipinapakita sa ibaba.

  Mahusay na Block Diagram
Mahusay na Block Diagram

Ang pag-aayos ng Brent-kung adder ay mukhang isang istraktura ng puno at ito ang high-speed adder na nagta-target sa gate-level na logic. Ang adder na ito ay maaaring idisenyo na may pagbaba ng bilang ng mga logic gate. Kaya, binabawasan nito ang pagkaantala at memorya na ginamit sa loob ng arkitektura na ito.

Brent Kung Adder Verilog Code

Ang Brent Kung adder verilog code ay ipinapakita sa ibaba.

`define INPUTSIZE 64 //itakda ang laki ng input n

`define GROUPSIZE 8 //itakda ang laki ng grupo = 1, 2, 4 o 8

 

module Brent_Kung_Adder(A, B, S);

input [`INPUTSIZE – 1:0] A;

input [`INPUTSIZE – 1:0] B;

output [`INPUTSIZE:0] S;

wire [`INPUTSIZE / `GROUPSIZE * 2 – 1:0] r_temp;

wire [`INPUTSIZE / `GROUPSIZE * 2 – 1:0] r;

wire [`INPUTSIZE / `GROUPSIZE:0] cin;

wire [`INPUTSIZE / `GROUPSIZE * 2 – 1:0] q;

italaga ang cin[0] = 1’b0;

bumuo

saan sa;

para sa (i = 0; i < `INPUTSIZE / `GROUPSIZE; i = i + 1) magsisimula: parallel_FA_CLA_prefix

    group_q_generation #(.Groupsize(`GROUPSIZE))

    f(

        .a(A[`GROUPSIZE * (i + 1) – 1:`GROUPSIZE * i]),

        .b(B[`GROUPSIZE * (i + 1) – 1:`GROUPSIZE * i]),

        .cin(cin[i]),

        .s(S[`GROUPSIZE * (i + 1) – 1:`GROUPSIZE * i]),

        .qg(q[i * 2 + 1:i * 2])

    );

wakas

parallel_prefix_tree_first_half #(.Treesize(`INPUTSIZE / `GROUPSIZE))

t1(

    .q(q[`INPUTSIZE / `GROUPSIZE * 2 – 1:0]),

    .r(r_temp[`INPUTSIZE / `GROUPSIZE * 2 – 1:0])

);

parallel_prefix_tree_second_half #(.Treesize(`INPUTSIZE / `GROUPSIZE))

t2(

    .q(r_temp[`INPUTSIZE / `GROUPSIZE * 2 – 1:0]),

    .r(r[`INPUTSIZE / `GROUPSIZE * 2 – 1:0])

);

para sa (i = 0; i < `INPUTSIZE / `GROUPSIZE; i = i + 1) magsisimula: cin_generation

    cin_generation_logic f(

        .r(r[2 * i + 1:2 * i]),

        .c0(1’b0),

        .cin(cin[i + 1])

    );

wakas

magtalaga ng S[`INPUTSIZE] = cin[`INPUTSIZE / `GROUPSIZE];

endgenerate

endmodule

// Unang kalahati ng parallel prefix tree

module parallel_prefix_tree_first_half #(parameter Treesize = `INPUTSIZE / `GROUPSIZE)(q, r);

input [Treesize * 2 – 1:0] q;

output [Treesize * 2 – 1:0] r;

bumuo

saan sa;

kung (Treesize == 2) magsisimula: trivial_case

    magtalaga ng r[1:0] = q[1:0];

    prefix_logic f(

        .ql(q[1:0]),

        .qh(q[3:2]),

        .r(r[3:2])

    );

end else begin: recursive_case

    wire [Treesize * 2 – 1:0] r_temp;

    parallel_prefix_tree_first_half #(.Treesize(Treesize / 2))

    recursion_lsbh(

        .q(q[Laki ng Puno – 1:0]),

        .r(r_temp[Laki ng Puno – 1:0])

    );

    parallel_prefix_tree_first_half #(.Treesize(Treesize / 2))

    recursion_msbh(

        .q(q[Treesize * 2 – 1:Treesize]),

        .r(r_temp[Treesize * 2 – 1:Treesize])

    );

    para sa (i = 0; i < Treesize * 2; i = i + 2) magsisimula: parallel_stitch_up

        kung (i != Treesize * 2 – 2) magsisimula: parallel_stitch_up_pass

            magtalaga ng r[i + 1:i] = r_temp[i + 1:i];

        end else begin: parallel_stitch_up_produce

            prefix_logic f(

                .ql(r_temp[Treesize – 1:Treesize – 2]),

                .qh(r_temp[Treesize * 2 – 1:Treesize * 2 – 2]),

                .r(r[Treesize * 2 – 1:Treesize * 2 – 2])

            );

        wakas

    wakas

wakas

endgenerate

endmodule

// Pangalawang kalahati ng parallel prefix tree

module parallel_prefix_tree_second_half #(parameter Treesize = `INPUTSIZE / `GROUPSIZE)(q, r);

input [Treesize * 2 – 1:0] q;

output [Treesize * 2 – 1:0] r;

wire [Treesize * 2 * ($clog2(Treesize) – 1) – 1:0] r_temp;

magtalaga ng r_temp[Treesize * 2 – 1:0] = q[Treesize * 2 – 1:0];

bumuo

genvar i, j;

para sa (i = 0; i < $clog2(Treesize) – 2; i = i + 1) magsisimula: second_half_level

    magtalaga ng r_temp[Treesize * 2 * (i + 1) + ((Treesize / (2 ** i)) – 1 – 2 ** ($clog2(Treesize / 4) – i)) * 2 – 1:Treesize * 2 * (i + 1)] = r_temp[Treesize * 2 * i + ((Treesize / (2 ** i)) – 1 – 2 ** ($clog2(Treesize / 4) – i)) * 2 – 1: Laki ng puno * 2 * i];

    para sa (j = (Treesize / (2 ** i)) – 1 – 2 ** ($clog2(Treesize / 4) – i);j < Treesize; j = j + 2 ** ($clog2(Treesize / 2 ) – i)) magsimula: second_half_level_logic

        prefix_logic f(

            .ql(r_temp[Treesize * 2 * i + (j – 2 ** ($clog2(Treesize / 4) – i)) * 2 + 1:Treesize * 2 * i + (j – 2 ** ($clog2( Laki ng puno / 4) – i)) * 2]),

            .qh(r_temp[Treesize * 2 * i + j * 2 + 1:Treesize * 2 * i + j * 2]),

            .r(r_temp[Treesize * 2 * (i + 1) + j * 2 + 1:Treesize * 2 * (i + 1) + j * 2])

        );

        kung (j != Laki ng Puno – 1 – 2 ** ($clog2(Laki ng Puno / 4) – i)) ay magsisimula: second_half_level_direct_connect

            magtalaga ng r_temp[Treesize * 2 * (i + 1) + (j + 2 ** ($clog2(Treesize / 2) – i)) * 2 – 1:Treesize * 2 * (i + 1) + j * 2 + 2] = r_temp[Treesize * 2 * i + (j + 2 ** ($clog2(Treesize / 2) – i)) * 2 – 1:Treesize * 2 * i + j * 2 + 2];

        wakas

    wakas

    magtalaga ng r_temp[Treesize * 2 * (i + 2) – 1:Treesize * 2 * (i + 2) – (2 ** ($clog2(Treesize / 4) – i)) * 2] = r_temp[Treesize * 2 * (i + 1) – 1:Treesize * 2 * (i + 1) – (2 ** ($clog2(Treesize / 4) – i)) * 2];

wakas

magtalaga ng r[1:0] = r_temp[Treesize * 2 * ($clog2(Treesize) – 2) + 1:Treesize * 2 * ($clog2(Treesize) – 2)];

para sa (i = 1; i < Treesize; i = i + 2) magsisimula: final_r_odd

    magtalaga ng r[i * 2 + 1:i * 2] = r_temp[Treesize * 2 * ($clog2(Treesize) – 2) + i * 2 + 1:Treesize * 2 * ($clog2(Treesize) – 2) + i * 2];

wakas

para sa (i = 2; i < Treesize; i = i + 2) magsisimula: final_r_even

    prefix_logic f(

        .ql(r_temp[Treesize * 2 * ($clog2(Treesize) – 2) + i * 2 – 1:Treesize * 2 * ($clog2(Treesize) – 2) + i * 2 – 2]),

        .qh(r_temp[Treesize * 2 * ($clog2(Treesize) – 2) + i * 2 + 1:Treesize * 2 * ($clog2(Treesize) – 2) + i * 2]),

        .r(r[i * 2 + 1:i * 2])

    );

wakas

endgenerate

endmodule

module group_q_generation #(parameter Groupsize = `GROUPSIZE)(a, b, cin, s, qg);

input [Groupsize – 1:0] a;

input [Groupsize – 1:0] b;

input cin;

output [Groupsize – 1:0] s;

output [1:0] qg;

wire [2 * Groupsize – 1:0] q;

wire [Groupsize – 1:0] c;

italaga ang c[0] = cin;

bumuo

saan sa;

para sa (i = 0; i < Groupsize; i = i + 1) magsisimula: parallel_FA_CLA_prefix

    FA_CLA_prefix f(

        .a(a[i]),

        .b(b[i]),

        .cin(c[i]),

        .s(s[i]),

        .q(q[i * 2 + 1:i * 2])

    );

    kung (i != Groupsize – 1) magsisimula: special_case

        magtalaga ng c[i + 1] = q[i * 2 + 1] | (q[i * 2] at c[i]);

    wakas

wakas

//group q generation batay sa Groupsize

kung (Groupsize == 1) magsisimula: case_gs1

    italaga ang qg[1] = q[1];

    italaga ang qg[0] = q[0];

end else if (Groupsize == 2) magsisimula: case_gs2

    magtalaga ng qg[1] = q[3] | (q[1] at q[2]);

    magtalaga ng qg[0] = q[2] & q[0];

end else if (Groupsize == 4) magsisimula: case_gs4

    magtalaga ng qg[1] = q[7] | (q[5] at q[6]) | (q[3] at q[6] at q[4]) | (q[1] & q[6] & q[4] & q[2]);

    magtalaga ng qg[0] = q[6] & q[4] & q[2] & q[0];

end else if (Groupsize == 8) magsisimula: case_gs8

    magtalaga ng qg[1] = q[15] | (q[13] at q[14]) | (q[11] at q[14] at q[12]) | (q[9] at q[14] at q[12] at q[10]) | (q[7] at q[14] at q[12] at q[10] at q[8]) | (q[5] & q[14] & q[12] & q[10] & q[8] & q[6]) | (q[3] & q[14] & q[12] & q[10] & q[8] & q[6] at q[4]) | (q[1] & q[14] & q[12] & q[10] & q[8] & q[6] & q[4] & q[2]);

    magtalaga ng qg[0] = q[14] & q[12] & q[10] & q[8] & q[6] & q[4] & q[2] & q[0];

wakas

endgenerate

endmodule

// Lohika ng henerasyon ng Cin

module cin_generation_logic(r, c0, cin);

input [1:0] r;

input c0;

output cin;

magtalaga ng cin = (r[0] & c0) | r[1];

endmodule

// Pangunahing lohika para sa mga pagpapatakbo ng prefix

module prefix_logic(ql, qh, r);

input [1:0] ql;

input [1:0] qh;

output [1:0] r;

magtalaga ng r[0] = qh[0] & ql[0];

magtalaga ng r[1] = (qh[0] at ql[1]) | qh[1];

endmodule

// Full Adder Cell na may Carry Look-Ahead

module FA_CLA_prefix(a, b, cin, s, q);

input a;

input b;

input cin;

output s;

output [1:0] q;

italaga ang q[0] = a ^ b;

magtalaga ng s = q[0] ^ cin;

magtalaga ng q[1] = a & b;

endmodule

Mga kalamangan

Ang mga pakinabang ng Brent Kung Adder ay kinabibilangan ng mga sumusunod.

  • Isa itong low-power adder dahil gumagamit ito ng minimum na circuit para makuha ang resulta.
  • Ito ay isang napaka-tanyag at malawakang ginagamit na adder.
  • Ang ganitong uri ng adder ay maaaring ipatupad sa pamamagitan ng paggamit ng mas kaunting mga module kumpara sa isang Kogge-Stone adder.
  • Ang pagdidisenyo ng Brent-Kung adder ay napakadali.
  • Ang adder na ito ay may mas kaunting mga koneksyon sa iba pang mga module.
  • Ang mga adder na ito ay iminungkahi pangunahin upang malutas ang mga kakulangan ng Kogge-Stone adders.

Mga disadvantages

Ang disadvantages ng Brent Kung Adde r isama ang mga sumusunod.

  • Ang mga adder na ito ay may mas malaking pagkaantala at kailangan nito ng 2 log2 n − 2 na antas ng lohika para sa pag-compute ng lahat ng mga bitbit na bitbit.
  • Ang pangunahing disbentaha ng adder na ito ay fanout na maaaring maging sanhi ng pagpapalaganap ng agos sa kabuuan ng adder upang mahati at maging mas mahina.

Brent Kung Adder Applications

Ang mga application ng Brent Kung Adder ay kinabibilangan ng mga sumusunod.

  • Ang isang Brent–Kung adder ay ginagamit sa isang pipeline na paraan upang bawasan ang pagkonsumo ng kuryente sa pamamagitan ng pagpapababa ng combinatorial logic depth at glitches stabilization.
  • Ang Brent-Kung adder ay nagbibigay ng natitirang bilang ng mga yugto mula i/p hanggang sa lahat ng o/ps ngunit may asymmetric Intermediate stages na naglo-load.
  • Maaaring gamitin ang adder na ito sa loob ng multiplier pati na rin ang iba pang elemento ng path ng data.

Kaya, ito ay isang pangkalahatang-ideya ng Brent kung adder , ang paggana nito, mga pakinabang, disadvantages, at mga aplikasyon nito. Ito ay isang napakahusay na adder at ang istraktura nito ay mukhang isang istraktura ng puno na pangunahing ginagamit para sa mga pagpapatakbo ng aritmetika na may mataas na pagganap. Ang ganitong uri ng adder ay napakabilis at pangunahing nakatuon sa lohika sa antas ng gate. Ang adder na ito ay dinisenyo sa pamamagitan ng paggamit ng mas kaunting bilang ng mga logic gate. Kaya, binabawasan nito ang memorya at pagkaantala na ginamit sa loob ng arkitektura na ito. Narito ang isang tanong para sa iyo, Brent kung adder na kilala rin bilang?