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

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [serialInterfaceEngine/] [processTxByte.v] - Blame information for rev 40

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

Line No. Rev Author Line
1 5 sfielding
 
2 22 sfielding
// File        : ../RTL/serialInterfaceEngine/processTxByte.v
3 37 sfielding
// Generated   : 11/10/06 05:37:23
4 22 sfielding
// From        : ../RTL/serialInterfaceEngine/processTxByte.asf
5
// By          : FSM2VHDL ver. 5.0.0.9
6
 
7 5 sfielding
//////////////////////////////////////////////////////////////////////
8
////                                                              ////
9
//// processTxByte
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 processTxByte (JBit, KBit, TxByteCtrlIn, TxByteFullSpeedRateIn, TxByteIn, USBWireCtrl, USBWireData, USBWireFullSpeedRate, USBWireGnt, USBWireRdy, USBWireReq, USBWireWEn, clk, processTxByteRdy, processTxByteWEn, rst);
55
input   [1:0] JBit;
56
input   [1:0] KBit;
57
input   [7:0] TxByteCtrlIn;
58
input   TxByteFullSpeedRateIn;
59
input   [7:0] TxByteIn;
60
input   USBWireGnt;
61
input   USBWireRdy;
62 5 sfielding
input   clk;
63
input   processTxByteWEn;
64
input   rst;
65
output  USBWireCtrl;
66 22 sfielding
output  [1:0] USBWireData;
67 14 sfielding
output  USBWireFullSpeedRate;
68 5 sfielding
output  USBWireReq;
69
output  USBWireWEn;
70 22 sfielding
output  processTxByteRdy;
71 5 sfielding
 
72 22 sfielding
wire    [1:0] JBit;
73
wire    [1:0] KBit;
74
wire    [7:0] TxByteCtrlIn;
75 14 sfielding
wire    TxByteFullSpeedRateIn;
76 22 sfielding
wire    [7:0] TxByteIn;
77 5 sfielding
reg     USBWireCtrl, next_USBWireCtrl;
78 22 sfielding
reg     [1:0] USBWireData, next_USBWireData;
79 14 sfielding
reg     USBWireFullSpeedRate, next_USBWireFullSpeedRate;
80 5 sfielding
wire    USBWireGnt;
81
wire    USBWireRdy;
82
reg     USBWireReq, next_USBWireReq;
83
reg     USBWireWEn, next_USBWireWEn;
84 22 sfielding
wire    clk;
85
reg     processTxByteRdy, next_processTxByteRdy;
86
wire    processTxByteWEn;
87
wire    rst;
88 5 sfielding
 
89
// diagram signals declarations
90
reg  [1:0]TXLineState, next_TXLineState;
91
reg  [3:0]TXOneCount, next_TXOneCount;
92 22 sfielding
reg  [7:0]TxByteCtrl, next_TxByteCtrl;
93
reg  TxByteFullSpeedRate, next_TxByteFullSpeedRate;
94
reg  [7:0]TxByte, next_TxByte;
95
reg  [3:0]i, next_i;
96 5 sfielding
 
