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

Subversion Repositories usb_host_core

[/] [usb_host_core/] [trunk/] [src_v/] [usbh_sie.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 ultra_embe
//-----------------------------------------------------------------
2
//                     USB Full Speed Host
3
//                           V0.5
4
//                     Ultra-Embedded.com
5
//                     Copyright 2015-2019
6
//
7
//                 Email: admin@ultra-embedded.com
8
//
9
//                         License: GPL
10
// If you would like a version with a more permissive license for
11
// use in closed source commercial applications please contact me
12
// for details.
13
//-----------------------------------------------------------------
14
//
15
// This file is open source HDL; you can redistribute it and/or 
16
// modify it under the terms of the GNU General Public License as 
17
// published by the Free Software Foundation; either version 2 of 
18
// the License, or (at your option) any later version.
19
//
20
// This file is distributed in the hope that it will be useful,
21
// but WITHOUT ANY WARRANTY; without even the implied warranty of
22
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
// GNU General Public License for more details.
24
//
25
// You should have received a copy of the GNU General Public 
26
// License along with this file; if not, write to the Free Software
27
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
28
// USA
29
//-----------------------------------------------------------------
30
 
31
//-----------------------------------------------------------------
32
//                          Generated File
33
//-----------------------------------------------------------------
34
 
35
module usbh_sie
36
(
37
    // Inputs
38
     input           clk_i
39
    ,input           rst_i
40
    ,input           start_i
41
    ,input           in_transfer_i
42
    ,input           sof_transfer_i
43
    ,input           resp_expected_i
44
    ,input  [  7:0]  token_pid_i
45
    ,input  [  6:0]  token_dev_i
46
    ,input  [  3:0]  token_ep_i
47
    ,input  [ 15:0]  data_len_i
48
    ,input           data_idx_i
49
    ,input  [  7:0]  tx_data_i
50
    ,input           utmi_txready_i
51
    ,input  [  7:0]  utmi_data_i
52
    ,input           utmi_rxvalid_i
53
    ,input           utmi_rxactive_i
54
 
55
    // Outputs
56
    ,output          ack_o
57
    ,output          tx_pop_o
58
    ,output [  7:0]  rx_data_o
59
    ,output          rx_push_o
60
    ,output          tx_done_o
61
    ,output          rx_done_o
62
    ,output          crc_err_o
63
    ,output          timeout_o
64
    ,output [  7:0]  response_o
65
    ,output [ 15:0]  rx_count_o
66
    ,output          idle_o
67
    ,output [  7:0]  utmi_data_o
68
    ,output          utmi_txvalid_o
69
);
70
 
71
 
72
 
73
//-----------------------------------------------------------------
74
// Registers / Wires
75
//-----------------------------------------------------------------
76
reg                 start_ack_q;
77
 
78
// Status
79
reg                 status_tx_done_q;
80
reg                 status_rx_done_q;
81
reg                 status_crc_err_q;
82
reg                 status_timeout_q;
83
reg [7:0]           status_response_q;
84
 
85
reg [15:0]          byte_count_q;
86
reg                 in_transfer_q;
87
 
88
reg [2:0]           rx_time_q;
89
reg                 rx_time_en_q;
90
reg [7:0]           last_tx_time_q;
91
 
92
reg                 send_data1_q;
93
reg                 send_sof_q;
94
reg                 send_ack_q;
95
 
96
// CRC16
97
reg [15:0]          crc_sum_q;
98
wire [15:0]         crc_out_w;
99
wire [7:0]          crc_data_in_w;
100
 
101
// CRC5
102
wire [4:0]          crc5_out_w;
103
wire [4:0]          crc5_next_w = crc5_out_w ^ 5'h1F;
104
 
105
reg [15:0]          token_q;
106
 
107
reg                 wait_resp_q;
108
 
109
reg [3:0]           state_q;
110
 
111
//-----------------------------------------------------------------
112
// Definitions
113
//-----------------------------------------------------------------
114
localparam RX_TIMEOUT       = 8'd255; // ~5uS @ 48MHz
115
localparam TX_IFS           = 8'd7; // 2 FS bit times (x5 CLKs @ 60MHz, x4 CLKs @ 48MHz)
116
 
117
localparam PID_OUT          = 8'hE1;
118
localparam PID_IN           = 8'h69;
119
localparam PID_SOF          = 8'hA5;
120
localparam PID_SETUP        = 8'h2D;
121
 
122
localparam PID_DATA0        = 8'hC3;
123
localparam PID_DATA1        = 8'h4B;
124
 
125
localparam PID_ACK          = 8'hD2;
126
localparam PID_NAK          = 8'h5A;
127
localparam PID_STALL        = 8'h1E;
128
 
129
// States
130
localparam STATE_IDLE       = 4'd0;
131
localparam STATE_RX_DATA    = 4'd1;
132
localparam STATE_TX_PID     = 4'd2;
133
localparam STATE_TX_DATA    = 4'd3;
134
localparam STATE_TX_CRC1    = 4'd4;
135
localparam STATE_TX_CRC2    = 4'd5;
136
localparam STATE_TX_TOKEN1  = 4'd6;
137
localparam STATE_TX_TOKEN2  = 4'd7;
138
localparam STATE_TX_TOKEN3  = 4'd8;
139
localparam STATE_TX_ACKNAK  = 4'd9;
140
localparam STATE_TX_WAIT    = 4'd10;
141
localparam STATE_RX_WAIT    = 4'd11;
142
localparam STATE_TX_IFS     = 4'd12;
143
 
144
localparam RX_TIME_ZERO     = 3'd0;
145
localparam RX_TIME_INC      = 3'd1;
146
localparam RX_TIME_READY    = 3'd7; // 2-bit times (x5 CLKs @ 60MHz, x4 CLKs @ 48MHz)
147
 
148
//-----------------------------------------------------------------
149
// Wires
150
//-----------------------------------------------------------------
151
// Rx data
152
wire [7:0] rx_data_w;
153
wire       data_ready_w;
154
wire       crc_byte_w;
155
wire       rx_active_w;
156
 
157
// 2-bit times after last RX (inter-packet delay)?
158
wire autoresp_thresh_w = send_ack_q & rx_time_en_q & (rx_time_q == RX_TIME_READY);
159
 
160
// Response timeout (no response after 500uS from transmit)
161
wire rx_resp_timeout_w = (last_tx_time_q >= RX_TIMEOUT) & wait_resp_q;
162
 
163
// Tx - Tx IFS timeout
164
wire tx_ifs_ready_w    = (last_tx_time_q >= TX_IFS);
165
 
166
// CRC16 error on received data
167
wire crc_error_w = (state_q == STATE_RX_DATA) && !rx_active_w && in_transfer_q        &&
168
                   (status_response_q == PID_DATA0 || status_response_q == PID_DATA1) &&
169
                   (crc_sum_q != 16'hB001);
170
 
171
//-----------------------------------------------------------------
172
// State Machine
173
//-----------------------------------------------------------------
174
reg [3:0] next_state_r;
175
 
176
always @ *
177
begin
178
    next_state_r = state_q;
179
 
180
    //-----------------------------------------
181
    // Tx State Machine
182
    //-----------------------------------------
183
    case (state_q)
184
 
185
        //-----------------------------------------
186
        // TX_TOKEN1 (byte 1 of token)
187
        //-----------------------------------------
188
        STATE_TX_TOKEN1 :
189
        begin
190
            // Data sent?
191
            if (utmi_txready_i)
192
                next_state_r = STATE_TX_TOKEN2;
193
        end
194
        //-----------------------------------------
195
        // TX_TOKEN2 (byte 2 of token)
196
        //-----------------------------------------
197
        STATE_TX_TOKEN2 :
198
        begin
199
            // Data sent?
200
            if (utmi_txready_i)
201
                next_state_r = STATE_TX_TOKEN3;
202
        end
203
        //-----------------------------------------
204
        // TX_TOKEN3 (byte 3 of token)
205
        //-----------------------------------------
206
        STATE_TX_TOKEN3 :
207
        begin
208
            // Data sent?
209
            if (utmi_txready_i)
210
            begin
211
                // SOF - no data packet
212
                if (send_sof_q)
213
                    next_state_r = STATE_TX_IFS;
214
                // IN - wait for data
215
                else if (in_transfer_q)
216
                    next_state_r = STATE_RX_WAIT;
217
                // OUT/SETUP - Send data or ZLP
218
                else
219
                    next_state_r = STATE_TX_IFS;
220
            end
221
        end
222
        //-----------------------------------------
223
        // TX_IFS
224
        //-----------------------------------------
225
        STATE_TX_IFS :
226
        begin
227
            // IFS expired
228
            if (tx_ifs_ready_w)
229
            begin
230
                // SOF - no data packet
231
                if (send_sof_q)
232
                    next_state_r = STATE_IDLE;
233
                // OUT/SETUP - Send data or ZLP
234
                else
235
                    next_state_r = STATE_TX_PID;
236
            end
237
        end
238
        //-----------------------------------------
239
        // TX_PID
240
        //-----------------------------------------
241
        STATE_TX_PID :
242
        begin
243
            // Last data byte sent?
244
            if (utmi_txready_i && (byte_count_q == 16'b0))
245
                next_state_r = STATE_TX_CRC1;
246
            else if (utmi_txready_i)
247
                next_state_r = STATE_TX_DATA;
248
        end
249
        //-----------------------------------------
250
        // TX_DATA
251
        //-----------------------------------------
252
        STATE_TX_DATA :
253
        begin
254
            // Last data byte sent?
255
            if (utmi_txready_i && (byte_count_q == 16'b0))
256
                next_state_r = STATE_TX_CRC1;
257
        end
258
        //-----------------------------------------
259
        // TX_CRC1 (first byte)
260
        //-----------------------------------------
261
        STATE_TX_CRC1 :
262
        begin
263
            // Data sent?
264
            if (utmi_txready_i)
265
                next_state_r = STATE_TX_CRC2;
266
        end
267
        //-----------------------------------------
268
        // TX_CRC (second byte)
269
        //-----------------------------------------
270
        STATE_TX_CRC2 :
271
        begin
272
            // Data sent?
273
            if (utmi_txready_i)
274
            begin
275
               // If a response is expected
276
               if (wait_resp_q)
277
                  next_state_r = STATE_RX_WAIT;
278
                // No response expected (e.g ISO transfer)
279
               else
280
                  next_state_r = STATE_IDLE;
281
            end
282
        end
283
        //-----------------------------------------
284
        // STATE_TX_WAIT
285
        //-----------------------------------------
286
        STATE_TX_WAIT :
287
        begin
288
            // Waited long enough?
289
            if (autoresp_thresh_w)
290
                next_state_r = STATE_TX_ACKNAK;
291
        end
292
        //-----------------------------------------
293
        // STATE_TX_ACKNAK
294
        //-----------------------------------------
295
        STATE_TX_ACKNAK :
296
        begin
297
            // Data sent?
298
            if (utmi_txready_i)
299
                next_state_r = STATE_IDLE;
300
        end
301
        //-----------------------------------------
302
        // STATE_RX_WAIT
303
        //-----------------------------------------
304
        STATE_RX_WAIT :
305
        begin
306
           // Data received?
307
           if (data_ready_w)
308
              next_state_r = STATE_RX_DATA;
309
            // Waited long enough?
310
           else if (rx_resp_timeout_w)
311
              next_state_r = STATE_IDLE;
312
        end
313
        //-----------------------------------------
314
        // RX_DATA
315
        //-----------------------------------------
316
        STATE_RX_DATA :
317
        begin
318
            // Receive complete
319
            if (~rx_active_w)
320
            begin
321
                // Send ACK but incoming data had CRC error, do not ACK
322
                if (send_ack_q && crc_error_w)
323
                    next_state_r = STATE_IDLE;
324
                // Send an ACK response without CPU interaction?
325
                else if (send_ack_q && (status_response_q == PID_DATA0 || status_response_q == PID_DATA1))
326
                    next_state_r = STATE_TX_WAIT;
327
                else
328
                    next_state_r = STATE_IDLE;
329
            end
330
        end
331
        //-----------------------------------------
332
        // IDLE / RECEIVE BEGIN
333
        //-----------------------------------------
334
        STATE_IDLE :
335
        begin
336
           // Token transfer request
337
           if (start_i)
338
              next_state_r  = STATE_TX_TOKEN1;
339
        end
340
        default :
341
           ;
342
    endcase
343
end
344
 
345
// Update state
346
always @ (posedge clk_i or posedge rst_i)
347
if (rst_i)
348
    state_q   <= STATE_IDLE;
349
else
350
    state_q   <= next_state_r;
351
 
352
//-----------------------------------------------------------------
353
// Tx Token
354
//-----------------------------------------------------------------
355
always @ (posedge clk_i or posedge rst_i)
356
if (rst_i)
357
    token_q         <= 16'h0000;
358
else if (state_q == STATE_IDLE)
359
    token_q         <= {token_dev_i, token_ep_i, 5'b0};
360
// PID of token sent, capture calculated CRC for token packet
361
else if (state_q == STATE_TX_TOKEN1 && utmi_txready_i)
362
    token_q[4:0]    <= crc5_next_w;
363
 
364
//-----------------------------------------------------------------
365
// Tx Timer
366
//-----------------------------------------------------------------
367
always @ (posedge clk_i or posedge rst_i)
368
if (rst_i)
369
    last_tx_time_q <= 8'd0;
370
// Start counting from last Tx
371
else if (state_q == STATE_IDLE || (utmi_txvalid_o && utmi_txready_i))
372
    last_tx_time_q <= 8'd0;
373
// Increment the Tx timeout
374
else if (last_tx_time_q != RX_TIMEOUT)
375
    last_tx_time_q <= last_tx_time_q + 8'd1;
376
 
377
//-----------------------------------------------------------------
378
// Transmit / Receive counter
379
//-----------------------------------------------------------------
380
always @ (posedge clk_i or posedge rst_i)
381
if (rst_i)
382
    byte_count_q <= 16'h0000;
383
// New transfer request (not automatic SOF request)
384
else if (state_q == STATE_IDLE && start_i && !sof_transfer_i)
385
    byte_count_q <= data_len_i;
386
else if (state_q == STATE_RX_WAIT)
387
    byte_count_q <= 16'h0000;
388
// Transmit byte
389
else if ((state_q == STATE_TX_PID || state_q == STATE_TX_DATA) && utmi_txready_i)
390
begin
391
    // Count down data left to send
392
    if (byte_count_q != 16'd0)
393
        byte_count_q <= byte_count_q - 16'd1;
394
end
395
// Received byte
396
else if (state_q == STATE_RX_DATA && data_ready_w && !crc_byte_w)
397
    byte_count_q <= byte_count_q + 16'd1;
398
 
399
//-----------------------------------------------------------------
400
// Transfer start ack
401
//-----------------------------------------------------------------
402
always @ (posedge clk_i or posedge rst_i)
403
if (rst_i)
404
    start_ack_q  <= 1'b0;
405
// First byte of PID sent, ack transfer request
406
else if (state_q == STATE_TX_TOKEN1 && utmi_txready_i)
407
    start_ack_q  <= 1'b1;
408
else
409
    start_ack_q  <= 1'b0;
410
 
411
//-----------------------------------------------------------------
412
// Record request details
413
//-----------------------------------------------------------------
414
always @ (posedge clk_i or posedge rst_i)
415
if (rst_i)
416
begin
417
    in_transfer_q   <= 1'b0;
418
    send_ack_q      <= 1'b0;
419
    send_data1_q    <= 1'b0;
420
    send_sof_q      <= 1'b0;
421
end
422
// Start of new request
423
else if (state_q == STATE_IDLE && start_i)
424
begin
425
    // Transfer request
426
    // e.g. (H)SOF                                   [sof_transfer_i]
427
    //      (H)OUT + (H)DATA + (F)ACK/NACK/STALL     [data_len_i >= 0 && !in_transfer_i]
428
    //      (H)IN  + (F)DATA + (H)ACK                [in_transfer_i]
429
    //      (H)IN  + (F)NAK/STALL                    [in_transfer_i]
430
    in_transfer_q   <= in_transfer_i;
431
 
432
    // Send ACK in response to IN DATA
433
    send_ack_q      <= in_transfer_i && resp_expected_i;
434
 
435
    // DATA0/1
436
    send_data1_q    <= data_idx_i;
437
 
438
    send_sof_q      <= sof_transfer_i;
439
end
440
 
441
//-----------------------------------------------------------------
442
// Response delay timer
443
//-----------------------------------------------------------------
444
always @ (posedge clk_i or posedge rst_i)
445
if (rst_i)
446
begin
447
    rx_time_q       <= RX_TIME_ZERO;
448
    rx_time_en_q    <= 1'b0;
449
end
450
else if (state_q == STATE_IDLE)
451
begin
452
    rx_time_q       <= RX_TIME_ZERO;
453
    rx_time_en_q    <= 1'b0;
454
end
455
// Receive complete
456
else if (state_q == STATE_RX_DATA && !utmi_rxactive_i)
457
begin
458
    // Reset time since end of last data byte
459
    rx_time_q       <= RX_TIME_ZERO;
460
    rx_time_en_q    <= 1'b1;
461
end
462
// Increment timer if enabled (and less than the threshold)
463
else if (rx_time_en_q && rx_time_q != RX_TIME_READY)
464
    rx_time_q       <= rx_time_q + RX_TIME_INC;
465
 
466
// Response expected
467
always @ (posedge clk_i or posedge rst_i)
468
if (rst_i)
469
    wait_resp_q <= 1'b0;
470
// Incoming data
471
else if (state_q == STATE_RX_WAIT && data_ready_w)
472
    wait_resp_q <= 1'b0;
473
else if (state_q == STATE_IDLE && start_i)
474
    wait_resp_q <= resp_expected_i;
475
 
476
//-----------------------------------------------------------------
477
// Status
478
//-----------------------------------------------------------------
479
always @ (posedge clk_i or posedge rst_i)
480
begin
481
   if (rst_i)
482
   begin
483
       status_response_q    <= 8'h00;
484
       status_timeout_q     <= 1'b0;
485
       status_rx_done_q     <= 1'b0;
486
       status_tx_done_q     <= 1'b0;
487
   end
488
   else
489
   begin
490
        case (state_q)
491
 
492
        //-----------------------------------------
493
        // RX_WAIT
494
        //-----------------------------------------
495
        STATE_RX_WAIT :
496
        begin
497
           // Store response PID
498
           if (data_ready_w)
499
               status_response_q   <= rx_data_w;
500
 
501
           // Waited long enough?
502
           if (rx_resp_timeout_w)
503
               status_timeout_q    <= 1'b1;
504
 
505
            status_tx_done_q     <= 1'b0;
506
        end
507
        //-----------------------------------------
508
        // RX_DATA
509
        //-----------------------------------------
510
        STATE_RX_DATA :
511
        begin
512
           // Receive complete
513
           if (!utmi_rxactive_i)
514
                status_rx_done_q   <= 1'b1;
515
           else
516
                status_rx_done_q   <= 1'b0;
517
        end
518
        //-----------------------------------------
519
        // TX_CRC (second byte)
520
        //-----------------------------------------
521
        STATE_TX_CRC2 :
522
        begin
523
            // Data sent?
524
            if (utmi_txready_i && !wait_resp_q)
525
            begin
526
                // Transfer now complete
527
                status_tx_done_q    <= 1'b1;
528
            end
529
        end
530
        //-----------------------------------------
531
        // IDLE / RECEIVE BEGIN
532
        //-----------------------------------------
533
        STATE_IDLE :
534
        begin
535
            // Transfer request
536
            // e.g. (H)SOF                                   [sof_transfer_i]
537
            //      (H)OUT + (H)DATA + (F)ACK/NACK/STALL     [data_len_i >= 0 && !in_transfer_i]
538
            //      (H)IN  + (F)DATA + (H)ACK                [in_transfer_i]
539
            //      (H)IN  + (F)NAK/STALL                    [in_transfer_i]
540
            if (start_i && !sof_transfer_i) // (not automatic SOF request)
541
            begin
542
                // Clear status
543
                status_response_q       <= 8'h00;
544
                status_timeout_q        <= 1'b0;
545
            end
546
 
547
            status_rx_done_q     <= 1'b0;
548
            status_tx_done_q     <= 1'b0;
549
        end
550
        //-----------------------------------------
551
        // DEFAULT
552
        //-----------------------------------------        
553
        default :
554
        begin
555
            status_rx_done_q     <= 1'b0;
556
            status_tx_done_q     <= 1'b0;
557
        end
558
       endcase
559
   end
560
end
561
 
562
 
563
//-----------------------------------------------------------------
564
// Data delay (to strip the CRC16 trailing bytes)
565
//-----------------------------------------------------------------
566
reg [31:0] data_buffer_q;
567
reg [3:0]  data_valid_q;
568
reg [3:0]  rx_active_q;
569
 
570
wire shift_en_w = (utmi_rxvalid_i & utmi_rxactive_i) || !utmi_rxactive_i;
571
 
572
always @ (posedge clk_i or posedge rst_i)
573
if (rst_i)
574
    data_buffer_q <= 32'b0;
575
else if (shift_en_w)
576
    data_buffer_q <= {utmi_data_i, data_buffer_q[31:8]};
577
 
578
always @ (posedge clk_i or posedge rst_i)
579
if (rst_i)
580
    data_valid_q <= 4'b0;
581
else if (shift_en_w)
582
    data_valid_q <= {(utmi_rxvalid_i & utmi_rxactive_i), data_valid_q[3:1]};
583
else
584
    data_valid_q <= {data_valid_q[3:1], 1'b0};
585
 
586
reg [1:0] data_crc_q;
587
always @ (posedge clk_i or posedge rst_i)
588
if (rst_i)
589
    data_crc_q <= 2'b0;
590
else if (shift_en_w)
591
    data_crc_q <= {!utmi_rxactive_i, data_crc_q[1]};
592
 
593
always @ (posedge clk_i or posedge rst_i)
594
if (rst_i)
595
    rx_active_q <= 4'b0;
596
else
597
    rx_active_q <= {utmi_rxactive_i, rx_active_q[3:1]};
598
 
599
assign rx_data_w    = data_buffer_q[7:0];
600
assign data_ready_w = data_valid_q[0];
601
assign crc_byte_w   = data_crc_q[0];
602
assign rx_active_w  = rx_active_q[0];
603
 
604
//-----------------------------------------------------------------
605
// CRC
606
//-----------------------------------------------------------------
607
 
608
// CRC16 (Data)
609
usbh_crc16
610
u_crc16
611
(
612
    .crc_i(crc_sum_q),
613
    .data_i(crc_data_in_w),
614
    .crc_o(crc_out_w)
615
);
616
 
617
// CRC5 (Token)
618
usbh_crc5
619
u_crc5
620
(
621
    .crc_i(5'h1F),
622
    .data_i(token_q[15:5]),
623
    .crc_o(crc5_out_w)
624
);
625
 
626
// CRC control / check
627
always @ (posedge clk_i or posedge rst_i)
628
begin
629
   if (rst_i)
630
   begin
631
       crc_sum_q          <= 16'hFFFF;
632
       status_crc_err_q   <= 1'b0;
633
   end
634
   else
635
   begin
636
        case (state_q)
637
            //-----------------------------------------
638
            // TX_PID
639
            //-----------------------------------------
640
            STATE_TX_PID :
641
            begin
642
                // First byte is PID (not CRC'd), reset CRC16
643
                crc_sum_q      <= 16'hFFFF;
644
            end
645
            //-----------------------------------------
646
            // TX_DATA
647
            //-----------------------------------------
648
            STATE_TX_DATA :
649
            begin
650
                // Data sent?
651
                if (utmi_txready_i)
652
                begin
653
                    // Next CRC start value
654
                    crc_sum_q      <= crc_out_w;
655
                end
656
            end
657
            //-----------------------------------------
658
            // RX_WAIT
659
            //-----------------------------------------
660
            STATE_RX_WAIT :
661
            begin
662
                // Reset CRC16
663
                crc_sum_q   <= 16'hFFFF;
664
            end
665
            //-----------------------------------------
666
            // RX_DATA
667
            //-----------------------------------------
668
            STATE_RX_DATA :
669
            begin
670
               // Data received?
671
               if (data_ready_w)
672
               begin
673
                   // Next CRC start value
674
                   crc_sum_q          <= crc_out_w;
675
               end
676
               // Receive complete
677
               else if (!rx_active_w)
678
               begin
679
                    // If some data received, check CRC
680
                    if (crc_error_w)
681
                        status_crc_err_q   <= 1'b1;
682
                    else
683
                        status_crc_err_q   <= 1'b0;
684
               end
685
            end
686
 
687
            //-----------------------------------------
688
            // IDLE / RECEIVE BEGIN
689
            //-----------------------------------------
690
            STATE_IDLE :
691
            begin
692
               // Start transfer request
693
               if (start_i && !sof_transfer_i)
694
               begin
695
                  // Clear error flag!
696
                  status_crc_err_q  <= 1'b0;
697
               end
698
            end
699
           default :
700
               ;
701
        endcase
702
   end
703
end
704
 
705
//-----------------------------------------------------------------
706
// Assignments
707
//-----------------------------------------------------------------
708
wire [15:0] token_rev_w;
709
 
710
genvar i;
711
generate
712
for (i=0; i < 16; i=i+1)
713
begin : LOOP
714
    assign token_rev_w[i] = token_q[15-i];
715
end
716
endgenerate
717
 
718
reg       utmi_txvalid_r;
719
reg [7:0] utmi_data_r;
720
 
721
always @ *
722
begin
723
    if (state_q == STATE_TX_CRC1)
724
    begin
725
        utmi_txvalid_r = 1'b1;
726
        utmi_data_r    = crc_sum_q[7:0] ^ 8'hFF;
727
    end
728
    else if (state_q == STATE_TX_CRC2)
729
    begin
730
        utmi_txvalid_r = 1'b1;
731
        utmi_data_r    = crc_sum_q[15:8] ^ 8'hFF;
732
    end
733
    else if (state_q == STATE_TX_TOKEN1)
734
    begin
735
        utmi_txvalid_r = 1'b1;
736
        utmi_data_r    = token_pid_i;
737
    end
738
    else if (state_q == STATE_TX_TOKEN2)
739
    begin
740
        utmi_txvalid_r = 1'b1;
741
        utmi_data_r    = token_rev_w[7:0];
742
    end
743
    else if (state_q == STATE_TX_TOKEN3)
744
    begin
745
        utmi_txvalid_r = 1'b1;
746
        utmi_data_r    = token_rev_w[15:8];
747
    end
748
    else if (state_q == STATE_TX_PID)
749
    begin
750
        utmi_txvalid_r = 1'b1;
751
        utmi_data_r    = send_data1_q ? PID_DATA1 : PID_DATA0;
752
    end
753
    else if (state_q == STATE_TX_ACKNAK)
754
    begin
755
        utmi_txvalid_r = 1'b1;
756
        utmi_data_r    = PID_ACK;
757
    end
758
    else if (state_q == STATE_TX_DATA)
759
    begin
760
        utmi_txvalid_r = 1'b1;
761
        utmi_data_r    = tx_data_i;
762
    end
763
    else
764
    begin
765
        utmi_txvalid_r = 1'b0;
766
        utmi_data_r    = 8'b0;
767
    end
768
end
769
 
770
assign utmi_txvalid_o = utmi_txvalid_r;
771
assign utmi_data_o    = utmi_data_r;
772
 
773
// Push incoming data into FIFO (not PID or CRC)
774
assign rx_data_o    = rx_data_w;
775
assign rx_push_o    = (state_q != STATE_IDLE && state_q != STATE_RX_WAIT) & data_ready_w & !crc_byte_w;
776
 
777
assign crc_data_in_w = (state_q == STATE_RX_DATA) ? rx_data_w : tx_data_i;
778
 
779
assign rx_count_o   = byte_count_q;
780
assign idle_o       = (state_q == STATE_IDLE);
781
 
782
assign ack_o        = start_ack_q;
783
 
784
assign tx_pop_o     = state_q == STATE_TX_DATA && utmi_txready_i;
785
 
786
assign tx_done_o    = status_tx_done_q;
787
assign rx_done_o    = status_rx_done_q;
788
assign crc_err_o    = status_crc_err_q;
789
assign timeout_o    = status_timeout_q;
790
assign response_o   = status_response_q;
791
 
792
 
793
 
794
endmodule

powered by: WebSVN 2.1.0

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