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

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [hostController/] [USBHostControlBI.v] - Blame information for rev 16

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

Line No. Rev Author Line
1 2 sfielding
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// USBHostControlBI.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 "usbHostControl_h.v"
48
 
49
module USBHostControlBI (address, dataIn, dataOut, writeEn,
50
  strobe_i,
51
  clk, rst,
52 5 sfielding
  SOFSentIntOut, connEventIntOut, resumeIntOut, transDoneIntOut,
53
  TxTransTypeReg, TxSOFEnableReg,
54
  TxAddrReg, TxEndPReg, frameNumIn,
55
  RxPktStatusIn, RxPIDIn,
56
  connectStateIn,
57
  SOFSentIn, connEventIn, resumeIntIn, transDoneIn,
58 2 sfielding
  hostControlSelect,
59
  clrTransReq,
60
  preambleEn,
61
  SOFSync,
62
  TxLineState,
63
  LineDirectControlEn,
64
  fullSpeedPol,
65
  fullSpeedRate,
66 14 sfielding
  transReq,
67 16 sfielding
  isoEn,
68
  SOFTimer
69 2 sfielding
  );
70
input [3:0] address;
71
input [7:0] dataIn;
72
input writeEn;
73
input strobe_i;
74
input clk;
75
input rst;
76
output [7:0] dataOut;
77
output SOFSentIntOut;
78
output connEventIntOut;
79
output resumeIntOut;
80
output transDoneIntOut;
81
 
82
output [1:0] TxTransTypeReg;
83
output TxSOFEnableReg;
84
output [6:0] TxAddrReg;
85
output [3:0] TxEndPReg;
86
input [10:0] frameNumIn;
87
input [7:0] RxPktStatusIn;
88
input [3:0] RxPIDIn;
89
input [1:0] connectStateIn;
90
input SOFSentIn;
91
input connEventIn;
92
input resumeIntIn;
93
input transDoneIn;
94
input hostControlSelect;
95
input clrTransReq;
96
output preambleEn;
97
output SOFSync;
98
output [1:0] TxLineState;
99
output LineDirectControlEn;
100
output fullSpeedPol;
101
output fullSpeedRate;
102
output transReq;
103 14 sfielding
output isoEn;     //enable isochronous mode
104 16 sfielding
input [15:0] SOFTimer;
105 2 sfielding
 
106
wire [3:0] address;
107
wire [7:0] dataIn;
108
wire writeEn;
109
wire strobe_i;
110
wire clk;
111
wire rst;
112
reg [7:0] dataOut;
113
 
114
reg SOFSentIntOut;
115
reg connEventIntOut;
116
reg resumeIntOut;
117
reg transDoneIntOut;
118
 
119
reg [1:0] TxTransTypeReg;
120
reg TxSOFEnableReg;
121
reg [6:0] TxAddrReg;
122
reg [3:0] TxEndPReg;
123
wire [10:0] frameNumIn;
124
wire [7:0] RxPktStatusIn;
125
wire [3:0] RxPIDIn;
126
wire [1:0] connectStateIn;
127
 
128
wire SOFSentIn;
129
wire connEventIn;
130
wire resumeIntIn;
131
wire transDoneIn;
132
wire hostControlSelect;
133
wire clrTransReq;
134
reg preambleEn;
135
reg SOFSync;
136
reg [1:0] TxLineState;
137
reg LineDirectControlEn;
138
reg fullSpeedPol;
139
reg fullSpeedRate;
140
reg transReq;
141 14 sfielding
reg isoEn;
142 16 sfielding
wire [15:0] SOFTimer;
143 2 sfielding
 
144
//internal wire and regs
145
reg [1:0] TxControlReg;
146
reg [4:0] TxLineControlReg;
147
reg clrSOFReq;
148
reg clrConnEvtReq;
149
reg clrResInReq;
150
reg clrTransDoneReq;
151
reg SOFSentInt;
152
reg connEventInt;
153
reg resumeInt;
154
reg transDoneInt;
155
reg [3:0] interruptMaskReg;
156
reg setTransReq;
157
 
