📄 arith.bsv
字号:
//----------------------------------------------------------------------//// The MIT License // // Copyright (c) 2007 Alfred Man Cheuk Ng, mcn02@mit.edu // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use,// copy, modify, merge, publish, distribute, sublicense, and/or sell// copies of the Software, and to permit persons to whom the// Software is furnished to do so, subject to the following conditions:// // The above copyright notice and this permission notice shall be// included in all copies or substantial portions of the Software.// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR// OTHER DEALINGS IN THE SOFTWARE.//----------------------------------------------------------------------////**********************************************************************// Galois field arithmetic//----------------------------------------------------------------------// $Id: Arith.bsv// import Types::*;// -----------------------------------------------------------// The primitive polynomial defines the Galois field in which // Reed-Solomon decoder operates, and all the following // arithmetic operations are defined under. Changing this // value cause the whole Reed-Solomon decoder to operate // under the new primitive polynomial.// primitive_polynomial[i] = Coefficient of x**i for i = 0:7// -----------------------------------------------------------Byte primitive_polynomial = 8'b00011101;Byte n_param = 8'd255;Byte t_param = 8'd16;// -----------------------------------------------------------(* noinline *) function Byte gf_mult (Byte left, Byte right); Word result = 16'b0;// for (int i = 0; i < 8; i = i + 1)// for (int j = 0; j < 8; j = j + 1)// result [i + j] = result [i + j] ^ (left [j] & right [i]);// for (int i = 15; i > 7; i = i - 1)// if (result [i] == 1'b1)// result = result ^ ((zeroExtend (primitive_polynomial)) << (i - 8)); result [0] = result [0] ^ (left [0] & right [0]); result [1] = result [1] ^ (left [1] & right [0]) ^ (left [0] & right [1]); result [2] = result [2] ^ (left [2] & right [0]) ^ (left [1] & right [1]) ^ (left [0] & right [2]); result [3] = result [3] ^ (left [3] & right [0]) ^ (left [2] & right [1]) ^ (left [1] & right [2]) ^ (left [0] & right [3]); result [4] = result [4] ^ (left [4] & right [0]) ^ (left [3] & right [1]) ^ (left [2] & right [2]) ^ (left [1] & right [3]) ^ (left [0] & right [4]); 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]); 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]); 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]); 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]); 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]); result [10] = result [10] ^ (left [7] & right [3]) ^ (left [6] & right [4]) ^ (left [5] & right [5]) ^ (left [4] & right [6]) ^ (left [3] & right [7]); result [11] = result [11] ^ (left [7] & right [4]) ^ (left [6] & right [5]) ^ (left [5] & right [6]) ^ (left [4] & right [7]); result [12] = result [12] ^ (left [7] & right [5]) ^ (left [6] & right [6]) ^ (left [5] & right [7]); result [13] = result [13] ^ (left [7] & right [6]) ^ (left [6] & right [7]); result [14] = result [14] ^ (left [7] & right [7]); if (result [14] == 1'b1) result = result ^ ((zeroExtend (primitive_polynomial)) << (6)); if (result [13] == 1'b1) result = result ^ ((zeroExtend (primitive_polynomial)) << (5)); if (result [12] == 1'b1) result = result ^ ((zeroExtend (primitive_polynomial)) << (4)); if (result [11] == 1'b1) result = result ^ ((zeroExtend (primitive_polynomial)) << (3)); if (result [10] == 1'b1) result = result ^ ((zeroExtend (primitive_polynomial)) << (2)); if (result [9] == 1'b1) result = result ^ ((zeroExtend (primitive_polynomial)) << (1)); if (result [8] == 1'b1) result = result ^ ((zeroExtend (primitive_polynomial)) << (0)); return (result [7:0]);endfunction// -----------------------------------------------------------function Byte gf_add (Byte left, Byte right); return (left ^ right);endfunction// -----------------------------------------------------------// function Byte const_alpha_n (int n);// //if (n == 0)// // return 1;// Byte a_n = 2;// for (int i = 1; i < n; i = i + 1)// a_n = gf_mult (a_n, 2);// return a_n;// endfunctionfunction Byte gf_inv (Byte a); case (a) matches 0 : return 2; 1 : return 1; 2 : return 142; 3 : return 244; 4 : return 71; 5 : return 167; 6 : return 122; 7 : return 186; 8 : return 173; 9 : return 157; 10 : return 221; 11 : return 152; 12 : return 61; 13 : return 170; 14 : return 93; 15 : return 150; 16 : return 216; 17 : return 114; 18 : return 192; 19 : return 88; 20 : return 224; 21 : return 62; 22 : return 76; 23 : return 102; 24 : return 144; 25 : return 222; 26 : return 85; 27 : return 128; 28 : return 160; 29 : return 131; 30 : return 75; 31 : return 42; 32 : return 108; 33 : return 237; 34 : return 57; 35 : return 81; 36 : return 96; 37 : return 86; 38 : return 44; 39 : return 138; 40 : return 112; 41 : return 208; 42 : return 31; 43 : return 74; 44 : return 38; 45 : return 139; 46 : return 51; 47 : return 110; 48 : return 72; 49 : return 137; 50 : return 111; 51 : return 46; 52 : return 164; 53 : return 195; 54 : return 64; 55 : return 94; 56 : return 80; 57 : return 34; 58 : return 207; 59 : return 169; 60 : return 171; 61 : return 12; 62 : return 21; 63 : return 225; 64 : return 54; 65 : return 95; 66 : return 248; 67 : return 213; 68 : return 146; 69 : return 78; 70 : return 166; 71 : return 4; 72 : return 48; 73 : return 136; 74 : return 43; 75 : return 30; 76 : return 22; 77 : return 103; 78 : return 69; 79 : return 147; 80 : return 56; 81 : return 35; 82 : return 104; 83 : return 140; 84 : return 129; 85 : return 26; 86 : return 37; 87 : return 97; 88 : return 19; 89 : return 193; 90 : return 203; 91 : return 99; 92 : return 151; 93 : return 14; 94 : return 55; 95 : return 65; 96 : return 36; 97 : return 87; 98 : return 202; 99 : return 91; 100 : return 185; 101 : return 196; 102 : return 23; 103 : return 77; 104 : return 82; 105 : return 141; 106 : return 239; 107 : return 179; 108 : return 32; 109 : return 236; 110 : return 47; 111 : return 50; 112 : return 40; 113 : return 209; 114 : return 17; 115 : return 217; 116 : return 233; 117 : return 251; 118 : return 218; 119 : return 121; 120 : return 219; 121 : return 119; 122 : return 6; 123 : return 187; 124 : return 132; 125 : return 205; 126 : return 254; 127 : return 252; 128 : return 27; 129 : return 84; 130 : return 161; 131 : return 29; 132 : return 124; 133 : return 204; 134 : return 228; 135 : return 176; 136 : return 73; 137 : return 49; 138 : return 39; 139 : return 45; 140 : return 83; 141 : return 105; 142 : return 2; 143 : return 245; 144 : return 24; 145 : return 223; 146 : return 68; 147 : return 79; 148 : return 155; 149 : return 188; 150 : return 15; 151 : return 92; 152 : return 11; 153 : return 220; 154 : return 189; 155 : return 148; 156 : return 172; 157 : return 9; 158 : return 199; 159 : return 162; 160 : return 28; 161 : return 130; 162 : return 159; 163 : return 198; 164 : return 52; 165 : return 194; 166 : return 70; 167 : return 5; 168 : return 206; 169 : return 59; 170 : return 13; 171 : return 60; 172 : return 156; 173 : return 8; 174 : return 190; 175 : return 183; 176 : return 135; 177 : return 229; 178 : return 238; 179 : return 107; 180 : return 235; 181 : return 242; 182 : return 191; 183 : return 175; 184 : return 197; 185 : return 100; 186 : return 7; 187 : return 123; 188 : return 149; 189 : return 154; 190 : return 174; 191 : return 182; 192 : return 18; 193 : return 89; 194 : return 165; 195 : return 53; 196 : return 101; 197 : return 184; 198 : return 163; 199 : return 158; 200 : return 210; 201 : return 247; 202 : return 98; 203 : return 90; 204 : return 133; 205 : return 125; 206 : return 168; 207 : return 58; 208 : return 41; 209 : return 113; 210 : return 200; 211 : return 246; 212 : return 249; 213 : return 67; 214 : return 215; 215 : return 214; 216 : return 16; 217 : return 115; 218 : return 118;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -