ReedArith.bsv
上传用户:aoptech
上传日期:2014-09-22
资源大小:784k
文件大小:15k
源码类别:

3G开发

开发平台:

Others

  1. //----------------------------------------------------------------------//
  2. // The MIT License 
  3. // 
  4. // Copyright (c) 2007 Alfred Man Cheuk Ng, mcn02@mit.edu 
  5. // 
  6. // Permission is hereby granted, free of charge, to any person 
  7. // obtaining a copy of this software and associated documentation 
  8. // files (the "Software"), to deal in the Software without 
  9. // restriction, including without limitation the rights to use,
  10. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the
  12. // Software is furnished to do so, subject to the following conditions:
  13. // 
  14. // The above copyright notice and this permission notice shall be
  15. // included in all copies or substantial portions of the Software.
  16. // 
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  21. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  23. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. // OTHER DEALINGS IN THE SOFTWARE.
  25. //----------------------------------------------------------------------//
  26. //**********************************************************************
  27. // Galois field arithmetic
  28. //----------------------------------------------------------------------
  29. // $Id: Arith.bsv
  30. //
  31. import ReedTypes::*;  
  32. import Vector::*;
  33. // -----------------------------------------------------------
  34. // The primitive polynomial defines the Galois field in which 
  35. // Reed-Solomon decoder operates, and all the following   
  36. // arithmetic operations are defined under.  Changing this    
  37. // value cause the whole Reed-Solomon decoder to operate   
  38. // under the new primitive polynomial.
  39. // primitive_polynomial[i] = Coefficient of x**i for i = 0:7
  40. // -----------------------------------------------------------
  41. Byte    n_param              = 8'd255;
  42. Byte    t_param              = 8'd16;
  43. // -----------------------------------------------------------
  44. //(* noinline *) 
  45. function Byte gf_mult (Polynomial primitive_polynomial, Byte left, Byte right);
  46.    
  47.    Bit#(15) first  = 15'b0;
  48.    Bit#(15) result = 15'b0;
  49.    
  50.    // this function bring back higher degree values back to the field
  51.    function Byte getAddSymbol(Bool ctrl, Integer shift);
  52.       Byte shiftPoly = primitive_polynomial << shift; 
  53.       Byte addSymbol = ctrl ? shiftPoly : 0; 
  54.       return addSymbol;
  55.    endfunction
  56.    
  57.   for (Integer i = 0; i < 8; i = i + 1)
  58.      for (Integer j = 0; j < 8 ; j = j + 1)
  59.         begin
  60.            if (first[i+j] == 0) // initialize result[i+j]
  61.               result[i+j] = (left[i] & right[j]);
  62.            else                 // accumulate
  63.               result[i+j] = result[i+j] ^ (left[i] & right[j]);
  64.            first[i+j] = 1; // only initialize each signal once 
  65.         end
  66.    
  67.   Vector#(7,Bool) ctrlVec = unpack(result[14:8]);
  68.   Byte finalResult = fold( ^ ,cons(result[7:0],zipWith(getAddSymbol,ctrlVec,genVector)));
  69.    
  70.   return finalResult;
  71. //    result [0] = result [0] ^ (left [0] & right [0]);
  72. //    result [1] = result [1] ^ (left [1] & right [0]) ^ (left [0] & right [1]);
  73. //    result [2] = result [2] ^ (left [2] & right [0]) ^ (left [1] & right [1]) ^ (left [0] & right [2]);
  74. //    result [3] = result [3] ^ (left [3] & right [0]) ^ (left [2] & right [1]) ^ (left [1] & right [2]) ^ (left [0] & right [3]);
  75. //    result [4] = result [4] ^ (left [4] & right [0]) ^ (left [3] & right [1]) ^ (left [2] & right [2]) ^ (left [1] & right [3]) ^ (left [0] & right [4]);
  76. //    result [5] = result [5] ^ (left [5] & right [0]) ^ (left [4] & right [1]) ^ (left [3] & right [2]) ^ (left [2] & right [3]) ^ (left [1] & right [4]) ^ (left [0] & right [5]);
  77. //    result [6] = result [6] ^ (left [6] & right [0]) ^ (left [5] & right [1]) ^ (left [4] & right [2]) ^ (left [3] & right [3]) ^ (left [2] & right [4]) ^ (left [1] & right [5]) ^ (left [0] & right [6]);
  78. //    result [7] = result [7] ^ (left [7] & right [0]) ^ (left [6] & right [1]) ^ (left [5] & right [2]) ^ (left [4] & right [3]) ^ (left [3] & right [4]) ^ (left [2] & right [5]) ^ (left [1] & right [6]) ^ (left [0] & right [7]);
  79. //    result [8] = result [8] ^ (left [7] & right [1]) ^ (left [6] & right [2]) ^ (left [5] & right [3]) ^ (left [4] & right [4]) ^ (left [3] & right [5]) ^ (left [2] & right [6]) ^ (left [1] & right [7]);
  80. //    result [9] = result [9] ^ (left [7] & right [2]) ^ (left [6] & right [3]) ^ (left [5] & right [4]) ^ (left [4] & right [5]) ^ (left [3] & right [6]) ^ (left [2] & right [7]);
  81. //    result [10] = result [10] ^ (left [7] & right [3]) ^ (left [6] & right [4]) ^ (left [5] & right [5]) ^ (left [4] & right [6]) ^ (left [3] & right [7]);
  82. //    result [11] = result [11] ^ (left [7] & right [4]) ^ (left [6] & right [5]) ^ (left [5] & right [6]) ^ (left [4] & right [7]);
  83. //    result [12] = result [12] ^ (left [7] & right [5]) ^ (left [6] & right [6]) ^ (left [5] & right [7]);
  84. //    result [13] = result [13] ^ (left [7] & right [6]) ^ (left [6] & right [7]);
  85. //    result [14] = result [14] ^ (left [7] & right [7]);
  86. //    if (result [14] == 1'b1)
  87. //       result = result ^ ((zeroExtend (primitive_polynomial)) << (6));
  88. //    if (result [13] == 1'b1)
  89. //       result = result ^ ((zeroExtend (primitive_polynomial)) << (5));
  90. //    if (result [12] == 1'b1)
  91. //       result = result ^ ((zeroExtend (primitive_polynomial)) << (4));
  92. //    if (result [11] == 1'b1)
  93. //       result = result ^ ((zeroExtend (primitive_polynomial)) << (3));
  94. //    if (result [10] == 1'b1)
  95. //       result = result ^ ((zeroExtend (primitive_polynomial)) << (2));
  96. //    if (result [9] == 1'b1)
  97. //       result = result ^ ((zeroExtend (primitive_polynomial)) << (1));
  98. //    if (result [8] == 1'b1)
  99. //       result = result ^ ((zeroExtend (primitive_polynomial)) << (0));
  100. //   return (result [7:0]);
  101. endfunction
  102. // -----------------------------------------------------------
  103. function Byte gf_add (Byte left, Byte right);
  104.    return (left ^ right);
  105. endfunction
  106. // -----------------------------------------------------------
  107. //(* noinline *) 
  108. function Byte alpha_n (Polynomial primitive_polynomial, Byte n);
  109.    return times_alpha_n(primitive_polynomial, 1,n);
  110. endfunction
  111. // -----------------------------------------------------------
  112. //(* noinline *) 
  113. function Byte times_alpha_n (Polynomial primitive_polynomial, Byte a, Byte n);
  114. //    Byte b=a;
  115. //    for (Byte i = 0; i < n; i = i + 1)
  116. //       b=times_alpha(primitive_polynomial, b);
  117. //    return b;
  118.    Byte multVal = 1 << n;
  119.    return gf_mult(primitive_polynomial,a,multVal);
  120. endfunction
  121. // -----------------------------------------------------------
  122. //(* noinline *) 
  123. function Byte times_alpha (Polynomial primitive_polynomial, Byte a);
  124.    return gf_mult(primitive_polynomial, a, 2);
  125. //   return (a<<1)^({a[7],a[7],a[7],a[7],a[7],a[7],a[7],a[7]} & primitive_polynomial);
  126. endfunction
  127. // // -----------------------------------------------------------
  128. // function Byte gf_inv (Byte a);
  129. //    case (a) matches
  130. //         0 : return         2;
  131. //         1 : return         1;
  132. //         2 : return       142;
  133. //         3 : return       244;
  134. //         4 : return        71;
  135. //         5 : return       167;
  136. //         6 : return       122;
  137. //         7 : return       186;
  138. //         8 : return       173;
  139. //         9 : return       157;
  140. //        10 : return       221;
  141. //        11 : return       152;
  142. //        12 : return        61;
  143. //        13 : return       170;
  144. //        14 : return        93;
  145. //        15 : return       150;
  146. //        16 : return       216;
  147. //        17 : return       114;
  148. //        18 : return       192;
  149. //        19 : return        88;
  150. //        20 : return       224;
  151. //        21 : return        62;
  152. //        22 : return        76;
  153. //        23 : return       102;
  154. //        24 : return       144;
  155. //        25 : return       222;
  156. //        26 : return        85;
  157. //        27 : return       128;
  158. //        28 : return       160;
  159. //        29 : return       131;
  160. //        30 : return        75;
  161. //        31 : return        42;
  162. //        32 : return       108;
  163. //        33 : return       237;
  164. //        34 : return        57;
  165. //        35 : return        81;
  166. //        36 : return        96;
  167. //        37 : return        86;
  168. //        38 : return        44;
  169. //        39 : return       138;
  170. //        40 : return       112;
  171. //        41 : return       208;
  172. //        42 : return        31;
  173. //        43 : return        74;
  174. //        44 : return        38;
  175. //        45 : return       139;
  176. //        46 : return        51;
  177. //        47 : return       110;
  178. //        48 : return        72;
  179. //        49 : return       137;
  180. //        50 : return       111;
  181. //        51 : return        46;
  182. //        52 : return       164;
  183. //        53 : return       195;
  184. //        54 : return        64;
  185. //        55 : return        94;
  186. //        56 : return        80;
  187. //        57 : return        34;
  188. //        58 : return       207;
  189. //        59 : return       169;
  190. //        60 : return       171;
  191. //        61 : return        12;
  192. //        62 : return        21;
  193. //        63 : return       225;
  194. //        64 : return        54;
  195. //        65 : return        95;
  196. //        66 : return       248;
  197. //        67 : return       213;
  198. //        68 : return       146;
  199. //        69 : return        78;
  200. //        70 : return       166;
  201. //        71 : return         4;
  202. //        72 : return        48;
  203. //        73 : return       136;
  204. //        74 : return        43;
  205. //        75 : return        30;
  206. //        76 : return        22;
  207. //        77 : return       103;
  208. //        78 : return        69;
  209. //        79 : return       147;
  210. //        80 : return        56;
  211. //        81 : return        35;
  212. //        82 : return       104;
  213. //        83 : return       140;
  214. //        84 : return       129;
  215. //        85 : return        26;
  216. //        86 : return        37;
  217. //        87 : return        97;
  218. //        88 : return        19;
  219. //        89 : return       193;
  220. //        90 : return       203;
  221. //        91 : return        99;
  222. //        92 : return       151;
  223. //        93 : return        14;
  224. //        94 : return        55;
  225. //        95 : return        65;
  226. //        96 : return        36;
  227. //        97 : return        87;
  228. //        98 : return       202;
  229. //        99 : return        91;
  230. //       100 : return       185;
  231. //       101 : return       196;
  232. //       102 : return        23;
  233. //       103 : return        77;
  234. //       104 : return        82;
  235. //       105 : return       141;
  236. //       106 : return       239;
  237. //       107 : return       179;
  238. //       108 : return        32;
  239. //       109 : return       236;
  240. //       110 : return        47;
  241. //       111 : return        50;
  242. //       112 : return        40;
  243. //       113 : return       209;
  244. //       114 : return        17;
  245. //       115 : return       217;
  246. //       116 : return       233;
  247. //       117 : return       251;
  248. //       118 : return       218;
  249. //       119 : return       121;
  250. //       120 : return       219;
  251. //       121 : return       119;
  252. //       122 : return         6;
  253. //       123 : return       187;
  254. //       124 : return       132;
  255. //       125 : return       205;
  256. //       126 : return       254;
  257. //       127 : return       252;
  258. //       128 : return        27;
  259. //       129 : return        84;
  260. //       130 : return       161;
  261. //       131 : return        29;
  262. //       132 : return       124;
  263. //       133 : return       204;
  264. //       134 : return       228;
  265. //       135 : return       176;
  266. //       136 : return        73;
  267. //       137 : return        49;
  268. //       138 : return        39;
  269. //       139 : return        45;
  270. //       140 : return        83;
  271. //       141 : return       105;
  272. //       142 : return         2;
  273. //       143 : return       245;
  274. //       144 : return        24;
  275. //       145 : return       223;
  276. //       146 : return        68;
  277. //       147 : return        79;
  278. //       148 : return       155;
  279. //       149 : return       188;
  280. //       150 : return        15;
  281. //       151 : return        92;
  282. //       152 : return        11;
  283. //       153 : return       220;
  284. //       154 : return       189;
  285. //       155 : return       148;
  286. //       156 : return       172;
  287. //       157 : return         9;
  288. //       158 : return       199;
  289. //       159 : return       162;
  290. //       160 : return        28;
  291. //       161 : return       130;
  292. //       162 : return       159;
  293. //       163 : return       198;
  294. //       164 : return        52;
  295. //       165 : return       194;
  296. //       166 : return        70;
  297. //       167 : return         5;
  298. //       168 : return       206;
  299. //       169 : return        59;
  300. //       170 : return        13;
  301. //       171 : return        60;
  302. //       172 : return       156;
  303. //       173 : return         8;
  304. //       174 : return       190;
  305. //       175 : return       183;
  306. //       176 : return       135;
  307. //       177 : return       229;
  308. //       178 : return       238;
  309. //       179 : return       107;
  310. //       180 : return       235;
  311. //       181 : return       242;
  312. //       182 : return       191;
  313. //       183 : return       175;
  314. //       184 : return       197;
  315. //       185 : return       100;
  316. //       186 : return         7;
  317. //       187 : return       123;
  318. //       188 : return       149;
  319. //       189 : return       154;
  320. //       190 : return       174;
  321. //       191 : return       182;
  322. //       192 : return        18;
  323. //       193 : return        89;
  324. //       194 : return       165;
  325. //       195 : return        53;
  326. //       196 : return       101;
  327. //       197 : return       184;
  328. //       198 : return       163;
  329. //       199 : return       158;
  330. //       200 : return       210;
  331. //       201 : return       247;
  332. //       202 : return        98;
  333. //       203 : return        90;
  334. //       204 : return       133;
  335. //       205 : return       125;
  336. //       206 : return       168;
  337. //       207 : return        58;
  338. //       208 : return        41;
  339. //       209 : return       113;
  340. //       210 : return       200;
  341. //       211 : return       246;
  342. //       212 : return       249;
  343. //       213 : return        67;
  344. //       214 : return       215;
  345. //       215 : return       214;
  346. //       216 : return        16;
  347. //       217 : return       115;
  348. //       218 : return       118;
  349. //       219 : return       120;
  350. //       220 : return       153;
  351. //       221 : return        10;
  352. //       222 : return        25;
  353. //       223 : return       145;
  354. //       224 : return        20;
  355. //       225 : return        63;
  356. //       226 : return       230;
  357. //       227 : return       240;
  358. //       228 : return       134;
  359. //       229 : return       177;
  360. //       230 : return       226;
  361. //       231 : return       241;
  362. //       232 : return       250;
  363. //       233 : return       116;
  364. //       234 : return       243;
  365. //       235 : return       180;
  366. //       236 : return       109;
  367. //       237 : return        33;
  368. //       238 : return       178;
  369. //       239 : return       106;
  370. //       240 : return       227;
  371. //       241 : return       231;
  372. //       242 : return       181;
  373. //       243 : return       234;
  374. //       244 : return         3;
  375. //       245 : return       143;
  376. //       246 : return       211;
  377. //       247 : return       201;
  378. //       248 : return        66;
  379. //       249 : return       212;
  380. //       250 : return       232;
  381. //       251 : return       117;
  382. //       252 : return       127;
  383. //       253 : return       255;
  384. //       254 : return       126;
  385. //       255 : return       253;
  386. //    endcase
  387. // endfunction