97
// BINARY ENCODED state machine: prcTxB
98
// State codes definitions:
99 9 sfielding
`define START_PTBY 5'b00000
100
`define PTBY_WAIT_EN 5'b00001
101
`define SEND_BYTE_UPDATE_BYTE 5'b00010
102
`define SEND_BYTE_WAIT_RDY 5'b00011
103
`define SEND_BYTE_CHK 5'b00100
104
`define SEND_BYTE_BIT_STUFF 5'b00101
105
`define SEND_BYTE_WAIT_RDY2 5'b00110
106
`define SEND_BYTE_CHK_FIN 5'b00111
107
`define PTBY_WAIT_GNT 5'b01000
108
`define STOP_SND_SE0_2 5'b01001
109
`define STOP_SND_SE0_1 5'b01010
110
`define STOP_CHK 5'b01011
111
`define STOP_SND_J 5'b01100
112
`define STOP_SND_IDLE 5'b01101
113
`define STOP_FIN 5'b01110
114
`define WAIT_RDY_WIRE 5'b01111
115
`define WAIT_RDY_PKT 5'b10000
116
`define LS_START_SND_IDLE3 5'b10001
117
`define LS_START_SND_J1 5'b10010
118
`define LS_START_SND_IDLE1 5'b10011
119
`define LS_START_SND_IDLE2 5'b10100
120
`define LS_START_FIN 5'b10101
121 14 sfielding
`define LS_START_W_RDY1 5'b10110
122
`define LS_START_W_RDY2 5'b10111
123
`define LS_START_W_RDY3 5'b11000
124
`define STOP_W_RDY1 5'b11001
125
`define STOP_W_RDY2 5'b11010
126
`define STOP_W_RDY3 5'b11011
127
`define STOP_W_RDY4 5'b11100
128 5 sfielding
 
129 22 sfielding
reg [4:0] CurrState_prcTxB;
130
reg [4:0] NextState_prcTxB;
131 5 sfielding
 
132
 
133 22 sfielding
//--------------------------------------------------------------------
134 5 sfielding
// Machine: prcTxB
135 22 sfielding
//--------------------------------------------------------------------
136
//----------------------------------
137
// Next State Logic (combinatorial)
138
//----------------------------------
139
always @ (TxByteIn or TxByteCtrlIn or TxByteFullSpeedRateIn or JBit or i or TxByte or TXOneCount or TXLineState or KBit or processTxByteWEn or USBWireGnt or USBWireRdy or TxByteFullSpeedRate or TxByteCtrl or processTxByteRdy or USBWireData or USBWireCtrl or USBWireReq or USBWireWEn or USBWireFullSpeedRate or CurrState_prcTxB)
140
begin : prcTxB_NextState
141 34 sfielding
  NextState_prcTxB <= CurrState_prcTxB;
142
  // Set default values for outputs and signals
143
  next_processTxByteRdy <= processTxByteRdy;
144
  next_USBWireData <= USBWireData;
145
  next_USBWireCtrl <= USBWireCtrl;
146
  next_USBWireReq <= USBWireReq;
147
  next_USBWireWEn <= USBWireWEn;
148
  next_i <= i;
149
  next_TxByte <= TxByte;
150
  next_TxByteCtrl <= TxByteCtrl;
151
  next_TXLineState <= TXLineState;
152
  next_TXOneCount <= TXOneCount;
153
  next_USBWireFullSpeedRate <= USBWireFullSpeedRate;
154
  next_TxByteFullSpeedRate <= TxByteFullSpeedRate;
155
  case (CurrState_prcTxB)
156
    `START_PTBY:
157
    begin
158
      next_processTxByteRdy <= 1'b0;
159
      next_USBWireData <= 2'b00;
160
      next_USBWireCtrl <= `TRI_STATE;
161
      next_USBWireReq <= 1'b0;
162
      next_USBWireWEn <= 1'b0;
163
      next_i <= 4'h0;
164
      next_TxByte <= 8'h00;
165
      next_TxByteCtrl <= 8'h00;
166
      next_TXLineState <= 2'b0;
167
      next_TXOneCount <= 4'h0;
168
      next_USBWireFullSpeedRate <= 1'b0;
169
      next_TxByteFullSpeedRate <= 1'b0;
170
      NextState_prcTxB <= `PTBY_WAIT_EN;
171
    end
172
    `PTBY_WAIT_EN:
173
    begin
174
      next_processTxByteRdy <= 1'b1;
175
      if ((processTxByteWEn == 1'b1) && (TxByteCtrlIn == `DATA_START))
176
      begin
