Advertisement
cr88192

Misc: BCD Add/Subtract (64b / 16-digit)

Apr 26th, 2022
1,769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ----
  2.  
  3. module ExBcdAdd4(a, b, c, c_in, c_out);
  4. input [3:0]     a;
  5. input [3:0]     b;
  6. output[3:0]     c;
  7. input           c_in;
  8. output          c_out;
  9.  
  10. reg[4:0]    tCa;
  11. reg[4:0]    tCb;
  12.  
  13. reg[3:0]    tC;
  14. reg         tCo;
  15. assign      c = tC;
  16. assign      c_out = tCo;
  17.  
  18. always @*
  19. begin
  20.     tCa = { 1'b0, a } + { 1'b0, b } + { 4'b0, c_in };
  21.  
  22.     case(tCa)
  23.         5'h00: tCb = 5'h00;
  24.         5'h01: tCb = 5'h01;
  25.         5'h02: tCb = 5'h02;
  26.         5'h03: tCb = 5'h03;
  27.         5'h04: tCb = 5'h04;
  28.         5'h05: tCb = 5'h05;
  29.         5'h06: tCb = 5'h06;
  30.         5'h07: tCb = 5'h07;
  31.         5'h08: tCb = 5'h08;
  32.         5'h09: tCb = 5'h09;
  33.         5'h0A: tCb = 5'h10;
  34.         5'h0B: tCb = 5'h11;
  35.         5'h0C: tCb = 5'h12;
  36.         5'h0D: tCb = 5'h13;
  37.         5'h0E: tCb = 5'h14;
  38.         5'h0F: tCb = 5'h15;
  39.         5'h10: tCb = 5'h16;
  40.         5'h11: tCb = 5'h17;
  41.         5'h12: tCb = 5'h18;
  42.         5'h13: tCb = 5'h19;
  43.  
  44.         default:
  45.         begin
  46.             /* Out of range, but can't occur with in-range inputs. */
  47.             tCb = 5'h00;
  48.         end
  49.     endcase
  50.  
  51. //  tCb = tCa + ((tCa>9)?6:0);
  52.     tC  = tCb[3:0];
  53.     tCo = tCb[4];
  54. end
  55.  
  56. endmodule
  57.  
  58. ---
  59.  
  60. `include "ExBcdAdd4.v"
  61.  
  62. module ExBcdAdd64(a, b, c, c_in, c_out, mode);
  63. input [63:0]        a;
  64. input [63:0]        b;
  65. output[63:0]        c;
  66. input           c_in;
  67. output          c_out;
  68. input           mode;
  69.  
  70. wire[63:0]  tBinv;
  71. wire[63:0]  tBi;
  72. wire        tCi;
  73.  
  74. assign tBinv =
  75. {   4'h9-b[63:60], 4'h9-b[59:56],
  76.     4'h9-b[55:52], 4'h9-b[51:48],
  77.     4'h9-b[47:44], 4'h9-b[43:40],
  78.     4'h9-b[39:36], 4'h9-b[35:32],
  79.     4'h9-b[31:28], 4'h9-b[27:24],
  80.     4'h9-b[23:20], 4'h9-b[19:16],
  81.     4'h9-b[15:12], 4'h9-b[11: 8],
  82.     4'h9-b[ 7: 4], 4'h9-b[ 3: 0]    };
  83.  
  84. assign  tBi = mode ? tBinv : b;
  85. assign  tCi = mode ? !c_in : c_in;
  86.  
  87. wire[63:0]  tCa;
  88. wire[63:0]  tCa0;
  89. wire[63:0]  tCa1;
  90.  
  91. wire    tCarry01a;
  92. wire    tCarry02a;
  93. wire    tCarry03a;
  94. wire    tCarry04a;
  95. wire    tCarry05a;
  96. wire    tCarry06a;
  97. wire    tCarry07a;
  98. wire    tCarry08a;
  99. wire    tCarry09a;
  100. wire    tCarry10a;
  101. wire    tCarry11a;
  102. wire    tCarry12a;
  103. wire    tCarry13a;
  104. wire    tCarry14a;
  105. wire    tCarry15a;
  106. wire    tCarry16a;
  107.  
  108. wire    tCarry01b;
  109. wire    tCarry02b;
  110. wire    tCarry03b;
  111. wire    tCarry04b;
  112. wire    tCarry05b;
  113. wire    tCarry06b;
  114. wire    tCarry07b;
  115. wire    tCarry08b;
  116. wire    tCarry09b;
  117. wire    tCarry10b;
  118. wire    tCarry11b;
  119. wire    tCarry12b;
  120. wire    tCarry13b;
  121. wire    tCarry14b;
  122. wire    tCarry15b;
  123. wire    tCarry16b;
  124.  
  125. ExBcdAdd4   add01a(a[ 3: 0], tBi[ 3: 0], tCa0[ 3: 0], 1'b0     , tCarry01a);
  126. ExBcdAdd4   add02a(a[ 7: 4], tBi[ 7: 4], tCa0[ 7: 4], tCarry01a, tCarry02a);
  127. ExBcdAdd4   add01b(a[ 3: 0], tBi[ 3: 0], tCa1[ 3: 0], 1'b1     , tCarry01b);
  128. ExBcdAdd4   add02b(a[ 7: 4], tBi[ 7: 4], tCa1[ 7: 4], tCarry01b, tCarry02b);
  129.  
  130. ExBcdAdd4   add03a(a[11: 8], tBi[11: 8], tCa0[11: 8], 1'b0     , tCarry03a);
  131. ExBcdAdd4   add04a(a[15:12], tBi[15:12], tCa0[15:12], tCarry03a, tCarry04a);
  132. ExBcdAdd4   add03b(a[11: 8], tBi[11: 8], tCa1[11: 8], 1'b1     , tCarry03b);
  133. ExBcdAdd4   add04b(a[15:12], tBi[15:12], tCa1[15:12], tCarry03b, tCarry04b);
  134.  
  135. ExBcdAdd4   add05a(a[19:16], tBi[19:16], tCa0[19:16], 1'b0     , tCarry05a);
  136. ExBcdAdd4   add06a(a[23:20], tBi[23:20], tCa0[23:20], tCarry05a, tCarry06a);
  137. ExBcdAdd4   add05b(a[19:16], tBi[19:16], tCa1[19:16], 1'b1     , tCarry05b);
  138. ExBcdAdd4   add06b(a[23:20], tBi[23:20], tCa1[23:20], tCarry05b, tCarry06b);
  139.  
  140. ExBcdAdd4   add07a(a[27:24], tBi[27:24], tCa0[27:24], 1'b0     , tCarry07a);
  141. ExBcdAdd4   add08a(a[31:28], tBi[31:28], tCa0[31:28], tCarry07a, tCarry08a);
  142. ExBcdAdd4   add07b(a[27:24], tBi[27:24], tCa1[27:24], 1'b1     , tCarry07b);
  143. ExBcdAdd4   add08b(a[31:28], tBi[31:28], tCa1[31:28], tCarry07b, tCarry08b);
  144.  
  145. ExBcdAdd4   add09a(a[35:32], tBi[35:32], tCa0[35:32], 1'b0     , tCarry09a);
  146. ExBcdAdd4   add10a(a[39:36], tBi[39:36], tCa0[39:36], tCarry09a, tCarry10a);
  147. ExBcdAdd4   add09b(a[35:32], tBi[35:32], tCa1[35:32], 1'b1     , tCarry09b);
  148. ExBcdAdd4   add10b(a[39:36], tBi[39:36], tCa1[39:36], tCarry09b, tCarry10b);
  149.  
  150. ExBcdAdd4   add11a(a[43:40], tBi[43:40], tCa0[43:40], 1'b0     , tCarry11a);
  151. ExBcdAdd4   add12a(a[47:44], tBi[47:44], tCa0[47:44], tCarry11a, tCarry12a);
  152. ExBcdAdd4   add11b(a[43:40], tBi[43:40], tCa1[43:40], 1'b1     , tCarry11b);
  153. ExBcdAdd4   add12b(a[47:44], tBi[47:44], tCa1[47:44], tCarry11b, tCarry12b);
  154.  
  155. ExBcdAdd4   add13a(a[51:48], tBi[51:48], tCa0[51:48], 1'b0     , tCarry13a);
  156. ExBcdAdd4   add14a(a[55:52], tBi[55:52], tCa0[55:52], tCarry13a, tCarry14a);
  157. ExBcdAdd4   add13b(a[51:48], tBi[51:48], tCa1[51:48], 1'b1     , tCarry13b);
  158. ExBcdAdd4   add14b(a[55:52], tBi[55:52], tCa1[55:52], tCarry13b, tCarry14b);
  159.  
  160. ExBcdAdd4   add15a(a[59:56], tBi[59:56], tCa0[59:56], 1'b0     , tCarry15a);
  161. ExBcdAdd4   add16a(a[63:60], tBi[63:60], tCa0[63:60], tCarry15a, tCarry16a);
  162. ExBcdAdd4   add15b(a[59:56], tBi[59:56], tCa1[59:56], 1'b1     , tCarry15b);
  163. ExBcdAdd4   add16b(a[63:60], tBi[63:60], tCa1[63:60], tCarry15b, tCarry16b);
  164.  
  165. wire tCc0_0 = 1'b0   ? tCarry02b : tCarry02a;
  166. wire tCc0_1 = tCc0_0 ? tCarry04b : tCarry04a;
  167. wire tCc0_2 = tCc0_1 ? tCarry06b : tCarry06a;
  168. wire tCc0_3 = tCc0_2 ? tCarry08b : tCarry08a;
  169. wire tCc0_4 = tCc0_3 ? tCarry10b : tCarry10a;
  170. wire tCc0_5 = tCc0_4 ? tCarry12b : tCarry12a;
  171. wire tCc0_6 = tCc0_5 ? tCarry14b : tCarry14a;
  172. wire tCc0_7 = tCc0_6 ? tCarry16b : tCarry16a;
  173.  
  174. wire tCc1_0 = 1'b1   ? tCarry02b : tCarry02a;
  175. wire tCc1_1 = tCc1_0 ? tCarry04b : tCarry04a;
  176. wire tCc1_2 = tCc1_1 ? tCarry06b : tCarry06a;
  177. wire tCc1_3 = tCc1_2 ? tCarry08b : tCarry08a;
  178. wire tCc1_4 = tCc1_3 ? tCarry10b : tCarry10a;
  179. wire tCc1_5 = tCc1_4 ? tCarry12b : tCarry12a;
  180. wire tCc1_6 = tCc1_5 ? tCarry14b : tCarry14a;
  181. wire tCc1_7 = tCc1_6 ? tCarry16b : tCarry16a;
  182.  
  183. wire tCc_0 = tCi ? tCc1_0 : tCc0_0;
  184. wire tCc_1 = tCi ? tCc1_1 : tCc0_1;
  185. wire tCc_2 = tCi ? tCc1_2 : tCc0_2;
  186. wire tCc_3 = tCi ? tCc1_3 : tCc0_3;
  187. wire tCc_4 = tCi ? tCc1_4 : tCc0_4;
  188. wire tCc_5 = tCi ? tCc1_5 : tCc0_5;
  189. wire tCc_6 = tCi ? tCc1_6 : tCc0_6;
  190. wire tCc_7 = tCi ? tCc1_7 : tCc0_7;
  191.  
  192. assign  tCa[ 7: 0] = tCi   ? tCa1[ 7: 0] : tCa0[ 7: 0];
  193. assign  tCa[15: 8] = tCc_0 ? tCa1[15: 8] : tCa0[15: 8];
  194. assign  tCa[23:16] = tCc_1 ? tCa1[23:16] : tCa0[23:16];
  195. assign  tCa[31:24] = tCc_2 ? tCa1[31:24] : tCa0[31:24];
  196. assign  tCa[39:32] = tCc_3 ? tCa1[39:32] : tCa0[39:32];
  197. assign  tCa[47:40] = tCc_4 ? tCa1[47:40] : tCa0[47:40];
  198. assign  tCa[55:48] = tCc_5 ? tCa1[55:48] : tCa0[55:48];
  199. assign  tCa[63:56] = tCc_6 ? tCa1[63:56] : tCa0[63:56];
  200.  
  201. assign      c = tCa;
  202. assign      c_out = tCc_7;
  203.  
  204. endmodule
  205.  
  206.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement