OpenCores
URL https://opencores.org/ocsvn/spacewiresystemc/spacewiresystemc/trunk

Subversion Repositories spacewiresystemc

[/] [spacewiresystemc/] [trunk/] [rtl/] [RTL_VB/] [tx_spw.v] - Blame information for rev 36

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 redbear
//+FHDR------------------------------------------------------------------------
2
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
3
//GLADIC Open Source RTL
4
//-----------------------------------------------------------------------------
5
//FILE NAME      :
6
//DEPARTMENT     : IC Design / Verification
7
//AUTHOR         : Felipe Fernandes da Costa
8
//AUTHOR’S EMAIL :
9
//-----------------------------------------------------------------------------
10
//RELEASE HISTORY
11
//VERSION DATE AUTHOR DESCRIPTION
12
//1.0 YYYY-MM-DD name
13
//-----------------------------------------------------------------------------
14
//KEYWORDS : General file searching keywords, leave blank if none.
15
//-----------------------------------------------------------------------------
16
//PURPOSE  : ECSS_E_ST_50_12C_31_july_2008
17
//-----------------------------------------------------------------------------
18
//PARAMETERS
19
//PARAM NAME            RANGE   : DESCRIPTION : DEFAULT : UNITS
20
//e.g.DATA_WIDTH        [32,16] : width of the DATA : 32:
21
//-----------------------------------------------------------------------------
22
//REUSE ISSUES
23
//Reset Strategy        :
24
//Clock Domains         :
25
//Critical Timing       :
26
//Test Features         :
27
//Asynchronous I/F      :
28
//Scan Methodology      :
29
//Instantiations        :
30
//Synthesizable (y/n)   :
31
//Other                 :
32
//-FHDR------------------------------------------------------------------------
33
 
