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

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [serialInterfaceEngine/] [processRxByte.v] - Blame information for rev 7

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 sfielding
 
2
//////////////////////////////////////////////////////////////////////
3
////                                                              ////
4
//// processRxByte
5
////                                                              ////
6
//// This file is part of the usbhostslave opencores effort.
7
//// http://www.opencores.org/cores/usbhostslave/                 ////
8
////                                                              ////
9
//// Module Description:                                          ////
10
//// 
11
////                                                              ////
12
//// To Do:                                                       ////
13
//// 
14
////                                                              ////
15
//// Author(s):                                                   ////
16
//// - Steve Fielding, sfielding@base2designs.com                 ////
17
////                                                              ////
18
//////////////////////////////////////////////////////////////////////
19
////                                                              ////
20
//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG          ////
21
////                                                              ////
22
//// This source file may be used and distributed without         ////
23
//// restriction provided that this copyright statement is not    ////
24
//// removed from the file and that any derivative work contains  ////
25
//// the original copyright notice and the associated disclaimer. ////
26
////                                                              ////
27
//// This source file is free software; you can redistribute it   ////
28
//// and/or modify it under the terms of the GNU Lesser General   ////
29
//// Public License as published by the Free Software Foundation; ////
30
//// either version 2.1 of the License, or (at your option) any   ////
31
//// later version.                                               ////
32
////                                                              ////
33
//// This source is distributed in the hope that it will be       ////
34
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
35
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
36
//// PURPOSE. See the GNU Lesser General Public License for more  ////
37
//// details.                                                     ////
38
////                                                              ////
39
//// You should have received a copy of the GNU Lesser General    ////
40
//// Public License along with this source; if not, download it   ////
41
//// from http://www.opencores.org/lgpl.shtml                     ////
42
////                                                              ////
43
//////////////////////////////////////////////////////////////////////
44
//
45 7 sfielding
// $Id: processRxByte.v,v 1.3 2004-12-31 14:40:43 sfielding Exp $
46 5 sfielding
//
47
// CVS Revision History
48
//
49
// $Log: not supported by cvs2svn $
50
//
51
`timescale 1ns / 1ps
52
`include "usbSerialInterfaceEngine_h.v"
53
`include "usbConstants_h.v"
54
 
55
module processRxByte (clk, CRC16En, CRC16Result, CRC16UpdateRdy, CRC5_8Bit, CRC5En, CRC5Result, CRC5UpdateRdy, CRCData, processRxByteRdy, processRxDataInWEn, rst, rstCRC, RxByteIn, RxCtrlIn, RxCtrlOut, RxDataOut, RxDataOutWEn);
56
input   clk;
57
input   [15:0]CRC16Result;
58
input   CRC16UpdateRdy;
59
input   [4:0]CRC5Result;
60
input   CRC5UpdateRdy;
61
input   processRxDataInWEn;
62
input   rst;
63
input   [7:0]RxByteIn;
64
input   [7:0]RxCtrlIn;
65
output  CRC16En;
66
output  CRC5_8Bit;
67
output  CRC5En;
68
output  [7:0]CRCData;
69
output  processRxByteRdy;
70
output  rstCRC;
71
output  [7:0]RxCtrlOut;
72
output  [7:0]RxDataOut;
73
output  RxDataOutWEn;
74
 
75
wire    clk;
76
reg     CRC16En, next_CRC16En;
77
wire    [15:0]CRC16Result;
78
wire    CRC16UpdateRdy;
79
reg     CRC5_8Bit, next_CRC5_8Bit;
80
reg     CRC5En, next_CRC5En;
81
wire    [4:0]CRC5Result;
82
wire    CRC5UpdateRdy;
83
reg     [7:0]CRCData, next_CRCData;
84
reg     processRxByteRdy, next_processRxByteRdy;
85
wire    processRxDataInWEn;
86
wire    rst;
87
reg     rstCRC, next_rstCRC;
88
wire    [7:0]RxByteIn;
89
wire    [7:0]RxCtrlIn;
90
reg     [7:0]RxCtrlOut, next_RxCtrlOut;
91
reg     [7:0]RxDataOut, next_RxDataOut;
92
reg     RxDataOutWEn, next_RxDataOutWEn;
93
 
94
// diagram signals declarations
95
reg ACKRxed, next_ACKRxed;
96
reg bitStuffError, next_bitStuffError;
97
reg CRCError, next_CRCError;
98
reg dataSequence, next_dataSequence;
99
reg NAKRxed, next_NAKRxed;
100
reg  [7:0]RxByte, next_RxByte;
101
reg  [2:0]RXByteStMachCurrState, next_RXByteStMachCurrState;
102
reg  [7:0]RxCtrl, next_RxCtrl;
103
reg  [9:0]RXDataByteCnt, next_RXDataByteCnt;
104
reg RxOverflow, next_RxOverflow;
105
reg  [7:0]RxStatus;
106
reg RxTimeOut, next_RxTimeOut;
107
reg Signal1, next_Signal1;
108
reg stallRxed, next_stallRxed;
109
 
110
// BINARY ENCODED state machine: prRxByte
111
// State codes definitions:
112
`define CHK_ST 4'b0000
113
`define START_PRBY 4'b0001
114
`define WAIT_BYTE 4'b0010
115
`define IDLE_CHK_START 4'b0011
116
`define CHK_SYNC_DO 4'b0100
117
`define CHK_PID_DO_CHK 4'b0101
118
`define CHK_PID_FIRST_BYTE_PROC 4'b0110
119
`define HSHAKE_FIN 4'b0111
120
`define HSHAKE_CHK 4'b1000
121
`define TOKEN_CHK_STRM 4'b1001
122
`define TOKEN_FIN 4'b1010
123
`define DATA_FIN 4'b1011
124
`define DATA_CHK_STRM 4'b1100
125
`define TOKEN_WAIT_CRC 4'b1101
126
`define DATA_WAIT_CRC 4'b1110
127
 
