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

Subversion Repositories usbhostslave

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

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

Line No. Rev Author Line
1 2 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 14 sfielding
////       
10 2 sfielding
////                                                              ////
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 9 sfielding
`timescale 1ns / 1ps
45 2 sfielding
 
46 9 sfielding
 
47 2 sfielding
`include "usbSlaveControl_h.v"
48
 
49
module USBSlaveControlBI (address, dataIn, dataOut, writeEn,
50
  strobe_i,
51
  clk, rst,
52 5 sfielding
  SOFRxedIntOut, resetEventIntOut, resumeIntOut, transDoneIntOut, NAKSentIntOut,
53 2 sfielding
  endP0TransTypeReg, endP0NAKTransTypeReg,
54
  endP1TransTypeReg, endP1NAKTransTypeReg,
55
  endP2TransTypeReg, endP2NAKTransTypeReg,
56
  endP3TransTypeReg, endP3NAKTransTypeReg,
57
  endP0ControlReg,
58
  endP1ControlReg,
59
  endP2ControlReg,
60
  endP3ControlReg,
61
  EP0StatusReg,
62
  EP1StatusReg,
63
  EP2StatusReg,
64
  EP3StatusReg,
65
  SCAddrReg, frameNum,
66 5 sfielding
  connectStateIn,
67
  SOFRxedIn, resetEventIn, resumeIntIn, transDoneIn, NAKSentIn,
68 2 sfielding
  slaveControlSelect,
69
  clrEP0Ready, clrEP1Ready, clrEP2Ready, clrEP3Ready,
70
  TxLineState,
71
  LineDirectControlEn,
72
  fullSpeedPol,
73
  fullSpeedRate,
74
  SCGlobalEn
75
  );
76
input [4:0] address;
77
input [7:0] dataIn;
78
input writeEn;
79
input strobe_i;
80
input clk;
81
input rst;
82
output [7:0] dataOut;
83
output SOFRxedIntOut;
84
output resetEventIntOut;
85
output resumeIntOut;
86
output transDoneIntOut;
87
output NAKSentIntOut;
88
 
89
input [1:0] endP0TransTypeReg;
90
input [1:0] endP0NAKTransTypeReg;
91
input [1:0] endP1TransTypeReg;
92
input [1:0] endP1NAKTransTypeReg;
93
input [1:0] endP2TransTypeReg;
94
input [1:0] endP2NAKTransTypeReg;
95
input [1:0] endP3TransTypeReg;
96
input [1:0] endP3NAKTransTypeReg;
97 14 sfielding
output [4:0] endP0ControlReg;
98
output [4:0] endP1ControlReg;
99
output [4:0] endP2ControlReg;
100
output [4:0] endP3ControlReg;
101 2 sfielding
input [7:0] EP0StatusReg;
102
input [7:0] EP1StatusReg;
103
input [7:0] EP2StatusReg;
104
input [7:0] EP3StatusReg;
105
output [6:0] SCAddrReg;
106
input [10:0] frameNum;
107
input [1:0] connectStateIn;
108
input SOFRxedIn;
109
input resetEventIn;
110
input resumeIntIn;
111
input transDoneIn;
112
input NAKSentIn;
113
input slaveControlSelect;
114
input clrEP0Ready;
115
input clrEP1Ready;
116
input clrEP2Ready;
117
input clrEP3Ready;
118
output [1:0] TxLineState;
119
output LineDirectControlEn;
120
output fullSpeedPol;
121
output fullSpeedRate;
122
output SCGlobalEn;
123
 
124
wire [4:0] address;
125
wire [7:0] dataIn;
126
wire writeEn;
127
wire strobe_i;
128
wire clk;
129
wire rst;
130
reg [7:0] dataOut;
131
 
132
reg SOFRxedIntOut;
133
reg resetEventIntOut;
134
reg resumeIntOut;
135
reg transDoneIntOut;
136
reg NAKSentIntOut;
137
 
