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

Subversion Repositories usbhostslave

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

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

powered by: WebSVN 2.1.0

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