128
reg [3:0]CurrState_prRxByte, NextState_prRxByte;
129
 
130
// Diagram actions (continuous assignments allowed only: assign ...)
131
always @
132
(next_CRCError or next_bitStuffError or
133
next_RxOverflow or next_NAKRxed or
134
next_stallRxed or next_ACKRxed or
135
next_dataSequence)
136
begin
137
RxStatus <=
138
{1'b0, next_dataSequence,
139
next_ACKRxed,
140
next_stallRxed, next_NAKRxed,
141
next_RxOverflow,
142
next_bitStuffError, next_CRCError };
143
end
144
 
145
 
146
// Machine: prRxByte
147
 
148
// NextState logic (combinatorial)
149
always @ (RXByteStMachCurrState or processRxDataInWEn or CRC16Result or CRC5Result or RxByteIn or RxCtrlIn or RxByte or RxStatus or RXDataByteCnt or CRC5UpdateRdy or CRC16UpdateRdy or RxCtrl or CRCError or bitStuffError or RxOverflow or RxTimeOut or NAKRxed or stallRxed or ACKRxed or dataSequence or RxDataOut or RxCtrlOut or RxDataOutWEn or rstCRC or CRCData or CRC5En or CRC5_8Bit or CRC16En or processRxByteRdy or CurrState_prRxByte)
150
begin
151
  NextState_prRxByte <= CurrState_prRxByte;
152
  // Set default values for outputs and signals
153
  next_RxByte <= RxByte;
154
  next_RxCtrl <= RxCtrl;
155
  next_RXByteStMachCurrState <= RXByteStMachCurrState;
156
  next_CRCError <= CRCError;
157
  next_bitStuffError <= bitStuffError;
158
  next_RxOverflow <= RxOverflow;
159
  next_RxTimeOut <= RxTimeOut;
160
  next_NAKRxed <= NAKRxed;
161
  next_stallRxed <= stallRxed;
162
  next_ACKRxed <= ACKRxed;
163
  next_dataSequence <= dataSequence;
164
  next_RxDataOut <= RxDataOut;
165
  next_RxCtrlOut <= RxCtrlOut;
166
  next_RxDataOutWEn <= RxDataOutWEn;
167
  next_rstCRC <= rstCRC;
168
  next_CRCData <= CRCData;
169
  next_CRC5En <= CRC5En;
170
  next_CRC5_8Bit <= CRC5_8Bit;
171
  next_CRC16En <= CRC16En;
172
  next_RXDataByteCnt <= RXDataByteCnt;
173
  next_processRxByteRdy <= processRxByteRdy;
174
  case (CurrState_prRxByte)  // synopsys parallel_case full_case
175
    `CHK_ST:
176
    begin
177 7 sfielding
      if (RXByteStMachCurrState == `HS_BYTE_ST)
178 5 sfielding
      begin
179 7 sfielding
        NextState_prRxByte <= `HSHAKE_CHK;
180
      end
181
      else if (RXByteStMachCurrState == `TOKEN_BYTE_ST)
