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

Subversion Repositories usbhostslave

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

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

powered by: WebSVN 2.1.0

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