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

Subversion Repositories usbhostslave

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 22 sfielding
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// USBSlaveControlBI.v                                          ////
4
////                                                              ////
5
//// This file is part of the usbhostslave opencores effort.
6
//// <http://www.opencores.org/cores//>                           ////
7
////                                                              ////
8
//// Module Description:                                          ////
9
////       
10
////                                                              ////
11
//// To Do:                                                       ////
12
//// 
13
////                                                              ////
14
//// Author(s):                                                   ////
15
//// - Steve Fielding, sfielding@base2designs.com                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG          ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE. See the GNU Lesser General Public License for more  ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from <http://www.opencores.org/lgpl.shtml>                   ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
`include "timescale.v"
45
`include "usbSlaveControl_h.v"
46
 
47
module USBSlaveControlBI (address, dataIn, dataOut, writeEn,
48
  strobe_i,
49
  busClk,
50
  rstSyncToBusClk,
51
  usbClk,
52
  rstSyncToUsbClk,
53 37 sfielding
  SOFRxedIntOut, resetEventIntOut, resumeIntOut, transDoneIntOut, NAKSentIntOut, vBusDetIntOut,
54 22 sfielding
  endP0TransTypeReg, endP0NAKTransTypeReg,
55
  endP1TransTypeReg, endP1NAKTransTypeReg,
56
  endP2TransTypeReg, endP2NAKTransTypeReg,
57
  endP3TransTypeReg, endP3NAKTransTypeReg,
58
  endP0ControlReg,
59
  endP1ControlReg,
60
  endP2ControlReg,
61
  endP3ControlReg,
62
  EP0StatusReg,
63
  EP1StatusReg,
64
  EP2StatusReg,
65
  EP3StatusReg,
66
  SCAddrReg, frameNum,
67
  connectStateIn,
68 37 sfielding
  vBusDetectIn,
69 22 sfielding
  SOFRxedIn, resetEventIn, resumeIntIn, transDoneIn, NAKSentIn,
70
  slaveControlSelect,
71
  clrEP0Ready, clrEP1Ready, clrEP2Ready, clrEP3Ready,
72
  TxLineState,
73
  LineDirectControlEn,
74
  fullSpeedPol,
75
  fullSpeedRate,
76 37 sfielding
  connectSlaveToHost,
77 22 sfielding
  SCGlobalEn
78
  );
79
input [4:0] address;
80
input [7:0] dataIn;
81
input writeEn;
82
input strobe_i;
83
input busClk;
84
input rstSyncToBusClk;
85
input usbClk;
86
input rstSyncToUsbClk;
87
output [7:0] dataOut;
88
output SOFRxedIntOut;
89
output resetEventIntOut;
90
output resumeIntOut;
91
output transDoneIntOut;
92
output NAKSentIntOut;
93 37 sfielding
output vBusDetIntOut;
94 22 sfielding
 
95
input [1:0] endP0TransTypeReg;
96
input [1:0] endP0NAKTransTypeReg;
97
input [1:0] endP1TransTypeReg;
98
input [1:0] endP1NAKTransTypeReg;
99
input [1:0] endP2TransTypeReg;
100
input [1:0] endP2NAKTransTypeReg;
101
input [1:0] endP3TransTypeReg;
102
input [1:0] endP3NAKTransTypeReg;
103
output [4:0] endP0ControlReg;
104
output [4:0] endP1ControlReg;
105
output [4:0] endP2ControlReg;
106
output [4:0] endP3ControlReg;
107
input [7:0] EP0StatusReg;
108
input [7:0] EP1StatusReg;
109
input [7:0] EP2StatusReg;
110
input [7:0] EP3StatusReg;
111
output [6:0] SCAddrReg;
112
input [10:0] frameNum;
113
input [1:0] connectStateIn;
114 37 sfielding
input vBusDetectIn;
115 22 sfielding
input SOFRxedIn;
116
input resetEventIn;
117
input resumeIntIn;
118
input transDoneIn;
119
input NAKSentIn;
120
input slaveControlSelect;
121
input clrEP0Ready;
122
input clrEP1Ready;
123
input clrEP2Ready;
124
input clrEP3Ready;
125
output [1:0] TxLineState;
126
output LineDirectControlEn;
127
output fullSpeedPol;
128
output fullSpeedRate;
129 37 sfielding
output connectSlaveToHost;
130 22 sfielding
output SCGlobalEn;
131
 
132
wire [4:0] address;
133
wire [7:0] dataIn;
134
wire writeEn;
135
wire strobe_i;
136
wire busClk;
137
wire rstSyncToBusClk;
138
wire usbClk;
139
wire rstSyncToUsbClk;
140
reg [7:0] dataOut;
141
 