138
wire [1:0] endP0TransTypeReg;
139
wire [1:0] endP0NAKTransTypeReg;
140
wire [1:0] endP1TransTypeReg;
141
wire [1:0] endP1NAKTransTypeReg;
142
wire [1:0] endP2TransTypeReg;
143
wire [1:0] endP2NAKTransTypeReg;
144
wire [1:0] endP3TransTypeReg;
145
wire [1:0] endP3NAKTransTypeReg;
146 14 sfielding
reg [4:0] endP0ControlReg;
147
reg [4:0] endP1ControlReg;
148
reg [4:0] endP2ControlReg;
149
reg [4:0] endP3ControlReg;
150 2 sfielding
wire [7:0] EP0StatusReg;
151
wire [7:0] EP1StatusReg;
152
wire [7:0] EP2StatusReg;
153
wire [7:0] EP3StatusReg;
154
reg [6:0] SCAddrReg;
155
reg [3:0] TxEndPReg;
156
wire [10:0] frameNum;
157
wire [1:0] connectStateIn;
158
 
159
wire SOFRxedIn;
160
wire resetEventIn;
161
wire resumeIntIn;
162
wire transDoneIn;
163
wire NAKSentIn;
164
wire slaveControlSelect;
165
wire clrEP0Ready;
166
wire clrEP1Ready;
167
wire clrEP2Ready;
168
wire clrEP3Ready;
169
reg [1:0] TxLineState;
170
reg LineDirectControlEn;
171
reg fullSpeedPol;
172
reg fullSpeedRate;
173
reg SCGlobalEn;
174
 
175
//internal wire and regs
176
reg [5:0] SCControlReg;
177
reg clrNAKReq;
178
reg clrSOFReq;
179
reg clrResetReq;
180
reg clrResInReq;
181
reg clrTransDoneReq;
182
reg SOFRxedInt;
183
reg resetEventInt;
184
reg resumeInt;
185
reg transDoneInt;
186
reg NAKSentInt;
187
reg [4:0] interruptMaskReg;
188
reg EP0SetReady;
189
reg EP1SetReady;
190
reg EP2SetReady;
191
reg EP3SetReady;
192
reg EP0SendStall;
193
reg EP1SendStall;
194
reg EP2SendStall;
195
reg EP3SendStall;
196 14 sfielding
reg EP0IsoEn;
197
reg EP1IsoEn;
198
reg EP2IsoEn;
199
reg EP3IsoEn;
200 2 sfielding
reg EP0DataSequence;
201
reg EP1DataSequence;
202
reg EP2DataSequence;
203
reg EP3DataSequence;
204
reg EP0Enable;
205
reg EP1Enable;
206
reg EP2Enable;
207
reg EP3Enable;
208
reg EP0Ready;
209
reg EP1Ready;
210
reg EP2Ready;
211
reg EP3Ready;
212
 
213
 
214
//sync write demux
215
always @(posedge clk)
216 14 sfielding
begin
217
  if (rst == 1'b1) begin
218
    EP0IsoEn <= 1'b0;
219
    EP0SendStall <= 1'b0;
220
    EP0DataSequence <= 1'b0;
221
    EP0Enable <= 1'b0;
222
    EP1IsoEn <= 1'b0;
223
    EP1SendStall <= 1'b0;
224
    EP1DataSequence <= 1'b0;
225
    EP1Enable <= 1'b0;
226
    EP2IsoEn <= 1'b0;
227
    EP2SendStall <= 1'b0;
228
    EP2DataSequence <= 1'b0;
229
    EP2Enable <= 1'b0;
230
    EP3IsoEn <= 1'b0;
231
    EP3SendStall <= 1'b0;
232
    EP3DataSequence <= 1'b0;
233
    EP3Enable <= 1'b0;
234
    SCControlReg <= 6'h00;
235
    SCAddrReg <= 7'h00;
236
    interruptMaskReg <= 5'h00;
237 5 sfielding
  end
238 14 sfielding
  else begin
239
    clrNAKReq <= 1'b0;
240
    clrSOFReq <= 1'b0;
241
    clrResetReq <= 1'b0;
242
    clrResInReq <= 1'b0;
243
    clrTransDoneReq <= 1'b0;
244
    EP0SetReady <= 1'b0;
245
    EP1SetReady <= 1'b0;
246
    EP2SetReady <= 1'b0;
247
    EP3SetReady <= 1'b0;
248
    if (writeEn == 1'b1 && strobe_i == 1'b1 && slaveControlSelect == 1'b1)
249
    begin
250
      case (address)
251
        `EP0_CTRL_REG : begin
252
          EP0IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
253
          EP0SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
254
          EP0DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
255
          EP0SetReady <= dataIn[`ENDPOINT_READY_BIT];
256
          EP0Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
257
        end
258
        `EP1_CTRL_REG : begin
259
          EP1IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
260
          EP1SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
261
          EP1DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
262
          EP1SetReady <= dataIn[`ENDPOINT_READY_BIT];
