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

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [hostController/] [sendpacket.v] - Blame information for rev 9

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

Line No. Rev Author Line
1 5 sfielding
 
2
//////////////////////////////////////////////////////////////////////
3
////                                                              ////
4
//// sendPacket
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
`timescale 1ns / 1ps
46
`include "usbSerialInterfaceEngine_h.v"
47
`include "usbConstants_h.v"
48
 
49
 
50
 
51
module sendPacket (clk, fifoData, fifoEmpty, fifoReadEn, frameNum, HCTxPortCntl, HCTxPortData, HCTxPortGnt, HCTxPortRdy, HCTxPortReq, HCTxPortWEn, PID, rst, sendPacketRdy, sendPacketWEn, TxAddr, TxEndP);
52
input   clk;
53
input   [7:0]fifoData;
54
input   fifoEmpty;
55
input   HCTxPortGnt;
56
input   HCTxPortRdy;
57
input   [3:0]PID;
58
input   rst;
59
input   sendPacketWEn;
60
input   [6:0]TxAddr;
61
input   [3:0]TxEndP;
62
output  fifoReadEn;
63
output  [10:0]frameNum;
64
output  [7:0]HCTxPortCntl;
65
output  [7:0]HCTxPortData;
66
output  HCTxPortReq;
67
output  HCTxPortWEn;
68
output  sendPacketRdy;
69
 
70
wire    clk;
71
wire    [7:0]fifoData;
72
wire    fifoEmpty;
73
reg     fifoReadEn, next_fifoReadEn;
74
reg     [10:0]frameNum, next_frameNum;
75
reg     [7:0]HCTxPortCntl, next_HCTxPortCntl;
76
reg     [7:0]HCTxPortData, next_HCTxPortData;
77
wire    HCTxPortGnt;
78
wire    HCTxPortRdy;
79
reg     HCTxPortReq, next_HCTxPortReq;
80
reg     HCTxPortWEn, next_HCTxPortWEn;
81
wire    [3:0]PID;
82
wire    rst;
83
reg     sendPacketRdy, next_sendPacketRdy;
84
wire    sendPacketWEn;
85
wire    [6:0]TxAddr;
86
wire    [3:0]TxEndP;
87
 
88
// diagram signals declarations
89
reg  [7:0]PIDNotPID;
90
 
91
// BINARY ENCODED state machine: sndPkt
92
// State codes definitions:
93
`define START_SP 5'b00000
94
`define WAIT_ENABLE 5'b00001
95
`define SP_WAIT_GNT 5'b00010
96
`define SEND_PID_WAIT_RDY 5'b00011
97
`define SEND_PID_FIN 5'b00100
98
`define FIN_SP 5'b00101
99
`define OUT_IN_SETUP_WAIT_RDY1 5'b00110
100
`define OUT_IN_SETUP_WAIT_RDY2 5'b00111
101
`define OUT_IN_SETUP_FIN 5'b01000
102
`define SEND_SOF_FIN1 5'b01001
103
`define SEND_SOF_WAIT_RDY3 5'b01010
104
`define SEND_SOF_WAIT_RDY4 5'b01011
105
`define DATA0_DATA1_READ_FIFO 5'b01100
106
`define DATA0_DATA1_WAIT_READ_FIFO 5'b01101
107
`define DATA0_DATA1_FIFO_EMPTY 5'b01110
108
`define DATA0_DATA1_FIN 5'b01111
109
`define DATA0_DATA1_TERM_BYTE 5'b10000
110
`define OUT_IN_SETUP_CLR_WEN1 5'b10001
111
`define SEND_SOF_CLR_WEN1 5'b10010
112
`define DATA0_DATA1_CLR_WEN 5'b10011
113
`define DATA0_DATA1_CLR_REN 5'b10100
114
 
115
reg [4:0]CurrState_sndPkt, NextState_sndPkt;
116
 