142
reg SOFRxedIntOut;
143
reg resetEventIntOut;
144
reg resumeIntOut;
145
reg transDoneIntOut;
146
reg NAKSentIntOut;
147 37 sfielding
reg vBusDetIntOut;
148 22 sfielding
 
149
wire [1:0] endP0TransTypeReg;
150
wire [1:0] endP0NAKTransTypeReg;
151
wire [1:0] endP1TransTypeReg;
152
wire [1:0] endP1NAKTransTypeReg;
153
wire [1:0] endP2TransTypeReg;
154
wire [1:0] endP2NAKTransTypeReg;
155
wire [1:0] endP3TransTypeReg;
156
wire [1:0] endP3NAKTransTypeReg;
157
reg [4:0] endP0ControlReg;
158 37 sfielding
reg [4:0] endP0ControlReg1;
159 22 sfielding
reg [4:0] endP1ControlReg;
160 37 sfielding
reg [4:0] endP1ControlReg1;
161 22 sfielding
reg [4:0] endP2ControlReg;
162 37 sfielding
reg [4:0] endP2ControlReg1;
163 22 sfielding
reg [4:0] endP3ControlReg;
164 37 sfielding
reg [4:0] endP3ControlReg1;
165 22 sfielding
wire [7:0] EP0StatusReg;
166
wire [7:0] EP1StatusReg;
167
wire [7:0] EP2StatusReg;
168
wire [7:0] EP3StatusReg;
169
reg [6:0] SCAddrReg;
170
reg [3:0] TxEndPReg;
171
wire [10:0] frameNum;
172
wire [1:0] connectStateIn;
173
 
174
wire SOFRxedIn;
175
wire resetEventIn;
176
wire resumeIntIn;
177
wire transDoneIn;
178
wire NAKSentIn;
179
wire slaveControlSelect;
180
wire clrEP0Ready;
181
wire clrEP1Ready;
182
wire clrEP2Ready;
183
wire clrEP3Ready;
184
reg [1:0] TxLineState;
185 37 sfielding
reg [1:0] TxLineState_reg1;
186 22 sfielding
reg LineDirectControlEn;
187 37 sfielding
reg LineDirectControlEn_reg1;
188 22 sfielding
reg fullSpeedPol;
189 37 sfielding
reg fullSpeedPol_reg1;
190 22 sfielding
reg fullSpeedRate;
191 37 sfielding
reg fullSpeedRate_reg1;
192
reg connectSlaveToHost;
193
reg connectSlaveToHost_reg1;
194 22 sfielding
reg SCGlobalEn;
195 37 sfielding
reg SCGlobalEn_reg1;
196 22 sfielding
 
197
//internal wire and regs
198 37 sfielding
reg [6:0] SCControlReg;
199
reg clrVBusDetReq;
200 22 sfielding
reg clrNAKReq;
201
reg clrSOFReq;
202
reg clrResetReq;
203
reg clrResInReq;
204
reg clrTransDoneReq;
205
reg SOFRxedInt;
206
reg resetEventInt;
207
reg resumeInt;
208
reg transDoneInt;
209 37 sfielding
reg vBusDetInt;
210 22 sfielding
reg NAKSentInt;
211 37 sfielding
reg [5:0] interruptMaskReg;
212 22 sfielding
reg EP0SetReady;
213
reg EP1SetReady;
214
reg EP2SetReady;
215
reg EP3SetReady;
216
reg EP0SendStall;
217
reg EP1SendStall;
218
reg EP2SendStall;
219
reg EP3SendStall;
220
reg EP0IsoEn;
221
reg EP1IsoEn;
222
reg EP2IsoEn;
223
reg EP3IsoEn;
224
reg EP0DataSequence;
225
reg EP1DataSequence;
226
reg EP2DataSequence;
227
reg EP3DataSequence;
228
reg EP0Enable;
229
reg EP1Enable;
230
reg EP2Enable;
231
reg EP3Enable;
232
reg EP0Ready;
233
reg EP1Ready;
234
reg EP2Ready;
235
reg EP3Ready;
236 37 sfielding
reg [2:0] SOFRxedInExtend;
237
reg [2:0] resetEventInExtend;
238
reg [2:0] resumeIntInExtend;
239
reg [2:0] transDoneInExtend;
240
reg [2:0] NAKSentInExtend;
241
reg [2:0] clrEP0ReadyExtend;
242
reg [2:0] clrEP1ReadyExtend;
243
reg [2:0] clrEP2ReadyExtend;
244
reg [2:0] clrEP3ReadyExtend;
245 22 sfielding
 
246 37 sfielding
 
