x393  1.0
FPGAcodeforElphelNC393camera
gtx_8x10enc.v
Go to the documentation of this file.
1 
39 module gtx_8x10enc(
40  input wire rst,
41  input wire clk,
42  input wire [1:0] inisk,
43  input wire [15:0] indata,
44  output wire [19:0] outdata
45 );
46 
47 // addresses to reference an encoding table
48 wire [8:0] addr0;
49 wire [8:0] addr1;
50 assign addr0 = {inisk[0], indata[7:0]};
51 assign addr1 = {inisk[1], indata[15:8]};
52 
53 // possible encoded data - both disparities, for both bytes
54 // due to registered memory output, this values will be valid after 2 clock cycles
55 // table[i] [9:0] in case of current disparity +, [19:10] in case of -
56 wire [31:0] table0_out;
57 wire [31:0] table1_out;
58 reg [19:0] table0_r;
59 reg [19:0] table1_r;
60 wire [19:0] table0;
61 wire [19:0] table1;
62 assign table0 = table0_out[19:0];
63 assign table1 = table1_out[19:0];
64 always @ (posedge clk)
65 begin
66  table0_r <= table0;
67  table1_r <= table1;
68 end
69 // encoded bytes
70 wire [9:0] enc0;
71 wire [9:0] enc1;
72 //reg [9:0] enc0_r;
73 //reg [9:0] enc1_r;
74 
75 // running displarity, 0 = -, 1 = +
77 // running disparity after encoding 1st byte
79 // invert disparity after a byte
80 // if current encoded word containg an equal amount of 1s and 0s (i.e. 5 x '1'), disp shall stay the same
81 // if amounts are unequal, there are either 4 or 6 '1's. in either case disp shall be inverted
82 wire inv_disp0;
83 wire inv_disp1;
84 assign inv_disp0 = ~^enc0;
85 assign inv_disp1 = ~^enc1;
86 
88 always @ (posedge clk)
90 
91 
92 // select encoded bytes depending on a previous disparity
93 assign enc0 = {10{~disparity}} & table0_r[19:10] | {10{disparity}} & table0_r[9:0];
94 assign enc1 = {10{~disparity_interm}} & table1_r[19:10] | {10{disparity_interm}} & table1_r[9:0];
95 
96 // latch output data
97 reg [19:0] outdata_l;
98 
99 assign outdata = outdata_l;
100 always @ (posedge clk)
101  outdata_l <= {enc1, enc0};
102 
104  .REGISTERS_A (1),
105  .REGISTERS_B (1),
106  .LOG2WIDTH_A (5),
107  .LOG2WIDTH_B (5)
108 )
109 encoding_table(
110  .clk_a (clk),
111  .addr_a ({1'b0, addr0}),
112  .en_a (1'b1),
113  .regen_a (1'b1),
114  .we_a (1'b0),
116  .data_in_a (32'h0),
117  .clk_b (clk),
118  .addr_b ({1'b0, addr1}),
119  .en_b (1'b1),
120  .regen_b (1'b1),
121  .we_b (1'b0),
123  .data_in_b (32'h0)
124 );
125 
126 `ifdef CHECKERS_ENABLED
127 reg [8:0] addr0_r;
128 reg [8:0] addr1_r;
129 reg [8:0] addr0_rr;
130 reg [8:0] addr1_rr;
131 always @ (posedge clk)
132 begin
133  addr0_r <= addr0;
134  addr1_r <= addr1;
135  addr0_rr <= addr0_r;
136  addr1_rr <= addr1_r;
137 end
138 always @ (posedge clk)
139  if (~rst)
140  if (|table0 | |table1) begin
141  // all good
142  end
143  else begin
144  // got xxxx or 0000, both cases tell us addresses were bad
145  $display("Error in %m: bad incoming data: 1) K = %h, Data = %h 2) K = %h, Data = %h", addr0_rr[8], addr0_rr[7:0], addr1_rr[8], addr1_rr[7:0]);
146  repeat (10) @(posedge clk);
147  $finish;
148  end
149 `endif // CHECKERS_ENABLED
150 
151 
152 endmodule
153 
[14-LOG2WIDTH_A:0] 12040addr_a
14753table1wire[19:0]
Definition: gtx_8x10enc.v:61
14756disparityreg
Definition: gtx_8x10enc.v:76
14748table0_outwire[31:0]
Definition: gtx_8x10enc.v:56
wire 14742clk
Definition: gtx_8x10enc.v:41
14752table0wire[19:0]
Definition: gtx_8x10enc.v:60
[1 << LOG2WIDTH_A-1:0] 12045data_in_a
wire [1:0] 14743inisk
Definition: gtx_8x10enc.v:42
[1 << LOG2WIDTH_B-1:0] 12052data_in_b
14757disparity_intermwire
Definition: gtx_8x10enc.v:78
14760outdata_lreg[19:0]
Definition: gtx_8x10enc.v:97
encoding_table ramt_var_w_var_r
Definition: gtx_8x10enc.v:103
[1 << LOG2WIDTH_A-1:0] 12044data_out_a
[14-LOG2WIDTH_B:0] 12047addr_b
14746addr0wire[8:0]
Definition: gtx_8x10enc.v:48
14749table1_outwire[31:0]
Definition: gtx_8x10enc.v:57
wire 14741rst
Definition: gtx_8x10enc.v:40
wire [15:0] 14744indata
Definition: gtx_8x10enc.v:43
[1 << LOG2WIDTH_B-1:0] 12051data_out_b
14759inv_disp1wire
Definition: gtx_8x10enc.v:83
14751table1_rreg[19:0]
Definition: gtx_8x10enc.v:59
14750table0_rreg[19:0]
Definition: gtx_8x10enc.v:58
14754enc0wire[9:0]
Definition: gtx_8x10enc.v:70
14758inv_disp0wire
Definition: gtx_8x10enc.v:82
wire [19:0] 14745outdata
Definition: gtx_8x10enc.v:44
14755enc1wire[9:0]
Definition: gtx_8x10enc.v:71
14747addr1wire[8:0]
Definition: gtx_8x10enc.v:49