|
| 1 | +// Chuck Benz, Hollis, NH Copyright (c)2002 |
| 2 | +// |
| 3 | +// The information and description contained herein is the |
| 4 | +// property of Chuck Benz. |
| 5 | +// |
| 6 | +// Permission is granted for any reuse of this information |
| 7 | +// and description as long as this copyright notice is |
| 8 | +// preserved. Modifications may be made as long as this |
| 9 | +// notice is preserved. |
| 10 | + |
| 11 | +// per Widmer and Franaszek |
| 12 | + |
| 13 | + |
| 14 | +module decode_8b10b (datain, dispin, dataout, dispout, code_err, disp_err); |
| 15 | + input [9:0] datain; |
| 16 | + input dispin; |
| 17 | + output [8:0] dataout; |
| 18 | + output dispout; |
| 19 | + output code_err; |
| 20 | + output disp_err; |
| 21 | + |
| 22 | + wire ai = datain[0]; |
| 23 | + wire bi = datain[1]; |
| 24 | + wire ci = datain[2]; |
| 25 | + wire di = datain[3]; |
| 26 | + wire ei = datain[4]; |
| 27 | + wire ii = datain[5]; |
| 28 | + wire fi = datain[6]; |
| 29 | + wire gi = datain[7]; |
| 30 | + wire hi = datain[8]; |
| 31 | + wire ji = datain[9]; |
| 32 | + |
| 33 | + wire aeqb = (ai & bi) | (!ai & !bi); |
| 34 | + wire ceqd = (ci & di) | (!ci & !di); |
| 35 | + wire p22 = (ai & bi & !ci & !di) | |
| 36 | + (ci & di & !ai & !bi) | |
| 37 | + ( !aeqb & !ceqd); |
| 38 | + wire p13 = ( !aeqb & !ci & !di) | |
| 39 | + ( !ceqd & !ai & !bi); |
| 40 | + wire p31 = ( !aeqb & ci & di) | |
| 41 | + ( !ceqd & ai & bi); |
| 42 | + |
| 43 | + wire p40 = ai & bi & ci & di; |
| 44 | + wire p04 = !ai & !bi & !ci & !di; |
| 45 | + |
| 46 | + wire disp6a = p31 | (p22 & dispin); // pos disp if p22 and was pos, or p31. |
| 47 | + wire disp6a2 = p31 & dispin; // disp is ++ after 4 bits |
| 48 | + wire disp6a0 = p13 & ! dispin; // -- disp after 4 bits |
| 49 | + |
| 50 | + wire disp6b = (((ei & ii & ! disp6a0) | (disp6a & (ei | ii)) | disp6a2 | |
| 51 | + (ei & ii & di)) & (ei | ii | di)); |
| 52 | + |
| 53 | + // The 5B/6B decoding special cases where ABCDE != abcde |
| 54 | + |
| 55 | + wire p22bceeqi = p22 & bi & ci & (ei == ii); |
| 56 | + wire p22bncneeqi = p22 & !bi & !ci & (ei == ii); |
| 57 | + wire p13in = p13 & !ii; |
| 58 | + wire p31i = p31 & ii; |
| 59 | + wire p13dei = p13 & di & ei & ii; |
| 60 | + wire p22aceeqi = p22 & ai & ci & (ei == ii); |
| 61 | + wire p22ancneeqi = p22 & !ai & !ci & (ei == ii); |
| 62 | + wire p13en = p13 & !ei; |
| 63 | + wire anbnenin = !ai & !bi & !ei & !ii; |
| 64 | + wire abei = ai & bi & ei & ii; |
| 65 | + wire cdei = ci & di & ei & ii; |
| 66 | + wire cndnenin = !ci & !di & !ei & !ii; |
| 67 | + |
| 68 | + // non-zero disparity cases: |
| 69 | + wire p22enin = p22 & !ei & !ii; |
| 70 | + wire p22ei = p22 & ei & ii; |
| 71 | + //wire p13in = p12 & !ii; |
| 72 | + //wire p31i = p31 & ii; |
| 73 | + wire p31dnenin = p31 & !di & !ei & !ii; |
| 74 | + //wire p13dei = p13 & di & ei & ii; |
| 75 | + wire p31e = p31 & ei; |
| 76 | + |
| 77 | + wire compa = p22bncneeqi | p31i | p13dei | p22ancneeqi | |
| 78 | + p13en | abei | cndnenin; |
| 79 | + wire compb = p22bceeqi | p31i | p13dei | p22aceeqi | |
| 80 | + p13en | abei | cndnenin; |
| 81 | + wire compc = p22bceeqi | p31i | p13dei | p22ancneeqi | |
| 82 | + p13en | anbnenin | cndnenin; |
| 83 | + wire compd = p22bncneeqi | p31i | p13dei | p22aceeqi | |
| 84 | + p13en | abei | cndnenin; |
| 85 | + wire compe = p22bncneeqi | p13in | p13dei | p22ancneeqi | |
| 86 | + p13en | anbnenin | cndnenin; |
| 87 | + |
| 88 | + wire ao = ai ^ compa; |
| 89 | + wire bo = bi ^ compb; |
| 90 | + wire co = ci ^ compc; |
| 91 | + wire do_ = di ^ compd; |
| 92 | + wire eo = ei ^ compe; |
| 93 | + |
| 94 | + wire feqg = (fi & gi) | (!fi & !gi); |
| 95 | + wire heqj = (hi & ji) | (!hi & !ji); |
| 96 | + wire fghj22 = (fi & gi & !hi & !ji) | |
| 97 | + (!fi & !gi & hi & ji) | |
| 98 | + ( !feqg & !heqj); |
| 99 | + wire fghjp13 = ( !feqg & !hi & !ji) | |
| 100 | + ( !heqj & !fi & !gi); |
| 101 | + wire fghjp31 = ( (!feqg) & hi & ji) | |
| 102 | + ( !heqj & fi & gi); |
| 103 | + |
| 104 | + wire dispout = (fghjp31 | (disp6b & fghj22) | (hi & ji)) & (hi | ji); |
| 105 | + |
| 106 | + wire ko = ( (ci & di & ei & ii) | ( !ci & !di & !ei & !ii) | |
| 107 | + (p13 & !ei & ii & gi & hi & ji) | |
| 108 | + (p31 & ei & !ii & !gi & !hi & !ji)); |
| 109 | + |
| 110 | + wire alt7 = (fi & !gi & !hi & // 1000 cases, where disp6b is 1 |
| 111 | + ((dispin & ci & di & !ei & !ii) | ko | |
| 112 | + (dispin & !ci & di & !ei & !ii))) | |
| 113 | + (!fi & gi & hi & // 0111 cases, where disp6b is 0 |
| 114 | + (( !dispin & !ci & !di & ei & ii) | ko | |
| 115 | + ( !dispin & ci & !di & ei & ii))); |
| 116 | + |
| 117 | + wire k28 = (ci & di & ei & ii) | ! (ci | di | ei | ii); |
| 118 | + // k28 with positive disp into fghi - .1, .2, .5, and .6 special cases |
| 119 | + wire k28p = ! (ci | di | ei | ii); |
| 120 | + wire fo = (ji & !fi & (hi | !gi | k28p)) | |
| 121 | + (fi & !ji & (!hi | gi | !k28p)) | |
| 122 | + (k28p & gi & hi) | |
| 123 | + (!k28p & !gi & !hi); |
| 124 | + wire go = (ji & !fi & (hi | !gi | !k28p)) | |
| 125 | + (fi & !ji & (!hi | gi |k28p)) | |
| 126 | + (!k28p & gi & hi) | |
| 127 | + (k28p & !gi & !hi); |
| 128 | + wire ho = ((ji ^ hi) & ! ((!fi & gi & !hi & ji & !k28p) | (!fi & gi & hi & !ji & k28p) | |
| 129 | + (fi & !gi & !hi & ji & !k28p) | (fi & !gi & hi & !ji & k28p))) | |
| 130 | + (!fi & gi & hi & ji) | (fi & !gi & !hi & !ji); |
| 131 | + |
| 132 | + wire disp6p = (p31 & (ei | ii)) | (p22 & ei & ii); |
| 133 | + wire disp6n = (p13 & ! (ei & ii)) | (p22 & !ei & !ii); |
| 134 | + wire disp4p = fghjp31; |
| 135 | + wire disp4n = fghjp13; |
| 136 | + |
| 137 | + assign code_err = p40 | p04 | (fi & gi & hi & ji) | (!fi & !gi & !hi & !ji) | |
| 138 | + (p13 & !ei & !ii) | (p31 & ei & ii) | |
| 139 | + (ei & ii & fi & gi & hi) | (!ei & !ii & !fi & !gi & !hi) | |
| 140 | + (ei & !ii & gi & hi & ji) | (!ei & ii & !gi & !hi & !ji) | |
| 141 | + (!p31 & ei & !ii & !gi & !hi & !ji) | |
| 142 | + (!p13 & !ei & ii & gi & hi & ji) | |
| 143 | + (((ei & ii & !gi & !hi & !ji) | |
| 144 | + (!ei & !ii & gi & hi & ji)) & |
| 145 | + ! ((ci & di & ei) | (!ci & !di & !ei))) | |
| 146 | + (disp6p & disp4p) | (disp6n & disp4n) | |
| 147 | + (ai & bi & ci & !ei & !ii & ((!fi & !gi) | fghjp13)) | |
| 148 | + (!ai & !bi & !ci & ei & ii & ((fi & gi) | fghjp31)) | |
| 149 | + (fi & gi & !hi & !ji & disp6p) | |
| 150 | + (!fi & !gi & hi & ji & disp6n) | |
| 151 | + (ci & di & ei & ii & !fi & !gi & !hi) | |
| 152 | + (!ci & !di & !ei & !ii & fi & gi & hi); |
| 153 | + |
| 154 | + assign dataout = {ko, ho, go, fo, eo, do_, co, bo, ao}; |
| 155 | + |
| 156 | + // my disp err fires for any legal codes that violate disparity, may fire for illegal codes |
| 157 | + assign disp_err = ((dispin & disp6p) | (disp6n & !dispin) | |
| 158 | + (dispin & !disp6n & fi & gi) | |
| 159 | + (dispin & ai & bi & ci) | |
| 160 | + (dispin & !disp6n & disp4p) | |
| 161 | + (!dispin & !disp6p & !fi & !gi) | |
| 162 | + (!dispin & !ai & !bi & !ci) | |
| 163 | + (!dispin & !disp6p & disp4n) | |
| 164 | + (disp6p & disp4p) | (disp6n & disp4n)); |
| 165 | +endmodule |
| 166 | + |
| 167 | + |
| 168 | +module encode_8b10b (datain, dispin, dataout, dispout); |
| 169 | + input [8:0] datain; |
| 170 | + input dispin; // 0 = neg disp; 1 = pos disp |
| 171 | + output [9:0] dataout; |
| 172 | + output dispout; |
| 173 | + |
| 174 | + wire ai = datain[0]; |
| 175 | + wire bi = datain[1]; |
| 176 | + wire ci = datain[2]; |
| 177 | + wire di = datain[3]; |
| 178 | + wire ei = datain[4]; |
| 179 | + wire fi = datain[5]; |
| 180 | + wire gi = datain[6]; |
| 181 | + wire hi = datain[7]; |
| 182 | + wire ki = datain[8]; |
| 183 | + |
| 184 | + wire aeqb = (ai & bi) | (!ai & !bi); |
| 185 | + wire ceqd = (ci & di) | (!ci & !di); |
| 186 | + wire l22 = (ai & bi & !ci & !di) | |
| 187 | + (ci & di & !ai & !bi) | |
| 188 | + ( !aeqb & !ceqd); |
| 189 | + wire l40 = ai & bi & ci & di; |
| 190 | + wire l04 = !ai & !bi & !ci & !di; |
| 191 | + wire l13 = ( !aeqb & !ci & !di) | |
| 192 | + ( !ceqd & !ai & !bi); |
| 193 | + wire l31 = ( !aeqb & ci & di) | |
| 194 | + ( !ceqd & ai & bi); |
| 195 | + |
| 196 | + // The 5B/6B encoding |
| 197 | + |
| 198 | + wire ao = ai; |
| 199 | + wire bo = (bi & !l40) | l04; |
| 200 | + wire co = l04 | ci | (ei & di & !ci & !bi & !ai); |
| 201 | + wire do_ = di & ! (ai & bi & ci); |
| 202 | + wire eo = (ei | l13) & ! (ei & di & !ci & !bi & !ai); |
| 203 | + wire io = (l22 & !ei) | |
| 204 | + (ei & !di & !ci & !(ai&bi)) | // D16, D17, D18 |
| 205 | + (ei & l40) | |
| 206 | + (ki & ei & di & ci & !bi & !ai) | // K.28 |
| 207 | + (ei & !di & ci & !bi & !ai); |
| 208 | + |
| 209 | + // pds16 indicates cases where d-1 is assumed + to get our encoded value |
| 210 | + wire pd1s6 = (ei & di & !ci & !bi & !ai) | (!ei & !l22 & !l31); |
| 211 | + // nds16 indicates cases where d-1 is assumed - to get our encoded value |
| 212 | + wire nd1s6 = ki | (ei & !l22 & !l13) | (!ei & !di & ci & bi & ai); |
| 213 | + |
| 214 | + // ndos6 is pds16 cases where d-1 is + yields - disp out - all of them |
| 215 | + wire ndos6 = pd1s6; |
| 216 | + // pdos6 is nds16 cases where d-1 is - yields + disp out - all but one |
| 217 | + wire pdos6 = ki | (ei & !l22 & !l13); |
| 218 | + |
| 219 | + |
| 220 | + // some Dx.7 and all Kx.7 cases result in run length of 5 case unless |
| 221 | + // an alternate coding is used (referred to as Dx.A7, normal is Dx.P7) |
| 222 | + // specifically, D11, D13, D14, D17, D18, D19. |
| 223 | + wire alt7 = fi & gi & hi & (ki | |
| 224 | + (dispin ? (!ei & di & l31) : (ei & !di & l13))); |
| 225 | + |
| 226 | + |
| 227 | + wire fo = fi & ! alt7; |
| 228 | + wire go = gi | (!fi & !gi & !hi); |
| 229 | + wire ho = hi; |
| 230 | + wire jo = (!hi & (gi ^ fi)) | alt7; |
| 231 | + |
| 232 | + // nd1s4 is cases where d-1 is assumed - to get our encoded value |
| 233 | + wire nd1s4 = fi & gi; |
| 234 | + // pd1s4 is cases where d-1 is assumed + to get our encoded value |
| 235 | + wire pd1s4 = (!fi & !gi) | (ki & ((fi & !gi) | (!fi & gi))); |
| 236 | + |
| 237 | + // ndos4 is pd1s4 cases where d-1 is + yields - disp out - just some |
| 238 | + wire ndos4 = (!fi & !gi); |
| 239 | + // pdos4 is nd1s4 cases where d-1 is - yields + disp out |
| 240 | + wire pdos4 = fi & gi & hi; |
| 241 | + |
| 242 | + // only legal K codes are K28.0->.7, K23/27/29/30.7 |
| 243 | + // K28.0->7 is ei=di=ci=1,bi=ai=0 |
| 244 | + // K23 is 10111 |
| 245 | + // K27 is 11011 |
| 246 | + // K29 is 11101 |
| 247 | + // K30 is 11110 - so K23/27/29/30 are ei & l31 |
| 248 | + wire illegalk = ki & |
| 249 | + (ai | bi | !ci | !di | !ei) & // not K28.0->7 |
| 250 | + (!fi | !gi | !hi | !ei | !l31); // not K23/27/29/30.7 |
| 251 | + |
| 252 | + // now determine whether to do the complementing |
| 253 | + // complement if prev disp is - and pd1s6 is set, or + and nd1s6 is set |
| 254 | + wire compls6 = (pd1s6 & !dispin) | (nd1s6 & dispin); |
| 255 | + |
| 256 | + // disparity out of 5b6b is disp in with pdso6 and ndso6 |
| 257 | + // pds16 indicates cases where d-1 is assumed + to get our encoded value |
| 258 | + // ndos6 is cases where d-1 is + yields - disp out |
| 259 | + // nds16 indicates cases where d-1 is assumed - to get our encoded value |
| 260 | + // pdos6 is cases where d-1 is - yields + disp out |
| 261 | + // disp toggles in all ndis16 cases, and all but that 1 nds16 case |
| 262 | + |
| 263 | + wire disp6 = dispin ^ (ndos6 | pdos6); |
| 264 | + |
| 265 | + wire compls4 = (pd1s4 & !disp6) | (nd1s4 & disp6); |
| 266 | + assign dispout = disp6 ^ (ndos4 | pdos4); |
| 267 | + |
| 268 | + assign dataout = {(jo ^ compls4), (ho ^ compls4), |
| 269 | + (go ^ compls4), (fo ^ compls4), |
| 270 | + (io ^ compls6), (eo ^ compls6), |
| 271 | + (do_ ^ compls6), (co ^ compls6), |
| 272 | + (bo ^ compls6), (ao ^ compls6)}; |
| 273 | +endmodule |
| 274 | + |
0 commit comments