| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- ///////////////////////////////////////////////////////////////////////////////
- // File Downloaded from http://www.nandland.com
- ///////////////////////////////////////////////////////////////////////////////
- module full_adder
- (
- i_bit1,
- i_bit2,
- i_carry,
- o_sum,
- o_carry
- );
-
- input i_bit1;
- input i_bit2;
- input i_carry;
- output o_sum;
- output o_carry;
-
- wire w_WIRE_1;
- wire w_WIRE_2;
- wire w_WIRE_3;
-
- assign w_WIRE_1 = i_bit1 ^ i_bit2;
- assign w_WIRE_2 = w_WIRE_1 & i_carry;
- assign w_WIRE_3 = i_bit1 & i_bit2;
-
- assign o_sum = w_WIRE_1 ^ i_carry;
- assign o_carry = w_WIRE_2 | w_WIRE_3;
-
-
- // FYI: Code above using wires will produce the same results as:
- // assign o_sum = i_bit1 ^ i_bit2 ^ i_carry;
- // assign o_carry = (i_bit1 ^ i_bit2) & i_carry) | (i_bit1 & i_bit2);
-
- // Wires are just used to be explicit.
-
- endmodule // full_adder
- module carry_lookahead_adder
- #(parameter WIDTH)
- (
- input logic[WIDTH-1:0] i_add1,
- input logic[WIDTH-1:0] i_add2,
- output [WIDTH:0] o_result
- );
-
- wire [WIDTH:0] w_C;
- wire [WIDTH-1:0] w_SUM;
- logic [WIDTH-1:0] w_G, w_P;
- // Create the Full Adders
- genvar ii;
- generate
- for (ii=0; ii<WIDTH; ii=ii+1)
- begin
- full_adder full_adder_inst
- (
- .i_bit1(i_add1[ii]),
- .i_bit2(i_add2[ii]),
- .i_carry(w_C[ii]),
- .o_sum(w_SUM[ii]),
- .o_carry()
- );
- end
- endgenerate
-
- // Create the Generate (G) Terms: Gi=Ai*Bi
- // Create the Propagate Terms: Pi=Ai+Bi
- // Create the Carry Terms:
- //always_comb begin
- // w_G[0] = i_add1[0] & i_add2[0];
- // w_P[0] = i_add1[0] | i_add2[0];
- //end
- genvar jj;
- generate
- for (jj=0; jj<WIDTH; jj=jj+1)
- begin
- assign w_G[jj] = i_add1[jj] & i_add2[jj];
- assign w_P[jj] = i_add1[jj] | i_add2[jj];
- assign w_C[jj+1] = w_G[jj] | (w_P[jj] & w_C[jj]);
- end
- endgenerate
-
- assign w_C[0] = 1'b0; // no carry input on first adder
- assign o_result = {w_C[WIDTH], w_SUM}; // Verilog Concatenation
-
- endmodule // carry_lookahead_adder
- module carry_lookahead_adder_tb ();
-
- parameter WIDTH = 3;
-
- reg [WIDTH-1:0] r_ADD_1 = 0;
- reg [WIDTH-1:0] r_ADD_2 = 0;
- wire [WIDTH:0] w_RESULT;
-
- carry_lookahead_adder #(.WIDTH(WIDTH)) carry_lookahead_inst
- (
- .i_add1(r_ADD_1),
- .i_add2(r_ADD_2),
- .o_result(w_RESULT)
- );
-
- initial
- begin
- #10;
- r_ADD_1 = 3'b000;
- r_ADD_2 = 3'b001;
- #10;
- r_ADD_1 = 3'b010;
- r_ADD_2 = 3'b010;
- #10;
- r_ADD_1 = 3'b101;
- r_ADD_2 = 3'b110;
- #10;
- r_ADD_1 = 3'b111;
- r_ADD_2 = 3'b111;
- #10;
- end
-
- endmodule // carry_lookahead_adder_tb
|