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

Subversion Repositories spacewiresystemc

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

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
                output reg tx_dout,
54
                output reg tx_sout,
55
                //
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
        reg [2:0] state_tx;
74
        reg [2:0] next_state_tx;
75
 
76
        reg [7:0]  null_s;
77
        reg [3:0]  fct_s;
78
        reg [3:0]  eop_s;
79
        reg [3:0]  eep_s;
80
        reg [13:0] timecode_s;
81
 
82
        reg [5:0]  last_type;
83
        reg [8:0]  txdata_flagctrl_tx_last;
84
        reg [7:0]  last_timein_control_flag_tx;
85
 
86
        reg first_time;
87
 
88 8 redbear
        reg hold_null;
89
        reg hold_fct;
90
        reg hold_data;
91
        reg hold_time_code;
92
 
93 5 redbear
        reg enable_null;
94
        reg enable_fct;
95
        reg enable_n_char;
96
        reg enable_time_code;
97
 
98
        reg [2:0] fct_send;
99 6 redbear
        reg [2:0] fct_send_last;
100 5 redbear
        reg [2:0] fct_flag;
101 6 redbear
 
102 5 redbear
        reg [5:0] fct_counter;
103 6 redbear
        reg [5:0] fct_counter_receive;
104
 
105 5 redbear
        reg last_tx_dout;
106
        reg last_tx_sout;
107
 
108
        reg [3:0] global_counter_transfer;
109
 
110
 
111 13 redbear
 
112 5 redbear
always@(*)
113
begin
114
        tx_dout = 1'b0;
115
 
116
         if(!enable_tx)
117
         begin
118
                tx_dout = 1'b0;
119
         end