117
// Diagram actions (continuous assignments allowed only: assign ...)
118
always @(PID)
119
begin
120
PIDNotPID <=  { (PID ^ 4'hf), PID };
121
end
122
 
123
 
124
// Machine: sndPkt
125
 
126
// NextState logic (combinatorial)
127
always @ (sendPacketWEn or HCTxPortGnt or HCTxPortRdy or PIDNotPID or PID or TxEndP or TxAddr or frameNum or fifoData or fifoEmpty or sendPacketRdy or fifoReadEn or HCTxPortData or HCTxPortCntl or HCTxPortWEn or HCTxPortReq or CurrState_sndPkt)
128
begin
129
  NextState_sndPkt <= CurrState_sndPkt;
130
  // Set default values for outputs and signals
131
  next_sendPacketRdy <= sendPacketRdy;
132
  next_fifoReadEn <= fifoReadEn;
133
  next_HCTxPortData <= HCTxPortData;
134
  next_HCTxPortCntl <= HCTxPortCntl;
135
  next_HCTxPortWEn <= HCTxPortWEn;
136
  next_HCTxPortReq <= HCTxPortReq;
137
  next_frameNum <= frameNum;
138
  case (CurrState_sndPkt)  // synopsys parallel_case full_case
139
    `START_SP:
140
    begin
141
      NextState_sndPkt <= `WAIT_ENABLE;
142
    end
143
    `WAIT_ENABLE:
144
    begin
145
      if (sendPacketWEn == 1'b1)
146
      begin
147
        NextState_sndPkt <= `SP_WAIT_GNT;
148
        next_sendPacketRdy <= 1'b0;
149
        next_HCTxPortReq <= 1'b1;
150
      end
151
    end
152
    `SP_WAIT_GNT:
153
    begin
154
      if (HCTxPortGnt == 1'b1)
155
      begin
156
        NextState_sndPkt <= `SEND_PID_WAIT_RDY;
157
      end
158
    end
159
    `FIN_SP:
160
    begin
161
      NextState_sndPkt <= `WAIT_ENABLE;
162
      next_sendPacketRdy <= 1'b1;
163
      next_HCTxPortReq <= 1'b0;
164
    end
165
    `SEND_PID_WAIT_RDY:
166
    begin
167
      if (HCTxPortRdy == 1'b1)
168
      begin
169
        NextState_sndPkt <= `SEND_PID_FIN;
170
        next_HCTxPortWEn <= 1'b1;
171
        next_HCTxPortData <= PIDNotPID;
172
        next_HCTxPortCntl <= `TX_PACKET_START;
173
      end
174
    end
175
    `SEND_PID_FIN:
176
    begin
177
      next_HCTxPortWEn <= 1'b0;
178
      if (PID == `DATA0 || PID == `DATA1)
179
      begin
180
        NextState_sndPkt <= `DATA0_DATA1_FIFO_EMPTY;
181
      end
182
      else if (PID == `SOF)
183
      begin
184
        NextState_sndPkt <= `SEND_SOF_WAIT_RDY3;
185
      end
186
      else if (PID == `OUT ||
187
        PID == `IN ||
188
        PID == `SETUP)
189
      begin
190
        NextState_sndPkt <= `OUT_IN_SETUP_WAIT_RDY1;
191
      end
192
      else
193
      begin
194
        NextState_sndPkt <= `FIN_SP;
195
      end
196
    end
197
    `OUT_IN_SETUP_WAIT_RDY1:
198
    begin
199
      if (HCTxPortRdy == 1'b1)
200
      begin
201
        NextState_sndPkt <= `OUT_IN_SETUP_CLR_WEN1;
202
        next_HCTxPortWEn <= 1'b1;
203
        next_HCTxPortData <= {TxEndP[0], TxAddr[6:0]};
204
        next_HCTxPortCntl <= `TX_PACKET_STREAM;
205
      end
206
    end
207
    `OUT_IN_SETUP_WAIT_RDY2:
208
    begin
