forked from Github_Repos/cvw
90 lines
2.5 KiB
Systemverilog
90 lines
2.5 KiB
Systemverilog
|
// Brent-Kung Prefix Adder
|
||
|
|
||
|
module ling_bk13 (cout, sum, a, b, cin);
|
||
|
input [12:0] a, b;
|
||
|
input cin;
|
||
|
output [12:0] sum;
|
||
|
output cout;
|
||
|
|
||
|
wire [13:0] p,g;
|
||
|
wire [13:1] h,c;
|
||
|
|
||
|
// pre-computation
|
||
|
assign p={a|b,1'b1};
|
||
|
assign g={a&b, cin};
|
||
|
|
||
|
// prefix tree
|
||
|
ling_brent_kung prefix_tree(h, c, p[12:0], g[12:0]);
|
||
|
|
||
|
// post-computation
|
||
|
assign h[13]=g[13]|c[13];
|
||
|
assign sum=p[13:1]^h|g[13:1]&c;
|
||
|
assign cout=p[13]&h[13];
|
||
|
|
||
|
endmodule
|
||
|
|
||
|
module ling_brent_kung (h, c, p, g);
|
||
|
|
||
|
input [12:0] p;
|
||
|
input [13:0] g;
|
||
|
output [13:1] h;
|
||
|
output [13:1] c;
|
||
|
|
||
|
|
||
|
// parallel-prefix, Brent-Kung
|
||
|
|
||
|
// Stage 1: Generates H/I pairs that span 1 bits
|
||
|
rgry g_1_0 (H_1_0, {g[1],g[0]});
|
||
|
rblk b_3_2 (H_3_2, I_3_2, {g[3],g[2]}, {p[2],p[1]});
|
||
|
rblk b_5_4 (H_5_4, I_5_4, {g[5],g[4]}, {p[4],p[3]});
|
||
|
rblk b_7_6 (H_7_6, I_7_6, {g[7],g[6]}, {p[6],p[5]});
|
||
|
rblk b_9_8 (H_9_8, I_9_8, {g[9],g[8]}, {p[8],p[7]});
|
||
|
rblk b_11_10 (H_11_10, I_11_10, {g[11],g[10]}, {p[10],p[9]});
|
||
|
rblk b_13_12 (H_13_12, I_13_12, {g[13],g[12]}, {p[12],p[11]});
|
||
|
|
||
|
// Stage 2: Generates H/I pairs that span 2 bits
|
||
|
grey g_3_0 (H_3_0, {H_3_2,H_1_0}, I_3_2);
|
||
|
black b_7_4 (H_7_4, I_7_4, {H_7_6,H_5_4}, {I_7_6,I_5_4});
|
||
|
black b_11_8 (H_11_8, I_11_8, {H_11_10,H_9_8}, {I_11_10,I_9_8});
|
||
|
|
||
|
// Stage 3: Generates H/I pairs that span 4 bits
|
||
|
grey g_7_0 (H_7_0, {H_7_4,H_3_0}, I_7_4);
|
||
|
|
||
|
// Stage 4: Generates H/I pairs that span 8 bits
|
||
|
|
||
|
// Stage 5: Generates H/I pairs that span 4 bits
|
||
|
grey g_11_0 (H_11_0, {H_11_8,H_7_0}, I_11_8);
|
||
|
|
||
|
// Stage 6: Generates H/I pairs that span 2 bits
|
||
|
grey g_5_0 (H_5_0, {H_5_4,H_3_0}, I_5_4);
|
||
|
grey g_9_0 (H_9_0, {H_9_8,H_7_0}, I_9_8);
|
||
|
|
||
|
// Last grey cell stage
|
||
|
grey g_2_0 (H_2_0, {g[2],H_1_0}, p[1]);
|
||
|
grey g_4_0 (H_4_0, {g[4],H_3_0}, p[3]);
|
||
|
grey g_6_0 (H_6_0, {g[6],H_5_0}, p[5]);
|
||
|
grey g_8_0 (H_8_0, {g[8],H_7_0}, p[7]);
|
||
|
grey g_10_0 (H_10_0, {g[10],H_9_0}, p[9]);
|
||
|
grey g_12_0 (H_12_0, {g[12],H_11_0}, p[11]);
|
||
|
|
||
|
// Final Stage: Apply c_k+1=p_k&H_k_0
|
||
|
assign c[1]=g[0];
|
||
|
|
||
|
assign h[1]=H_1_0; assign c[2]=p[1]&H_1_0;
|
||
|
assign h[2]=H_2_0; assign c[3]=p[2]&H_2_0;
|
||
|
assign h[3]=H_3_0; assign c[4]=p[3]&H_3_0;
|
||
|
assign h[4]=H_4_0; assign c[5]=p[4]&H_4_0;
|
||
|
assign h[5]=H_5_0; assign c[6]=p[5]&H_5_0;
|
||
|
assign h[6]=H_6_0; assign c[7]=p[6]&H_6_0;
|
||
|
assign h[7]=H_7_0; assign c[8]=p[7]&H_7_0;
|
||
|
assign h[8]=H_8_0; assign c[9]=p[8]&H_8_0;
|
||
|
|
||
|
assign h[9]=H_9_0; assign c[10]=p[9]&H_9_0;
|
||
|
assign h[10]=H_10_0; assign c[11]=p[10]&H_10_0;
|
||
|
assign h[11]=H_11_0; assign c[12]=p[11]&H_11_0;
|
||
|
assign h[12]=H_12_0; assign c[13]=p[12]&H_12_0;
|
||
|
|
||
|
endmodule
|
||
|
|
||
|
|