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

Subversion Repositories usbhostslave

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

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 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
output [3:0] endP0ControlReg;
98
output [3:0] endP1ControlReg;
99
output [3:0] endP2ControlReg;
100
output [3:0] endP3ControlReg;
101
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
reg [3:0] endP0ControlReg;
147
reg [3:0] endP1ControlReg;
148
reg [3:0] endP2ControlReg;
149
reg [3:0] endP3ControlReg;
150
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
reg EP0DataSequence;
197
reg EP1DataSequence;
198
reg EP2DataSequence;
199
reg EP3DataSequence;
200
reg EP0Enable;
201
reg EP1Enable;
202
reg EP2Enable;
203
reg EP3Enable;
204
reg EP0Ready;
205
reg EP1Ready;
206
reg EP2Ready;
207
reg EP3Ready;
208
 
209
 
210
//sync write demux
211
always @(posedge clk)
212
begin
213 5 sfielding
  clrNAKReq <= 1'b0;
214 2 sfielding
  clrSOFReq <= 1'b0;
215
  clrResetReq <= 1'b0;
216
  clrResInReq <= 1'b0;
217
  clrTransDoneReq <= 1'b0;
218
  EP0SetReady <= 1'b0;
219
  EP1SetReady <= 1'b0;
220
  EP2SetReady <= 1'b0;
221
  EP3SetReady <= 1'b0;
