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

Subversion Repositories spacewiresystemc

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

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

powered by: WebSVN 2.1.0

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