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

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [slaveController/] [slaveGetpacket.v] - Blame information for rev 40

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 sfielding
 
2 22 sfielding
// File        : ../RTL/slaveController/slaveGetpacket.v
3 37 sfielding
// Generated   : 11/10/06 05:37:25
4 22 sfielding
// From        : ../RTL/slaveController/slaveGetpacket.asf
5
// By          : FSM2VHDL ver. 5.0.0.9
6
 
7 5 sfielding
//////////////////////////////////////////////////////////////////////
8
////                                                              ////
9
//// slaveGetPacket
10
////                                                              ////
11
//// This file is part of the usbhostslave opencores effort.
12
//// http://www.opencores.org/cores/usbhostslave/                 ////
13
////                                                              ////
14
//// Module Description:                                          ////
15
//// 
16
////                                                              ////
17
//// To Do:                                                       ////
18
//// 
19
////                                                              ////
20
//// Author(s):                                                   ////
21
//// - Steve Fielding, sfielding@base2designs.com                 ////
22
////                                                              ////
23
//////////////////////////////////////////////////////////////////////
24
////                                                              ////
25
//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG          ////
26
////                                                              ////
27
//// This source file may be used and distributed without         ////
28
//// restriction provided that this copyright statement is not    ////
29
//// removed from the file and that any derivative work contains  ////
30
//// the original copyright notice and the associated disclaimer. ////
31
////                                                              ////
32
//// This source file is free software; you can redistribute it   ////
33
//// and/or modify it under the terms of the GNU Lesser General   ////
34
//// Public License as published by the Free Software Foundation; ////
35
//// either version 2.1 of the License, or (at your option) any   ////
36
//// later version.                                               ////
37
////                                                              ////
38
//// This source is distributed in the hope that it will be       ////
39
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
40
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
41
//// PURPOSE. See the GNU Lesser General Public License for more  ////
42
//// details.                                                     ////
43
////                                                              ////
44
//// You should have received a copy of the GNU Lesser General    ////
45
//// Public License along with this source; if not, download it   ////
46
//// from http://www.opencores.org/lgpl.shtml                     ////
47
////                                                              ////
48
//////////////////////////////////////////////////////////////////////
49
//
50 22 sfielding
`include "timescale.v"
51 5 sfielding
`include "usbSerialInterfaceEngine_h.v"
52
`include "usbConstants_h.v"
53
 
54 22 sfielding
module slaveGetPacket (ACKRxed, CRCError, RXDataIn, RXDataValid, RXFifoData, RXFifoFull, RXFifoWEn, RXOverflow, RXPacketRdy, RXStreamStatusIn, RXTimeOut, RxPID, SIERxTimeOut, SIERxTimeOutEn, bitStuffError, clk, dataSequence, endPointReady, getPacketEn, rst);
55
input   [7:0] RXDataIn;
56
input   RXDataValid;
57
input   RXFifoFull;
58
input   [7:0] RXStreamStatusIn;
59
input   SIERxTimeOut;           // Single cycle pulse
60 5 sfielding
input   clk;
61 18 sfielding
input   endPointReady;
62 5 sfielding
input   getPacketEn;
63
input   rst;
64
output  ACKRxed;
65
output  CRCError;
66 22 sfielding
output  [7:0] RXFifoData;
67 5 sfielding
output  RXFifoWEn;
68
output  RXOverflow;
69
output  RXPacketRdy;
70
output  RXTimeOut;
71 22 sfielding
output  [3:0] RxPID;
72 20 sfielding
output  SIERxTimeOutEn;
73 22 sfielding
output  bitStuffError;
74
output  dataSequence;
75 5 sfielding
 
76
reg     ACKRxed, next_ACKRxed;
77
reg     CRCError, next_CRCError;
78 22 sfielding
wire    [7:0] RXDataIn;
79 5 sfielding
wire    RXDataValid;
80 22 sfielding
reg     [7:0] RXFifoData, next_RXFifoData;
81 5 sfielding
wire    RXFifoFull;
82
reg     RXFifoWEn, next_RXFifoWEn;
83
reg     RXOverflow, next_RXOverflow;
84
reg     RXPacketRdy, next_RXPacketRdy;
85 22 sfielding
wire    [7:0] RXStreamStatusIn;
86 5 sfielding
reg     RXTimeOut, next_RXTimeOut;
87 22 sfielding
reg     [3:0] RxPID, next_RxPID;
88 5 sfielding
wire    SIERxTimeOut;
89 20 sfielding
reg     SIERxTimeOutEn, next_SIERxTimeOutEn;
90 22 sfielding
reg     bitStuffError, next_bitStuffError;
91
wire    clk;
92
reg     dataSequence, next_dataSequence;
93
wire    endPointReady;
94
wire    getPacketEn;
95
wire    rst;
96 5 sfielding
 
97
// diagram signals declarations
98
reg  [7:0]RXByteOld, next_RXByteOld;
99
reg  [7:0]RXByteOldest, next_RXByteOldest;
100 22 sfielding
reg  [7:0]RXByte, next_RXByte;
101 5 sfielding
reg  [7:0]RXStreamStatus, next_RXStreamStatus;
102
 
103
// BINARY ENCODED state machine: slvGetPkt
104
// State codes definitions:
105
`define PROC_PKT_CHK_PID 5'b00000
106
`define PROC_PKT_HS 5'b00001
107
`define PROC_PKT_DATA_W_D1 5'b00010
108
`define PROC_PKT_DATA_CHK_D1 5'b00011
109
`define PROC_PKT_DATA_W_D2 5'b00100
110
`define PROC_PKT_DATA_FIN 5'b00101
111
`define PROC_PKT_DATA_CHK_D2 5'b00110
112
`define PROC_PKT_DATA_W_D3 5'b00111
113
`define PROC_PKT_DATA_CHK_D3 5'b01000
114
`define PROC_PKT_DATA_LOOP_CHK_FIFO 5'b01001
115
`define PROC_PKT_DATA_LOOP_FIFO_FULL 5'b01010
116
`define PROC_PKT_DATA_LOOP_W_D 5'b01011
117
`define START_GP 5'b01100
118
`define WAIT_PKT 5'b01101
119
`define CHK_PKT_START 5'b01110
120
`define WAIT_EN 5'b01111
121
`define PKT_RDY 5'b10000
122
`define PROC_PKT_DATA_LOOP_DELAY 5'b10001
123 18 sfielding
`define PROC_PKT_DATA_LOOP_EP_N_RDY 5'b10010
124 5 sfielding
 