209
      if (HCTxPortRdy == 1'b1)
210
      begin
211
        NextState_sndPkt <= `OUT_IN_SETUP_FIN;
212
        next_HCTxPortWEn <= 1'b1;
213
        next_HCTxPortData <= {5'b00000, TxEndP[3:1]};
214
        next_HCTxPortCntl <= `TX_PACKET_STREAM;
215
      end
216
    end
217
    `OUT_IN_SETUP_FIN:
218
    begin
219
      next_HCTxPortWEn <= 1'b0;
220
      NextState_sndPkt <= `FIN_SP;
221
    end
222
    `OUT_IN_SETUP_CLR_WEN1:
223
    begin
224
      next_HCTxPortWEn <= 1'b0;
225
      NextState_sndPkt <= `OUT_IN_SETUP_WAIT_RDY2;
226
    end
227
    `SEND_SOF_FIN1:
228
    begin
229
      next_HCTxPortWEn <= 1'b0;
230
      next_frameNum <= frameNum + 1'b1;
231
      NextState_sndPkt <= `FIN_SP;
232
    end
233
    `SEND_SOF_WAIT_RDY3:
234
    begin
235
      if (HCTxPortRdy == 1'b1)
236
      begin
237
        NextState_sndPkt <= `SEND_SOF_CLR_WEN1;
238
        next_HCTxPortWEn <= 1'b1;
239
        next_HCTxPortData <= frameNum[7:0];
240
        next_HCTxPortCntl <= `TX_PACKET_STREAM;
241
      end
242
    end
243
    `SEND_SOF_WAIT_RDY4:
244
    begin
245
      if (HCTxPortRdy == 1'b1)
246
      begin
247
        NextState_sndPkt <= `SEND_SOF_FIN1;
248
        next_HCTxPortWEn <= 1'b1;
249
        next_HCTxPortData <= {5'b00000, frameNum[10:8]};
250
        next_HCTxPortCntl <= `TX_PACKET_STREAM;
251
      end
252
    end
253
    `SEND_SOF_CLR_WEN1:
254
    begin
255
      next_HCTxPortWEn <= 1'b0;
256
      NextState_sndPkt <= `SEND_SOF_WAIT_RDY4;
257
    end
258
    `DATA0_DATA1_READ_FIFO:
259
    begin
260
      next_HCTxPortWEn <= 1'b1;
261
      next_HCTxPortData <= fifoData;
262
      next_HCTxPortCntl <= `TX_PACKET_STREAM;
263
      NextState_sndPkt <= `DATA0_DATA1_CLR_WEN;
264
    end
265
    `DATA0_DATA1_WAIT_READ_FIFO:
266
    begin
267
      if (HCTxPortRdy == 1'b1)
268
      begin
269
        NextState_sndPkt <= `DATA0_DATA1_CLR_REN;
270
        next_fifoReadEn <= 1'b1;
271
      end
272
    end
273
    `DATA0_DATA1_FIFO_EMPTY:
274
    begin
275
      if (fifoEmpty == 1'b0)
276
      begin
277
        NextState_sndPkt <= `DATA0_DATA1_WAIT_READ_FIFO;
278
      end
279
      else
280
      begin
281
        NextState_sndPkt <= `DATA0_DATA1_TERM_BYTE;
282
      end
283
    end
284
    `DATA0_DATA1_FIN:
285
    begin
286
      next_HCTxPortWEn <= 1'b0;
287
      NextState_sndPkt <= `FIN_SP;
288
    end
289
    `DATA0_DATA1_TERM_BYTE:
290
    begin
291
      if (HCTxPortRdy == 1'b1)
292
      begin
293
        NextState_sndPkt <= `DATA0_DATA1_FIN;
294
        //Last byte is not valid data,
295
        //but the 'TX_PACKET_STOP' flag is required
296
        //by the SIE state machine to detect end of data packet
297
        next_HCTxPortWEn <= 1'b1;
298
        next_HCTxPortData <= 8'h00;
299
        next_HCTxPortCntl <= `TX_PACKET_STOP;
300
      end
301
    end
302
    `DATA0_DATA1_CLR_WEN:
303
    begin
304
      next_HCTxPortWEn <= 1'b0;
305
      NextState_sndPkt <= `DATA0_DATA1_FIFO_EMPTY;
306
    end
307
    `DATA0_DATA1_CLR_REN:
308
    begin
309
      next_fifoReadEn <= 1'b0;
310
      NextState_sndPkt <= `DATA0_DATA1_READ_FIFO;
311
    end
312
  endcase
313
end
314
 
315
// Current State Logic (sequential)
316
always @ (posedge clk)
317
begin
318
  if (rst)
319
    CurrState_sndPkt <= `START_SP;
320
  else
321
    CurrState_sndPkt <= NextState_sndPkt;
322
end
323
 
324
// Registered outputs logic
325
always @ (posedge clk)
326
begin
327
  if (rst)
328
  begin
329
    sendPacketRdy <= 1'b1;
330
    fifoReadEn <= 1'b0;
331
    HCTxPortData <= 8'h00;
332
    HCTxPortCntl <= 8'h00;
333
    HCTxPortWEn <= 1'b0;
334
    HCTxPortReq <= 1'b0;
335
    frameNum <= 11'h000;
336
  end
337
  else
338
  begin
339
    sendPacketRdy <= next_sendPacketRdy;
340
    fifoReadEn <= next_fifoReadEn;
341
    HCTxPortData <= next_HCTxPortData;
342
    HCTxPortCntl <= next_HCTxPortCntl;
343
    HCTxPortWEn <= next_HCTxPortWEn;
344
    HCTxPortReq <= next_HCTxPortReq;
345
    frameNum <= next_frameNum;
346
  end
347
end
348
 
349 2 sfielding
endmodule

powered by: WebSVN 2.1.0

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