34
`timescale 1ns/1ns
35
 
36
module TX_SPW (
37
                input pclk_tx,
38
                //
39
                input [8:0] data_tx_i,
40
                input txwrite_tx,
41
                //
42
                input [7:0] timecode_tx_i,
43
                input tickin_tx,
44
                //
45
                input enable_tx,
46
                input send_null_tx,
47
                input send_fct_tx,
48
 
49
                //
50
                input gotfct_tx,
51
                input send_fct_now,
52
                //
53 33 redbear
                output reg tx_dout_e,
54
                output reg tx_sout_e,
55 5 redbear
                //
56 8 redbear
                output  reg ready_tx_data,
57 13 redbear
                output  reg ready_tx_timecode
58 5 redbear
 
59
                );
60
 
61
localparam [2:0] tx_spw_start     = 3'b000,
62
                 tx_spw_null      = 3'b001,
63
                 tx_spw_null_fct  = 3'b010,
64
                 tx_spw_full      = 3'b100;
65
 
66
localparam [5:0] NULL     = 6'b000001,
67
                 FCT      = 6'b000010,
68
                 EOP      = 6'b000100,
69
                 EEP      = 6'b001000,
70
                 DATA     = 6'b010000,
71
                 TIMEC    = 6'b100000;
72
 
73 25 redbear
 
74
localparam [7:0] null_s = 8'b01110100;
75
localparam [2:0] fct_s  = 3'b100;
76
localparam [3:0] eop_s  = 4'b0101;
77
localparam [3:0] eep_s  = 4'b0110;
78
localparam [13:0] timecode_ss    = 14'b01110000000000;
79
 
80
 
81
 
82 5 redbear
        reg [2:0] state_tx;
83
        reg [2:0] next_state_tx;
84
 
85
        reg [13:0] timecode_s;
86
 
87
        reg [5:0]  last_type;
88
        reg [8:0]  txdata_flagctrl_tx_last;
89 36 redbear
        reg [8:0]  tx_data_in;
90
        reg data_rdy_trnsp;
91 5 redbear
        reg [7:0]  last_timein_control_flag_tx;
92 36 redbear
        reg [7:0]  tx_tcode_in;
93
        reg tcode_rdy_trnsp;
94 5 redbear
 
95 8 redbear
        reg hold_null;
96
        reg hold_fct;
97
        reg hold_data;
98
        reg hold_time_code;
99
 
100 5 redbear
        reg enable_null;
101
        reg enable_fct;
102
        reg enable_n_char;
103
        reg enable_time_code;
104
 
105
        reg [2:0] fct_send;
106
        reg [2:0] fct_flag;
107 6 redbear
 
108 5 redbear
        reg [5:0] fct_counter;
109 6 redbear
        reg [5:0] fct_counter_receive;
110
 
111 5 redbear
        reg last_tx_dout;
112
        reg last_tx_sout;
113
 
114 33 redbear
        reg tx_dout;
115
        reg tx_sout;
116
 
117
        reg tx_dout_null;
118
        reg tx_dout_fct;
119
        reg tx_dout_timecode;
120
        reg tx_dout_data;
121
 
122 17 redbear
        reg block_sum;
123 19 redbear
        reg block_sum_fct_send;
124 17 redbear
 
125 5 redbear
        reg [3:0] global_counter_transfer;
126
 
127 33 redbear
always@(*)
128
begin
129 36 redbear
        tx_dout_null = last_tx_dout;
130 5 redbear
 
131 33 redbear
         if(enable_null)
132
         begin
133 36 redbear
                 if(last_type == NULL  && global_counter_transfer[3:0] == 4'd0)
134 33 redbear
                 begin
135
                        tx_dout_null = !(null_s[6]^null_s[0]^null_s[1]);
136
                 end
137
                 else if(last_type == FCT  && global_counter_transfer[3:0] == 4'd0)
138
                 begin
139
                        tx_dout_null = !(null_s[6]^fct_s[0]^fct_s[1]);
140
                 end
141
                 else if(last_type == EOP  && global_counter_transfer[3:0] == 4'd0)
142
                 begin
143
                        tx_dout_null = !(null_s[6]^eop_s[0]^eop_s[1]);
144
                 end
145
                 else if(last_type == EEP  && global_counter_transfer[3:0] == 4'd0)
146
                 begin
147
                        tx_dout_null = !(null_s[6]^eep_s[0]^eep_s[1]);
148
                 end
149
                 else if(last_type == DATA  && global_counter_transfer[3:0] == 4'd0)
150
                 begin
151
                        tx_dout_null =  !(null_s[6]^txdata_flagctrl_tx_last[0]^txdata_flagctrl_tx_last[1]^txdata_flagctrl_tx_last[2]^txdata_flagctrl_tx_last[3]^ txdata_flagctrl_tx_last[4]^txdata_flagctrl_tx_last[5]^txdata_flagctrl_tx_last[6]^txdata_flagctrl_tx_last[7]);
152
                 end
153
                 else if(last_type == TIMEC && global_counter_transfer[3:0] == 4'd0)
154
                 begin
155
                        tx_dout_null =  !(null_s[6]^last_timein_control_flag_tx[7]^last_timein_control_flag_tx[6]^last_timein_control_flag_tx[5]^last_timein_control_flag_tx[4]^last_timein_control_flag_tx[3]^last_timein_control_flag_tx[2]^last_timein_control_flag_tx[1]^last_timein_control_flag_tx[0]);
156
                 end
157
                 else if(global_counter_transfer[3:0] == 4'd1)
158
                 begin
159
                        tx_dout_null = null_s[6];
160
                 end
161
                 else if(global_counter_transfer[3:0] == 4'd2)
162
                 begin
163
                        tx_dout_null = null_s[5];
164
                 end
165
                 else if(global_counter_transfer[3:0] == 4'd3)
166
                 begin
167
                        tx_dout_null = null_s[4];
168
                 end
169
                 else if(global_counter_transfer[3:0] == 4'd4)
170
                 begin
171
                        tx_dout_null = null_s[3];
172
                 end
173
                 else if(global_counter_transfer[3:0] == 4'd5)
174
                 begin
175
                        tx_dout_null = null_s[2];
176
                 end
177
                 else if(global_counter_transfer[3:0] == 4'd6)
178
                 begin
179
                        tx_dout_null = null_s[1];
180
                 end
181
                 else if(global_counter_transfer[3:0] == 4'd7)
182
                 begin
183
                        tx_dout_null = null_s[0];
184
                 end
185
        end
186
end
187 13 redbear
 
188 33 redbear
 
189 5 redbear
always@(*)
190
begin
191
 
192 36 redbear
        tx_dout_fct = last_tx_dout;
193 33 redbear
 
194
        if(enable_fct)
195
        begin
196
 
197
                 if(last_type == NULL  && global_counter_transfer[3:0] == 4'd0)
198
                 begin
199
                        tx_dout_fct = !(fct_s[2]^null_s[0]^null_s[1]);
200
                 end
201
                 else if(last_type == FCT  && global_counter_transfer[3:0] == 4'd0)
202
                 begin
203
                        tx_dout_fct = !(fct_s[2]^fct_s[0]^fct_s[1]);
204
                 end
205
                 else if(last_type == EOP  && global_counter_transfer[3:0] == 4'd0)
206
                 begin
207
                        tx_dout_fct = !(fct_s[2]^eop_s[0]^eop_s[1]);
208
                 end
209
                 else if(last_type == EEP  && global_counter_transfer[3:0] == 4'd0)
210
                 begin
211
                        tx_dout_fct = !(fct_s[2]^eep_s[0]^eep_s[1]);
212
                 end
213
                 else if (last_type == DATA && global_counter_transfer[3:0] == 4'd0)
214
                 begin
215
                        tx_dout_fct = !(fct_s[2]^txdata_flagctrl_tx_last[0]^txdata_flagctrl_tx_last[1]^txdata_flagctrl_tx_last[2]^txdata_flagctrl_tx_last[3]^ txdata_flagctrl_tx_last[4]^txdata_flagctrl_tx_last[5]^txdata_flagctrl_tx_last[6]^txdata_flagctrl_tx_last[7]);
216
                 end
217
                 else if(last_type == TIMEC && global_counter_transfer[3:0] == 4'd0)
218
                 begin
219
                        tx_dout_fct = !(fct_s[2]^last_timein_control_flag_tx[7]^last_timein_control_flag_tx[6]^last_timein_control_flag_tx[5]^last_timein_control_flag_tx[4]^last_timein_control_flag_tx[3]^last_timein_control_flag_tx[2]^last_timein_control_flag_tx[1]^last_timein_control_flag_tx[0]);
220
                 end
221
                 else if(global_counter_transfer[3:0] == 4'd1)
222
                 begin
223
                        tx_dout_fct = fct_s[2];
224
                 end
225
                 else if(global_counter_transfer[3:0] == 4'd2)
226
                 begin
227
                        tx_dout_fct = fct_s[1];
228
                 end
229
                 else if(global_counter_transfer[3:0] == 4'd3)
230
                 begin
231
                        tx_dout_fct = fct_s[0];
232
                 end
233
 
234
        end
235 5 redbear
end
236 33 redbear
 
237
always@(*)
238
begin
239 36 redbear
        tx_dout_timecode = last_tx_dout;
240 33 redbear
 
241
        if(enable_time_code)
242
        begin
243
                 if(last_type == NULL  && global_counter_transfer[3:0] == 4'd0)
244
                 begin
245
                        tx_dout_timecode = !(timecode_s[12]^null_s[0]^null_s[1]);
246
                 end
247
                 else if(last_type == FCT   && global_counter_transfer[3:0] == 4'd0)
248
                 begin
249
                        tx_dout_timecode = !(timecode_s[12]^fct_s[0]^fct_s[1]);
250
                 end
251
                 else if (last_type == EOP   && global_counter_transfer[3:0] == 4'd0)
252
                 begin
253
                        tx_dout_timecode = !(timecode_s[12]^eop_s[0]^eop_s[1]);
254
                 end
255
                 else if( last_type == EEP   && global_counter_transfer[3:0] == 4'd0)
256
                 begin
257
                        tx_dout_timecode = !(timecode_s[12]^eep_s[0]^eep_s[1]);
258
                 end
259
                 else if( last_type == DATA  && global_counter_transfer[3:0] == 4'd0)
260
                 begin
261
                        tx_dout_timecode = !(timecode_s[12]^txdata_flagctrl_tx_last[0]^txdata_flagctrl_tx_last[1]^txdata_flagctrl_tx_last[2]^txdata_flagctrl_tx_last[3]^ txdata_flagctrl_tx_last[4]^txdata_flagctrl_tx_last[5]^txdata_flagctrl_tx_last[6]^txdata_flagctrl_tx_last[7]);
262
                 end
263
                 else if( last_type == TIMEC && global_counter_transfer[3:0] == 4'd0)
264
                 begin
265
                        tx_dout_timecode = !(timecode_s[12]^last_timein_control_flag_tx[7]^last_timein_control_flag_tx[6]^last_timein_control_flag_tx[5]^last_timein_control_flag_tx[4]^last_timein_control_flag_tx[3]^last_timein_control_flag_tx[2]^last_timein_control_flag_tx[1]^last_timein_control_flag_tx[0]);
266
                 end
267
                 else if( global_counter_transfer[3:0] == 4'd1)
268
                 begin
269
                        tx_dout_timecode = timecode_s[12];
270
                 end
271
                 else if( global_counter_transfer[3:0] == 4'd2)
272
                 begin
273
                        tx_dout_timecode = timecode_s[11];
274
                 end
275
                 else if( global_counter_transfer[3:0] == 4'd3)
276
                 begin
277
                        tx_dout_timecode = timecode_s[10];
278
                 end
279
                 else if( global_counter_transfer[3:0] == 4'd4)
280
                 begin
281
                        tx_dout_timecode = timecode_s[9];
282
                 end
283
                 else if( global_counter_transfer[3:0] == 4'd5)
284
                 begin
285
                        tx_dout_timecode = timecode_s[8];
286
                 end
287
                 else if( global_counter_transfer[3:0] == 4'd6)
288
                 begin
289
                        tx_dout_timecode = timecode_s[0];
290
                 end
291
                 else if( global_counter_transfer[3:0] == 4'd7)
292
                 begin
293
                        tx_dout_timecode = timecode_s[1];
294
                 end
295
                 else if( global_counter_transfer[3:0] == 4'd8)
296
                 begin
297
                        tx_dout_timecode = timecode_s[2];
298
                 end
299
                 else if(global_counter_transfer[3:0] == 4'd9)
300
                 begin
301
                        tx_dout_timecode = timecode_s[3];
302
                 end
303
                 else if(global_counter_transfer[3:0] == 4'd10)
304
                 begin
305
                        tx_dout_timecode = timecode_s[4];
306
                 end
307
                 else if(global_counter_transfer[3:0] == 4'd11)
308
                 begin
309
                        tx_dout_timecode = timecode_s[5];
310
                 end
311
                 else if( global_counter_transfer[3:0] == 4'd12)
312
                 begin
313
                        tx_dout_timecode = timecode_s[6];
314
                 end
315
                 else if(global_counter_transfer[3:0] == 4'd13)
316
                 begin
317
                        tx_dout_timecode = timecode_s[7];
318
                 end
319
        end
320
end
321
 
322
always@(*)
323
begin
324 36 redbear
        tx_dout_data = last_tx_dout;
325 33 redbear
 
326
        if(enable_n_char)
327
        begin
328 36 redbear
                if(!tx_data_in[8] && last_type == NULL  && global_counter_transfer[3:0] == 4'd0)
329 33 redbear
                 begin
330 36 redbear
                        tx_dout_data = !(tx_data_in[8]^null_s[0]^null_s[1]);
331 33 redbear
                 end
332 36 redbear
                 else if(!tx_data_in[8] && last_type == FCT && global_counter_transfer[3:0] == 4'd0)
333 33 redbear
                 begin
334 36 redbear
                        tx_dout_data = !(tx_data_in[8]^fct_s[0]^fct_s[1]);
335 33 redbear
                 end
336 36 redbear
                 else if(!tx_data_in[8] && last_type == EOP  && global_counter_transfer[3:0] == 4'd0)
337 33 redbear
                 begin
338 36 redbear
                        tx_dout_data = !(tx_data_in[8]^eop_s[0]^eop_s[1]);
339 33 redbear
                 end
340 36 redbear
                 else if(!tx_data_in[8] && last_type == EEP  && global_counter_transfer[3:0] == 4'd0)
341 33 redbear
                 begin
342 36 redbear
                        tx_dout_data = !(tx_data_in[8]^eep_s[0]^eep_s[1]);
343 33 redbear
                 end
344 36 redbear
                 else if(!tx_data_in[8] && last_type == DATA  && global_counter_transfer[3:0] == 4'd0)
345 33 redbear
                 begin
346 36 redbear
                        tx_dout_data = !(tx_data_in[8]^txdata_flagctrl_tx_last[0]^txdata_flagctrl_tx_last[1]^txdata_flagctrl_tx_last[2]^txdata_flagctrl_tx_last[3]^ txdata_flagctrl_tx_last[4]^txdata_flagctrl_tx_last[5]^txdata_flagctrl_tx_last[6]^txdata_flagctrl_tx_last[7]);
347 33 redbear
                 end
348 36 redbear
                 else if(!tx_data_in[8] && last_type == TIMEC && global_counter_transfer[3:0] == 4'd0)
349 33 redbear
                 begin
350 36 redbear
                        tx_dout_data = !(tx_data_in[8]^last_timein_control_flag_tx[7]^last_timein_control_flag_tx[6]^last_timein_control_flag_tx[5]^last_timein_control_flag_tx[4]^last_timein_control_flag_tx[3]^last_timein_control_flag_tx[2]^last_timein_control_flag_tx[1]^last_timein_control_flag_tx[0]);
351 33 redbear
                 end
352 36 redbear
                 else if(tx_data_in[8]  && tx_data_in[1:0] == 2'b00 && last_type == NULL  && global_counter_transfer[3:0] == 4'd0)
353 33 redbear
                 begin
354
                        tx_dout_data = !(eop_s[2]^null_s[0]^null_s[1]);
355
                 end
356 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b00 && last_type == FCT   && global_counter_transfer[3:0] == 4'd0)
357 33 redbear
                 begin
358
                        tx_dout_data = !(eop_s[2]^fct_s[0]^fct_s[1]);
359
                 end
360 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b00 && last_type == EOP  && global_counter_transfer[3:0] == 4'd0)
361 33 redbear
                 begin
362
                        tx_dout_data = !(eop_s[2]^eop_s[0]^eop_s[1]);
363
                 end
364 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b00 && last_type == EEP  && global_counter_transfer[3:0] == 4'd0)
365 33 redbear
                 begin
366
                        tx_dout_data = !(eop_s[2]^eep_s[0]^eep_s[1]);
367
                 end
368 36 redbear
                 else if(tx_data_in[8]  && tx_data_in[1:0] == 2'b00 && last_type == DATA  && global_counter_transfer[3:0] == 4'd0)
369 33 redbear
                 begin
370
                        tx_dout_data = !(eop_s[2]^txdata_flagctrl_tx_last[0]^txdata_flagctrl_tx_last[1]^txdata_flagctrl_tx_last[2]^txdata_flagctrl_tx_last[3]^ txdata_flagctrl_tx_last[4]^txdata_flagctrl_tx_last[5]^txdata_flagctrl_tx_last[6]^txdata_flagctrl_tx_last[7]);
371
                 end
372 36 redbear
                 else if(tx_data_in[8]  && tx_data_in[1:0] == 2'b00 && last_type == TIMEC && global_counter_transfer[3:0] == 4'd0)
373 33 redbear
                 begin
374
                        tx_dout_data = !(eop_s[2]^last_timein_control_flag_tx[7]^last_timein_control_flag_tx[6]^last_timein_control_flag_tx[5]^last_timein_control_flag_tx[4]^last_timein_control_flag_tx[3]^last_timein_control_flag_tx[2]^last_timein_control_flag_tx[1]^last_timein_control_flag_tx[0]);
375
                 end
376 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b01 && last_type == NULL  && global_counter_transfer[3:0] == 4'd0)
377 33 redbear
                 begin
378
                        tx_dout_data = !(eep_s[2]^null_s[0]^null_s[1]);
379
                 end
380 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b01 && last_type == FCT  && global_counter_transfer[3:0] == 4'd0)
381 33 redbear
                 begin
382
                        tx_dout_data = !(eep_s[2]^fct_s[0]^fct_s[1]);
383
                 end
384 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b01 && last_type == EOP  && global_counter_transfer[3:0] == 4'd0)
385 33 redbear
                 begin
386
                        tx_dout_data = !(eep_s[2]^eop_s[0]^eop_s[1]);
387
                 end
388 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b01 && last_type == EEP && global_counter_transfer[3:0] == 4'd0)
389 33 redbear
                 begin
390
                        tx_dout_data = !(eep_s[2]^eep_s[0]^eep_s[1]);
391
                 end
392 36 redbear
                 else if(tx_data_in[8]  && tx_data_in[1:0] == 2'b01 && last_type == DATA && global_counter_transfer[3:0] == 4'd0)
393 33 redbear
                 begin
394
                        tx_dout_data = !(eep_s[2]^txdata_flagctrl_tx_last[0]^txdata_flagctrl_tx_last[1]^txdata_flagctrl_tx_last[2]^txdata_flagctrl_tx_last[3]^ txdata_flagctrl_tx_last[4]^txdata_flagctrl_tx_last[5]^txdata_flagctrl_tx_last[6]^txdata_flagctrl_tx_last[7]);
395
                 end
396 36 redbear
                 else if(tx_data_in[8]  &&  tx_data_in[1:0] == 2'b01 && last_type == TIMEC && global_counter_transfer[3:0] == 4'd0)
397 33 redbear
                 begin
398
                        tx_dout_data = !(eep_s[2]^last_timein_control_flag_tx[7]^last_timein_control_flag_tx[6]^last_timein_control_flag_tx[5]^last_timein_control_flag_tx[4]^last_timein_control_flag_tx[3]^last_timein_control_flag_tx[2]^last_timein_control_flag_tx[1]^last_timein_control_flag_tx[0]);
399
                 end
400 36 redbear
                 else if(!tx_data_in[8] &&  global_counter_transfer[3:0] == 4'd1)
401 33 redbear
                 begin
402 36 redbear
                        tx_dout_data = tx_data_in[8];
403 33 redbear
                 end
404 36 redbear
                 else if(!tx_data_in[8] && global_counter_transfer[3:0] == 4'd2)
405 33 redbear
                 begin
406 36 redbear
                        tx_dout_data = tx_data_in[0];
407 33 redbear
                 end
408 36 redbear
                 else if(!tx_data_in[8] &&  global_counter_transfer[3:0] == 4'd3)
409 33 redbear
                 begin
410 36 redbear
                        tx_dout_data = tx_data_in[1];
411 33 redbear
                 end
412 36 redbear
                 else if(!tx_data_in[8] && global_counter_transfer[3:0] == 4'd4)
413 33 redbear
                 begin
414 36 redbear
                        tx_dout_data = tx_data_in[2];
415 33 redbear
                 end
416 36 redbear
                 else if(!tx_data_in[8]  && global_counter_transfer[3:0] == 4'd5)
417 33 redbear
                 begin
418 36 redbear
                        tx_dout_data = tx_data_in[3];
419 33 redbear
                 end
420 36 redbear
                 else if(!tx_data_in[8]  && global_counter_transfer[3:0] == 4'd6)
421 33 redbear
                 begin
422 36 redbear
                        tx_dout_data = tx_data_in[4];
423 33 redbear
                 end
424 36 redbear
                 else if(!tx_data_in[8]  && global_counter_transfer[3:0] == 4'd7)
425 33 redbear
                 begin
426 36 redbear
                        tx_dout_data = tx_data_in[5];
427 33 redbear
                 end
428 36 redbear
                 else if(!tx_data_in[8] &&  global_counter_transfer[3:0] == 4'd8)
429 33 redbear
                 begin
430 36 redbear
                        tx_dout_data = tx_data_in[6];
431 33 redbear
                 end
432 36 redbear
                 else if(!tx_data_in[8] &&  global_counter_transfer[3:0] == 4'd9)
433 33 redbear
                 begin
434 36 redbear
                        tx_dout_data = tx_data_in[7];
435 33 redbear
                 end
436 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b01 && global_counter_transfer[3:0] == 4'd1)
437 33 redbear
                 begin
438
                        tx_dout_data = eep_s[2];
439
                 end
440 36 redbear
                 else if( tx_data_in[8] && tx_data_in[1:0] == 2'b01 && global_counter_transfer[3:0] == 4'd2)
441 33 redbear
                 begin
442
                        tx_dout_data = eep_s[1];
443
                 end
444 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b01 && global_counter_transfer[3:0] == 4'd3)
445 33 redbear
                 begin
446
                        tx_dout_data = eep_s[0];
447
                 end
448 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b00 && global_counter_transfer[3:0] == 4'd1)
449 33 redbear
                 begin
450
                        tx_dout_data = eop_s[2];
451
                 end
452 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b00 && global_counter_transfer[3:0] == 4'd2)
453 33 redbear
                 begin
454
                        tx_dout_data = eop_s[1];
455
                 end
456 36 redbear
                 else if(tx_data_in[8] && tx_data_in[1:0] == 2'b00 && global_counter_transfer[3:0] == 4'd3)
457 33 redbear
                 begin
458
                        tx_dout_data = eop_s[0];
459
                 end
460
        end
461
end
462 5 redbear
 
463
//strobe
464
always@(*)
465
begin
466
 
467 36 redbear
        tx_sout = last_tx_sout;
468
 
469
        if((enable_null | enable_fct | enable_n_char | enable_time_code) & tx_dout == last_tx_dout)
470 5 redbear
        begin
471
                tx_sout = !last_tx_sout;
472
        end
473 33 redbear
        else if((enable_null | enable_fct | enable_n_char | enable_time_code) & tx_dout != last_tx_dout)
474 5 redbear
        begin
475
                tx_sout = last_tx_sout;
476 33 redbear
        end
477 5 redbear
end
478
 
479 17 redbear
always@(*)
480 5 redbear
begin
481 17 redbear
        fct_counter = 6'd0;
482
 
483
        if(gotfct_tx)
484 5 redbear
        begin
485 17 redbear
                if(block_sum)
486 15 redbear
                begin
487 17 redbear
 
488
                end
489
                else
490
                begin
491
                        if(fct_counter_receive < 6'd48)
492 15 redbear
                        begin
493 17 redbear
                                fct_counter = fct_counter_receive + 6'd8;
494 15 redbear
                        end
495
                        else
496
                        begin
497 17 redbear
                                fct_counter = fct_counter_receive + 6'd7;
498
 
499 15 redbear
                        end
500
                end
501 5 redbear
        end
502
end
503
 
504
//slots open in our side
505 19 redbear
always@(*)
506 5 redbear
begin
507
 
508 19 redbear
        fct_send = {3{1'b0}};
509
 
510
        if(send_fct_now)
511 5 redbear
        begin
512 19 redbear
                if(block_sum_fct_send)
513
                begin
514 6 redbear
 
515
                end
516
                else
517
                begin
518 19 redbear
                        if(fct_flag == 3'd7)
519
                        begin
520
                                fct_send = 3'd0;
521
                        end
522
                        else
523
                        begin
524
                                fct_send = fct_flag + 3'd1;
525
 
526
                        end
527 6 redbear
                end
528 5 redbear
        end
529
end
530
 
531 36 redbear
always@(*)
532
begin
533 5 redbear
 
534 36 redbear
        tx_dout = last_tx_dout;
535
 
536
        if(enable_null)
537
        begin
538
                tx_dout = tx_dout_null;
539
        end
540
        else if(enable_fct)
541
        begin
542
                tx_dout = tx_dout_fct;
543
        end
544
        else if(enable_time_code)
545
        begin
546
                tx_dout = tx_dout_timecode;
547
        end
548
        else if(enable_n_char)
549
        begin
550
                tx_dout = tx_dout_data;
551
        end
552
end
553
 
554 5 redbear
always@(*)
555
begin
556
 
557
 
558 36 redbear
        enable_null      = hold_null;
559
        enable_fct       = hold_fct;
560
        enable_n_char    = hold_data;
561
        enable_time_code = hold_time_code;
562 5 redbear
 
563 17 redbear
        next_state_tx = state_tx;
564
 
565 5 redbear
        case(state_tx)
566
        tx_spw_start:
567
        begin
568
                if(send_null_tx && enable_tx)
569
                begin
570 36 redbear
                        next_state_tx = tx_spw_null;
571 5 redbear
                end
572
                else
573
                begin
574
                        next_state_tx = tx_spw_start;
575
                end
576
        end
577
        tx_spw_null:
578
        begin
579
                enable_null = 1'b1;
580
 
581 8 redbear
                if(!hold_null)
582 5 redbear
                begin
583
                        if(send_null_tx && send_fct_tx && enable_tx)
584
                                next_state_tx = tx_spw_null_fct;
585
                        else
586
                                next_state_tx = tx_spw_null;
587
                end
588
 
589
        end
590
        tx_spw_null_fct:
591
        begin
592
 
593
                enable_null   = 1'b1;
594
 
595 8 redbear
                if(send_fct_tx && fct_flag > 0  && !hold_null)
596 5 redbear
                begin
597 8 redbear
                        next_state_tx = tx_spw_null_fct;
598 5 redbear
                        enable_null = 1'b0;
599 8 redbear
                        enable_fct  = 1'b1;
600 5 redbear
                end
601
                else
602
                begin
603
                        enable_fct = 1'b0;
604 17 redbear
                        if(send_fct_tx && fct_counter_receive > 6'd0)
605 5 redbear
                        begin
606 36 redbear
                                next_state_tx =  tx_spw_full;
607 5 redbear
                        end
608
 
609
                end
610
        end
611
        tx_spw_full:
612
        begin
613 36 redbear
                if(tickin_tx && !ready_tx_timecode && tcode_rdy_trnsp &&!hold_null && !hold_fct && !hold_data)
614 5 redbear
                begin
615 6 redbear
                        enable_time_code = 1'b1;
616 5 redbear
                end
617 8 redbear
                else if(fct_flag > 3'd0 && !hold_null && !hold_time_code && !hold_data)
618 5 redbear
                begin
619 6 redbear
                        enable_fct  = 1'b1;
620 5 redbear
                end
621 36 redbear
                else if((txwrite_tx && !ready_tx_data && data_rdy_trnsp && fct_counter_receive > 6'd0 && !hold_null && !hold_time_code && !hold_fct) == 1'b1 )
622 5 redbear
                begin
623 8 redbear
                        enable_n_char = 1'b1;
624 5 redbear
                end
625 36 redbear
                else
626 8 redbear
                begin
627
                        enable_null = 1'b1;
628
                end
629 5 redbear
        end
630
        endcase
631
 
632
end
633
 
634 33 redbear
 
635
 
636 25 redbear
always@(posedge pclk_tx or negedge enable_tx)
637 5 redbear
begin
638
        if(!enable_tx)
639
        begin
640 25 redbear
 
641
                timecode_s    <= 14'b01110000000000;
642 19 redbear
                fct_flag      <= 3'd7;
643 6 redbear
 
644 13 redbear
                ready_tx_data     <= 1'b0;
645
                ready_tx_timecode <= 1'b0;
646 8 redbear
 
647
                hold_null       <= 1'b0;
648
                hold_fct        <= 1'b0;
649
                hold_data       <= 1'b0;
650
                hold_time_code  <= 1'b0;
651
 
652 5 redbear
                last_type  <= NULL;
653
 
654
                global_counter_transfer <= 4'd0;
655
                txdata_flagctrl_tx_last <= 9'd0;
656 36 redbear
                tx_data_in <= 9'd0;
657 5 redbear
                last_timein_control_flag_tx <= 8'd0;
658 6 redbear
 
659
                fct_counter_receive <= 6'd0;
660 17 redbear
 
661
                block_sum  <= 1'b0;
662 19 redbear
                block_sum_fct_send <= 1'b0;
663 6 redbear
 
664 5 redbear
                last_tx_dout      <= 1'b0;
665
                last_tx_sout      <= 1'b0;
666 33 redbear
 
667 5 redbear
                state_tx <= tx_spw_start;
668 17 redbear
 
669 36 redbear
                tx_dout_e <= 1'b0;
670
                tx_sout_e <= 1'b0;
671
 
672
                data_rdy_trnsp <= 1'b0;
673
 
674
                tx_tcode_in     <= 8'd0;
675
                tcode_rdy_trnsp <= 1'b0;
676
 
677 5 redbear
        end
678
        else
679
        begin
680 25 redbear
 
681 5 redbear
                state_tx <= next_state_tx;
682 36 redbear
 
683 5 redbear
                last_tx_dout <= tx_dout;
684
                last_tx_sout <= tx_sout;
685
 
686 36 redbear
                tx_dout_e <= last_tx_dout;
687
                tx_sout_e <= last_tx_sout;
688
 
689 5 redbear
                if(enable_null)
690
                begin
691 6 redbear
 
692 36 redbear
                        if(txwrite_tx && global_counter_transfer == 4'd5)
693
                        begin
694
                                tx_data_in <= data_tx_i;
695
                                data_rdy_trnsp <= 1'b1;
696
                        end
697
                        else
698
                                tx_data_in <= tx_data_in;
699
 
700
                        if(tickin_tx && global_counter_transfer == 4'd5)
701
                        begin
702
                                tx_tcode_in <= timecode_tx_i;
703
                                tcode_rdy_trnsp <= 1'b1;
704
                        end
705
                        else
706
                                tx_tcode_in <= tx_tcode_in;
707
 
708
 
709 25 redbear
                        //hold_null     <= 1'b0;
710
                        hold_fct        <= 1'b0;
711
                        hold_data       <= 1'b0;
712
                        hold_time_code  <= 1'b0;
713
 
714 19 redbear
                        //
715 17 redbear
                        if(gotfct_tx && !block_sum)
716
                        begin
717 15 redbear
                                fct_counter_receive <= fct_counter;
718 17 redbear
                                block_sum<= 1'b1;
719
                        end
720
                        else if(!gotfct_tx)
721
                        begin
722
                                block_sum<= 1'b0;
723
                        end
724
                        else
725
                                block_sum <= block_sum;
726 6 redbear
                        //
727 19 redbear
                        if(send_fct_now && !block_sum_fct_send)
728 6 redbear
                        begin
729 19 redbear
                                fct_flag <= fct_send;
730
                                block_sum_fct_send<= 1'b1;
731 6 redbear
                        end
732 19 redbear
                        else if(!send_fct_now)
733
                        begin
734
                                block_sum_fct_send<= 1'b0;
735
                        end
736
                        else
737
                                block_sum_fct_send <= block_sum_fct_send;
738 6 redbear
 
739 36 redbear
                        if(global_counter_transfer == 4'd3)
740 34 redbear
                        begin
741 36 redbear
                                ready_tx_timecode <= 1'b0;
742
                                ready_tx_data <= 1'b0;
743 34 redbear
                        end
744
                        else
745
                        begin
746 36 redbear
                                ready_tx_timecode <= ready_tx_timecode;
747
                                ready_tx_data <= ready_tx_data;
748 34 redbear
                        end
749
 
750 36 redbear
                        if(global_counter_transfer == 4'd7)
751 5 redbear
                        begin
752 36 redbear
                                last_type  <= NULL;
753
                                hold_null <= 1'b0;
754
                                global_counter_transfer <= 4'd0;
755 5 redbear
                        end
756 36 redbear
                        else
757 5 redbear
                        begin
758 36 redbear
                                last_type  <= last_type;
759
                                hold_null <= 1'b1;
760 5 redbear
                                global_counter_transfer <= global_counter_transfer + 4'd1;
761
                        end
762
                end
763
                else if(enable_fct)
764
                begin
765 8 redbear
 
766 25 redbear
                        hold_null       <= 1'b0;
767
                        //hold_fct      <= 1'b0;
768
                        hold_data       <= 1'b0;
769
                        hold_time_code  <= 1'b0;
770
 
771
 
772 17 redbear
                        if(gotfct_tx && !block_sum)
773
                        begin
774 15 redbear
                                fct_counter_receive <= fct_counter;
775 17 redbear
                                block_sum<= 1'b1;
776
                        end
777
                        else if(!gotfct_tx)
778
                        begin
779
                                block_sum<= 1'b0;
780
                        end
781
                        else
782
                                block_sum <= block_sum;
783 36 redbear
 
784
                        ready_tx_data <= ready_tx_data;
785 6 redbear
 
786 34 redbear
                        if(global_counter_transfer == 4'd3)
787
                        begin
788 36 redbear
 
789
                                fct_flag <= fct_flag - 3'd1;
790
                                last_type  <=FCT;
791
                                global_counter_transfer <= 4'd0;
792 34 redbear
                                hold_fct <= 1'b0;
793
                        end
794
                        else
795
                        begin
796
 
797 19 redbear
                                if(send_fct_now && !block_sum_fct_send)
798
                                begin
799
                                        fct_flag <= fct_send;
800
                                        block_sum_fct_send<= 1'b1;
801
                                end
802
                                else if(!send_fct_now)
803
                                begin
804
                                        block_sum_fct_send<= 1'b0;
805
                                end
806
                                else
807
                                        block_sum_fct_send <= block_sum_fct_send;
808 36 redbear
 
809
                                hold_fct <= 1'b1;
810
                                global_counter_transfer <= global_counter_transfer + 4'd1;
811 5 redbear
                        end
812
                end
813
                else if(enable_time_code)
814
                begin
815 33 redbear
 
816 36 redbear
                        if(txwrite_tx && global_counter_transfer == 4'd6)
817
                        begin
818
                                data_rdy_trnsp <= 1'b1;
819
                                tx_data_in <= data_tx_i;
820
                        end
821
                        else
822
                                tx_data_in <= tx_data_in;
823
 
824 25 redbear
                        hold_null       <= 1'b0;
825
                        hold_fct        <= 1'b0;
826
                        hold_data       <= 1'b0;
827
                        //hold_time_code        <= 1'b0;
828
 
829 17 redbear
                        if(gotfct_tx && !block_sum)
830
                        begin
831 15 redbear
                                fct_counter_receive <= fct_counter;
832 17 redbear
                                block_sum<= 1'b1;
833
                        end
834
                        else if(!gotfct_tx)
835
                        begin
836
                                block_sum<= 1'b0;
837
                        end
838
                        else
839
                                block_sum <= block_sum;
840 15 redbear
 
841 13 redbear
                        if(global_counter_transfer == 4'd13)
842
                        begin
843 36 redbear
                                hold_time_code <= 1'b0;
844 13 redbear
                                ready_tx_timecode <= 1'b1;
845 36 redbear
                                global_counter_transfer <= 4'd0;
846 13 redbear
                        end
847 34 redbear
                        else
848
                        begin
849
                                hold_time_code <= 1'b0;
850 36 redbear
                                ready_tx_timecode <= 1'b0;
851
                                global_counter_transfer <= global_counter_transfer + 4'd1;
852 34 redbear
                        end
853
 
854 6 redbear
                        //
855 19 redbear
                        if(send_fct_now && !block_sum_fct_send)
856 6 redbear
                        begin
857 19 redbear
                                fct_flag <= fct_send;
858
                                block_sum_fct_send<= 1'b1;
859 6 redbear
                        end
860 19 redbear
                        else if(!send_fct_now)
861
                        begin
862
                                block_sum_fct_send<= 1'b0;
863
                        end
864
                        else
865
                                block_sum_fct_send <= block_sum_fct_send;
866 6 redbear
 
867 34 redbear
                        if(global_counter_transfer != 4'd13)
868 5 redbear
                        begin
869 36 redbear
 
870
                                timecode_s <= {timecode_ss[13:10],2'd2,tx_tcode_in[7:0]};
871 5 redbear
                        end
872
                        else
873
                        begin
874 34 redbear
                                ready_tx_data <= 1'b0;
875 36 redbear
                                last_timein_control_flag_tx <= tx_tcode_in;
876 25 redbear
                                last_type  <= TIMEC;
877 5 redbear
                        end
878
                end
879
                else if(enable_n_char)
880
                begin
881 25 redbear
                        hold_null       <= 1'b0;
882
                        hold_fct        <= 1'b0;
883
                        //hold_data     <= 1'b0;
884
                        hold_time_code  <= 1'b0;
885
 
886 6 redbear
                        //
887 19 redbear
                        if(send_fct_now && !block_sum_fct_send)
888 6 redbear
                        begin
889 19 redbear
                                fct_flag <= fct_send;
890
                                block_sum_fct_send<= 1'b1;
891 6 redbear
                        end
892 19 redbear
                        else if(!send_fct_now)
893
                        begin
894
                                block_sum_fct_send<= 1'b0;
895
                        end
896
                        else
897
                                block_sum_fct_send <= block_sum_fct_send;
898 6 redbear
 
899 36 redbear
                        if(!tx_data_in[8])
900 5 redbear
                        begin
901 8 redbear
 
902
                                if(global_counter_transfer == 4'd9)
903
                                begin
904 36 redbear
 
905
                                        fct_counter_receive <= fct_counter_receive - 6'd1;
906
                                        last_type  <= DATA;
907
 
908 34 redbear
                                        hold_data <= 1'b0;
909 8 redbear
                                        ready_tx_data <= 1'b1;
910 36 redbear
                                        data_rdy_trnsp <= 1'b0;
911
                                        global_counter_transfer <= 4'd0;
912 8 redbear
                                end
913 17 redbear
                                else
914
                                begin
915
                                        if(gotfct_tx && !block_sum)
916
                                        begin
917
                                                fct_counter_receive <= fct_counter;
918
                                                block_sum<= 1'b1;
919
                                        end
920
                                        else if(!gotfct_tx)
921
                                        begin
922
                                                block_sum<= 1'b0;
923
                                        end
924
                                        else
925
                                                block_sum <= block_sum;
926 36 redbear
 
927
                                        ready_tx_data <= 1'b0;
928
                                        hold_data <= 1'b1;
929
                                        ready_tx_timecode <= 1'b0;
930
                                        global_counter_transfer <= global_counter_transfer + 4'd1;
931 8 redbear
                                end
932
 
933 36 redbear
                                if(global_counter_transfer == 4'd4)
934
                                        txdata_flagctrl_tx_last <= tx_data_in;
935
 
936
 
937 5 redbear
                        end
938 36 redbear
                        else if(tx_data_in[8])
939 5 redbear
                        begin
940 8 redbear
 
941
                                if(global_counter_transfer == 4'd3)
942
                                begin
943 36 redbear
                                        fct_counter_receive <= fct_counter_receive - 6'd1;
944
 
945
                                        if(tx_data_in[1:0] == 2'b00)
946
                                        begin
947
                                                last_type  <=EOP;
948
                                        end
949
                                        else if(tx_data_in[1:0] == 2'b01)
950
                                        begin
951
                                                last_type  <=EEP;
952
                                        end
953
 
954
                                        global_counter_transfer <= 4'd0;
955 34 redbear
                                        hold_data <= 1'b0;
956 36 redbear
                                        data_rdy_trnsp <= 1'b0;
957 8 redbear
                                        ready_tx_data <= 1'b1;
958
                                end
959 17 redbear
                                else
960
                                begin
961 34 redbear
                                        txdata_flagctrl_tx_last <= txdata_flagctrl_tx_last;
962 17 redbear
 
963
                                        if(gotfct_tx && !block_sum)
964
                                        begin
965
                                                fct_counter_receive <= fct_counter;
966
                                                block_sum<= 1'b1;
967
                                        end
968
                                        else if(!gotfct_tx)
969
                                        begin
970
                                                block_sum<= 1'b0;
971
                                        end
972
                                        else
973
                                                block_sum <= block_sum;
974 36 redbear
 
975
                                        hold_data <= 1'b1;
976
                                        ready_tx_data <= 1'b0;
977
                                        ready_tx_timecode <= 1'b0;
978
                                        global_counter_transfer <= global_counter_transfer + 4'd1;
979 8 redbear
                                end
980 34 redbear
 
981 36 redbear
 
982 5 redbear
                        end
983 8 redbear
 
984 5 redbear
                end
985
 
986
        end
987
end
988
 
989
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.