125 22 sfielding
reg [4:0] CurrState_slvGetPkt;
126
reg [4:0] NextState_slvGetPkt;
127 5 sfielding
 
128
 
129 22 sfielding
//--------------------------------------------------------------------
130 5 sfielding
// Machine: slvGetPkt
131 22 sfielding
//--------------------------------------------------------------------
132
//----------------------------------
133
// Next State Logic (combinatorial)
134
//----------------------------------
135
always @ (RXDataIn or RXStreamStatusIn or RXByte or RXByteOldest or RXByteOld or RXDataValid or SIERxTimeOut or RXStreamStatus or getPacketEn or endPointReady or RXFifoFull or CRCError or bitStuffError or RXOverflow or RXTimeOut or ACKRxed or dataSequence or SIERxTimeOutEn or RxPID or RXPacketRdy or RXFifoWEn or RXFifoData or CurrState_slvGetPkt)
136
begin : slvGetPkt_NextState
137 34 sfielding
  NextState_slvGetPkt <= CurrState_slvGetPkt;
138
  // Set default values for outputs and signals
139
  next_CRCError <= CRCError;
140
  next_bitStuffError <= bitStuffError;
141
  next_RXOverflow <= RXOverflow;
142
  next_RXTimeOut <= RXTimeOut;
143
  next_ACKRxed <= ACKRxed;
144
  next_dataSequence <= dataSequence;
145
  next_SIERxTimeOutEn <= SIERxTimeOutEn;
146
  next_RXByte <= RXByte;
147
  next_RXStreamStatus <= RXStreamStatus;
148
  next_RxPID <= RxPID;
149
  next_RXPacketRdy <= RXPacketRdy;
150
  next_RXByteOldest <= RXByteOldest;
151
  next_RXByteOld <= RXByteOld;
152
  next_RXFifoWEn <= RXFifoWEn;
153
  next_RXFifoData <= RXFifoData;
154
  case (CurrState_slvGetPkt)
155
    `START_GP:
156
      NextState_slvGetPkt <= `WAIT_EN;
157
    `WAIT_PKT:
158
    begin
159
      next_CRCError <= 1'b0;
160
      next_bitStuffError <= 1'b0;
161
      next_RXOverflow <= 1'b0;
162
      next_RXTimeOut <= 1'b0;
163
      next_ACKRxed <= 1'b0;
164
      next_dataSequence <= 1'b0;
165
      next_SIERxTimeOutEn <= 1'b1;
166
      if (RXDataValid == 1'b1)
167
      begin
168
        NextState_slvGetPkt <= `CHK_PKT_START;
