adder.sv 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // File Downloaded from http://www.nandland.com
  3. ///////////////////////////////////////////////////////////////////////////////
  4. module full_adder
  5. (
  6. i_bit1,
  7. i_bit2,
  8. i_carry,
  9. o_sum,
  10. o_carry
  11. );
  12. input i_bit1;
  13. input i_bit2;
  14. input i_carry;
  15. output o_sum;
  16. output o_carry;
  17. wire w_WIRE_1;
  18. wire w_WIRE_2;
  19. wire w_WIRE_3;
  20. assign w_WIRE_1 = i_bit1 ^ i_bit2;
  21. assign w_WIRE_2 = w_WIRE_1 & i_carry;
  22. assign w_WIRE_3 = i_bit1 & i_bit2;
  23. assign o_sum = w_WIRE_1 ^ i_carry;
  24. assign o_carry = w_WIRE_2 | w_WIRE_3;
  25. // FYI: Code above using wires will produce the same results as:
  26. // assign o_sum = i_bit1 ^ i_bit2 ^ i_carry;
  27. // assign o_carry = (i_bit1 ^ i_bit2) & i_carry) | (i_bit1 & i_bit2);
  28. // Wires are just used to be explicit.
  29. endmodule // full_adder
  30. module carry_lookahead_adder
  31. #(parameter WIDTH)
  32. (
  33. input logic[WIDTH-1:0] i_add1,
  34. input logic[WIDTH-1:0] i_add2,
  35. output [WIDTH:0] o_result
  36. );
  37. wire [WIDTH:0] w_C;
  38. wire [WIDTH-1:0] w_SUM;
  39. logic [WIDTH-1:0] w_G, w_P;
  40. // Create the Full Adders
  41. genvar ii;
  42. generate
  43. for (ii=0; ii<WIDTH; ii=ii+1)
  44. begin
  45. full_adder full_adder_inst
  46. (
  47. .i_bit1(i_add1[ii]),
  48. .i_bit2(i_add2[ii]),
  49. .i_carry(w_C[ii]),
  50. .o_sum(w_SUM[ii]),
  51. .o_carry()
  52. );
  53. end
  54. endgenerate
  55. // Create the Generate (G) Terms: Gi=Ai*Bi
  56. // Create the Propagate Terms: Pi=Ai+Bi
  57. // Create the Carry Terms:
  58. //always_comb begin
  59. // w_G[0] = i_add1[0] & i_add2[0];
  60. // w_P[0] = i_add1[0] | i_add2[0];
  61. //end
  62. genvar jj;
  63. generate
  64. for (jj=0; jj<WIDTH; jj=jj+1)
  65. begin
  66. assign w_G[jj] = i_add1[jj] & i_add2[jj];
  67. assign w_P[jj] = i_add1[jj] | i_add2[jj];
  68. assign w_C[jj+1] = w_G[jj] | (w_P[jj] & w_C[jj]);
  69. end
  70. endgenerate
  71. assign w_C[0] = 1'b0; // no carry input on first adder
  72. assign o_result = {w_C[WIDTH], w_SUM}; // Verilog Concatenation
  73. endmodule // carry_lookahead_adder
  74. module carry_lookahead_adder_tb ();
  75. parameter WIDTH = 3;
  76. reg [WIDTH-1:0] r_ADD_1 = 0;
  77. reg [WIDTH-1:0] r_ADD_2 = 0;
  78. wire [WIDTH:0] w_RESULT;
  79. carry_lookahead_adder #(.WIDTH(WIDTH)) carry_lookahead_inst
  80. (
  81. .i_add1(r_ADD_1),
  82. .i_add2(r_ADD_2),
  83. .o_result(w_RESULT)
  84. );
  85. initial
  86. begin
  87. #10;
  88. r_ADD_1 = 3'b000;
  89. r_ADD_2 = 3'b001;
  90. #10;
  91. r_ADD_1 = 3'b010;
  92. r_ADD_2 = 3'b010;
  93. #10;
  94. r_ADD_1 = 3'b101;
  95. r_ADD_2 = 3'b110;
  96. #10;
  97. r_ADD_1 = 3'b111;
  98. r_ADD_2 = 3'b111;
  99. #10;
  100. end
  101. endmodule // carry_lookahead_adder_tb