247 22 sfielding
//clock domain crossing sync registers
248
//STB = Sync To Busclk
249
reg [4:0] endP0ControlRegSTB;
250
reg [4:0] endP1ControlRegSTB;
251
reg [4:0] endP2ControlRegSTB;
252
reg [4:0] endP3ControlRegSTB;
253 37 sfielding
reg [2:0] NAKSentInSTB;
254
reg [2:0] SOFRxedInSTB;
255
reg [2:0] resetEventInSTB;
256
reg [2:0] resumeIntInSTB;
257
reg [2:0] transDoneInSTB;
258
reg [2:0] clrEP0ReadySTB;
259
reg [2:0] clrEP1ReadySTB;
260
reg [2:0] clrEP2ReadySTB;
261
reg [2:0] clrEP3ReadySTB;
262 22 sfielding
reg SCGlobalEnSTB;
263
reg [1:0] TxLineStateSTB;
264
reg LineDirectControlEnSTB;
265
reg fullSpeedPolSTB;
266
reg fullSpeedRateSTB;
267 37 sfielding
reg connectSlaveToHostSTB;
268 22 sfielding
reg [7:0] EP0StatusRegSTB;
269 37 sfielding
reg [7:0] EP0StatusRegSTB_reg1;
270 22 sfielding
reg [7:0] EP1StatusRegSTB;
271 37 sfielding
reg [7:0] EP1StatusRegSTB_reg1;
272 22 sfielding
reg [7:0] EP2StatusRegSTB;
273 37 sfielding
reg [7:0] EP2StatusRegSTB_reg1;
274 22 sfielding
reg [7:0] EP3StatusRegSTB;
275 37 sfielding
reg [7:0] EP3StatusRegSTB_reg1;
276 22 sfielding
reg [1:0] endP0TransTypeRegSTB;
277 37 sfielding
reg [1:0] endP0TransTypeRegSTB_reg1;
278 22 sfielding
reg [1:0] endP0NAKTransTypeRegSTB;
279 37 sfielding
reg [1:0] endP0NAKTransTypeRegSTB_reg1;
280 22 sfielding
reg [1:0] endP1TransTypeRegSTB;
281 37 sfielding
reg [1:0] endP1TransTypeRegSTB_reg1;
282 22 sfielding
reg [1:0] endP1NAKTransTypeRegSTB;
283 37 sfielding
reg [1:0] endP1NAKTransTypeRegSTB_reg1;
284 22 sfielding
reg [1:0] endP2TransTypeRegSTB;
285 37 sfielding
reg [1:0] endP2TransTypeRegSTB_reg1;
286 22 sfielding
reg [1:0] endP2NAKTransTypeRegSTB;
287 37 sfielding
reg [1:0] endP2NAKTransTypeRegSTB_reg1;
288 22 sfielding
reg [1:0] endP3TransTypeRegSTB;
289 37 sfielding
reg [1:0] endP3TransTypeRegSTB_reg1;
290 22 sfielding
reg [1:0] endP3NAKTransTypeRegSTB;
291 37 sfielding
reg [1:0] endP3NAKTransTypeRegSTB_reg1;
292 22 sfielding
reg [10:0] frameNumSTB;
293 37 sfielding
reg [10:0] frameNumSTB_reg1;
294
reg [2:0] vBusDetectInSTB;
295
reg [1:0] connectStateInSTB;
296
reg [1:0] connectStateInSTB_reg1;
297 22 sfielding
 
298
 
299
//sync write demux
300
always @(posedge busClk)
301
begin
302
  if (rstSyncToBusClk == 1'b1) begin
303
    EP0IsoEn <= 1'b0;
304
    EP0SendStall <= 1'b0;
305
    EP0DataSequence <= 1'b0;
306
    EP0Enable <= 1'b0;
307
    EP1IsoEn <= 1'b0;
308
    EP1SendStall <= 1'b0;
309
    EP1DataSequence <= 1'b0;
310
    EP1Enable <= 1'b0;
311
    EP2IsoEn <= 1'b0;
312
    EP2SendStall <= 1'b0;
313
    EP2DataSequence <= 1'b0;
314
    EP2Enable <= 1'b0;
315
    EP3IsoEn <= 1'b0;
316
    EP3SendStall <= 1'b0;
317
    EP3DataSequence <= 1'b0;
318
    EP3Enable <= 1'b0;
319 37 sfielding
    SCControlReg <= 7'h00;
320 22 sfielding
    SCAddrReg <= 7'h00;
321 37 sfielding
    interruptMaskReg <= 6'h00;
322 22 sfielding
  end
323
  else begin
324 37 sfielding
    clrVBusDetReq <= 1'b0;
325 22 sfielding
    clrNAKReq <= 1'b0;
326
    clrSOFReq <= 1'b0;
327
    clrResetReq <= 1'b0;
328
    clrResInReq <= 1'b0;
329
    clrTransDoneReq <= 1'b0;
330
    EP0SetReady <= 1'b0;
331
    EP1SetReady <= 1'b0;
332
    EP2SetReady <= 1'b0;
333
    EP3SetReady <= 1'b0;
334
    if (writeEn == 1'b1 && strobe_i == 1'b1 && slaveControlSelect == 1'b1)
335
    begin
336
      case (address)
337
        `EP0_CTRL_REG : begin
338
          EP0IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
339
          EP0SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
340
          EP0DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
341
          EP0SetReady <= dataIn[`ENDPOINT_READY_BIT];
342
          EP0Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
343
        end
344
        `EP1_CTRL_REG : begin
345
          EP1IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
346
          EP1SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
347
          EP1DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
348
          EP1SetReady <= dataIn[`ENDPOINT_READY_BIT];