169
        next_RXByte <= RXDataIn;
170
        next_RXStreamStatus <= RXStreamStatusIn;
171
      end
172
      else if (SIERxTimeOut == 1'b1)
173
      begin
174
        NextState_slvGetPkt <= `PKT_RDY;
175
        next_RXTimeOut <= 1'b1;
176
      end
177
    end
178
    `CHK_PKT_START:
179
      if (RXStreamStatus == `RX_PACKET_START)
180
      begin
181
        NextState_slvGetPkt <= `PROC_PKT_CHK_PID;
182
        next_RxPID <= RXByte[3:0];
183
      end
184
      else
185
      begin
186
        NextState_slvGetPkt <= `PKT_RDY;
187
        next_RXTimeOut <= 1'b1;
188
      end
189
    `WAIT_EN:
190
    begin
191
      next_RXPacketRdy <= 1'b0;
192
      next_SIERxTimeOutEn <= 1'b0;
193
      if (getPacketEn == 1'b1)
194
        NextState_slvGetPkt <= `WAIT_PKT;
195
    end
196
    `PKT_RDY:
197
    begin
198
      next_RXPacketRdy <= 1'b1;
199
      NextState_slvGetPkt <= `WAIT_EN;
200
    end
201
    `PROC_PKT_CHK_PID:
202
      if (RXByte[1:0] == `HANDSHAKE)
203
        NextState_slvGetPkt <= `PROC_PKT_HS;
204
      else if (RXByte[1:0] == `DATA)
205
        NextState_slvGetPkt <= `PROC_PKT_DATA_W_D1;
206
      else
207
        NextState_slvGetPkt <= `PKT_RDY;
208
    `PROC_PKT_HS:
209
      if (RXDataValid == 1'b1)
210
      begin
211
        NextState_slvGetPkt <= `PKT_RDY;
212
        next_RXOverflow <= RXDataIn[`RX_OVERFLOW_BIT];
213
        next_ACKRxed <= RXDataIn[`ACK_RXED_BIT];
214
      end
215
    `PROC_PKT_DATA_W_D1:
216
      if (RXDataValid == 1'b1)
217
      begin
218
        NextState_slvGetPkt <= `PROC_PKT_DATA_CHK_D1;
219
        next_RXByte <= RXDataIn;
220
        next_RXStreamStatus <= RXStreamStatusIn;
221
      end
222
    `PROC_PKT_DATA_CHK_D1:
223
      if (RXStreamStatus == `RX_PACKET_STREAM)
224
      begin
225
        NextState_slvGetPkt <= `PROC_PKT_DATA_W_D2;
226
        next_RXByteOldest <= RXByte;
227
      end
228
      else
229
        NextState_slvGetPkt <= `PROC_PKT_DATA_FIN;
230
    `PROC_PKT_DATA_W_D2:
231
      if (RXDataValid == 1'b1)
232
      begin
233
        NextState_slvGetPkt <= `PROC_PKT_DATA_CHK_D2;
234
        next_RXByte <= RXDataIn;
235
        next_RXStreamStatus <= RXStreamStatusIn;
236
      end
237
    `PROC_PKT_DATA_FIN:
238
    begin
239
      next_CRCError <= RXByte[`CRC_ERROR_BIT];
240
      next_bitStuffError <= RXByte[`BIT_STUFF_ERROR_BIT];
241
      next_dataSequence <= RXByte[`DATA_SEQUENCE_BIT];
242
      NextState_slvGetPkt <= `PKT_RDY;
243
    end
244
    `PROC_PKT_DATA_CHK_D2:
245
      if (RXStreamStatus == `RX_PACKET_STREAM)
246
      begin
247
        NextState_slvGetPkt <= `PROC_PKT_DATA_W_D3;
248
        next_RXByteOld <= RXByte;
249
      end
250
      else
251
        NextState_slvGetPkt <= `PROC_PKT_DATA_FIN;
252
    `PROC_PKT_DATA_W_D3:
253
      if (RXDataValid == 1'b1)
254
      begin
255
        NextState_slvGetPkt <= `PROC_PKT_DATA_CHK_D3;
256
        next_RXByte <= RXDataIn;
257
        next_RXStreamStatus <= RXStreamStatusIn;
258
      end
259
    `PROC_PKT_DATA_CHK_D3:
260
      if (RXStreamStatus == `RX_PACKET_STREAM)
261
        NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_CHK_FIFO;
262
      else
263
        NextState_slvGetPkt <= `PROC_PKT_DATA_FIN;
264
    `PROC_PKT_DATA_LOOP_CHK_FIFO:
265
      if (endPointReady == 1'b0)
266
        NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_EP_N_RDY;
267
      else if (RXFifoFull == 1'b1)
268
      begin
269
        NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_FIFO_FULL;
270
        next_RXOverflow <= 1'b1;
271
      end
272
      else
273
      begin
274
        NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_W_D;
275
        next_RXFifoWEn <= 1'b1;
276
        next_RXFifoData <= RXByteOldest;
277
        next_RXByteOldest <= RXByteOld;
278
        next_RXByteOld <= RXByte;
279
      end
280
    `PROC_PKT_DATA_LOOP_FIFO_FULL:
281
      NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_W_D;
282
    `PROC_PKT_DATA_LOOP_W_D:
283
    begin
284
      next_RXFifoWEn <= 1'b0;
285
      if ((RXDataValid == 1'b1) && (RXStreamStatusIn == `RX_PACKET_STREAM))
286
      begin
287
        NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_DELAY;
288
        next_RXByte <= RXDataIn;
289
      end
290
      else if (RXDataValid == 1'b1)
291
      begin
292
        NextState_slvGetPkt <= `PROC_PKT_DATA_FIN;
293
        next_RXByte <= RXDataIn;
294
      end
295
    end
296
    `PROC_PKT_DATA_LOOP_DELAY:
297
      NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_CHK_FIFO;
298
    `PROC_PKT_DATA_LOOP_EP_N_RDY:    // Discard data
299
      NextState_slvGetPkt <= `PROC_PKT_DATA_LOOP_W_D;
300
  endcase
301 5 sfielding
end
302
 
303 22 sfielding
//----------------------------------
304 5 sfielding
// Current State Logic (sequential)
305 22 sfielding
//----------------------------------
306 5 sfielding
always @ (posedge clk)
307 22 sfielding
begin : slvGetPkt_CurrentState
308 34 sfielding
  if (rst)
309
    CurrState_slvGetPkt <= `START_GP;
310
  else
311
    CurrState_slvGetPkt <= NextState_slvGetPkt;
312 5 sfielding
end
313
 
314 22 sfielding
//----------------------------------
315 5 sfielding
// Registered outputs logic
316 22 sfielding
//----------------------------------
317 5 sfielding
always @ (posedge clk)
318 22 sfielding
begin : slvGetPkt_RegOutput
319 34 sfielding
  if (rst)
320
  begin
321
    RXByteOld <= 8'h00;
322
    RXByteOldest <= 8'h00;
323
    RXByte <= 8'h00;
324
    RXStreamStatus <= 8'h00;
325
    RXPacketRdy <= 1'b0;
326
    RXFifoWEn <= 1'b0;
327
    RXFifoData <= 8'h00;
328
    CRCError <= 1'b0;
329
    bitStuffError <= 1'b0;
330
    RXOverflow <= 1'b0;
331
    RXTimeOut <= 1'b0;
332
    ACKRxed <= 1'b0;
333
    dataSequence <= 1'b0;
334
    SIERxTimeOutEn <= 1'b0;
335
    RxPID <= 4'h0;
336
  end
337
  else
338
  begin
339
    RXByteOld <= next_RXByteOld;
340
    RXByteOldest <= next_RXByteOldest;
341
    RXByte <= next_RXByte;
342
    RXStreamStatus <= next_RXStreamStatus;
343
    RXPacketRdy <= next_RXPacketRdy;
344
    RXFifoWEn <= next_RXFifoWEn;
345
    RXFifoData <= next_RXFifoData;
346
    CRCError <= next_CRCError;
347
    bitStuffError <= next_bitStuffError;
348
    RXOverflow <= next_RXOverflow;
349
    RXTimeOut <= next_RXTimeOut;
350
    ACKRxed <= next_ACKRxed;
351
    dataSequence <= next_dataSequence;
352
    SIERxTimeOutEn <= next_SIERxTimeOutEn;
353
    RxPID <= next_RxPID;
354
  end
355 5 sfielding
end
356
 
357 2 sfielding
endmodule

powered by: WebSVN 2.1.0

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