Skip to content

Commit aec03d4

Browse files
committed
Added 8b10b encoder/decoder
1 parent 46e79a0 commit aec03d4

File tree

1 file changed

+274
-0
lines changed

1 file changed

+274
-0
lines changed

encdec_8b10b.v

+274
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
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

Comments
 (0)