263
          EP1Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
264
        end
265
        `EP2_CTRL_REG : begin
266
          EP2IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
267
          EP2SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
268
          EP2DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
269
          EP2SetReady <= dataIn[`ENDPOINT_READY_BIT];
270
          EP2Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
271
        end
272
        `EP3_CTRL_REG : begin
273
          EP3IsoEn <= dataIn[`ENDPOINT_ISO_ENABLE_BIT];
274
          EP3SendStall <= dataIn[`ENDPOINT_SEND_STALL_BIT];
275
          EP3DataSequence <= dataIn[`ENDPOINT_OUTDATA_SEQUENCE_BIT];
276
          EP3SetReady <= dataIn[`ENDPOINT_READY_BIT];
277
          EP3Enable <= dataIn[`ENDPOINT_ENABLE_BIT];
278
        end
279
        `SC_CONTROL_REG : SCControlReg <= dataIn[5:0];
280
        `SC_ADDRESS : SCAddrReg <= dataIn[6:0];
281
        `SC_INTERRUPT_STATUS_REG : begin
282
          clrNAKReq <= dataIn[`NAK_SENT_INT_BIT];
283
          clrSOFReq <= dataIn[`SOF_RECEIVED_BIT];
284
          clrResetReq <= dataIn[`RESET_EVENT_BIT];
285
          clrResInReq <= dataIn[`RESUME_INT_BIT];
286
          clrTransDoneReq <= dataIn[`TRANS_DONE_BIT];
287
        end
288
        `SC_INTERRUPT_MASK_REG  : interruptMaskReg <= dataIn[4:0];
289
      endcase
290
    end
291
  end
292 2 sfielding
end
293
 
294
//interrupt control 
295
always @(posedge clk)
296
begin
297 14 sfielding
  if (rst == 1'b1) begin
298
    NAKSentInt <= 1'b0;
299 5 sfielding
    SOFRxedInt <= 1'b0;
300
    resetEventInt <= 1'b0;
301 14 sfielding
    resumeInt <= 1'b0;
302
    transDoneInt <= 1'b0;
303
  end
304
  else begin
305
    if (NAKSentIn == 1'b1)
306
      NAKSentInt <= 1'b1;
307
    else if (clrNAKReq == 1'b1)
308
      NAKSentInt <= 1'b0;
309 5 sfielding
 
310 14 sfielding
    if (SOFRxedIn == 1'b1)
311
      SOFRxedInt <= 1'b1;
312
    else if (clrSOFReq == 1'b1)
313
      SOFRxedInt <= 1'b0;
314
 
315
    if (resetEventIn == 1'b1)
316
      resetEventInt <= 1'b1;
317
    else if (clrResetReq == 1'b1)
318
      resetEventInt <= 1'b0;
319
 
320
    if (resumeIntIn == 1'b1)
321
      resumeInt <= 1'b1;
322
    else if (clrResInReq == 1'b1)
323
      resumeInt <= 1'b0;
324 2 sfielding
 
325 14 sfielding
    if (transDoneIn == 1'b1)
326
      transDoneInt <= 1'b1;
327
    else if (clrTransDoneReq == 1'b1)
328
      transDoneInt <= 1'b0;
329
  end
330 2 sfielding
end
331
 
332
//mask interrupts
333
always @(interruptMaskReg or transDoneInt or resumeInt or resetEventInt or SOFRxedInt or NAKSentInt) begin
334
  transDoneIntOut <= transDoneInt & interruptMaskReg[`TRANS_DONE_BIT];