177
        NextState_prcTxB <= `PTBY_WAIT_GNT;
178
        next_processTxByteRdy <= 1'b0;
179
        next_TxByte <= TxByteIn;
180
        next_TxByteCtrl <= TxByteCtrlIn;
181
        next_TxByteFullSpeedRate <= TxByteFullSpeedRateIn;
182
        next_USBWireFullSpeedRate <= TxByteFullSpeedRateIn;
183
        next_TXOneCount <= 4'h0;
184
        next_TXLineState <= JBit;
185
        next_USBWireReq <= 1'b1;
186
      end
187
      else if (processTxByteWEn == 1'b1)
188
      begin
189
        NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE;
190
        next_processTxByteRdy <= 1'b0;
191
        next_TxByte <= TxByteIn;
192
        next_TxByteCtrl <= TxByteCtrlIn;
193
        next_TxByteFullSpeedRate <= TxByteFullSpeedRateIn;
194
        next_USBWireFullSpeedRate <= TxByteFullSpeedRateIn;
195
        next_i <= 4'h0;
196
      end
197
    end
198
    `PTBY_WAIT_GNT:
199
      if (USBWireGnt == 1'b1)
200
        NextState_prcTxB <= `WAIT_RDY_WIRE;
201
    `WAIT_RDY_WIRE:
202
      if ((USBWireRdy == 1'b1) && (TxByteFullSpeedRate  == 1'b0))
203
        NextState_prcTxB <= `LS_START_SND_IDLE1;
204
      else if (USBWireRdy == 1'b1)
205
      begin
206
        NextState_prcTxB <= `WAIT_RDY_PKT;
207
        //actively drive the first J bit
208
        next_USBWireData <= JBit;
209
        next_USBWireCtrl <= `DRIVE;
210
        next_USBWireWEn <= 1'b1;
211
      end
212
    `WAIT_RDY_PKT:
213
    begin
214
      next_USBWireWEn <= 1'b0;
215
      NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE;
216
      next_i <= 4'h0;
217
    end
218
    `SEND_BYTE_UPDATE_BYTE:
219
    begin
220
      next_i <= i + 1'b1;
221
      next_TxByte <= {1'b0, TxByte[7:1] };
222
      if (TxByte[0] == 1'b1)                      //If this bit is 1, then
223
        next_TXOneCount <= TXOneCount + 1'b1;
224
          //increment 'TXOneCount'
225
      else                                        //else this is a zero bit
226
      begin
227
        next_TXOneCount <= 4'h0;
228
          //reset 'TXOneCount'
229
          if (TXLineState == JBit)
230
          next_TXLineState <= KBit;
231
              //toggle the line state
232
          else
233
          next_TXLineState <= JBit;
234
      end
235
      NextState_prcTxB <= `SEND_BYTE_WAIT_RDY;
236
    end
237
    `SEND_BYTE_WAIT_RDY:
238
      if (USBWireRdy == 1'b1)
239
      begin
240
        NextState_prcTxB <= `SEND_BYTE_CHK;
241
        next_USBWireWEn <= 1'b1;
242
        next_USBWireData <= TXLineState;
243
        next_USBWireCtrl <= `DRIVE;
244
      end
245
    `SEND_BYTE_CHK:
246
    begin
247
      next_USBWireWEn <= 1'b0;
248
      if (TXOneCount == `MAX_CONSEC_SAME_BITS)
249
        NextState_prcTxB <= `SEND_BYTE_BIT_STUFF;
250
      else if (i != 4'h8)
251
        NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE;
252
      else
253
        NextState_prcTxB <= `STOP_CHK;
254
    end
255
    `SEND_BYTE_BIT_STUFF:
256
    begin
257
      next_TXOneCount <= 4'h0;
258
      //reset 'TXOneCount'
259
      if (TXLineState == JBit)
260
        next_TXLineState <= KBit;
261
          //toggle the line state
262
      else
263
        next_TXLineState <= JBit;
264
      NextState_prcTxB <= `SEND_BYTE_WAIT_RDY2;
265
    end
266
    `SEND_BYTE_WAIT_RDY2:
267
      if (USBWireRdy == 1'b1)
268
      begin
269
        NextState_prcTxB <= `SEND_BYTE_CHK_FIN;
270
        next_USBWireWEn <= 1'b1;
271
        next_USBWireData <= TXLineState;
272
        next_USBWireCtrl <= `DRIVE;
273
      end
274
    `SEND_BYTE_CHK_FIN:
275
    begin
276
      next_USBWireWEn <= 1'b0;
277
      if (i == 4'h8)
278
        NextState_prcTxB <= `STOP_CHK;
279
      else
280
        NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE;
281
    end
282
    `STOP_SND_SE0_2:
283
    begin
284
      next_USBWireWEn <= 1'b0;
285
      NextState_prcTxB <= `STOP_W_RDY2;
286
    end
287
    `STOP_SND_SE0_1:
288
      NextState_prcTxB <= `STOP_W_RDY1;
289
    `STOP_CHK:
290
      if (TxByteCtrl == `DATA_STOP)
291
        NextState_prcTxB <= `STOP_SND_SE0_1;
292
      else
293
        NextState_prcTxB <= `PTBY_WAIT_EN;
294
    `STOP_SND_J:
295
    begin
296
      next_USBWireWEn <= 1'b0;
297
      NextState_prcTxB <= `STOP_W_RDY3;
298
    end
299
    `STOP_SND_IDLE:
300
    begin
301
      next_USBWireWEn <= 1'b0;
302
      NextState_prcTxB <= `STOP_W_RDY4;
303
    end
304
    `STOP_FIN:
305
    begin
306
      next_USBWireWEn <= 1'b0;
307
      next_USBWireReq <= 1'b0;
308
      //release the wire
309
      NextState_prcTxB <= `PTBY_WAIT_EN;
310
    end
311
    `STOP_W_RDY1:
312
      if (USBWireRdy == 1'b1)
313
      begin
314
        NextState_prcTxB <= `STOP_SND_SE0_2;
315
        next_USBWireWEn <= 1'b1;
316
        next_USBWireData <= `SE0;
317
        next_USBWireCtrl <= `DRIVE;
318
      end
319
    `STOP_W_RDY2:
320
      if (USBWireRdy == 1'b1)
321
      begin
322
        NextState_prcTxB <= `STOP_SND_J;
323
        next_USBWireWEn <= 1'b1;
324
        next_USBWireData <= `SE0;
325
        next_USBWireCtrl <= `DRIVE;
326
      end
327
    `STOP_W_RDY3:
328
      if (USBWireRdy == 1'b1)
329
      begin
330
        NextState_prcTxB <= `STOP_SND_IDLE;
331
        next_USBWireWEn <= 1'b1;
332
        next_USBWireData <= JBit;
333
        next_USBWireCtrl <= `DRIVE;
334
      end
335
    `STOP_W_RDY4:
336
      if (USBWireRdy == 1'b1)
337
      begin
338
        NextState_prcTxB <= `STOP_FIN;
339
        next_USBWireWEn <= 1'b1;
340
        next_USBWireData <= JBit;
341
        next_USBWireCtrl <= `TRI_STATE;
342
      end
343
    `LS_START_SND_IDLE3:
344
    begin
345
      next_USBWireWEn <= 1'b0;
346
      NextState_prcTxB <= `LS_START_W_RDY2;
347
    end
348
    `LS_START_SND_J1:
349
    begin
350
      next_USBWireWEn <= 1'b0;
351
      NextState_prcTxB <= `LS_START_W_RDY3;
352
    end
353
    `LS_START_SND_IDLE1:
354
      if (USBWireRdy == 1'b1)
355
      begin
356
        NextState_prcTxB <= `LS_START_SND_IDLE2;
357
        next_USBWireWEn <= 1'b1;
358
        next_USBWireData <= JBit;
359
        next_USBWireCtrl <= `TRI_STATE;
360
      end
361
    `LS_START_SND_IDLE2:
362
    begin
363
      next_USBWireWEn <= 1'b0;
364
      NextState_prcTxB <= `LS_START_W_RDY1;
365
    end
366
    `LS_START_FIN:
367
    begin
368
      next_USBWireWEn <= 1'b0;
369
      NextState_prcTxB <= `SEND_BYTE_UPDATE_BYTE;
370
      next_i <= 4'h0;
371
    end
372
    `LS_START_W_RDY1:
373
      if (USBWireRdy == 1'b1)
374
      begin
375
        NextState_prcTxB <= `LS_START_SND_IDLE3;
376
        next_USBWireWEn <= 1'b1;
377
        next_USBWireData <= JBit;
378
        next_USBWireCtrl <= `TRI_STATE;
379
      end
380
    `LS_START_W_RDY2:
381
      if (USBWireRdy == 1'b1)
382
      begin
383
        NextState_prcTxB <= `LS_START_SND_J1;
384
        next_USBWireWEn <= 1'b1;
385
        next_USBWireData <= JBit;
386
        next_USBWireCtrl <= `TRI_STATE;
387
      end
388
    `LS_START_W_RDY3:
389
      if (USBWireRdy == 1'b1)
390
      begin
391
        NextState_prcTxB <= `LS_START_FIN;
392
        //Drive the first JBit
393
        next_USBWireWEn <= 1'b1;
394
        next_USBWireData <= JBit;
395
        next_USBWireCtrl <= `DRIVE;
396
      end
397
  endcase
398 5 sfielding
end
399
 
400 22 sfielding
//----------------------------------
401 5 sfielding
// Current State Logic (sequential)
402 22 sfielding
//----------------------------------
403 5 sfielding
always @ (posedge clk)
404 22 sfielding
begin : prcTxB_CurrentState
405 34 sfielding
  if (rst)
406
    CurrState_prcTxB <= `START_PTBY;
407
  else
408
    CurrState_prcTxB <= NextState_prcTxB;
409 5 sfielding
end
410
 
411 22 sfielding
//----------------------------------
412 5 sfielding
// Registered outputs logic
413 22 sfielding
//----------------------------------
414 5 sfielding
always @ (posedge clk)
415 22 sfielding
begin : prcTxB_RegOutput
416 34 sfielding
  if (rst)
417
  begin
418
    i <= 4'h0;
419
    TxByte <= 8'h00;
420
    TxByteCtrl <= 8'h00;
421
    TXLineState <= 2'b0;
422
    TXOneCount <= 4'h0;
423
    TxByteFullSpeedRate <= 1'b0;
424
    processTxByteRdy <= 1'b0;
425
    USBWireData <= 2'b00;
426
    USBWireCtrl <= `TRI_STATE;
427
    USBWireReq <= 1'b0;
428
    USBWireWEn <= 1'b0;
429
    USBWireFullSpeedRate <= 1'b0;
430
  end
431
  else
432
  begin
433
    i <= next_i;
434
    TxByte <= next_TxByte;
435
    TxByteCtrl <= next_TxByteCtrl;
436
    TXLineState <= next_TXLineState;
437
    TXOneCount <= next_TXOneCount;
438
    TxByteFullSpeedRate <= next_TxByteFullSpeedRate;
439
    processTxByteRdy <= next_processTxByteRdy;
440
    USBWireData <= next_USBWireData;
441
    USBWireCtrl <= next_USBWireCtrl;
442
    USBWireReq <= next_USBWireReq;
443
    USBWireWEn <= next_USBWireWEn;
444
    USBWireFullSpeedRate <= next_USBWireFullSpeedRate;
445
  end
446 5 sfielding
end
447
 
448 2 sfielding
endmodule

powered by: WebSVN 2.1.0

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