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