222 5 sfielding
  if (writeEn == 1'b1 && strobe_i == 1'b1 && slaveControlSelect == 1'b1)
223
  begin
224
    case (address)
225 2 sfielding
      `EP0_CTRL_REG : begin
226
        EP0SendStall <= dataIn[3];
227
        EP0DataSequence <= dataIn[2];
228
        EP0SetReady <= dataIn[1];
229
        EP0Enable <= dataIn[0];
230
      end
231
      `EP1_CTRL_REG : begin
232
        EP1SendStall <= dataIn[3];
233
        EP1DataSequence <= dataIn[2];
234
        EP1SetReady <= dataIn[1];
235
        EP1Enable <= dataIn[0];
236
      end
237
      `EP2_CTRL_REG : begin
238
        EP2SendStall <= dataIn[3];
239
        EP2DataSequence <= dataIn[2];
240
        EP2SetReady <= dataIn[1];
241
        EP2Enable <= dataIn[0];
242
      end
243
      `EP3_CTRL_REG : begin
244
        EP3SendStall <= dataIn[3];
245
        EP3DataSequence <= dataIn[2];
246
        EP3SetReady <= dataIn[1];
247
        EP3Enable <= dataIn[0];
248
      end
249 5 sfielding
      `SC_CONTROL_REG : SCControlReg <= dataIn[5:0];
250
      `SC_ADDRESS : SCAddrReg <= dataIn[6:0];
251
      `SC_INTERRUPT_STATUS_REG : begin
252 2 sfielding
        clrNAKReq <= dataIn[4];
253
        clrSOFReq <= dataIn[3];
254
        clrResetReq <= dataIn[2];
255
        clrResInReq <= dataIn[1];
256
        clrTransDoneReq <= dataIn[0];
257
      end
258 5 sfielding
      `SC_INTERRUPT_MASK_REG  : interruptMaskReg <= dataIn[4:0];
259
    endcase
260
  end
261 2 sfielding
end
262
 
263
//interrupt control 
264
always @(posedge clk)
265
begin
266 5 sfielding
  if (NAKSentIn == 1'b1)
267
    NAKSentInt <= 1'b1;
268
  else if (clrNAKReq == 1'b1)
269
    NAKSentInt <= 1'b0;
270 2 sfielding
 
271 5 sfielding
  if (SOFRxedIn == 1'b1)
272
    SOFRxedInt <= 1'b1;
273
  else if (clrSOFReq == 1'b1)
274
    SOFRxedInt <= 1'b0;
275
 
276
  if (resetEventIn == 1'b1)
277
    resetEventInt <= 1'b1;
278
  else if (clrResetReq == 1'b1)
279
    resetEventInt <= 1'b0;
280
 
281
  if (resumeIntIn == 1'b1)
282
    resumeInt <= 1'b1;
283
  else if (clrResInReq == 1'b1)
284
    resumeInt <= 1'b0;
285 2 sfielding
 
286 5 sfielding
  if (transDoneIn == 1'b1)
287
    transDoneInt <= 1'b1;
288
  else if (clrTransDoneReq == 1'b1)
289
    transDoneInt <= 1'b0;
290 2 sfielding
end
291
 
292
//mask interrupts
293
always @(interruptMaskReg or transDoneInt or resumeInt or resetEventInt or SOFRxedInt or NAKSentInt) begin
294
  transDoneIntOut <= transDoneInt & interruptMaskReg[`TRANS_DONE_BIT];
295
  resumeIntOut <= resumeInt & interruptMaskReg[`RESUME_INT_BIT];
296
  resetEventIntOut <= resetEventInt & interruptMaskReg[`RESET_EVENT_BIT];
297
  SOFRxedIntOut <= SOFRxedInt & interruptMaskReg[`SOF_RECEIVED_BIT];
298
  NAKSentIntOut <= NAKSentInt & interruptMaskReg[`NAK_SENT_INT_BIT];
299
end
300
 
301
//end point ready, set/clear
302
always @(posedge clk)
303
begin
304 5 sfielding
  if (EP0SetReady == 1'b1)
305
    EP0Ready <= 1'b1;
306
  else if (clrEP0Ready == 1'b1)
307
    EP0Ready <= 1'b0;
308 2 sfielding
 
309 5 sfielding
  if (EP1SetReady == 1'b1)
310
    EP1Ready <= 1'b1;
311
  else if (clrEP1Ready == 1'b1)
312
    EP1Ready <= 1'b0;
313 2 sfielding
 
314 5 sfielding
  if (EP2SetReady == 1'b1)
315
    EP2Ready <= 1'b1;
316
  else if (clrEP2Ready == 1'b1)
317
    EP2Ready <= 1'b0;
318 2 sfielding
 
319 5 sfielding
  if (EP3SetReady == 1'b1)
320
    EP3Ready <= 1'b1;
321
  else if (clrEP3Ready == 1'b1)
322
    EP3Ready <= 1'b0;
323 2 sfielding
end
324
 
325
//break out control signals
326
always @(SCControlReg) begin
327
  SCGlobalEn <= SCControlReg[`SC_GLOBAL_ENABLE_BIT];
328
  TxLineState <= SCControlReg[`SC_TX_LINE_STATE_MSBIT:`SC_TX_LINE_STATE_LSBIT];
329
  LineDirectControlEn <= SCControlReg[`SC_DIRECT_CONTROL_BIT];
330
  fullSpeedPol <= SCControlReg[`SC_FULL_SPEED_LINE_POLARITY_BIT];
331
  fullSpeedRate <= SCControlReg[`SC_FULL_SPEED_LINE_RATE_BIT];
332
end
333
 
334
//combine endpoint control signals 
335
always @(EP0SendStall or EP0Ready or EP0DataSequence or EP0Enable or
336
  EP1SendStall or EP1Ready or EP1DataSequence or EP1Enable or
337
  EP2SendStall or EP2Ready or EP2DataSequence or EP2Enable or
338
  EP3SendStall or EP3Ready or EP3DataSequence or EP3Enable)
339
begin
340
  endP0ControlReg <= {EP0SendStall, EP0DataSequence, EP0Ready, EP0Enable};
341
  endP1ControlReg <= {EP1SendStall, EP1DataSequence, EP1Ready, EP1Enable};
342
  endP2ControlReg <= {EP2SendStall, EP2DataSequence, EP2Ready, EP2Enable};
343
  endP3ControlReg <= {EP3SendStall, EP3DataSequence, EP3Ready, EP3Enable};
344
end
345
 
346
 
347
      // async read mux
348
always @(address or
349
  EP0SendStall or EP0Ready or EP0DataSequence or EP0Enable or
350
  EP1SendStall or EP1Ready or EP1DataSequence or EP1Enable or
351
  EP2SendStall or EP2Ready or EP2DataSequence or EP2Enable or
352
  EP3SendStall or EP3Ready or EP3DataSequence or EP3Enable or
353
  EP0StatusReg or EP1StatusReg or EP2StatusReg or EP3StatusReg or
354
  endP0ControlReg or endP1ControlReg or endP2ControlReg or endP3ControlReg or
355
  endP0NAKTransTypeReg or endP1NAKTransTypeReg or endP2NAKTransTypeReg or endP3NAKTransTypeReg or
356
  endP0TransTypeReg or endP1TransTypeReg or endP2TransTypeReg or endP3TransTypeReg or
357
  SCControlReg or connectStateIn or
358
  NAKSentInt or SOFRxedInt or resetEventInt or resumeInt or transDoneInt or
359
  interruptMaskReg or SCAddrReg or frameNum)
360
begin
361 5 sfielding
  case (address)
362 2 sfielding
      `EP0_CTRL_REG : dataOut <= endP0ControlReg;
363
      `EP0_STS_REG : dataOut <= EP0StatusReg;
364
      `EP0_TRAN_TYPE_STS_REG : dataOut <= endP0TransTypeReg;
365
      `EP0_NAK_TRAN_TYPE_STS_REG : dataOut <= endP0NAKTransTypeReg;
366
      `EP1_CTRL_REG : dataOut <= endP1ControlReg;
367
      `EP1_STS_REG :  dataOut <= EP1StatusReg;
368
      `EP1_TRAN_TYPE_STS_REG : dataOut <= endP1TransTypeReg;
369
      `EP1_NAK_TRAN_TYPE_STS_REG : dataOut <= endP1NAKTransTypeReg;
370
      `EP2_CTRL_REG : dataOut <= endP2ControlReg;
371
      `EP2_STS_REG :  dataOut <= EP2StatusReg;
372
      `EP2_TRAN_TYPE_STS_REG : dataOut <= endP2TransTypeReg;
373
      `EP2_NAK_TRAN_TYPE_STS_REG : dataOut <= endP2NAKTransTypeReg;
374
      `EP3_CTRL_REG : dataOut <= endP3ControlReg;
375
      `EP3_STS_REG :  dataOut <= EP3StatusReg;
376
      `EP3_TRAN_TYPE_STS_REG : dataOut <= endP3TransTypeReg;
377
      `EP3_NAK_TRAN_TYPE_STS_REG : dataOut <= endP3NAKTransTypeReg;
378 5 sfielding
      `SC_CONTROL_REG : dataOut <= SCControlReg;
379
      `SC_LINE_STATUS_REG : dataOut <= {6'b000000, connectStateIn};
380
      `SC_INTERRUPT_STATUS_REG :  dataOut <= {3'b000, NAKSentInt, SOFRxedInt, resetEventInt, resumeInt, transDoneInt};
381
      `SC_INTERRUPT_MASK_REG  : dataOut <= {3'b000, interruptMaskReg};
382
      `SC_ADDRESS : dataOut <= {1'b0, SCAddrReg};
383 12 sfielding
      `SC_FRAME_NUM_MSP : dataOut <= {5'b00000, frameNum[10:8]};
384
      `SC_FRAME_NUM_LSP : dataOut <= frameNum[7:0];
385 2 sfielding
      default: dataOut <= 8'h00;
386 5 sfielding
  endcase
387 2 sfielding
end
388
 
389
 
390
endmodule

powered by: WebSVN 2.1.0

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