blob: f3575c94f2824ac2aa3196a8df89df31df6bbd3c [file] [log] [blame]
/*Author: Zhuxu
m99a1@yahoo.cn
Use parallel prefix tree structure to reduce a 16-bit number by one.
stage 0: number of genration=16; number of logic operation=16; G_0[xx]=~i_operand[xx];
stage 1: NOG=16; NOO=8; G_1[2n-1]=G_0[2n-1]&&G_0[2n-2]; n=8:1
stage 2: NOG=16; NOO=7; G_2[2n-1]=G_1[2n-1]&&G_1[2n-3]; n=8:2
stage 3: NOG=16; NOO=6; G_3[2n-1]=G_2[2n-1]&&G_2[2n-5]; n=8:3
stage 4: NOG=16; NOO=4; G_4[2n-1]=G_3[2n-1]&&G_3[2n-9]; n=8:5
stage 5: NOG=16; NOO=7; G_5[2n]=G_4[2n]&&G_4[2n-1]; n=7:1
*/
module minus_one(
input [15:0]i_operand,
output [15:0]o_result,
output o_borrow
);
//stage 0
wire [15:0]G_0;
assign G_0=~i_operand;
//stage 1
wire [15:0]G_1;
assign G_1[1]=G_0[1]&G_0[0];
assign G_1[3]=G_0[3]&G_0[2];
assign G_1[5]=G_0[5]&G_0[4];
assign G_1[7]=G_0[7]&G_0[6];
assign G_1[9]=G_0[9]&G_0[8];
assign G_1[11]=G_0[11]&G_0[10];
assign G_1[13]=G_0[13]&G_0[12];
assign G_1[15]=G_0[15]&G_0[14];
assign G_1[0]=G_0[0];
assign G_1[2]=G_0[2];
assign G_1[4]=G_0[4];
assign G_1[6]=G_0[6];
assign G_1[8]=G_0[8];
assign G_1[10]=G_0[10];
assign G_1[12]=G_0[12];
assign G_1[14]=G_0[14];
//stage 2
wire [15:0]G_2;
assign G_2[3]=G_1[3]&G_1[1];
assign G_2[5]=G_1[5]&G_1[3];
assign G_2[7]=G_1[7]&G_1[5];
assign G_2[9]=G_1[9]&G_1[7];
assign G_2[11]=G_1[11]&G_1[9];
assign G_2[13]=G_1[13]&G_1[11];
assign G_2[15]=G_1[15]&G_1[13];
assign G_2[0]=G_1[0];
assign G_2[2]=G_1[2];
assign G_2[1]=G_1[1];
assign G_2[4]=G_1[4];
assign G_2[6]=G_1[6];
assign G_2[8]=G_1[8];
assign G_2[10]=G_1[10];
assign G_2[12]=G_1[12];
assign G_2[14]=G_1[14];
//stage 3
wire [15:0]G_3;
assign G_3[5]=G_2[5]&G_2[1];
assign G_3[7]=G_2[7]&G_2[3];
assign G_3[9]=G_2[9]&G_2[5];
assign G_3[11]=G_2[11]&G_2[7];
assign G_3[13]=G_2[13]&G_2[9];
assign G_3[15]=G_2[15]&G_2[11];
assign G_3[0]=G_2[0];
assign G_3[2]=G_2[2];
assign G_3[1]=G_2[1];
assign G_3[4]=G_2[4];
assign G_3[3]=G_2[3];
assign G_3[6]=G_2[6];
assign G_3[8]=G_2[8];
assign G_3[10]=G_2[10];
assign G_3[12]=G_2[12];
assign G_3[14]=G_2[14];
//stage 4
wire [15:0]G_4;
assign G_4[9]=G_3[9]&G_3[1];
assign G_4[11]=G_3[11]&G_3[3];
assign G_4[13]=G_3[13]&G_3[5];
assign G_4[15]=G_3[15]&G_3[7];
assign G_4[0]=G_3[0];
assign G_4[2]=G_3[2];
assign G_4[1]=G_3[1];
assign G_4[4]=G_3[4];
assign G_4[3]=G_3[3];
assign G_4[6]=G_3[6];
assign G_4[5]=G_3[5];
assign G_4[8]=G_3[8];
assign G_4[7]=G_3[7];
assign G_4[10]=G_3[10];
assign G_4[12]=G_3[12];
assign G_4[14]=G_3[14];
//stage 5
wire [15:0]G_5;
assign G_5[2]=G_4[2]&G_4[1];
assign G_5[4]=G_4[4]&G_4[3];
assign G_5[6]=G_4[6]&G_4[5];
assign G_5[8]=G_4[8]&G_4[7];
assign G_5[10]=G_4[10]&G_4[9];
assign G_5[12]=G_4[12]&G_4[11];
assign G_5[14]=G_4[14]&G_4[13];
assign G_5[1]=G_4[1];
assign G_5[3]=G_4[3];
assign G_5[5]=G_4[5];
assign G_5[7]=G_4[7];
assign G_5[9]=G_4[9];
assign G_5[11]=G_4[11];
assign G_5[13]=G_4[13];
assign G_5[15]=G_4[15];
assign G_5[0]=G_4[0];
//stage 6
assign o_result[0]=~i_operand[0];
assign o_result[15:1]=(G_5[14:0]&(~i_operand[15:1]))|((~G_5[14:0])&i_operand[15:1]);
assign o_borrow=G_5[15];
endmodule