182
      begin
183 5 sfielding
        NextState_prRxByte <= `TOKEN_WAIT_CRC;
184
      end
185 7 sfielding
      else if (RXByteStMachCurrState == `DATA_BYTE_ST)
186 5 sfielding
      begin
187 7 sfielding
        NextState_prRxByte <= `DATA_WAIT_CRC;
188 5 sfielding
      end
189 7 sfielding
      else if (RXByteStMachCurrState == `IDLE_BYTE_ST)
190 5 sfielding
      begin
191 7 sfielding
        NextState_prRxByte <= `IDLE_CHK_START;
192 5 sfielding
      end
193
      else if (RXByteStMachCurrState == `CHECK_SYNC_ST)
194
      begin
195
        NextState_prRxByte <= `CHK_SYNC_DO;
196
      end
197 7 sfielding
      else if (RXByteStMachCurrState == `CHECK_PID_ST)
198 5 sfielding
      begin
199 7 sfielding
        NextState_prRxByte <= `CHK_PID_DO_CHK;
200 5 sfielding
      end
201
    end
202
    `START_PRBY:
203
    begin
204
      next_RxByte <= 8'h00;
205
      next_RxCtrl <= 8'h00;
206
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
207
      next_CRCError <= 1'b0;
208
      next_bitStuffError <= 1'b0;
209
      next_RxOverflow <= 1'b0;
210
      next_RxTimeOut <= 1'b0;
211
      next_NAKRxed <= 1'b0;
212
      next_stallRxed <= 1'b0;
213
      next_ACKRxed <= 1'b0;
214
      next_dataSequence <= 1'b0;
215
      next_RxDataOut <= 8'h00;
216
      next_RxCtrlOut <= 8'h00;
217
      next_RxDataOutWEn <= 1'b0;
218
      next_rstCRC <= 1'b0;
219
      next_CRCData <= 8'h00;
220
      next_CRC5En <= 1'b0;
221
      next_CRC5_8Bit <= 1'b0;
222
      next_CRC16En <= 1'b0;
223
      next_RXDataByteCnt <= 10'h00;
224
      next_processRxByteRdy <= 1'b1;
225
      NextState_prRxByte <= `WAIT_BYTE;
226
    end
227
    `WAIT_BYTE:
228
    begin
229
      if (processRxDataInWEn == 1'b1)
230
      begin
231
        NextState_prRxByte <= `CHK_ST;
232
        next_RxByte <= RxByteIn;
233
        next_RxCtrl <= RxCtrlIn;
234
        next_processRxByteRdy <= 1'b0;
235
      end
236
    end
237
    `HSHAKE_FIN:
238
    begin
239
      next_RxDataOutWEn <= 1'b0;
240
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
241
      NextState_prRxByte <= `WAIT_BYTE;
242
      next_processRxByteRdy <= 1'b1;
243
    end
244
    `HSHAKE_CHK:
245
    begin
246
      NextState_prRxByte <= `HSHAKE_FIN;
247
      if (RxCtrl != `DATA_STOP) //If more than PID rxed, then report error
248
      next_RxOverflow <= 1'b1;
249
      next_RxDataOut <= RxStatus;
250
      next_RxCtrlOut <= `RX_PACKET_STOP;
251
      next_RxDataOutWEn <= 1'b1;
252
    end
253
    `CHK_PID_DO_CHK:
254
    begin