335
  resumeIntOut <= resumeInt & interruptMaskReg[`RESUME_INT_BIT];
336
  resetEventIntOut <= resetEventInt & interruptMaskReg[`RESET_EVENT_BIT];
337
  SOFRxedIntOut <= SOFRxedInt & interruptMaskReg[`SOF_RECEIVED_BIT];
338
  NAKSentIntOut <= NAKSentInt & interruptMaskReg[`NAK_SENT_INT_BIT];
339
end
340
 
341
//end point ready, set/clear
342
always @(posedge clk)
343
begin
344 14 sfielding
  if (rst == 1'b1) begin
345 5 sfielding
    EP0Ready <= 1'b0;
346
    EP1Ready <= 1'b0;
347
    EP2Ready <= 1'b0;
348 14 sfielding
    EP3Ready <= 1'b0;
349
  end
350
  else begin
351
    if (EP0SetReady == 1'b1)
352
      EP0Ready <= 1'b1;
353
    else if (clrEP0Ready == 1'b1)
354
      EP0Ready <= 1'b0;
355 2 sfielding
 
356 14 sfielding
    if (EP1SetReady == 1'b1)
357
      EP1Ready <= 1'b1;
358
    else if (clrEP1Ready == 1'b1)
359
      EP1Ready <= 1'b0;
360
 
361
    if (EP2SetReady == 1'b1)
362
      EP2Ready <= 1'b1;
363
    else if (clrEP2Ready == 1'b1)
364
      EP2Ready <= 1'b0;
365
 
366
    if (EP3SetReady == 1'b1)
367
      EP3Ready <= 1'b1;
368
    else if (clrEP3Ready == 1'b1)
369
      EP3Ready <= 1'b0;
370
  end
371 2 sfielding
end
372
 
373
//break out control signals
374
always @(SCControlReg) begin
375
  SCGlobalEn <= SCControlReg[`SC_GLOBAL_ENABLE_BIT];
376
  TxLineState <= SCControlReg[`SC_TX_LINE_STATE_MSBIT:`SC_TX_LINE_STATE_LSBIT];
377
  LineDirectControlEn <= SCControlReg[`SC_DIRECT_CONTROL_BIT];
378
  fullSpeedPol <= SCControlReg[`SC_FULL_SPEED_LINE_POLARITY_BIT];
379
  fullSpeedRate <= SCControlReg[`SC_FULL_SPEED_LINE_RATE_BIT];
380
end
381
 
382
//combine endpoint control signals 
383 14 sfielding
always @(EP0IsoEn or EP0SendStall or EP0Ready or EP0DataSequence or EP0Enable or
384
  EP1IsoEn or EP1SendStall or EP1Ready or EP1DataSequence or EP1Enable or
385
  EP2IsoEn or EP2SendStall or EP2Ready or EP2DataSequence or EP2Enable or
386
  EP3IsoEn or EP3SendStall or EP3Ready or EP3DataSequence or EP3Enable)
387 2 sfielding
begin
388 14 sfielding
  endP0ControlReg <= {EP0IsoEn, EP0SendStall, EP0DataSequence, EP0Ready, EP0Enable};
389
  endP1ControlReg <= {EP1IsoEn, EP1SendStall, EP1DataSequence, EP1Ready, EP1Enable};
390
  endP2ControlReg <= {EP2IsoEn, EP2SendStall, EP2DataSequence, EP2Ready, EP2Enable};
391
  endP3ControlReg <= {EP3IsoEn, EP3SendStall, EP3DataSequence, EP3Ready, EP3Enable};
392 2 sfielding
end
393
 
394
 
395
      // async read mux
396
always @(address or
397
  EP0SendStall or EP0Ready or EP0DataSequence or EP0Enable or
398
  EP1SendStall or EP1Ready or EP1DataSequence or EP1Enable or
399
  EP2SendStall or EP2Ready or EP2DataSequence or EP2Enable or
400
  EP3SendStall or EP3Ready or EP3DataSequence or EP3Enable or
401
  EP0StatusReg or EP1StatusReg or EP2StatusReg or EP3StatusReg or
402
  endP0ControlReg or endP1ControlReg or endP2ControlReg or endP3ControlReg or
403
  endP0NAKTransTypeReg or endP1NAKTransTypeReg or endP2NAKTransTypeReg or endP3NAKTransTypeReg or
404
  endP0TransTypeReg or endP1TransTypeReg or endP2TransTypeReg or endP3TransTypeReg or
405
  SCControlReg or connectStateIn or
406
  NAKSentInt or SOFRxedInt or resetEventInt or resumeInt or transDoneInt or
407
  interruptMaskReg or SCAddrReg or frameNum)
408
begin
409 5 sfielding
  case (address)
410 2 sfielding
      `EP0_CTRL_REG : dataOut <= endP0ControlReg;
411
      `EP0_STS_REG : dataOut <= EP0StatusReg;
412
      `EP0_TRAN_TYPE_STS_REG : dataOut <= endP0TransTypeReg;
413
      `EP0_NAK_TRAN_TYPE_STS_REG : dataOut <= endP0NAKTransTypeReg;
414
      `EP1_CTRL_REG : dataOut <= endP1ControlReg;
415
      `EP1_STS_REG :  dataOut <= EP1StatusReg;
416
      `EP1_TRAN_TYPE_STS_REG : dataOut <= endP1TransTypeReg;
417
      `EP1_NAK_TRAN_TYPE_STS_REG : dataOut <= endP1NAKTransTypeReg;
418
      `EP2_CTRL_REG : dataOut <= endP2ControlReg;
419
      `EP2_STS_REG :  dataOut <= EP2StatusReg;
420
      `EP2_TRAN_TYPE_STS_REG : dataOut <= endP2TransTypeReg;
421
      `EP2_NAK_TRAN_TYPE_STS_REG : dataOut <= endP2NAKTransTypeReg;
422
      `EP3_CTRL_REG : dataOut <= endP3ControlReg;
423
      `EP3_STS_REG :  dataOut <= EP3StatusReg;
424
      `EP3_TRAN_TYPE_STS_REG : dataOut <= endP3TransTypeReg;
425
      `EP3_NAK_TRAN_TYPE_STS_REG : dataOut <= endP3NAKTransTypeReg;
426 5 sfielding
      `SC_CONTROL_REG : dataOut <= SCControlReg;
427
      `SC_LINE_STATUS_REG : dataOut <= {6'b000000, connectStateIn};
428
      `SC_INTERRUPT_STATUS_REG :  dataOut <= {3'b000, NAKSentInt, SOFRxedInt, resetEventInt, resumeInt, transDoneInt};
429
      `SC_INTERRUPT_MASK_REG  : dataOut <= {3'b000, interruptMaskReg};
430
      `SC_ADDRESS : dataOut <= {1'b0, SCAddrReg};
431 12 sfielding
      `SC_FRAME_NUM_MSP : dataOut <= {5'b00000, frameNum[10:8]};
432
      `SC_FRAME_NUM_LSP : dataOut <= frameNum[7:0];
433 2 sfielding
      default: dataOut <= 8'h00;
434 5 sfielding
  endcase
435 2 sfielding
end
436
 
437
 
438
endmodule

powered by: WebSVN 2.1.0

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