349
          EP1Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
350
        end
351
        `EP2_CTRL_REG : begin
352
          EP2IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
353
          EP2SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
354
          EP2DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
355
          EP2SetReady <= dataIn[`ENDPOINT_READY_BIT];
356
          EP2Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
357
        end
358
        `EP3_CTRL_REG : begin
359
          EP3IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
360
          EP3SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
361
          EP3DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
362
          EP3SetReady <= dataIn[`ENDPOINT_READY_BIT];
363
          EP3Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
364
        end
365 37 sfielding
        `SC_CONTROL_REG : SCControlReg <= dataIn[6:0];
366 22 sfielding
        `SC_ADDRESS : SCAddrReg <= dataIn[6:0];
367
        `SC_INTERRUPT_STATUS_REG : begin
368 37 sfielding
          clrVBusDetReq <= dataIn[`VBUS_DET_INT_BIT];
369 22 sfielding
          clrNAKReq <= dataIn[`NAK_SENT_INT_BIT];
370
          clrSOFReq <= dataIn[`SOF_RECEIVED_BIT];
371
          clrResetReq <= dataIn[`RESET_EVENT_BIT];
372
          clrResInReq <= dataIn[`RESUME_INT_BIT];
373
          clrTransDoneReq <= dataIn[`TRANS_DONE_BIT];
374
        end
375 37 sfielding
        `SC_INTERRUPT_MASK_REG  : interruptMaskReg <= dataIn[5:0];
376 22 sfielding
      endcase
377
    end
378
  end
379
end
380
 
381
//interrupt control 
382
always @(posedge busClk)
383
begin
384
  if (rstSyncToBusClk == 1'b1) begin
385 37 sfielding
    vBusDetInt <= 1'b0;
386 22 sfielding
    NAKSentInt <= 1'b0;
387
    SOFRxedInt <= 1'b0;
388
    resetEventInt <= 1'b0;
389
    resumeInt <= 1'b0;
390
    transDoneInt <= 1'b0;
391
  end
392
  else begin
393 37 sfielding
    if (vBusDetectInSTB[0] != vBusDetectInSTB[1])
394
      vBusDetInt <= 1'b1;
395
    else if (clrVBusDetReq == 1'b1)
396
      vBusDetInt <= 1'b0;
397
 
398
    if (NAKSentInSTB[1] == 1'b1 && NAKSentInSTB[0] == 1'b0)
399 22 sfielding
      NAKSentInt <= 1'b1;
400
    else if (clrNAKReq == 1'b1)
401
      NAKSentInt <= 1'b0;
402
 
403 37 sfielding
    if (SOFRxedInSTB[1] == 1'b1 && SOFRxedInSTB[0] == 1'b0)
404 22 sfielding
      SOFRxedInt <= 1'b1;
405
    else if (clrSOFReq == 1'b1)
406
      SOFRxedInt <= 1'b0;
407
 
408 37 sfielding
    if (resetEventInSTB[1] == 1'b1 && resetEventInSTB[0] == 1'b0)
409 22 sfielding
      resetEventInt <= 1'b1;
410
    else if (clrResetReq == 1'b1)
411
      resetEventInt <= 1'b0;
412
 
413 37 sfielding
    if (resumeIntInSTB[1] == 1'b1 && resumeIntInSTB[0] == 1'b0)
414 22 sfielding
      resumeInt <= 1'b1;
415
    else if (clrResInReq == 1'b1)
416 37 sfielding
      resumeInt <= 1'b0;
417 22 sfielding
 
418 37 sfielding
    if (transDoneInSTB[1] == 1'b1 && transDoneInSTB[0] == 1'b0)
419 22 sfielding
      transDoneInt <= 1'b1;
420
    else if (clrTransDoneReq == 1'b1)
421
      transDoneInt <= 1'b0;
422
  end
423
end
424
 
425
//mask interrupts
426 37 sfielding
always @(*) begin
427 22 sfielding
  transDoneIntOut <= transDoneInt & interruptMaskReg[`TRANS_DONE_BIT];
428
  resumeIntOut <= resumeInt & interruptMaskReg[`RESUME_INT_BIT];
429
  resetEventIntOut <= resetEventInt & interruptMaskReg[`RESET_EVENT_BIT];
430
  SOFRxedIntOut <= SOFRxedInt & interruptMaskReg[`SOF_RECEIVED_BIT];
431
  NAKSentIntOut <= NAKSentInt & interruptMaskReg[`NAK_SENT_INT_BIT];
432 37 sfielding
  vBusDetIntOut <= vBusDetInt & interruptMaskReg[`VBUS_DET_INT_BIT];
433 22 sfielding
end
434
 
435
//end point ready, set/clear
436
//Since 'busClk' can be a higher freq than 'usbClk',
437
//'EP0SetReady' etc must be delayed with respect to other control signals, thus
438
//ensuring that control signals have been clocked through to 'usbClk' clock
439
//domain before the ready is asserted.
440
//Not sure this is required because there is at least two 'usbClk' ticks between
441 37 sfielding
//detection of 'EP0Ready' and sampling of related control signals.
442 22 sfielding
always @(posedge busClk)
443
begin
444
  if (rstSyncToBusClk == 1'b1) begin
445
    EP0Ready <= 1'b0;
446
    EP1Ready <= 1'b0;
447
    EP2Ready <= 1'b0;
448
    EP3Ready <= 1'b0;
449
  end
450
  else begin
451
    if (EP0SetReady == 1'b1)
452
      EP0Ready <= 1'b1;
453 37 sfielding
    else if (clrEP0ReadySTB[1] == 1'b1 && clrEP0ReadySTB[0] == 1'b0)
454 22 sfielding
      EP0Ready <= 1'b0;
455
 
456
    if (EP1SetReady == 1'b1)
457
      EP1Ready <= 1'b1;
458 37 sfielding
    else if (clrEP1ReadySTB[1] == 1'b1 && clrEP1ReadySTB[0] == 1'b0)
459 22 sfielding
      EP1Ready <= 1'b0;
460
 
461
    if (EP2SetReady == 1'b1)
462
      EP2Ready <= 1'b1;
463 37 sfielding
    else if (clrEP2ReadySTB[1] == 1'b1 && clrEP2ReadySTB[0] == 1'b0)
464 22 sfielding
      EP2Ready <= 1'b0;
465
 
466
    if (EP3SetReady == 1'b1)
467
      EP3Ready <= 1'b1;
468 37 sfielding
    else if (clrEP3ReadySTB[1] == 1'b1 && clrEP3ReadySTB[0] == 1'b0)
469 22 sfielding
      EP3Ready <= 1'b0;
470
  end
471
end
472
 
473
//break out control signals
474
always @(SCControlReg) begin
475
  SCGlobalEnSTB <= SCControlReg[`SC_GLOBAL_ENABLE_BIT];
476
  TxLineStateSTB <= SCControlReg[`SC_TX_LINE_STATE_MSBIT:`SC_TX_LINE_STATE_LSBIT];
477
  LineDirectControlEnSTB <= SCControlReg[`SC_DIRECT_CONTROL_BIT];
478
  fullSpeedPolSTB <= SCControlReg[`SC_FULL_SPEED_LINE_POLARITY_BIT];
479
  fullSpeedRateSTB <= SCControlReg[`SC_FULL_SPEED_LINE_RATE_BIT];
480 37 sfielding
  connectSlaveToHostSTB <= SCControlReg[`SC_CONNECT_TO_HOST_BIT];
481 22 sfielding
end
482
 
483
//combine endpoint control signals 
484 37 sfielding
always @(*)
485 22 sfielding
begin
486
  endP0ControlRegSTB <= {EP0IsoEn, EP0SendStall, EP0DataSequence, EP0Ready, EP0Enable};
487
  endP1ControlRegSTB <= {EP1IsoEn, EP1SendStall, EP1DataSequence, EP1Ready, EP1Enable};
488
  endP2ControlRegSTB <= {EP2IsoEn, EP2SendStall, EP2DataSequence, EP2Ready, EP2Enable};
489
  endP3ControlRegSTB <= {EP3IsoEn, EP3SendStall, EP3DataSequence, EP3Ready, EP3Enable};
490
end
491
 
492
 
493
// async read mux
494 37 sfielding
always @(*)
495 22 sfielding
begin
496
  case (address)
497
      `EP0_CTRL_REG : dataOut <= endP0ControlRegSTB;
498
      `EP0_STS_REG : dataOut <= EP0StatusRegSTB;
499
      `EP0_TRAN_TYPE_STS_REG : dataOut <= endP0TransTypeRegSTB;
500
      `EP0_NAK_TRAN_TYPE_STS_REG : dataOut <= endP0NAKTransTypeRegSTB;
501
      `EP1_CTRL_REG : dataOut <= endP1ControlRegSTB;
502
      `EP1_STS_REG :  dataOut <= EP1StatusRegSTB;
503
      `EP1_TRAN_TYPE_STS_REG : dataOut <= endP1TransTypeRegSTB;
504
      `EP1_NAK_TRAN_TYPE_STS_REG : dataOut <= endP1NAKTransTypeRegSTB;
505
      `EP2_CTRL_REG : dataOut <= endP2ControlRegSTB;
506
      `EP2_STS_REG :  dataOut <= EP2StatusRegSTB;
507
      `EP2_TRAN_TYPE_STS_REG : dataOut <= endP2TransTypeRegSTB;
508
      `EP2_NAK_TRAN_TYPE_STS_REG : dataOut <= endP2NAKTransTypeRegSTB;
509
      `EP3_CTRL_REG : dataOut <= endP3ControlRegSTB;
510
      `EP3_STS_REG :  dataOut <= EP3StatusRegSTB;
511
      `EP3_TRAN_TYPE_STS_REG : dataOut <= endP3TransTypeRegSTB;
512
      `EP3_NAK_TRAN_TYPE_STS_REG : dataOut <= endP3NAKTransTypeRegSTB;
513
      `SC_CONTROL_REG : dataOut <= SCControlReg;
514 37 sfielding
      `SC_LINE_STATUS_REG : dataOut <= {5'b00000, vBusDetectInSTB[0], connectStateInSTB};
515
      `SC_INTERRUPT_STATUS_REG :  dataOut <= {2'b00, vBusDetInt, NAKSentInt, SOFRxedInt, resetEventInt, resumeInt, transDoneInt};
516
      `SC_INTERRUPT_MASK_REG  : dataOut <= {2'b00, interruptMaskReg};
517 22 sfielding
      `SC_ADDRESS : dataOut <= {1'b0, SCAddrReg};
518
      `SC_FRAME_NUM_MSP : dataOut <= {5'b00000, frameNumSTB[10:8]};
519
      `SC_FRAME_NUM_LSP : dataOut <= frameNumSTB[7:0];
520
      default: dataOut <= 8'h00;
521
  endcase
522
end
523
 
524 37 sfielding
 
525
//Extend SOFRxedIn, resetEventIn, resumeIntIn, transDoneIn, NAKSentIn from 1 tick
526
//pulses to 3 tick pulses
527
always @(posedge usbClk) begin
528
  if (rstSyncToUsbClk == 1'b1) begin
529
    SOFRxedInExtend <= 3'b000;
530
    resetEventInExtend <= 3'b000;
531
    resumeIntInExtend <= 3'b000;
532
    transDoneInExtend <= 3'b000;
533
    NAKSentInExtend <= 3'b000;
534
    clrEP0ReadyExtend <= 3'b000;
535
    clrEP1ReadyExtend <= 3'b000;
536
    clrEP2ReadyExtend <= 3'b000;
537
    clrEP3ReadyExtend <= 3'b000;
538
  end
539
  else begin
540
    if (SOFRxedIn == 1'b1)
541
      SOFRxedInExtend <= 3'b111;
542
    else
543
      SOFRxedInExtend <= {1'b0, SOFRxedInExtend[2:1]};
544
    if (resetEventIn == 1'b1)
545
      resetEventInExtend <= 3'b111;
546
    else
547
      resetEventInExtend <= {1'b0, resetEventInExtend[2:1]};
548
    if (resumeIntIn == 1'b1)
549
      resumeIntInExtend <= 3'b111;
550
    else
551
      resumeIntInExtend <= {1'b0, resumeIntInExtend[2:1]};
552
    if (transDoneIn == 1'b1)
553
      transDoneInExtend <= 3'b111;
554
    else
555
      transDoneInExtend <= {1'b0, transDoneInExtend[2:1]};
556
    if (NAKSentIn == 1'b1)
557
      NAKSentInExtend <= 3'b111;
558
    else
559
      NAKSentInExtend <= {1'b0, NAKSentInExtend[2:1]};
560
    if (clrEP0Ready == 1'b1)
561
      clrEP0ReadyExtend <= 3'b111;
562
    else
563
      clrEP0ReadyExtend <= {1'b0, clrEP0ReadyExtend[2:1]};
564
    if (clrEP1Ready == 1'b1)
565
      clrEP1ReadyExtend <= 3'b111;
566
    else
567
      clrEP1ReadyExtend <= {1'b0, clrEP1ReadyExtend[2:1]};
568
    if (clrEP2Ready == 1'b1)
569
      clrEP2ReadyExtend <= 3'b111;
570
    else
571
      clrEP2ReadyExtend <= {1'b0, clrEP2ReadyExtend[2:1]};
572
    if (clrEP3Ready == 1'b1)
573
      clrEP3ReadyExtend <= 3'b111;
574
    else
575
      clrEP3ReadyExtend <= {1'b0, clrEP3ReadyExtend[2:1]};
576
  end
577
end
578
 
579 22 sfielding
//re-sync from busClk to usbClk. 
580
always @(posedge usbClk) begin
581 37 sfielding
  if (rstSyncToUsbClk == 1'b1) begin
582
    endP0ControlReg <= {5{1'b0}};
583
    endP0ControlReg1 <= {5{1'b0}};
584
    endP1ControlReg <= {5{1'b0}};
585
    endP1ControlReg1 <= {5{1'b0}};
586
    endP2ControlReg <= {5{1'b0}};
587
    endP2ControlReg1 <= {5{1'b0}};
588
    endP3ControlReg <= {5{1'b0}};
589
    endP3ControlReg1 <= {5{1'b0}};
590
    SCGlobalEn <= 1'b0;
591
    SCGlobalEn_reg1 <= 1'b0;
592
    TxLineState <= 2'b00;
593
    TxLineState_reg1 <= 2'b00;
594
    LineDirectControlEn <= 1'b0;
595
    LineDirectControlEn_reg1 <= 1'b0;
596
    fullSpeedPol <= 1'b0;
597
    fullSpeedPol_reg1 <= 1'b0;
598
    fullSpeedRate <= 1'b0;
599
    fullSpeedRate_reg1 <= 1'b0;
600
    connectSlaveToHost <= 1'b0;
601
    connectSlaveToHost_reg1 <= 1'b0;
602
  end
603
  else begin
604
    endP0ControlReg1 <= endP0ControlRegSTB;
605
    endP0ControlReg <= endP0ControlReg1;
606
    endP1ControlReg1 <= endP1ControlRegSTB;
607
    endP1ControlReg <= endP1ControlReg1;
608
    endP2ControlReg1 <= endP2ControlRegSTB;
609
    endP2ControlReg <= endP2ControlReg1;
610
    endP3ControlReg1 <= endP3ControlRegSTB;
611
    endP3ControlReg <= endP3ControlReg1;
612
    SCGlobalEn_reg1 <= SCGlobalEnSTB;
613
    SCGlobalEn <= SCGlobalEn_reg1;
614
    TxLineState_reg1 <= TxLineStateSTB;
615
    TxLineState <= TxLineState_reg1;
616
    LineDirectControlEn_reg1 <= LineDirectControlEnSTB;
617
    LineDirectControlEn <= LineDirectControlEn_reg1;
618
    fullSpeedPol_reg1 <= fullSpeedPolSTB;
619
    fullSpeedPol <= fullSpeedPol_reg1;
620
    fullSpeedRate_reg1 <= fullSpeedRateSTB;
621
    fullSpeedRate <= fullSpeedRate_reg1;
622
    connectSlaveToHost_reg1 <= connectSlaveToHostSTB;
623
    connectSlaveToHost <= connectSlaveToHost_reg1;
624
  end
625 22 sfielding
end
626
 
627 37 sfielding
//re-sync from usbClk and async inputs to busClk. Since 'NAKSentIn', 'SOFRxedIn' etc 
628
//are only asserted for 3 usbClk ticks
629
//busClk freq must be greater than usbClk/3 (plus some allowance for setup and hold) freq
630 22 sfielding
always @(posedge busClk) begin
631 37 sfielding
  if (rstSyncToBusClk == 1'b1) begin
632
    vBusDetectInSTB <= 3'b000;
633
    NAKSentInSTB <= 3'b000;
634
    SOFRxedInSTB <= 3'b000;
635
    resetEventInSTB <= 3'b000;
636
    resumeIntInSTB <= 3'b000;
637
    transDoneInSTB <= 3'b000;
638
    clrEP0ReadySTB <= 3'b000;
639
    clrEP1ReadySTB <= 3'b000;
640
    clrEP2ReadySTB <= 3'b000;
641
    clrEP3ReadySTB <= 3'b000;
642
    EP0StatusRegSTB <= 8'h00;
643
    EP0StatusRegSTB_reg1 <= 8'h00;
644
    EP1StatusRegSTB <= 8'h00;
645
    EP1StatusRegSTB_reg1 <= 8'h00;
646
    EP2StatusRegSTB <= 8'h00;
647
    EP2StatusRegSTB_reg1 <= 8'h00;
648
    EP3StatusRegSTB <= 8'h00;
649
    EP3StatusRegSTB_reg1 <= 8'h00;
650
    endP0TransTypeRegSTB <= 2'b00;
651
    endP0TransTypeRegSTB_reg1 <= 2'b00;
652
    endP1TransTypeRegSTB <= 2'b00;
653
    endP1TransTypeRegSTB_reg1 <= 2'b00;
654
    endP2TransTypeRegSTB <= 2'b00;
655
    endP2TransTypeRegSTB_reg1 <= 2'b00;
656
    endP3TransTypeRegSTB <= 2'b00;
657
    endP3TransTypeRegSTB_reg1 <= 2'b00;
658
    endP0NAKTransTypeRegSTB <= 2'b00;
659
    endP0NAKTransTypeRegSTB_reg1 <= 2'b00;
660
    endP1NAKTransTypeRegSTB <= 2'b00;
661
    endP1NAKTransTypeRegSTB_reg1 <= 2'b00;
662
    endP2NAKTransTypeRegSTB <= 2'b00;
663
    endP2NAKTransTypeRegSTB_reg1 <= 2'b00;
664
    endP3NAKTransTypeRegSTB <= 2'b00;
665
    endP3NAKTransTypeRegSTB_reg1 <= 2'b00;
666
    frameNumSTB <= {11{1'b0}};
667
    frameNumSTB_reg1 <= {11{1'b0}};
668
    connectStateInSTB <= 2'b00;
669
    connectStateInSTB_reg1 <= 2'b00;
670
  end
671
  else begin
672
    vBusDetectInSTB <= {vBusDetectIn, vBusDetectInSTB[2:1]};
673
    NAKSentInSTB <= {NAKSentInExtend[0], NAKSentInSTB[2:1]};
674
    SOFRxedInSTB <= {SOFRxedInExtend[0], SOFRxedInSTB[2:1]};
675
    resetEventInSTB <= {resetEventInExtend[0], resetEventInSTB[2:1]};
676
    resumeIntInSTB <= {resumeIntInExtend[0], resumeIntInSTB[2:1]};
677
    transDoneInSTB <= {transDoneInExtend[0], transDoneInSTB[2:1]};
678
    clrEP0ReadySTB <= {clrEP0ReadyExtend[0], clrEP0ReadySTB[2:1]};
679
    clrEP1ReadySTB <= {clrEP1ReadyExtend[0], clrEP1ReadySTB[2:1]};
680
    clrEP2ReadySTB <= {clrEP2ReadyExtend[0], clrEP2ReadySTB[2:1]};
681
    clrEP3ReadySTB <= {clrEP3ReadyExtend[0], clrEP3ReadySTB[2:1]};
682
    EP0StatusRegSTB_reg1 <= EP0StatusReg;
683
    EP0StatusRegSTB <= EP0StatusRegSTB_reg1;
684
    EP1StatusRegSTB_reg1 <= EP1StatusReg;
685
    EP1StatusRegSTB <= EP1StatusRegSTB_reg1;
686
    EP2StatusRegSTB_reg1 <= EP2StatusReg;
687
    EP2StatusRegSTB <= EP2StatusRegSTB_reg1;
688
    EP3StatusRegSTB_reg1 <= EP3StatusReg;
689
    EP3StatusRegSTB <= EP3StatusRegSTB_reg1;
690
    endP0TransTypeRegSTB_reg1 <= endP0TransTypeReg;
691
    endP0TransTypeRegSTB <= endP0TransTypeRegSTB_reg1;
692
    endP1TransTypeRegSTB_reg1 <= endP1TransTypeReg;
693
    endP1TransTypeRegSTB <= endP1TransTypeRegSTB_reg1;
694
    endP2TransTypeRegSTB_reg1 <= endP2TransTypeReg;
695
    endP2TransTypeRegSTB <= endP2TransTypeRegSTB_reg1;
696
    endP3TransTypeRegSTB_reg1 <= endP3TransTypeReg;
697
    endP3TransTypeRegSTB <= endP3TransTypeRegSTB_reg1;
698
    endP0NAKTransTypeRegSTB_reg1 <= endP0NAKTransTypeReg;
699
    endP0NAKTransTypeRegSTB <= endP0NAKTransTypeRegSTB_reg1;
700
    endP1NAKTransTypeRegSTB_reg1 <= endP1NAKTransTypeReg;
701
    endP1NAKTransTypeRegSTB <= endP1NAKTransTypeRegSTB_reg1;
702
    endP2NAKTransTypeRegSTB_reg1 <= endP2NAKTransTypeReg;
703
    endP2NAKTransTypeRegSTB <= endP2NAKTransTypeRegSTB_reg1;
704
    endP3NAKTransTypeRegSTB_reg1 <= endP3NAKTransTypeReg;
705
    endP3NAKTransTypeRegSTB <= endP3NAKTransTypeRegSTB_reg1;
706
    frameNumSTB_reg1 <= frameNum;
707
    frameNumSTB <= frameNumSTB_reg1;
708
    connectStateInSTB_reg1 <= connectStateIn;
709
    connectStateInSTB <= connectStateInSTB_reg1;
710
  end
711 22 sfielding
end
712
 
713 37 sfielding
 
714 22 sfielding
endmodule

powered by: WebSVN 2.1.0

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