255
      if ((RxByte[7:4] ^ RxByte[3:0] ) != 4'hf)
256
      begin
257
        NextState_prRxByte <= `WAIT_BYTE;
258
        next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
259
        next_processRxByteRdy <= 1'b1;
260
      end
261
      else
262
      begin
263
        NextState_prRxByte <= `CHK_PID_FIRST_BYTE_PROC;
264
        next_CRCError <= 1'b0;
265
        next_bitStuffError <= 1'b0;
266
        next_RxOverflow <= 1'b0;
267
        next_NAKRxed <= 1'b0;
268
        next_stallRxed <= 1'b0;
269
        next_ACKRxed <= 1'b0;
270
        next_dataSequence <= 1'b0;
271
        next_RxTimeOut <= 1'b0;
272
        next_RXDataByteCnt <= 0;
273
        next_RxDataOut <= RxByte;
274
        next_RxCtrlOut <= `RX_PACKET_START;
275
        next_RxDataOutWEn <= 1'b1;
276
        next_rstCRC <= 1'b1;
277
      end
278
    end
279
    `CHK_PID_FIRST_BYTE_PROC:
280
    begin
281
      next_rstCRC <= 1'b0;
282
      next_RxDataOutWEn <= 1'b0;
283
      case (RxByte[1:0] )
284
      `SPECIAL:                              //Special PID.
285
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
286
      `TOKEN:                                //Token PID
287
      begin
288
      next_RXByteStMachCurrState <= `TOKEN_BYTE_ST;
289
      next_RXDataByteCnt <= 0;
290
      end
291
      `HANDSHAKE:                            //Handshake PID
292
      begin
293
      case (RxByte[3:2] )
294
      2'b00:
295
      next_ACKRxed <= 1'b1;
296
      2'b10:
297
      next_NAKRxed <= 1'b1;
298
      2'b11:
299
      next_stallRxed <= 1'b1;
300
      default:
301
      begin
302
      $display ("Invalid Handshake PID detected in ProcessRXByte\n");
303
      end
304
      endcase
305
      next_RXByteStMachCurrState <= `HS_BYTE_ST;
306
      end
307
      `DATA:                                  //Data PID
308
      begin
309
      case (RxByte[3:2] )
310
      2'b00:
311
      next_dataSequence <= 1'b0;
312
      2'b10:
313
      next_dataSequence <= 1'b1;
314
      default:
315
      $display ("Invalid DATA PID detected in ProcessRXByte\n");
316
      endcase
317
      next_RXByteStMachCurrState <= `DATA_BYTE_ST;
318
      next_RXDataByteCnt <= 0;
319
      end
320
      endcase
321
      NextState_prRxByte <= `WAIT_BYTE;
322
      next_processRxByteRdy <= 1'b1;
323
    end
324
    `DATA_FIN:
325
    begin
326
      next_CRC16En <= 1'b0;
327
      next_RxDataOutWEn <= 1'b0;
328
      NextState_prRxByte <= `WAIT_BYTE;
329
      next_processRxByteRdy <= 1'b1;
330
    end
331
    `DATA_CHK_STRM:
332
    begin
333
      next_RXDataByteCnt <= RXDataByteCnt + 1'b1;
334
      case (RxCtrl)
335
      `DATA_STOP:
336
      begin
337
      if (CRC16Result != 16'hb001)
338
      next_CRCError <= 1'b1;
339
      next_RxDataOut <= RxStatus;
340
      next_RxCtrlOut <= `RX_PACKET_STOP;
341
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
342
      end
343
      `DATA_BIT_STUFF_ERROR:
344
      begin
345
      next_bitStuffError <= 1'b1;
346
      next_RxDataOut <= RxStatus;
347
      next_RxCtrlOut <= `RX_PACKET_STOP;
348
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
349
      end
350
      `DATA_STREAM:
351
      begin
352
      next_RxDataOut <= RxByte;
353
      next_RxCtrlOut <= `RX_PACKET_STREAM;
354
      next_CRCData <= RxByte;
355
      next_CRC16En <= 1'b1;
356
      end
357
      endcase
358
      next_RxDataOutWEn <= 1'b1;
359
      NextState_prRxByte <= `DATA_FIN;
360
    end
361
    `DATA_WAIT_CRC:
362
    begin
363
      if (CRC16UpdateRdy == 1'b1)
364
      begin
365
        NextState_prRxByte <= `DATA_CHK_STRM;
366
      end
367
    end
368
    `TOKEN_CHK_STRM:
369
    begin
370
      next_RXDataByteCnt <= RXDataByteCnt + 1'b1;
371
      case (RxCtrl)
372
      `DATA_STOP:
373
      begin
374
      if (CRC5Result != 5'h6)
375
      next_CRCError <= 1'b1;
376
      next_RxDataOut <= RxStatus;
377
      next_RxCtrlOut <= `RX_PACKET_STOP;
378
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
379
      end
380
      `DATA_BIT_STUFF_ERROR:
381
      begin
382
      next_bitStuffError <= 1'b1;
383
      next_RxDataOut <= RxStatus;
384
      next_RxCtrlOut <= `RX_PACKET_STOP;
385
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
386
      end
387
      `DATA_STREAM:
388
      begin
389
      if (RXDataByteCnt > 10'h2)
390
      begin
391
      next_RxOverflow <= 1'b1;
392
      next_RxDataOut <= RxStatus;
393
      next_RxCtrlOut <= `RX_PACKET_STOP;
394
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
395
      end
396
      else
397
      begin
398
      next_RxDataOut <= RxByte;
399
      next_RxCtrlOut <= `RX_PACKET_STREAM;
400
      next_CRCData <= RxByte;
401
      next_CRC5_8Bit <= 1'b1;
402
      next_CRC5En <= 1'b1;
403
      end
404
      end
405
      endcase
406
      next_RxDataOutWEn <= 1'b1;
407
      NextState_prRxByte <= `TOKEN_FIN;
408
    end
409
    `TOKEN_FIN:
410
    begin
411
      next_CRC5En <= 1'b0;
412
      next_RxDataOutWEn <= 1'b0;
413
      NextState_prRxByte <= `WAIT_BYTE;
414
      next_processRxByteRdy <= 1'b1;
415
    end
416
    `TOKEN_WAIT_CRC:
417
    begin
418
      if (CRC5UpdateRdy == 1'b1)
419
      begin
420
        NextState_prRxByte <= `TOKEN_CHK_STRM;
421
      end
422
    end
423
    `CHK_SYNC_DO:
424
    begin
425
      if (RxByte == `SYNC_BYTE)
426
      next_RXByteStMachCurrState <= `CHECK_PID_ST;
427
      else
428
      next_RXByteStMachCurrState <= `IDLE_BYTE_ST;
429
      NextState_prRxByte <= `WAIT_BYTE;
430
      next_processRxByteRdy <= 1'b1;
431
    end
432
    `IDLE_CHK_START:
433
    begin
434
      if (RxCtrl == `DATA_START)
435
      next_RXByteStMachCurrState <= `CHECK_SYNC_ST;
436
      NextState_prRxByte <= `WAIT_BYTE;
437
      next_processRxByteRdy <= 1'b1;
438
    end
439
  endcase
440
end
441
 
442
// Current State Logic (sequential)
443
always @ (posedge clk)
444
begin
445
  if (rst)
446
    CurrState_prRxByte <= `START_PRBY;
447
  else
448
    CurrState_prRxByte <= NextState_prRxByte;
449
end
450
 
451
// Registered outputs logic
452
always @ (posedge clk)
453
begin
454
  if (rst)
455
  begin
456
    RxDataOut <= 8'h00;
457
    RxCtrlOut <= 8'h00;
458
    RxDataOutWEn <= 1'b0;
459
    rstCRC <= 1'b0;
460
    CRCData <= 8'h00;
461
    CRC5En <= 1'b0;
462
    CRC5_8Bit <= 1'b0;
463
    CRC16En <= 1'b0;
464
    processRxByteRdy <= 1'b1;
465
    RxByte <= 8'h00;
466
    RxCtrl <= 8'h00;
467
    RXByteStMachCurrState <= `IDLE_BYTE_ST;
468
    CRCError <= 1'b0;
469
    bitStuffError <= 1'b0;
470
    RxOverflow <= 1'b0;
471
    RxTimeOut <= 1'b0;
472
    NAKRxed <= 1'b0;
473
    stallRxed <= 1'b0;
474
    ACKRxed <= 1'b0;
475
    dataSequence <= 1'b0;
476
    RXDataByteCnt <= 10'h00;
477
  end
478
  else
479
  begin
480
    RxDataOut <= next_RxDataOut;
481
    RxCtrlOut <= next_RxCtrlOut;
482
    RxDataOutWEn <= next_RxDataOutWEn;
483
    rstCRC <= next_rstCRC;
484
    CRCData <= next_CRCData;
485
    CRC5En <= next_CRC5En;
486
    CRC5_8Bit <= next_CRC5_8Bit;
487
    CRC16En <= next_CRC16En;
488
    processRxByteRdy <= next_processRxByteRdy;
489
    RxByte <= next_RxByte;
490
    RxCtrl <= next_RxCtrl;
491
    RXByteStMachCurrState <= next_RXByteStMachCurrState;
492
    CRCError <= next_CRCError;
493
    bitStuffError <= next_bitStuffError;
494
    RxOverflow <= next_RxOverflow;
495
    RxTimeOut <= next_RxTimeOut;
496
    NAKRxed <= next_NAKRxed;
497
    stallRxed <= next_stallRxed;
498
    ACKRxed <= next_ACKRxed;
499
    dataSequence <= next_dataSequence;
500
    RXDataByteCnt <= next_RXDataByteCnt;
501
  end
502
end
503
 
504 2 sfielding
endmodule

powered by: WebSVN 2.1.0

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