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

Subversion Repositories spacewiresystemc

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

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

powered by: WebSVN 2.1.0

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