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

Lines changed: 274 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy