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

Subversion Repositories spacewiresystemc

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

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

powered by: WebSVN 2.1.0

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