120
         else if( enable_null & first_time  & global_counter_transfer == 4'd0)
121
         begin
122
                tx_dout = null_s[7];
123
         end
124
         else if( enable_null & !first_time & last_type == NULL  & global_counter_transfer == 4'd0)
125
         begin
126
                tx_dout = !(null_s[6]^null_s[0]^null_s[1]);
127
         end
128
         else if( enable_null & !first_time & last_type == FCT   & global_counter_transfer == 4'd0)
129
         begin
130
                tx_dout = !(null_s[6]^fct_s[0]^fct_s[1]);
131
         end
132
         else if( enable_null & !first_time & last_type == EOP   & global_counter_transfer == 4'd0)
133
         begin
134
                tx_dout = !(null_s[6]^eop_s[0]^eop_s[1]);
135
         end
136
         else if( enable_null & !first_time & last_type == EEP   & global_counter_transfer == 4'd0)
137
         begin
138
                tx_dout = !(null_s[6]^eep_s[0]^eep_s[1]);
139
         end
140
         else if( enable_null & !first_time & last_type == DATA  & global_counter_transfer == 4'd0)
141
         begin
142
                tx_dout =  !(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]);
143
         end
144
         else if( enable_null & !first_time & last_type == TIMEC & global_counter_transfer == 4'd0)
145
         begin
146
                tx_dout =  !(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]);
147
         end
148
         else if( enable_null & !first_time & global_counter_transfer == 4'd1)
149
         begin
150
                tx_dout = null_s[6];
151
         end
152
         else if( enable_null & !first_time & global_counter_transfer == 4'd2)
153
         begin
154
                tx_dout = null_s[5];
155
         end
156
         else if( enable_null & !first_time & global_counter_transfer == 4'd3)
157
         begin
158
                tx_dout = null_s[4];
159
         end
160
         else if( enable_null & !first_time & global_counter_transfer == 4'd4)
161
         begin
162
                tx_dout = null_s[3];
163
         end
164
         else if( enable_null & !first_time & global_counter_transfer == 4'd5)
165
         begin
166
                tx_dout = null_s[2];
167
         end
168
         else if( enable_null & !first_time & global_counter_transfer == 4'd6)
169
         begin
170
                tx_dout = null_s[1];
171
         end
172
         else if( enable_null & !first_time & global_counter_transfer == 4'd7)
173
         begin
174
                tx_dout = null_s[0];
175
         end
176
         else if( enable_fct  & !first_time & last_type == NULL  & global_counter_transfer == 4'd0)
177
         begin
178
                tx_dout = !(fct_s[2]^null_s[0]^null_s[1]);
179
         end
180
         else if( enable_fct  & !first_time & last_type == FCT   & global_counter_transfer == 4'd0)
181
         begin
182
                tx_dout = !(fct_s[2]^fct_s[0]^fct_s[1]);
183
         end
184
         else if( enable_fct  & !first_time & last_type == EOP   & global_counter_transfer == 4'd0)
185
         begin
186
                tx_dout = !(fct_s[2]^eop_s[0]^eop_s[1]);
187
         end
188
         else if( enable_fct  & !first_time & last_type == EEP   & global_counter_transfer == 4'd0)
189
         begin
190
                tx_dout = !(fct_s[2]^eep_s[0]^eep_s[1]);
191
         end
192
         else if ( enable_fct  & !first_time & last_type == DATA  & global_counter_transfer == 4'd0)
193
         begin
194
                tx_dout = !(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]);
195
         end
196
         else if( enable_fct  & !first_time & last_type == TIMEC & global_counter_transfer == 4'd0)
197
         begin
198
                tx_dout = !(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]);
199
         end
200
         else if( enable_fct  & !first_time & global_counter_transfer == 4'd1)
201
         begin
202
                tx_dout = fct_s[2];
203
         end
204
         else if( enable_fct  & !first_time & global_counter_transfer == 4'd2)
205
         begin
206
                tx_dout = fct_s[1];
207
         end
208
         else if( enable_fct  & !first_time & global_counter_transfer == 4'd3)
209
         begin
210
                tx_dout = fct_s[0];
211
         end
212
         else if( enable_time_code & !first_time & last_type == NULL  & global_counter_transfer == 4'd0)
213
         begin
214
                tx_dout = !(timecode_s[12]^null_s[0]^null_s[1]);
215
         end
216
         else if( enable_time_code & !first_time & last_type == FCT   & global_counter_transfer == 4'd0)
217
         begin
218
                tx_dout = !(timecode_s[12]^fct_s[0]^fct_s[1]);
219
         end
220
         else if ( enable_time_code & !first_time & last_type == EOP   & global_counter_transfer == 4'd0)
221
         begin
222
                tx_dout = !(timecode_s[12]^eop_s[0]^eop_s[1]);
223
         end
224
         else if( enable_time_code & !first_time & last_type == EEP   & global_counter_transfer == 4'd0)
225
         begin
226
                tx_dout = !(timecode_s[12]^eep_s[0]^eep_s[1]);
227
         end
228
         else if( enable_time_code & !first_time & last_type == DATA  & global_counter_transfer == 4'd0)
229
         begin
230
                tx_dout = !(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]);
231
         end
232
         else if( enable_time_code & !first_time & last_type == TIMEC & global_counter_transfer == 4'd0)
233
         begin
234
                tx_dout = !(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]);
235
         end
236
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd1)
237
         begin
238
                tx_dout = timecode_s[12];
239
         end
240
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd2)
241
         begin
242
                tx_dout = timecode_s[11];
243
         end
244
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd3)
245
         begin
246
                tx_dout = timecode_s[10];
247
         end
248
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd4)
249
         begin
250
                tx_dout = timecode_s[9];
251
         end
252
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd5)
253
         begin
254
                tx_dout = timecode_s[8];
255
         end
256
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd6)
257
         begin
258 13 redbear
                tx_dout = timecode_s[0];
259 5 redbear
         end
260
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd7)
261
         begin
262 13 redbear
                tx_dout = timecode_s[1];
263 5 redbear
         end
264
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd8)
265
         begin
266 13 redbear
                tx_dout = timecode_s[2];
267 5 redbear
         end
268
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd9)
269
         begin
270 13 redbear
                tx_dout = timecode_s[3];
271 5 redbear
         end
272
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd10)
273
         begin
274 13 redbear
                tx_dout = timecode_s[4];
275 5 redbear
         end
276
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd11)
277
         begin
278 13 redbear
                tx_dout = timecode_s[5];
279 5 redbear
         end
280
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd12)
281
         begin
282 13 redbear
                tx_dout = timecode_s[6];
283 5 redbear
         end
284
         else if( enable_time_code & !first_time & global_counter_transfer == 4'd13)
285
         begin
286 13 redbear
                tx_dout = timecode_s[7];
287 5 redbear
         end
288 8 redbear
         else if( enable_n_char   & !data_tx_i[8] & !first_time & last_type == NULL  & global_counter_transfer == 4'd0)
289 5 redbear
         begin
290
                tx_dout = !(data_tx_i[8]^null_s[0]^null_s[1]);
291
         end
292 8 redbear
         else if( enable_n_char   & !data_tx_i[8] & !first_time & last_type == FCT   & global_counter_transfer == 4'd0)
293 5 redbear
         begin
294
                tx_dout = !(data_tx_i[8]^fct_s[0]^fct_s[1]);
295
         end
296 8 redbear
         else if( enable_n_char   & !data_tx_i[8] & !first_time & last_type == EOP   & global_counter_transfer == 4'd0)
297 5 redbear
         begin
298
                tx_dout = !(data_tx_i[8]^eop_s[0]^eop_s[1]);
299
         end
300 8 redbear
         else if( enable_n_char   & !data_tx_i[8] & !first_time & last_type == EEP   & global_counter_transfer == 4'd0)
301 5 redbear
         begin
302
                tx_dout = !(data_tx_i[8]^eep_s[0]^eep_s[1]);
303
         end
304 8 redbear
         else if( enable_n_char   & !data_tx_i[8] & !first_time & last_type == DATA  & global_counter_transfer == 4'd0)
305 5 redbear
         begin
306
                tx_dout = !(data_tx_i[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]);
307
         end
308 8 redbear
         else if( enable_n_char   & !data_tx_i[8] & !first_time & last_type == TIMEC & global_counter_transfer == 4'd0)
309 5 redbear
         begin
310
                tx_dout = !(data_tx_i[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]);
311
         end
312 8 redbear
         else if( enable_n_char   & data_tx_i[8]  & data_tx_i[1:0] == 2'b00 &  !first_time & last_type == NULL  & global_counter_transfer == 4'd0)
313 5 redbear
         begin
314 8 redbear
                tx_dout = !(eop_s[3]^null_s[0]^null_s[1]);
315
         end
316
         else if( enable_n_char   & !data_tx_i[8] & data_tx_i[1:0] == 2'b00 & !first_time & last_type == FCT   & global_counter_transfer == 4'd0)
317
         begin
318
                tx_dout = !(eop_s[3]^fct_s[0]^fct_s[1]);
319
         end
320
         else if( enable_n_char   & !data_tx_i[8] & data_tx_i[1:0] == 2'b00 & !first_time & last_type == EOP   & global_counter_transfer == 4'd0)
321
         begin
322
                tx_dout = !(eop_s[3]^eop_s[0]^eop_s[1]);
323
         end
324
         else if( enable_n_char   & !data_tx_i[8] & data_tx_i[1:0] == 2'b00 & !first_time & last_type == EEP   & global_counter_transfer == 4'd0)
325
         begin
326
                tx_dout = !(eop_s[3]^eep_s[0]^eep_s[1]);
327
         end
328
         else if( enable_n_char   & !data_tx_i[8]  & data_tx_i[1:0] == 2'b00 & !first_time & last_type == DATA  & global_counter_transfer == 4'd0)
329
         begin
330
                tx_dout = !(eop_s[3]^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]);
331
         end
332
         else if( enable_n_char   & !data_tx_i[8]  & data_tx_i[1:0] == 2'b00 & !first_time & last_type == TIMEC & global_counter_transfer == 4'd0)
333
         begin
334
                tx_dout = !(eop_s[3]^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]);
335
         end
336
         else if( enable_n_char    &  data_tx_i[8] & data_tx_i[1:0] == 2'b00 & !first_time & global_counter_transfer == 4'd1)
337
         begin
338
                tx_dout = eop_s[2];
339
         end
340
         else if( enable_n_char    &  data_tx_i[8] & data_tx_i[1:0] == 2'b00 & !first_time & global_counter_transfer == 4'd2)
341
         begin
342
                tx_dout = eop_s[1];
343
         end
344
         else if( enable_n_char    &  data_tx_i[8] & data_tx_i[1:0] == 2'b00 & !first_time & global_counter_transfer == 4'd3)
345
         begin
346
                tx_dout = eop_s[0];
347
         end
348
         else if( enable_n_char   & data_tx_i[8]  & data_tx_i[1:0] == 2'b01 &  !first_time & last_type == NULL  & global_counter_transfer == 4'd0)
349
         begin
350
                tx_dout = !(eep_s[3]^null_s[0]^null_s[1]);
351
         end
352
         else if( enable_n_char   & !data_tx_i[8] & data_tx_i[1:0] == 2'b01 & !first_time & last_type == FCT   & global_counter_transfer == 4'd0)
353
         begin
354
                tx_dout = !(eep_s[3]^fct_s[0]^fct_s[1]);
355
         end
356
         else if( enable_n_char   & !data_tx_i[8] & data_tx_i[1:0] == 2'b01 & !first_time & last_type == EOP   & global_counter_transfer == 4'd0)
357
         begin
358
                tx_dout = !(eep_s[3]^eop_s[0]^eop_s[1]);
359
         end
360
         else if( enable_n_char   & !data_tx_i[8] & data_tx_i[1:0] == 2'b01 & !first_time & last_type == EEP   & global_counter_transfer == 4'd0)
361
         begin
362
                tx_dout = !(eep_s[3]^eep_s[0]^eep_s[1]);
363
         end
364
         else if( enable_n_char   & !data_tx_i[8]  & data_tx_i[1:0] == 2'b01 & !first_time & last_type == DATA  & global_counter_transfer == 4'd0)
365
         begin
366
                tx_dout = !(eep_s[3]^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]);
367
         end
368
         else if( enable_n_char   & !data_tx_i[8]  & data_tx_i[1:0] == 2'b01 & !first_time & last_type == TIMEC & global_counter_transfer == 4'd0)
369
         begin
370
                tx_dout = !(eep_s[3]^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]);
371
         end
372
         else if( enable_n_char   & !data_tx_i[8] & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd1)
373
         begin
374 5 redbear
                tx_dout = data_tx_i[8];
375
         end
376
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd2)
377
         begin
378
                tx_dout = data_tx_i[0];
379
         end
380
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd3)
381
         begin
382
                tx_dout = data_tx_i[1];
383
         end
384
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd4)
385
         begin
386
                tx_dout = data_tx_i[2];
387
         end
388
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd5)
389
         begin
390
                tx_dout = data_tx_i[3];
391
         end
392
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd6)
393
         begin
394
                tx_dout = data_tx_i[4];
395
         end
396
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd7)
397
         begin
398
                tx_dout = data_tx_i[5];
399
         end
400
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd8)
401
         begin
402
                tx_dout = data_tx_i[6];
403
         end
404
         else if( enable_n_char    & !data_tx_i[8] & !first_time & global_counter_transfer == 4'd9)
405
         begin
406
                tx_dout = data_tx_i[7];
407
         end
408
         else if( enable_n_char    &  data_tx_i[8] & data_tx_i[1:0] == 2'b01 & !first_time & global_counter_transfer == 4'd1)
409
         begin
410
                tx_dout = eep_s[2];
411
         end
412
         else if( enable_n_char    &  data_tx_i[8] & data_tx_i[1:0] == 2'b01 & !first_time & global_counter_transfer == 4'd2)
413
         begin
414
                tx_dout = eep_s[1];
415
         end
416
         else if( enable_n_char    &  data_tx_i[8] & data_tx_i[1:0] == 2'b01 & !first_time & global_counter_transfer == 4'd3)
417
         begin
418
                tx_dout = eep_s[0];
419
         end
420
end
421
 
422
//strobe
423
always@(*)
424
begin
425
        tx_sout = 1'b0;
426
 
427
        if(!enable_tx)
428
        begin
429
                tx_sout = 1'b0;
430
        end
431 13 redbear
        else if((enable_null | enable_fct | enable_n_char | enable_time_code) && tx_dout == last_tx_dout)
432 5 redbear
        begin
433
                tx_sout = !last_tx_sout;
434
        end
435 13 redbear
        else if((enable_null | enable_fct | enable_n_char | enable_time_code) && tx_dout != last_tx_dout)
436 5 redbear
        begin
437
                tx_sout = last_tx_sout;
438 12 redbear
        end
439
 
440 5 redbear
end
441
 
442
//slots open in another side
443 15 redbear
always@(posedge gotfct_tx , negedge enable_tx)
444 5 redbear
begin
445
        if(!enable_tx)
446
        begin
447 15 redbear
                fct_counter <= 6'd0;
448 5 redbear
        end
449 15 redbear
        else
450 5 redbear
        begin
451 15 redbear
                if(fct_counter  < 6'd55)
452
                begin
453
                        if(enable_n_char && global_counter_transfer == 4'd9 && !data_tx_i[8])
454
                        begin
455
                                if(fct_counter < 6'd55)
456
                                        fct_counter <= fct_counter_receive + 6'd8 - 6'd1;
457
                                else
458
                                        fct_counter <= 6'd0;
459
                        end
460
                        else if(enable_n_char && global_counter_transfer == 4'd3 && data_tx_i[8])
461
                        begin
462
                                if(fct_counter < 6'd55)
463
                                        fct_counter <= fct_counter_receive + 6'd8 - 6'd1;
464
                                else
465
                                        fct_counter <= 6'd0;
466
                        end
467
                        else if(fct_counter == 6'd48)
468
                        begin
469
                                if(fct_counter < 6'd55)
470
                                        fct_counter <= fct_counter_receive + 6'd7;
471
                                else
472
                                        fct_counter <= 6'd0;
473
                        end
474
                        else
475
                        begin
476
                                if(fct_counter < 6'd55)
477
                                        fct_counter <= fct_counter_receive + 6'd8;
478
                                else
479
                                        fct_counter <= 6'd0;
480
                        end
481
 
482
                end
483 6 redbear
                else
484 15 redbear
                fct_counter <= 6'd0;
485 5 redbear
        end
486
end
487
 
488
 
489
//slots open in our side
490
always@(posedge send_fct_now or negedge enable_tx)
491
begin
492
 
493
        if(!enable_tx)
494
        begin
495
                fct_send <= {3{1'b1}};
496
        end
497
        else
498
        begin
499 6 redbear
 
500
                if(fct_send == 3'd7)
501
                begin
502
                        fct_send <= 3'd1;
503
                end
504
                else
505
                begin
506
                        fct_send <= fct_send + 3'd1;
507
                end
508 5 redbear
        end
509
 
510
end
511
 
512
 
513
always@(*)
514
begin
515
 
516
        next_state_tx = state_tx;
517
 
518
        enable_null      = 1'b0;
519
        enable_fct       = 1'b0;
520
        enable_n_char    = 1'b0;
521
        enable_time_code = 1'b0;
522
 
523
        case(state_tx)
524
        tx_spw_start:
525
        begin
526
                if(send_null_tx && enable_tx)
527
                begin
528 12 redbear
                        //if(!hold_null)
529 5 redbear
                                next_state_tx = tx_spw_null;
530
 
531 12 redbear
                        //enable_null = 1'b1;
532 5 redbear
                end
533
                else
534
                begin
535
                        next_state_tx = tx_spw_start;
536
                end
537
        end
538
        tx_spw_null:
539
        begin
540
                enable_null = 1'b1;
541
 
542 8 redbear
                if(!hold_null)
543 5 redbear
                begin
544
                        if(send_null_tx && send_fct_tx && enable_tx)
545
                                next_state_tx = tx_spw_null_fct;
546
                        else
547
                                next_state_tx = tx_spw_null;
548
                end
549
 
550
        end
551
        tx_spw_null_fct:
552
        begin
553
 
554
                enable_null   = 1'b1;
555
 
556 8 redbear
                if(send_fct_tx && fct_flag > 0  && !hold_null)
557 5 redbear
                begin
558 8 redbear
                        next_state_tx = tx_spw_null_fct;
559 5 redbear
                        enable_null = 1'b0;
560 8 redbear
                        enable_fct  = 1'b1;
561 5 redbear
                end
562
                else
563
                begin
564
                        enable_fct = 1'b0;
565 8 redbear
                        if(send_fct_tx && fct_counter > 6'd0)
566 5 redbear
                        begin
567 12 redbear
                                //if(global_counter_transfer == 4'd7)
568
                                        next_state_tx =  tx_spw_full;
569 5 redbear
                        end
570
 
571
                end
572
        end
573
        tx_spw_full:
574
        begin
575
 
576 8 redbear
                enable_null = 1'b0;
577
                enable_fct  = 1'b0;
578
                enable_n_char = 1'b0;
579
                enable_time_code = 1'b0;
580 5 redbear
 
581 12 redbear
                /*
582
                hold_null       <= 1'b0;
583
                hold_fct        <= 1'b0;
584
                hold_data       <= 1'b0;
585
                hold_time_code  <= 1'b0;
586
                */
587
 
588 8 redbear
                if(tickin_tx && !hold_null && !hold_fct && !hold_data)
589 5 redbear
                begin
590 6 redbear
                        enable_time_code = 1'b1;
591 5 redbear
                end
592 8 redbear
                else if(fct_flag > 3'd0 && !hold_null && !hold_time_code && !hold_data)
593 5 redbear
                begin
594 6 redbear
                        enable_fct  = 1'b1;
595 5 redbear
                end
596 8 redbear
                else if(txwrite_tx && fct_counter_receive > 6'd0 && !hold_null && !hold_time_code && !hold_fct )
597 5 redbear
                begin
598 8 redbear
                        enable_n_char = 1'b1;
599 5 redbear
                end
600 8 redbear
                else if(!hold_time_code && !hold_fct && !hold_data)
601
                begin
602
                        enable_null = 1'b1;
603
                end
604 5 redbear
 
605
        end
606
        endcase
607
 
608
end
609
 
610
always@(posedge pclk_tx)
611
begin
612
        if(!enable_tx)
613
        begin
614 13 redbear
                null_s        <= 8'h74;
615
                fct_s         <= 4'h4;
616
                eop_s         <= 4'h5;
617
                eep_s         <= 4'h6;
618
                timecode_s    <= 14'b01110000000000;
619 5 redbear
 
620 13 redbear
                fct_flag      <= 3'd0;
621 6 redbear
                fct_send_last <= 3'd0;
622
 
623 13 redbear
                first_time        <= 1'b1;
624
                ready_tx_data     <= 1'b0;
625
                ready_tx_timecode <= 1'b0;
626 8 redbear
 
627
                hold_null       <= 1'b0;
628
                hold_fct        <= 1'b0;
629
                hold_data       <= 1'b0;
630
                hold_time_code  <= 1'b0;
631
 
632 5 redbear
                last_type  <= NULL;
633
 
634
                global_counter_transfer <= 4'd0;
635
                txdata_flagctrl_tx_last <= 9'd0;
636
                last_timein_control_flag_tx <= 8'd0;
637 6 redbear
 
638
                fct_counter_receive <= 6'd0;
639 15 redbear
                //fct_counter_update <= 6'd0;
640
                //fct_counter_last <= 6'd0;
641 6 redbear
 
642 5 redbear
                last_tx_dout      <= 1'b0;
643
                last_tx_sout      <= 1'b0;
644
                state_tx <= tx_spw_start;
645
        end
646
        else
647
        begin
648
 
649
                state_tx <= next_state_tx;
650
                last_tx_dout <= tx_dout;
651
                last_tx_sout <= tx_sout;
652
 
653
                if(enable_null)
654
                begin
655 6 redbear
 
656 8 redbear
                        ready_tx_data <= 1'b0;
657 13 redbear
                        ready_tx_timecode <= 1'b0;
658 8 redbear
 
659 15 redbear
                        if(fct_counter > 6'd0)
660
                                fct_counter_receive <= fct_counter;
661 6 redbear
                        //
662
                        if(fct_send_last != fct_send)
663
                        begin
664
                                if(fct_send == 3'd1 && fct_send_last == 3'd7)
665
                                begin
666
                                        fct_flag <= fct_flag + 3'd1;
667
                                end
668
                                else
669
                                begin
670
                                        fct_flag <= fct_flag + (fct_send - fct_send_last);
671
                                end
672
 
673
                                fct_send_last <= fct_send;
674
                        end
675
 
676 5 redbear
                        if(first_time)
677
                        begin
678
                                first_time <= 1'b0;
679 8 redbear
                                hold_null <= 1'b1;
680 5 redbear
                                global_counter_transfer <= global_counter_transfer + 4'd1;
681
                        end
682
                        else if(global_counter_transfer != 4'd7)
683
                        begin
684 8 redbear
                                hold_null <= 1'b1;
685 5 redbear
                                global_counter_transfer <= global_counter_transfer + 4'd1;
686
                        end
687
                        else
688
                        begin
689 8 redbear
                                hold_null <= 1'b0;
690 5 redbear
                                global_counter_transfer <= 4'd0;
691
                        end
692
                end
693
                else if(enable_fct)
694
                begin
695 8 redbear
 
696
                        ready_tx_data <= 1'b0;
697 13 redbear
                        ready_tx_timecode <= 1'b0;
698 8 redbear
 
699 15 redbear
                        if(fct_counter > 6'd0)
700
                                fct_counter_receive <= fct_counter;
701 6 redbear
 
702
 
703 5 redbear
                        if(global_counter_transfer != 4'd3)
704
                        begin
705 8 redbear
                                hold_fct <= 1'b1;
706 5 redbear
                                global_counter_transfer <= global_counter_transfer + 4'd1;
707
                        end
708
                        else
709
                        begin
710 8 redbear
                                hold_fct <= 1'b0;
711 5 redbear
                                global_counter_transfer <= 4'd0;
712 6 redbear
                                fct_flag <= fct_flag - 3'd1;
713 5 redbear
                        end
714
                end
715
                else if(enable_time_code)
716
                begin
717 8 redbear
 
718
                        ready_tx_data <= 1'b0;
719
 
720 15 redbear
                        if(fct_counter > 6'd0)
721
                                fct_counter_receive <= fct_counter;
722
 
723
 
724 13 redbear
                        if(global_counter_transfer == 4'd13)
725
                        begin
726
                                ready_tx_timecode <= 1'b1;
727
                        end
728 6 redbear
                        //
729
                        if(fct_send_last != fct_send)
730
                        begin
731
                                if(fct_send == 3'd1 && fct_send_last == 3'd7)
732
                                begin
733
                                        fct_flag <= fct_flag + 3'd1;
734
                                end
735
                                else
736
                                begin
737
                                        fct_flag <= fct_flag + (fct_send - fct_send_last);
738
                                end
739
 
740
                                fct_send_last <= fct_send;
741
                        end
742
 
743 5 redbear
                        if(global_counter_transfer < 4'd13)
744
                        begin
745
                                global_counter_transfer <= global_counter_transfer + 4'd1;
746 13 redbear
                                timecode_s <= {timecode_s[13:10],2'd2,timecode_tx_i[7:0]};
747 5 redbear
                        end
748
                        else
749
                        begin
750 13 redbear
                                last_timein_control_flag_tx <= timecode_tx_i;
751 5 redbear
                                global_counter_transfer <= 4'd0;
752
                        end
753
                end
754
                else if(enable_n_char)
755
                begin
756 8 redbear
 
757 13 redbear
                        ready_tx_timecode <= 1'b0;
758
 
759 15 redbear
                        //if(fct_counter > 6'd0)
760
                        //      fct_counter_receive <= fct_counter;
761 6 redbear
                        //
762
                        if(fct_send_last != fct_send)
763
                        begin
764
                                if(fct_send == 3'd1 && fct_send_last == 3'd7)
765
                                begin
766
                                        fct_flag <= fct_flag + 3'd1;
767
                                end
768
                                else
769
                                begin
770
                                        fct_flag <= fct_flag + (fct_send - fct_send_last);
771
                                end
772
 
773
                                fct_send_last <= fct_send;
774
                        end
775
 
776 8 redbear
                        if(!data_tx_i[8])
777 5 redbear
                        begin
778 8 redbear
 
779
                                if(global_counter_transfer == 4'd9)
780
                                begin
781
                                        ready_tx_data <= 1'b1;
782
                                end
783
 
784
                                if(global_counter_transfer != 4'd9)
785
                                begin
786
                                        hold_data <= 1'b1;
787
                                        global_counter_transfer <= global_counter_transfer + 4'd1;
788
                                        txdata_flagctrl_tx_last <= data_tx_i;
789
                                end
790
                                else
791
                                begin
792
                                        hold_data <= 1'b0;
793
                                        global_counter_transfer <= 4'd0;
794
                                        //
795 15 redbear
                                        fct_counter_receive <= fct_counter_receive - 6'd1;
796 8 redbear
 
797
                                end
798
 
799 5 redbear
                        end
800 8 redbear
                        else if(data_tx_i[8])
801 5 redbear
                        begin
802 8 redbear
 
803
                                if(global_counter_transfer == 4'd3)
804
                                begin
805
                                        ready_tx_data <= 1'b1;
806
                                end
807
 
808
                                if(global_counter_transfer != 4'd3)
809
                                begin
810
                                        hold_data <= 1'b1;
811
                                        global_counter_transfer <= global_counter_transfer + 4'd1;
812
                                        txdata_flagctrl_tx_last <= data_tx_i;
813
                                end
814
                                else
815
                                begin
816 15 redbear
 
817 8 redbear
                                        hold_data <= 1'b0;
818
                                        global_counter_transfer <= 4'd0;
819
 
820 15 redbear
 
821
                                        fct_counter_receive <= fct_counter_receive - 6'd1;
822
 
823 8 redbear
                                end
824 5 redbear
                        end
825 8 redbear
 
826 5 redbear
                end
827
 
828
        end
829
end
830
 
831
endmodule

powered by: WebSVN 2.1.0

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