158
//sync write demux
159
always @(posedge clk)
160
begin
161 14 sfielding
  if (rst == 1'b1) begin
162
    isoEn <= 1'b0;
163
    preambleEn <= 1'b0;
164
    SOFSync <= 1'b0;
165
    TxTransTypeReg <= 2'b00;
166
    TxLineControlReg <= 5'h00;
167
    TxSOFEnableReg <= 1'b0;
168
    TxAddrReg <= 7'h00;
169
    TxEndPReg <= 4'h0;
170
    interruptMaskReg <= 4'h0;
171 5 sfielding
  end
172 14 sfielding
  else begin
173
    clrSOFReq <= 1'b0;
174
    clrConnEvtReq <= 1'b0;
175
    clrResInReq <= 1'b0;
176
    clrTransDoneReq <= 1'b0;
177
    setTransReq <= 1'b0;
178
    if (writeEn == 1'b1 && strobe_i == 1'b1 && hostControlSelect == 1'b1)
179
    begin
180
      case (address)
181
        `TX_CONTROL_REG : begin
182
          isoEn <= dataIn[`ISO_ENABLE_BIT];
183
          preambleEn <= dataIn[`PREAMBLE_ENABLE_BIT];
184
          SOFSync <= dataIn[`SOF_SYNC_BIT];
185
          setTransReq <= dataIn[`TRANS_REQ_BIT];
186
        end
187
        `TX_TRANS_TYPE_REG : TxTransTypeReg <= dataIn[1:0];
188
        `TX_LINE_CONTROL_REG : TxLineControlReg <= dataIn[4:0];
189
        `TX_SOF_ENABLE_REG : TxSOFEnableReg <= dataIn[`SOF_EN_BIT];
190
        `TX_ADDR_REG : TxAddrReg <= dataIn[6:0];
191
        `TX_ENDP_REG : TxEndPReg <= dataIn[3:0];
192
        `INTERRUPT_STATUS_REG :  begin
193
          clrSOFReq <= dataIn[`SOF_SENT_BIT];
194
          clrConnEvtReq <= dataIn[`CONNECTION_EVENT_BIT];
195
          clrResInReq <= dataIn[`RESUME_INT_BIT];
196
          clrTransDoneReq <= dataIn[`TRANS_DONE_BIT];
197
        end
198
        `INTERRUPT_MASK_REG  : interruptMaskReg <= dataIn[3:0];
199
      endcase
200
    end
201
  end
202 2 sfielding
end
203
 
204
//interrupt control
205
always @(posedge clk)
206
begin
207 14 sfielding
  if (rst == 1'b1) begin
208 5 sfielding
    SOFSentInt <= 1'b0;
209
    connEventInt <= 1'b0;
210 14 sfielding
    resumeInt <= 1'b0;
211
    transDoneInt <= 1'b0;
212
  end
213
  else begin
214
    if (SOFSentIn == 1'b1)
215
      SOFSentInt <= 1'b1;
216
    else if (clrSOFReq == 1'b1)
217
      SOFSentInt <= 1'b0;
218 5 sfielding
 
219 14 sfielding
    if (connEventIn == 1'b1)
220
      connEventInt <= 1'b1;
221
    else if (clrConnEvtReq == 1'b1)
222
      connEventInt <= 1'b0;
223
 
224
    if (resumeIntIn == 1'b1)
225
      resumeInt <= 1'b1;
226
    else if (clrResInReq == 1'b1)
227
      resumeInt <= 1'b0;
228 2 sfielding
 
229 14 sfielding
    if (transDoneIn == 1'b1)
230
      transDoneInt <= 1'b1;
231
    else if (clrTransDoneReq == 1'b1)
232
      transDoneInt <= 1'b0;
233
  end
234 2 sfielding
end
235
 
236
//mask interrupts
237
always @(interruptMaskReg or transDoneInt or resumeInt or connEventInt or SOFSentInt) begin
238
  transDoneIntOut <= transDoneInt & interruptMaskReg[`TRANS_DONE_BIT];
239
  resumeIntOut <= resumeInt & interruptMaskReg[`RESUME_INT_BIT];
240
  connEventIntOut <= connEventInt & interruptMaskReg[`CONNECTION_EVENT_BIT];
241
  SOFSentIntOut <= SOFSentInt & interruptMaskReg[`SOF_SENT_BIT];
242
end
243
 
244
//transaction request set/clear
245
always @(posedge clk)
246
begin
247 14 sfielding
  if (rst == 1'b1) begin
248 5 sfielding
    transReq <= 1'b0;
249 14 sfielding
  end
250
  else begin
251
    if (setTransReq == 1'b1)
252
      transReq <= 1'b1;
253
    else if (clrTransReq == 1'b1)
254
      transReq <= 1'b0;
255
  end
256 2 sfielding
end
257
 
258
//break out control signals
259
always @(TxControlReg or TxLineControlReg) begin
260
  TxLineState <= TxLineControlReg[`TX_LINE_STATE_MSBIT:`TX_LINE_STATE_LSBIT];
261
  LineDirectControlEn <= TxLineControlReg[`DIRECT_CONTROL_BIT];
262
  fullSpeedPol <= TxLineControlReg[`FULL_SPEED_LINE_POLARITY_BIT];
263
  fullSpeedRate <= TxLineControlReg[`FULL_SPEED_LINE_RATE_BIT];
264
end
265
 
266
// async read mux
267
always @(address or
268 5 sfielding
  TxControlReg or TxTransTypeReg or TxLineControlReg or TxSOFEnableReg or
269
  TxAddrReg or TxEndPReg or frameNumIn or
270
  SOFSentInt or connEventInt or resumeInt or transDoneInt or
271
  interruptMaskReg or RxPktStatusIn or RxPIDIn or connectStateIn or
272 14 sfielding
  preambleEn or SOFSync or transReq or isoEn)
273 2 sfielding
begin
274 5 sfielding
  case (address)
275 14 sfielding
      `TX_CONTROL_REG : dataOut <= {4'b0000, isoEn, preambleEn, SOFSync, transReq} ;
276 5 sfielding
      `TX_TRANS_TYPE_REG : dataOut <= {6'b000000, TxTransTypeReg};
277
      `TX_LINE_CONTROL_REG : dataOut <= {3'b000, TxLineControlReg};
278
      `TX_SOF_ENABLE_REG : dataOut <= {7'b0000000, TxSOFEnableReg};
279
      `TX_ADDR_REG : dataOut <= {1'b0, TxAddrReg};
280
      `TX_ENDP_REG : dataOut <= {4'h0, TxEndPReg};
281 12 sfielding
      `FRAME_NUM_MSB_REG : dataOut <= {5'b00000, frameNumIn[10:8]};
282
      `FRAME_NUM_LSB_REG : dataOut <= frameNumIn[7:0];
283 5 sfielding
      `INTERRUPT_STATUS_REG :  dataOut <= {4'h0, SOFSentInt, connEventInt, resumeInt, transDoneInt};
284
      `INTERRUPT_MASK_REG  : dataOut <= {4'h0, interruptMaskReg};
285
      `RX_STATUS_REG  : dataOut <= RxPktStatusIn;
286
      `RX_PID_REG  : dataOut <= {4'b0000, RxPIDIn};
287
      `RX_CONNECT_STATE_REG : dataOut <= {6'b000000, connectStateIn};
288 16 sfielding
      `HOST_SOF_TIMER_MSB_REG : dataOut <= SOFTimer[15:8];
289 2 sfielding
      default: dataOut <= 8'h00;
290 5 sfielding
  endcase
291 2 sfielding
end
292
 
293
 
294
endmodule

powered by: WebSVN 2.1.0

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