SURF  1.0
Code12b14bPkg.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : Code12b14bPkg.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2016-10-05
5 -- Last update: 2017-05-01
6 -------------------------------------------------------------------------------
7 -- Description: 12B14B Package File
8 -------------------------------------------------------------------------------
9 -- This file is part of 'SLAC Firmware Standard Library'.
10 -- It is subject to the license terms in the LICENSE.txt file found in the
11 -- top-level directory of this distribution and at:
12 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
13 -- No part of 'SLAC Firmware Standard Library', including this file,
14 -- may be copied, modified, propagated, or distributed except according to
15 -- the terms contained in the LICENSE.txt file.
16 -------------------------------------------------------------------------------
17 
18 library ieee;
19 use ieee.std_logic_1164.all;
20 use ieee.std_logic_arith.all;
21 use ieee.std_logic_unsigned.all;
22 
23 use work.StdRtlPkg.all;
24 --use work.TextUtilPkg.all;
25 
26 
27 package Code12b14bPkg is
28 --! @file
29  --! @ingroup base_general
30 
31  -------------------------------------------------------------------------------------------------
32  -- Constants for K codes
33  -- These are intended for public use
34  -------------------------------------------------------------------------------------------------
35  constant K_120_0_C : slv(11 downto 0) := "000001111000";
36  constant K_120_1_C : slv(11 downto 0) := "000011111000";
37  constant K_120_2_C : slv(11 downto 0) := "000101111000";
38  constant K_120_3_C : slv(11 downto 0) := "000111111000";
39  constant K_120_4_C : slv(11 downto 0) := "001001111000";
40  constant K_120_7_C : slv(11 downto 0) := "001111111000";
41  constant K_120_8_C : slv(11 downto 0) := "010001111000";
42  constant K_120_11_C : slv(11 downto 0) := "010111111000";
43 -- constant K_120_15_C : slv(11 downto 0) := "011111111000";
44  constant K_120_16_C : slv(11 downto 0) := "100001111000";
45  constant K_120_19_C : slv(11 downto 0) := "100111111000";
46  constant K_120_23_C : slv(11 downto 0) := "101111111000";
47  constant K_120_24_C : slv(11 downto 0) := "110001111000";
48  constant K_120_27_C : slv(11 downto 0) := "110111111000";
49  constant K_120_29_C : slv(11 downto 0) := "111011111000";
50  constant K_120_30_C : slv(11 downto 0) := "111101111000";
51  constant K_120_31_C : slv(11 downto 0) := "111111111000";
52 -- constant K_55_15_C : slv(11 downto 0) := "011110110111";
53 -- constant K_57_15_C : slv(11 downto 0) := "011110111001";
54 -- constant K_87_15_C : slv(11 downto 0) := "011111010111";
55 -- constant K_93_15_C : slv(11 downto 0) := "011111011101";
56 -- constant K_117_15_C : slv(11 downto 0) := "011111110101";
57 
58  constant K_120_0_CODE_C : slv(13 downto 0) := "00011011111000";
59  constant K_120_1_CODE_C : slv(13 downto 0) := "01000111111000";
60  constant K_120_2_CODE_C : slv(13 downto 0) := "01001011111000";
61  constant K_120_3_CODE_C : slv(13 downto 0) := "10001111111000";
62  constant K_120_4_CODE_C : slv(13 downto 0) := "01010011111000";
63  constant K_120_7_CODE_C : slv(13 downto 0) := "11100011111000";
64  constant K_120_8_CODE_C : slv(13 downto 0) := "01100011111000";
65  constant K_120_11_CODE_C : slv(13 downto 0) := "00101111111000";
66 -- constant K_120_15_CODE_C : slv(13 downto 0) := "00001111111000";
67  constant K_120_16_CODE_C : slv(13 downto 0) := "00100111111000";
68  constant K_120_19_CODE_C : slv(13 downto 0) := "01001111111000";
69  constant K_120_23_CODE_C : slv(13 downto 0) := "10100011111000";
70  constant K_120_24_CODE_C : slv(13 downto 0) := "00110011111000";
71  constant K_120_27_CODE_C : slv(13 downto 0) := "10010011111000";
72  constant K_120_29_CODE_C : slv(13 downto 0) := "10001011111000";
73  constant K_120_30_CODE_C : slv(13 downto 0) := "10000111111000";
74  constant K_120_31_CODE_C : slv(13 downto 0) := "00101011111000";
75 -- constant K_55_15_CODE_C : slv(13 downto 0) := "00001110110111";
76 -- constant K_57_15_CODE_C : slv(13 downto 0) := "00001110111001";
77 -- constant K_87_15_CODE_C : slv(13 downto 0) := "00001111010111";
78 -- constant K_93_15_CODE_C : slv(13 downto 0) := "00001111011101";
79 -- constant K_117_15_CODE_C : slv(13 downto 0) := "00001111110101";
80 
81 
82 
83  -------------------------------------------------------------------------------------------------
84  -- Disparity types and helper functions
85  -------------------------------------------------------------------------------------------------
86  subtype BlockDisparityType is integer range -4 to 4;
87  function toSlv (d : BlockDisparityType) return slv;
88  function toBlockDisparityType (d : slv(1 downto 0)) return BlockDisparityType;
89  function getDisparity (vec : slv) return BlockDisparityType;
90 
91  -- Convert a 12 bit code into "D/K.x.y" form
92  function toString (code : slv(11 downto 0); k : sl) return string;
93 
94  -------------------------------------------------------------------------------------------------
95  -- K-Code table
96  -------------------------------------------------------------------------------------------------
97  type KCodeEntryType is record
98  k12 : slv(11 downto 0);
99  k14 : slv(13 downto 0);
101  end record KCodeEntryType;
102 
103  type KCodeArray is array (natural range <>) of KCodeEntryType;
104 
106 
107  -------------------------------------------------------------------------------------------------
108  -- Structures for holding 7/8 code table
109  -------------------------------------------------------------------------------------------------
110  type Encode7b8bType is record
111  in7b : slv(6 downto 0);
112  out8b : slv(7 downto 0);
114  alt8b : slv(7 downto 0);
116  end record Encode7b8bType;
117 
118  type Encode7b8bArray is array (natural range <>) of Encode7b8bType;
119 
120  function makeEncode7b8bTable(a : slv8Array(0 to 127)) return Encode7b8bArray;
121 
122  -- Array of codes for 7b/8b D codes
123 -- constant CODE_8B_C : slv8Array(0 to 127) := (
124 -- "00011010", "11110001", "10101110", "00100011", "00001101", "00010101", "00100110", "10000111",
125 -- "00010011", "00100101", "00101001", "10001011", "00101100", "10001101", "10001110", "00001111",
126 -- "00101010", "00110001", "00110010", "10010011", "00110100", "10010101", "10010110", "00010111",
127 -- "01000101", "10011001", "10011010", "10011011", "10011100", "00011101", "00011110", "00011001",
128 -- "01000111", "01100001", "01001001", "10100011", "01001010", "10100101", "10100110", "00100111",
129 -- "01011000", "10101001", "10101010", "10101011", "10101100", "10101101", "00101110", "00101111",
130 -- "01001100", "10110001", "10110010", "00110011", "10110100", "00110101", "00110110", "00110111",
131 -- "10111000", "00111001", "00111010", "00111011", "00111100", "00111101", "00111110", "00011011",
132 -- "01000100", "00011100", "01100010", "11000011", "00100100", "11000101", "11000110", "11000111",
133 -- "01101000", "11001001", "11001010", "01001011", "11001100", "01001101", "01001110", "01001111",
134 -- "01110000", "11010001", "11010010", "01010011", "11010100", "01010101", "01010110", "01010111",
135 -- "11011000", "01011001", "01011010", "01011011", "01011100", "01011101", "01011110", "00101011",
136 -- "00101101", "11100001", "11100010", "01100011", "11100100", "01100101", "01100110", "01100111",
137 -- "11101000", "01101001", "01101010", "01101011", "01101100", "01101101", "01101110", "01000011",
138 -- "11110000", "01110001", "01110010", "01110011", "01110100", "01110101", "01110110", "01110111",
139 -- "01111000", "01111001", "01111010", "01111011", "01111100", "10111101", "11110100", "11101001");
140 
141  constant CODE_8B_C : slv8Array(0 to 127) := (
142  "01011000", "00011001", "00011010", "00100011", "01100100", "10000101", "10000110", "10000111", -- 7
143  "01101000", "10001001", "01001010", "10001011", "01001100", "10001101", "10001110", "11000111", -- 15
144  "00010011", "10010001", "10010010", "10010011", "10010100", "10010101", "10010110", "00010111", -- 23
145  "10011000", "10011001", "10011010", "00011011", "10011100", "00011101", "00011110", "00011100", -- 31
146  "00100101", "10100001", "00100110", "10100011", "10100100", "10100101", "10100110", "00100111", -- 39
147  "00101001", "10101001", "10101010", "00101011", "10101100", "00101101", "00101110", "00101010", -- 47
148  "00110010", "10110001", "10110010", "00110011", "10110100", "00110101", "00110110", "00110111", -- 55
149  "10111000", "00111001", "00111010", "00111011", "00111100", "10111101", "00110100", "10111011", -- 63
150  "01010100", "11000001", "11000010", "11000011", "01000001", "11000101", "11000110", "01000111", -- 71
151  "01001001", "11001001", "11001010", "01001011", "11001100", "01001101", "01001110", "01000101", -- 79
152  "01000011", "11010001", "11010010", "01010011", "11010100", "01010101", "01010110", "01010111", -- 87
153  "11011000", "01011001", "01011010", "11010011", "01011100", "01011101", "11001110", "11011110", -- 95
154  "01100010", "11100001", "11100010", "01100011", "11100100", "01100101", "01100110", "11100111", -- 103
155  "11101000", "01101001", "01101010", "11101011", "01101100", "11101001", "11101010", "11101101", -- 111
156  "00100100", "01110001", "01110010", "01010001", "01110100", "01110101", "01010010", "01110111", -- 119
157  "01111000", "01100001", "01111011", "01110011", "01111100", "01111101", "01111110", "11101110"); -- 127
158 
159 
161 
162  -- 7/8 K-code constants
163 -- constant K_55_C : slv(6 downto 0) := "0110111";
164 -- constant K_57_C : slv(6 downto 0) := "0111001";
165 -- constant K_87_C : slv(6 downto 0) := "1010111";
166 -- constant K_93_C : slv(6 downto 0) := "1011101";
167 -- constant K_117_C : slv(6 downto 0) := "1110101";
168  constant K_120_C : slv(6 downto 0) := "1111000";
169 
170 -- constant K_55_CODE_C : slv(7 downto 0) := "10110111";
171 -- constant K_57_CODE_C : slv(7 downto 0) := "10111001";
172 -- constant K_87_CODE_C : slv(7 downto 0) := "11010111";
173 -- constant K_93_CODE_C : slv(7 downto 0) := "11011101";
174 -- constant K_117_CODE_C : slv(7 downto 0) := "11110101";
175  constant K_120_CODE_C : slv(7 downto 0) := "11111000";
176 
177 -- constant K78_TABLE_C : Encode7b8bArray(0 to 0);
178 
179  -------------------------------------------------------------------------------------------------
180  -- Structure for holding 5/6 code table
181  -------------------------------------------------------------------------------------------------
182  type Encode5b6bType is record
183  in5b : slv(4 downto 0);
184  out6b : slv(5 downto 0);
186  alt6b : slv(5 downto 0);
188  end record Encode5b6bType;
189 
190  type Encode5b6bArray is array (natural range <>) of Encode5b6bType;
191 
192  function makeEncode5b6bTable(a : slv6Array(0 to 31)) return Encode5b6bArray;
193 
194  constant CODE_6B_C : slv6Array(0 to 31) := (
195  "000110", "010001", "010010", "100011", "010100", "100101", "100110", "000111",
196  "011000", "101001", "101010", "001011", "101100", "001101", "001110", "111010",
197  "110110", "110001", "110010", "010011", "110100", "010101", "010110", "010111",
198  "001100", "011001", "011010", "011011", "011100", "011101", "011110", "110101");
199 
201 
202  -- 5b/6b K Codes
203  constant K_X_0_C : slv(4 downto 0) := "00000";
204  constant K_X_1_C : slv(4 downto 0) := "00001";
205  constant K_X_2_C : slv(4 downto 0) := "00010";
206  constant K_X_3_C : slv(4 downto 0) := "00011";
207  constant K_X_4_C : slv(4 downto 0) := "00100";
208  constant K_X_7_C : slv(4 downto 0) := "00111";
209  constant K_X_8_C : slv(4 downto 0) := "01000";
210  constant K_X_11_C : slv(4 downto 0) := "01011";
211 -- constant K_X_15_C : slv(4 downto 0) := "01111";
212  constant K_X_16_C : slv(4 downto 0) := "10000";
213  constant K_X_19_C : slv(4 downto 0) := "10011";
214  constant K_X_23_C : slv(4 downto 0) := "10111";
215  constant K_X_24_C : slv(4 downto 0) := "11000";
216  constant K_X_27_C : slv(4 downto 0) := "11011";
217  constant K_X_29_C : slv(4 downto 0) := "11101";
218  constant K_X_30_C : slv(4 downto 0) := "11110";
219  constant K_X_31_C : slv(4 downto 0) := "11111";
220 
221  -- Some of these are inverted from normal code.
222  -- This doesn't matter as the encoder/decoder are currently written
223  -- These aren't used for encoder and both normal and inverted are checked for in decoder
224  constant K_X_0_CODE_C : slv(5 downto 0) := "000110";
225  constant K_X_1_CODE_C : slv(5 downto 0) := "010001";
226  constant K_X_2_CODE_C : slv(5 downto 0) := "010010";
227  constant K_X_3_CODE_C : slv(5 downto 0) := "100011";
228  constant K_X_4_CODE_C : slv(5 downto 0) := "010100";
229  constant K_X_7_CODE_C : slv(5 downto 0) := "111000"; -- Double check this, should invert?
230  constant K_X_8_CODE_C : slv(5 downto 0) := "011000";
231  constant K_X_11_CODE_C : slv(5 downto 0) := "001011";
232 -- constant K_X_15_CODE_C : slv(5 downto 0) := "000011";
233  constant K_X_16_CODE_C : slv(5 downto 0) := "001001";
234  constant K_X_19_CODE_C : slv(5 downto 0) := "010011";
235  constant K_X_23_CODE_C : slv(5 downto 0) := "101000";
236  constant K_X_24_CODE_C : slv(5 downto 0) := "001100";
237  constant K_X_27_CODE_C : slv(5 downto 0) := "100100";
238  constant K_X_29_CODE_C : slv(5 downto 0) := "100010";
239  constant K_X_30_CODE_C : slv(5 downto 0) := "100001";
240  constant K_X_31_CODE_C : slv(5 downto 0) := "001010";
241 
242 -- constant K56_TABLE_C : Encode5b6bArray(0 to 15);
243 
244  -------------------------------------------------------------------------------------------------
245  -- Structure for full encode table
246  -------------------------------------------------------------------------------------------------
247  type EncodeTableType is record
248  data78 : Encode7b8bArray(0 to 127);
250  kTable : KCodeArray(0 to 15);
251  end record;
252 
254 
255  -------------------------------------------------------------------------------------------------
256  -- Procedures for encoding and decoding
257  -------------------------------------------------------------------------------------------------
258  procedure encode12b14b (
259  constant CODES_C : in EncodeTableType;
260  dataIn : in slv(11 downto 0);
261  dataKIn : in sl;
262  dispIn : in slv(1 downto 0);
263  dataOut : inout slv(13 downto 0);
264  dispOut : inout slv(1 downto 0);
265  invalidK : out sl);
266 
267  procedure decode12b14b (
268  constant CODES_C : in EncodeTableType;
269  dataIn : in slv(13 downto 0);
270  dispIn : in slv(1 downto 0);
271  dataOut : inout slv(11 downto 0);
272  dataKOut : inout sl;
273  dispOut : inout slv(1 downto 0);
274  codeError : out sl;
275  dispError : inout sl);
276 
277 end package Code12b14bPkg;
278 
279 package body Code12b14bPkg is
280 
281  function toString (
282  code : slv(11 downto 0);
283  k : sl)
284  return string is
285  variable s : string(1 to 8);
286  begin
287  s := resize(ite(k = '1', "K.", "D.") &
288  integer'image(conv_integer(code(6 downto 0))) &
289  "." &
290  integer'image(conv_integer(code(11 downto 7))), 8);
291  return s;
292  end function toString;
293 
294  -- Determine the disparity of a vector
295  function getDisparity (vec : slv) return BlockDisparityType is
296  variable ones : integer;
297  variable zeros : integer;
298  variable disparity : BlockDisparityType;
299  begin
300  zeros := 0;
301  ones := 0;
302  for i in vec'range loop
303  if (vec(i) = '0') then
304  zeros := zeros + 1;
305  end if;
306  end loop;
307 
308  ones := vec'length-zeros;
309  disparity := ones-zeros;
310 
311  return disparity;
312 
313  end function getDisparity;
314 
315  function toSlv (d : BlockDisparityType) return slv is
316  variable ret : slv(1 downto 0) := "01";
317  begin
318  case d is
319  when -2 =>
320  ret := "10";
321  when 0 =>
322  ret := "11";
323  when 2 =>
324  ret := "00";
325  when 4 =>
326  ret := "01";
327  when others =>
328  ret := "11";
329  end case;
330  return ret;
331  end function;
332 
333  function toBlockDisparityType (d : slv(1 downto 0)) return BlockDisparityType is
334  begin
335  if (d = "10") then
336  return -2;
337  elsif (d = "11") then
338  return 0;
339  elsif (d = "00") then
340  return 2;
341  elsif (d = "01") then
342  return 4;
343  end if;
344  return 0;
345  end function;
346 
347 
348  -- Given an running disparity and a selected code disparity,
349  -- determine whether the selected code needs to be complimented, and what the out disparity is
350  -- Should maybe implement DisparityType as a constrained integer and just use math here
351  -- instead of this state machine. Not sure which is better.
352  procedure disparityControl (
353  prevDisp : in slv(1 downto 0);
354  blockDisp : in BlockDisparityType;
355  compliment : inout sl) is
356  variable dispInt : BlockDisparityType;
357  begin
358  compliment := '0';
359  dispInt := toBlockDisparityType(prevDisp);
360 
361  case prevDisp is
362  when "10" => -- -2
363  if (blockDisp = -2 or blockDisp = -4) then
364  compliment := '1';
365  end if;
366  when "11" => -- 0
367  if (blockDisp = -4) then
368  compliment := '1';
369  end if;
370  when "00" => -- 2
371  if (blockDisp = 2 or blockDisp = 4) then
372  compliment := '1';
373  end if;
374  when "01" => -- 4
375  if (blockDisp = 2 or blockDisp = 4) then
376  compliment := '1';
377  end if;
378  when others =>
379  null;
380  end case;
381 
382  end procedure;
383 
384  -------------------------------------------------------------------------------------------------
385  -- Make the encode table
386  function makeEncode7b8bTable(a : slv8Array(0 to 127)) return Encode7b8bArray is
387  variable ret : Encode7b8bArray(0 to 127);
388  begin
389  for i in ret'range loop
390  ret(i).in7b := conv_std_logic_vector(i, 7);
391  ret(i).out8b := a(i);
392  ret(i).outDisp := getDisparity(ret(i).out8b);
393  ret(i).altDisp := getDisparity(not ret(i).out8b);
394  if (ret(i).outDisp /= 0) then
395  ret(i).alt8b := not (ret(i).out8b);
396  else
397  ret(i).alt8b := ret(i).out8b;
398  end if;
399  end loop;
400  return ret;
401  end function makeEncode7b8bTable;
402 
403  -------------------------------------------------------------------------------------------------
404  -- Make the encode table
405  function makeEncode5b6bTable (a : slv6Array(0 to 31)) return Encode5b6bArray is
406  variable ret : Encode5b6bArray(0 to 31);
407  begin
408  for i in ret'range loop
409  ret(i).in5b := conv_std_logic_vector(i, 5);
410  ret(i).out6b := a(i);
411  ret(i).outDisp := getDisparity(ret(i).out6b);
412  ret(i).altDisp := getDisparity(not ret(i).out6b);
413  if (ret(i).outDisp /= 0) then
414  ret(i).alt6b := not (ret(i).out6b);
415  else
416  ret(i).alt6b := ret(i).out6b;
417  end if;
418  if (ret(i).out6b = "000111") then
419  ret(i).alt6b := "111000";
420  end if;
421  end loop;
422  return ret;
423  end function makeEncode5b6bTable;
424 
425  procedure encode12b14b (
426  constant CODES_C : in EncodeTableType;
427  dataIn : in slv(11 downto 0);
428  dataKIn : in sl;
429  dispIn : in slv(1 downto 0);
430  dataOut : inout slv(13 downto 0);
431  dispOut : inout slv(1 downto 0);
432  invalidK : out sl)
433  is
434  variable blockDispIn : BlockDisparityType;
435 
436  variable dataIn7 : slv(6 downto 0);
437  variable tmp78 : Encode7b8bType;
438  variable data8 : slv(7 downto 0);
439  variable blockDisp78 : BlockDisparityType;
440 
441  variable dataIn5 : slv(4 downto 0);
442  variable tmp56 : Encode5b6bType;
443  variable data6 : slv(5 downto 0);
444  variable blockDisp56 : BlockDisparityType;
445 
446  variable debug : boolean := false;
447  variable tmpDisp : integer range -8 to 8;
448  variable compliment : sl;
449  begin
450 
451  -- First, split in input word in two
452  dataIn5 := dataIn(11 downto 7);
453  dataIn7 := dataIn(6 downto 0);
454 
455  -- Now do the 7b8b part
456  -- Default lookup first
457  tmp78 := CODES_C.data78(conv_integer(dataIn7));
458  data8 := tmp78.out8b;
459  blockDisp78 := tmp78.outDisp;
460 
461 
462  -- Decide whether to invert
463  blockDispIn := toBlockDisparityType(dispIn);
464 
465  disparityControl(dispIn, blockDisp78, compliment);
466 
467  if (compliment = '1') then
468  blockDisp78 := tmp78.altDisp;
469  data8 := tmp78.alt8b;
470  end if;
471 
472 -- tmpDisp := blockDispIn + tmp78.outDisp;
473 
474 -- if ((dispIn = "10" and tmpDisp = 4) or tmpDisp > 4 or tmpDisp <= -4) then
475 -- blockDisp78 := tmp78.altDisp;
476 -- data8 := tmp78.alt8b;
477 -- end if;
478 
479 -- tmpDisp := blockDispIn + blockDisp78;
480 
481  -- Now repeat for the 5b6b
482  tmp56 := CODES_C.data56(conv_integer(dataIn5));
483  data6 := tmp56.out6b;
484  blockDisp56 := tmp56.outDisp;
485 
486  -- Decide whether to invert the output
487  if ((blockDisp78 > 0 and blockDisp56 > 0) or
488  (blockDisp78 < 0 and blockDisp56 < 0) or
489  (blockDisp78 = 0 and blockDispIn > 0 and blockDisp56 > 0) or
490  (blockDisp78 = 0 and blockDispIn < 0 and blockDisp56 < 0)) then
491  blockDisp56 := tmp56.altDisp;
492  data6 := tmp56.alt6b;
493  end if;
494 
495  -- Special case for D/K.x.7
496  -- Code is balanced but need to invert to avoid run length limits
497  if (dataIn5 = "00111" and (blockDisp78 > 0)) then
498  blockDisp56 := tmp56.altDisp;
499  data6 := tmp56.alt6b;
500  end if;
501 
502 
503  dataOut(7 downto 0) := data8;
504  dataOut(13 downto 8) := data6;
505  dispOut := toSlv(blockDispIn + blockDisp56 + blockDisp78);
506 
507  -- Control table overrides everything
508  if (dataKIn = '1') then
509  invalidK := '1';
510  -- Search the table for valid K.x
511  for i in CODES_C.kTable'range loop
512  if (dataIn = CODES_C.kTable(i).k12) then
513  dataOut := CODES_C.kTable(i).k14;
514  tmpDisp := CODES_C.kTable(i).disp;
515  invalidK := '0';
516  end if;
517  end loop;
518 
519  if (blockDispIn = 0 or blockDispIn = 2 or blockDispIn = 4) then
520  dataOut := not dataOut;
521  tmpDisp := getDisparity(dataOut);
522  end if;
523 
524  dispOut := toSlv(blockDispIn + tmpDisp);
525  end if;
526 
527  end;
528 
529  procedure decode12b14b (
530  constant CODES_C : in EncodeTableType;
531  dataIn : in slv(13 downto 0);
532  dispIn : in slv(1 downto 0);
533  dataOut : inout slv(11 downto 0);
534  dataKOut : inout sl;
535  dispOut : inout slv(1 downto 0);
536  codeError : out sl;
537  dispError : inout sl)
538  is
539  variable valid78 : sl;
540  variable valid56 : sl;
541  variable dataIn8 : slv(7 downto 0);
542  variable dataIn6 : slv(5 downto 0);
543  variable dataOut5 : slv(4 downto 0);
544  variable dataOut7 : slv(6 downto 0);
545  variable inputDisp : integer;
546  variable runDisp : integer;
547  begin
548 
549  -- Set default values
550  codeError := '1';
551  dispError := '0';
552  dataKOut := '0';
553  valid78 := '0';
554  valid56 := '0';
555  dataOut5 := (others => '0');
556  dataOut7 := (others => '0');
557 
558 
559  -- Check the disparity of the input
560  inputDisp := getDisparity(dataIn);
561  if (inputDisp > 4 or inputDisp < -4) then
562 -- print("Input Disp Error");
563 -- print("dataIn: " & str(dataIn));
564 -- print("inputDisp: " & str(inputDisp));
565  dispError := '1';
566  end if;
567 
568  -- Check the running disparity
569  runDisp := inputDisp + toBlockDisparityType(dispIn);
570  if (runDisp > 4 or runDisp < -4) then
571  runDisp := minimum(4, maximum(-4, runDisp));
572 -- print("Run Disp Error");
573 -- print("dataIn: " & str(dataIn) & " " & hstr(dataIn));
574 -- print("dispIn: " & str(toBlockDisparityType(dispIn)));
575 -- print("inputDisp: " & str(inputDisp));
576 -- print("runDisp: " & str(runDisp));
577  dispError := '1';
578  end if;
579 
580  -- This probably isn't correct
581  -- Need to figure out what to do when running disparity is out of range
582  dispOut := toSlv(runDisp);
583 -- if (dispError = '1') then
584 -- dispOut := toSlv(0);
585 -- end if;
586 
587 
588 
589  dataIn8 := dataIn(7 downto 0);
590  dataIn6 := dataIn(13 downto 8);
591 
592 -- dataOut7 := dataIn8(6 downto 0);
593 -- dataOut5 := dataIn6(4 downto 0);
594 
595  dataOut(6 downto 0) := dataIn(6 downto 0);
596  dataOut(11 downto 7) := dataIn(12 downto 8);
597 
598  -- Check for a k-code
599  for i in CODES_C.kTable'range loop
600  if (dataIn = CODES_C.kTable(i).k14 or
601  dataIn = not CODES_C.kTable(i).k14) then
602  dataOut := CODES_C.kTable(i).k12;
603  dataKOut := '1';
604  valid56 := '1';
605  valid78 := '1';
606  exit;
607  end if;
608  end loop;
609 
610  if (dataKOut = '0') then
611  -- Decode 7/8
612  for i in CODES_C.data78'range loop
613  if (dataIn8 = CODES_C.data78(i).out8b or
614  dataIn8 = CODES_C.data78(i).alt8b) then
615  dataOut7 := CODES_C.data78(i).in7b;
616  dataOut(6 downto 0) := CODES_C.data78(i).in7b;
617  valid78 := '1';
618  exit;
619  end if;
620  end loop;
621 
622  for i in CODES_C.data56'range loop
623  if (dataIn6 = CODES_C.data56(i).out6b or
624  dataIn6 = CODES_C.data56(i).alt6b) then
625  dataOut5 := CODES_C.data56(i).in5b;
626  dataOut(11 downto 7) := CODES_C.data56(i).in5b;
627  valid56 := '1';
628  exit;
629  end if;
630  end loop;
631 
632  end if;
633 
634  if (valid56 = '1' and valid78 = '1') then
635  codeError := '0';
636  end if;
637 
638 
639  end procedure decode12b14b;
640 
641  -------------------------------------------------------------------------------------------------
642  -- Differed constants from above
643  -------------------------------------------------------------------------------------------------
644  constant K_CODE_TABLE_C : KCodeArray := (
645  (k12 => K_120_0_C, k14 => K_120_0_CODE_C, disp => getDisparity(K_120_0_CODE_C)),
646  (k12 => K_120_1_C, k14 => K_120_1_CODE_C, disp => getDisparity(K_120_1_CODE_C)),
647  (k12 => K_120_2_C, k14 => K_120_2_CODE_C, disp => getDisparity(K_120_2_CODE_C)),
648  (k12 => K_120_3_C, k14 => K_120_3_CODE_C, disp => getDisparity(K_120_3_CODE_C)),
649  (k12 => K_120_4_C, k14 => K_120_4_CODE_C, disp => getDisparity(K_120_4_CODE_C)),
650  (k12 => K_120_7_C, k14 => K_120_7_CODE_C, disp => getDisparity(K_120_7_CODE_C)),
651  (k12 => K_120_8_C, k14 => K_120_8_CODE_C, disp => getDisparity(K_120_8_CODE_C)),
652  (k12 => K_120_11_C, k14 => K_120_11_CODE_C, disp => getDisparity(K_120_11_CODE_C)),
653 -- (k12 => K_120_15_C, k14 => K_120_15_CODE_C, disp => getDisparity(K_120_15_CODE_C)),
654  (k12 => K_120_16_C, k14 => K_120_16_CODE_C, disp => getDisparity(K_120_16_CODE_C)),
655  (k12 => K_120_19_C, k14 => K_120_19_CODE_C, disp => getDisparity(K_120_19_CODE_C)),
656  (k12 => K_120_23_C, k14 => K_120_23_CODE_C, disp => getDisparity(K_120_23_CODE_C)),
657  (k12 => K_120_24_C, k14 => K_120_24_CODE_C, disp => getDisparity(K_120_24_CODE_C)),
658  (k12 => K_120_27_C, k14 => K_120_27_CODE_C, disp => getDisparity(K_120_27_CODE_C)),
659  (k12 => K_120_29_C, k14 => K_120_29_CODE_C, disp => getDisparity(K_120_29_CODE_C)),
660  (k12 => K_120_30_C, k14 => K_120_30_CODE_C, disp => getDisparity(K_120_30_CODE_C)),
661  (k12 => K_120_31_C, k14 => K_120_31_CODE_C, disp => getDisparity(K_120_31_CODE_C)));
662 -- (k12 => K_55_15_C, k14 => K_55_15_CODE_C, disp => getDisparity(K_55_15_CODE_C)),
663 -- (k12 => K_57_15_C, k14 => K_57_15_CODE_C, disp => getDisparity(K_57_15_CODE_C)),
664 -- (k12 => K_87_15_C, k14 => K_87_15_CODE_C, disp => getDisparity(K_87_15_CODE_C)),
665 -- (k12 => K_93_15_C, k14 => K_93_15_CODE_C, disp => getDisparity(K_93_15_CODE_C)),
666 -- (k12 => K_117_15_C, k14 => K_117_15_CODE_C, disp => getDisparity(K_117_15_CODE_C)));
667 
668 
669  constant ENCODE_7B8B_TABLE_C : Encode7b8bArray := makeEncode7b8bTable(CODE_8B_C);
670  constant ENCODE_5B6B_TABLE_C : Encode5b6bArray := makeEncode5b6bTable(CODE_6B_C);
671 
676 
677 end package body Code12b14bPkg;
string toStringcode,k,
slv( 13 downto 0) := "00011011111000" K_120_0_CODE_C
slv( 4 downto 0) := "00111" K_X_7_C
slv( 5 downto 0) := "010010" K_X_2_CODE_C
slv( 13 downto 0) := "00100111111000" K_120_16_CODE_C
_library_ ieeeieee
slv( 13 downto 0) := "01001111111000" K_120_19_CODE_C
slv( 6 downto 0) in7b
slv( 5 downto 0) alt6b
slv6Array( 0 to 31) :=( "000110", "010001", "010010", "100011", "010100", "100101", "100110", "000111", "011000", "101001", "101010", "001011", "101100", "001101", "001110", "111010", "110110", "110001", "110010", "010011", "110100", "010101", "010110", "010111", "001100", "011001", "011010", "011011", "011100", "011101", "011110", "110101") CODE_6B_C
slv( 11 downto 0) := "001111111000" K_120_7_C
slv8Array( 0 to 127) :=( "01011000", "00011001", "00011010", "00100011", "01100100", "10000101", "10000110", "10000111", "01101000", "10001001", "01001010", "10001011", "01001100", "10001101", "10001110", "11000111", "00010011", "10010001", "10010010", "10010011", "10010100", "10010101", "10010110", "00010111", "10011000", "10011001", "10011010", "00011011", "10011100", "00011101", "00011110", "00011100", "00100101", "10100001", "00100110", "10100011", "10100100", "10100101", "10100110", "00100111", "00101001", "10101001", "10101010", "00101011", "10101100", "00101101", "00101110", "00101010", "00110010", "10110001", "10110010", "00110011", "10110100", "00110101", "00110110", "00110111", "10111000", "00111001", "00111010", "00111011", "00111100", "10111101", "00110100", "10111011", "01010100", "11000001", "11000010", "11000011", "01000001", "11000101", "11000110", "01000111", "01001001", "11001001", "11001010", "01001011", "11001100", "01001101", "01001110", "01000101", "01000011", "11010001", "11010010", "01010011", "11010100", "01010101", "01010110", "01010111", "11011000", "01011001", "01011010", "11010011", "01011100", "01011101", "11001110", "11011110", "01100010", "11100001", "11100010", "01100011", "11100100", "01100101", "01100110", "11100111", "11101000", "01101001", "01101010", "11101011", "01101100", "11101001", "11101010", "11101101", "00100100", "01110001", "01110010", "01010001", "01110100", "01110101", "01010010", "01110111", "01111000", "01100001", "01111011", "01110011", "01111100", "01111101", "01111110", "11101110") CODE_8B_C
slv( 13 downto 0) := "10001111111000" K_120_3_CODE_C
std_logic sl
Definition: StdRtlPkg.vhd:28
slv( 13 downto 0) := "10000111111000" K_120_30_CODE_C
slv( 5 downto 0) := "011000" K_X_8_CODE_C
slv( 11 downto 0) := "111011111000" K_120_29_C
Encode7b8bArray ENCODE_7B8B_TABLE_C
slv( 4 downto 0) := "00010" K_X_2_C
slv( 4 downto 0) := "01011" K_X_11_C
slv( 6 downto 0) := "1111000" K_120_C
KCodeArray K_CODE_TABLE_C
Encode7b8bArray := makeEncode7b8bTable(CODE_8B_C ) ENCODE_7B8B_TABLE_C
slv( 7 downto 0) := "11111000" K_120_CODE_C
decode12b14bCODES_C,dataIn,dispIn,dataOut,dataKOut,dispOut,codeError,dispError,
slv( 5 downto 0) := "100010" K_X_29_CODE_C
slv( 4 downto 0) := "00001" K_X_1_C
KCodeArray( 0 to 15) kTable
slv( 13 downto 0) := "10100011111000" K_120_23_CODE_C
slv( 5 downto 0) := "001100" K_X_24_CODE_C
slv( 5 downto 0) := "001010" K_X_31_CODE_C
slv( 4 downto 0) := "10011" K_X_19_C
BlockDisparityType outDisp
BlockDisparityType toBlockDisparityTyped,
slv( 5 downto 0) := "101000" K_X_23_CODE_C
slv( 11 downto 0) := "001001111000" K_120_4_C
array(natural range <> ) of KCodeEntryType KCodeArray
slv( 11 downto 0) := "000101111000" K_120_2_C
slv( 4 downto 0) := "00011" K_X_3_C
Encode5b6bArray := makeEncode5b6bTable(CODE_6B_C ) ENCODE_5B6B_TABLE_C
slv( 4 downto 0) := "10111" K_X_23_C
slv( 13 downto 0) := "01010011111000" K_120_4_CODE_C
BlockDisparityType altDisp
slv( 11 downto 0) := "111101111000" K_120_30_C
slv( 11 downto 0) := "110001111000" K_120_24_C
slv( 5 downto 0) := "100001" K_X_30_CODE_C
slv( 7 downto 0) out8b
slv( 13 downto 0) := "10010011111000" K_120_27_CODE_C
slv( 13 downto 0) := "01001011111000" K_120_2_CODE_C
KCodeArray :=((k12 => K_120_0_C,k14 => K_120_0_CODE_C,disp => getDisparity(K_120_0_CODE_C )),(k12 => K_120_1_C,k14 => K_120_1_CODE_C,disp => getDisparity(K_120_1_CODE_C )),(k12 => K_120_2_C,k14 => K_120_2_CODE_C,disp => getDisparity(K_120_2_CODE_C )),(k12 => K_120_3_C,k14 => K_120_3_CODE_C,disp => getDisparity(K_120_3_CODE_C )),(k12 => K_120_4_C,k14 => K_120_4_CODE_C,disp => getDisparity(K_120_4_CODE_C )),(k12 => K_120_7_C,k14 => K_120_7_CODE_C,disp => getDisparity(K_120_7_CODE_C )),(k12 => K_120_8_C,k14 => K_120_8_CODE_C,disp => getDisparity(K_120_8_CODE_C )),(k12 => K_120_11_C,k14 => K_120_11_CODE_C,disp => getDisparity(K_120_11_CODE_C )),(k12 => K_120_16_C,k14 => K_120_16_CODE_C,disp => getDisparity(K_120_16_CODE_C )),(k12 => K_120_19_C,k14 => K_120_19_CODE_C,disp => getDisparity(K_120_19_CODE_C )),(k12 => K_120_23_C,k14 => K_120_23_CODE_C,disp => getDisparity(K_120_23_CODE_C )),(k12 => K_120_24_C,k14 => K_120_24_CODE_C,disp => getDisparity(K_120_24_CODE_C )),(k12 => K_120_27_C,k14 => K_120_27_CODE_C,disp => getDisparity(K_120_27_CODE_C )),(k12 => K_120_29_C,k14 => K_120_29_CODE_C,disp => getDisparity(K_120_29_CODE_C )),(k12 => K_120_30_C,k14 => K_120_30_CODE_C,disp => getDisparity(K_120_30_CODE_C )),(k12 => K_120_31_C,k14 => K_120_31_CODE_C,disp => getDisparity(K_120_31_CODE_C ))) K_CODE_TABLE_C
slv( 5 downto 0) := "001011" K_X_11_CODE_C
slv( 13 downto 0) := "01100011111000" K_120_8_CODE_C
slv( 13 downto 0) := "01000111111000" K_120_1_CODE_C
EncodeTableType :=(data78 => ENCODE_7B8B_TABLE_C,data56 => ENCODE_5B6B_TABLE_C,kTable => K_CODE_TABLE_C) ENCODE_TABLE_C
slv( 4 downto 0) := "11110" K_X_30_C
Encode5b6bArray( 0 to 31) data56
Encode5b6bArray makeEncode5b6bTablea,
slv( 11 downto 0) := "111111111000" K_120_31_C
slv( 11 downto 0) := "100111111000" K_120_19_C
Encode7b8bArray( 0 to 127) data78
integer range - 4 to 4 BlockDisparityType
EncodeTableType ENCODE_TABLE_C
slv( 11 downto 0) := "101111111000" K_120_23_C
slv( 4 downto 0) := "11000" K_X_24_C
slv( 11 downto 0) := "000011111000" K_120_1_C
slv( 4 downto 0) := "11101" K_X_29_C
Encode7b8bArray makeEncode7b8bTablea,
slv( 4 downto 0) in5b
slv( 11 downto 0) := "010111111000" K_120_11_C
BlockDisparityType getDisparityvec,
slv( 5 downto 0) := "001001" K_X_16_CODE_C
array(natural range <> ) of Encode7b8bType Encode7b8bArray
slv( 13 downto 0) := "00110011111000" K_120_24_CODE_C
BlockDisparityType disp
slv( 5 downto 0) := "000110" K_X_0_CODE_C
slv( 4 downto 0) := "11111" K_X_31_C
slv( 5 downto 0) := "010011" K_X_19_CODE_C
slv( 4 downto 0) := "11011" K_X_27_C
slv( 11 downto 0) := "000111111000" K_120_3_C
Encode5b6bArray ENCODE_5B6B_TABLE_C
slv( 5 downto 0) := "100100" K_X_27_CODE_C
slv( 11 downto 0) := "010001111000" K_120_8_C
slv( 5 downto 0) := "010001" K_X_1_CODE_C
slv( 5 downto 0) out6b
slv( 13 downto 0) := "10001011111000" K_120_29_CODE_C
slv( 11 downto 0) := "110111111000" K_120_27_C
slv( 11 downto 0) := "100001111000" K_120_16_C
slv( 4 downto 0) := "00000" K_X_0_C
slv( 4 downto 0) := "00100" K_X_4_C
slv( 13 downto 0) k14
encode12b14bCODES_C,dataIn,dataKIn,dispIn,dataOut,dispOut,invalidK,
slv( 11 downto 0) k12
slv( 5 downto 0) := "010100" K_X_4_CODE_C
slv( 11 downto 0) := "000001111000" K_120_0_C
slv( 7 downto 0) alt8b
slv( 5 downto 0) := "111000" K_X_7_CODE_C
slv( 4 downto 0) := "01000" K_X_8_C
slv( 13 downto 0) := "00101111111000" K_120_11_CODE_C
array(natural range <> ) of Encode5b6bType Encode5b6bArray
slv( 5 downto 0) := "100011" K_X_3_CODE_C
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
slv( 13 downto 0) := "00101011111000" K_120_31_CODE_C
slv( 4 downto 0) := "10000" K_X_16_C
slv( 13 downto 0) := "11100011111000" K_120_7_CODE_C