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

Subversion Repositories usb2uart

[/] [usb2uart/] [trunk/] [rtl/] [usb1_core/] [usb1_idma.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dinesha
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Internal DMA Engine                                        ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Rudolf Usselmann                                   ////
7
////          rudi@asics.ws                                      ////
8
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/usb1_funct/////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2000-2002 Rudolf Usselmann                    ////
15
////                         www.asics.ws                        ////
16
////                         rudi@asics.ws                       ////
17
////                                                             ////
18
//// This source file may be used and distributed without        ////
19
//// restriction provided that this copyright statement is not   ////
20
//// removed from the file and that any derivative work contains ////
21
//// the original copyright notice and the associated disclaimer.////
22
////                                                             ////
23
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
24
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
25
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
26
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
27
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
28
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
29
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
30
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
31
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
32
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
33
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
34
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
35
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
36
////                                                             ////
37
/////////////////////////////////////////////////////////////////////
38
 
39
//  CVS Log
40
//
41
//  $Id: usb1_idma.v,v 1.2 2002-09-25 06:06:49 rudi Exp $
42
//
43
//  $Date: 2002-09-25 06:06:49 $
44
//  $Revision: 1.2 $
45
//  $Author: rudi $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: not supported by cvs2svn $
51
//               Revision 1.1.1.1  2002/09/19 12:07:38  rudi
52
//               Initial Checkin
53
//
54
//
55
//
56
//
57
//
58
//
59
 
60
`include "usb1_defines.v"
61
 
62
module usb1_idma(       clk, rst,
63
 
64
                // Packet Disassembler/Assembler interface
65
                rx_data_valid,
66
                rx_data_done,
67
                send_data,
68
                rd_next,
69
 
70
                tx_valid,
71
                tx_data_st_i,
72
                tx_data_st_o,
73
 
74
                // Protocol Engine
75
                tx_dma_en, rx_dma_en, idma_done,
76
                ep_sel,
77
 
78
                // Register File Manager Interface
79
                size,
80
                rx_cnt, rx_done,
81
                tx_busy,
82
 
83
                // Block Frames
84
                ep_bf_en, ep_bf_size,
85
                dropped_frame, misaligned_frame,
86
 
87
                // Memory Arb interface
88
                mwe, mre, ep_empty, ep_empty_int, ep_full
89
                );
90
 
91
 
92
// Packet Disassembler/Assembler interface
93
input           clk, rst;
94
input           rx_data_valid;
95
input           rx_data_done;
96
output          send_data;
97
input           rd_next;
98
 
99
input           tx_valid;
100
input   [7:0]    tx_data_st_i;
101
output  [7:0]    tx_data_st_o;
102
 
103
// Protocol Engine
104
input           tx_dma_en;
105
input           rx_dma_en;
106
output          idma_done;      // DMA is done
107
input   [3:0]    ep_sel;
108
 
109
// Register File Manager Interface
110
input   [8:0]    size;           // MAX PL Size in bytes
111
output  [7:0]    rx_cnt;
112
output          rx_done;
113
output          tx_busy;
114
 
115
input           ep_bf_en;
116
input   [6:0]    ep_bf_size;
117
output          dropped_frame;
118
output          misaligned_frame;
119
 
120
// Memory Arb interface
121
output          mwe;
122
output          mre;
123
input           ep_empty;
124
output          ep_empty_int;
125
input           ep_full;
126
 
127
///////////////////////////////////////////////////////////////////
128
//
129
// Local Wires and Registers
130
//
131
 
132
reg             tx_dma_en_r;
133
reg     [8:0]    sizd_c;                 // Internal size counter
134
wire            adr_incw;
135
wire            adr_incb;
136
wire            siz_dec;
137
wire            mwe;                    // Memory Write enable
138
wire            mre;                    // Memory Read enable
139
reg             mwe_r;
140
reg             sizd_is_zero;           // Indicates when all bytes have been
141
                                        // transferred
142
wire            sizd_is_zero_d;
143
reg             idma_done;              // DMA transfer is done
144
wire            send_data;              // Enable UTMI Transmitter
145
reg             rx_data_done_r;
146
reg             rx_data_valid_r;
147
wire            ff_re, ff_full, ff_empty;
148
reg             ff_we, ff_we1;
149
reg             tx_dma_en_r1;
150
reg             tx_dma_en_r2;
151
reg             tx_dma_en_r3;
152
reg             send_data_r;
153
wire            ff_clr;
154
reg     [7:0]    rx_cnt;
155
reg     [7:0]    rx_cnt_r;
156
reg             ep_empty_r;
157
reg             ep_empty_latched;
158
wire            ep_empty_int;
159
reg     [6:0]    ec;
160
wire            ec_clr;
161
reg             dropped_frame;
162
reg     [6:0]    rc_cnt;
163
wire            rc_clr;
164
reg             ep_full_latched;
165
wire            ep_full_int;
166
reg             misaligned_frame;
167
reg             tx_valid_r;
168
wire            tx_valid_e;
169
 
170
///////////////////////////////////////////////////////////////////
171
//
172
// For IN Block Frames transmit frames in [ep_bf_size] byte quantities
173
//
174
 
175
`ifdef USB1_BF_ENABLE
176
 
177
always @(posedge clk)
178
        if(!rst)                ec <= #1 7'h0;
179
        else
180
        if(!ep_bf_en | ec_clr)  ec <= #1 7'h0;
181
        else
182
        if(mre)                 ec <= #1 ec + 7'h1;
183
 
184
assign ec_clr = (ec == ep_bf_size) | tx_dma_en;
185
 
186
always @(posedge clk)
187
        if(!rst)        ep_empty_latched <= #1 1'b0;
188
        else
189
        if(ec_clr)      ep_empty_latched <= #1 ep_empty;
190
 
191
assign ep_empty_int = ep_bf_en ? ep_empty_latched : ep_empty;
192
`else
193
assign ep_empty_int = ep_empty;
194
`endif
195
///////////////////////////////////////////////////////////////////
196
//
197
// For OUT Block Frames always store in [ep_bf_size] byte chunks
198
// if fifo can't accept [ep_bf_size] bytes junk the entire [ep_bf_size]
199
// byte frame
200
//
201
 
202
`ifdef USB1_BF_ENABLE
203
always @(posedge clk)
204
        if(!rst)                rc_cnt <= #1 7'h0;
205
        else
206
        if(!ep_bf_en | rc_clr)  rc_cnt <= #1 7'h0;
207
        else
208
        if(mwe_r)               rc_cnt <= #1 rc_cnt + 7'h1;
209
 
210
assign rc_clr = ((rc_cnt == ep_bf_size) & mwe_r) | rx_dma_en;
211
 
212
always @(posedge clk)
213
        if(!rst)        ep_full_latched <= #1 1'b0;
214
        else
215
        if(rc_clr)      ep_full_latched <= #1 ep_full;
216
 
217
assign ep_full_int = ep_bf_en ? ep_full_latched : ep_full;
218
 
219
always @(posedge clk)
220
        dropped_frame <= #1 rc_clr & ep_full & ep_bf_en;
221
 
222
always @(posedge clk)
223
        misaligned_frame <= #1 rx_data_done_r & ep_bf_en & (rc_cnt!=7'd00);
224
`else
225
assign ep_full_int = ep_full;
226
 
227
always @(posedge clk)
228
        dropped_frame <= #1 1'b0;
229
 
230
always @(posedge clk)
231
        misaligned_frame <= #1 1'b0;
232
 
233
`endif
234
 
235
// synopsys translate_off
236
`ifdef USBF_VERBOSE_DEBUG
237
always @(posedge dropped_frame)
238
        $display("WARNING: BF: Droped one OUT frame (no space in FIFO) (%t)",$time);
239
 
240
always @(posedge misaligned_frame)
241
        $display("WARNING: BF: Received misaligned frame (%t)",$time);
242
`endif
243
// synopsys translate_on
244
 
245
///////////////////////////////////////////////////////////////////
246
//
247
// FIFO interface
248
//
249
 
250
always @(posedge clk)
251
        mwe_r <= #1 rx_data_valid;
252
 
253
assign mwe = mwe_r & !ep_full_int;
254
 
255
///////////////////////////////////////////////////////////////////
256
//
257
// Misc Logic
258
//
259
 
260
always @(posedge clk)
261
        rx_data_valid_r <= #1 rx_data_valid;
262
 
263
always @(posedge clk)
264
        rx_data_done_r <= #1 rx_data_done;
265
 
266
// Generate one cycle pulses for tx and rx dma enable
267
always @(posedge clk)
268
        tx_dma_en_r <= #1 tx_dma_en;
269
 
270
always @(posedge clk)
271
        tx_dma_en_r1 <= tx_dma_en_r;
272
 
273
always @(posedge clk)
274
        tx_dma_en_r2 <= tx_dma_en_r1;
275
 
276
always @(posedge clk)
277
        tx_dma_en_r3 <= tx_dma_en_r2;
278
 
279
// DMA Done Indicator
280
always @(posedge clk)
281
        idma_done <= #1 (rx_data_done_r | sizd_is_zero_d | ep_empty_int);
282
 
283
///////////////////////////////////////////////////////////////////
284
//
285
// RX Size Counter
286
//
287
 
288
always @(posedge clk or negedge rst)
289
        if(!rst)                        rx_cnt_r <= #1 8'h00;
290
        else
291
        if(rx_data_done_r)              rx_cnt_r <= #1 8'h00;
292
        else
293
        if(rx_data_valid)               rx_cnt_r <= #1 rx_cnt_r + 8'h01;
294
 
295
always @(posedge clk or negedge rst)
296
        if(!rst)                rx_cnt <= #1 8'h00;
297
        else
298
        if(rx_data_done_r)      rx_cnt <= #1 rx_cnt_r;
299
 
300
assign rx_done = rx_data_done_r;
301
 
302
///////////////////////////////////////////////////////////////////
303
//
304
// Transmit Size Counter (counting backward from input size)
305
// For MAX packet size
306
//
307
 
308
always @(posedge clk or negedge rst)
309
        if(!rst)                        sizd_c <= #1 9'h1ff;
310
        else
311
        if(tx_dma_en)                   sizd_c <= #1 size;
312
        else
313
        if(siz_dec)                     sizd_c <= #1 sizd_c - 9'h1;
314
 
315
assign siz_dec = (tx_dma_en_r | tx_dma_en_r1 | rd_next) & !sizd_is_zero_d;
316
 
317
assign sizd_is_zero_d = sizd_c == 9'h0;
318
 
319
always @(posedge clk)
320
        sizd_is_zero <= #1 sizd_is_zero_d;
321
 
322
///////////////////////////////////////////////////////////////////
323
//
324
// TX Logic
325
//
326
 
327
assign tx_busy = send_data | tx_dma_en_r | tx_dma_en;
328
 
329
always @(posedge clk)
330
        tx_valid_r <= #1 tx_valid;
331
 
332
assign tx_valid_e = tx_valid_r & !tx_valid;
333
 
334
// Since we are prefetching two entries in to our fast fifo, we
335
// need to know when exactly ep_empty was asserted, as we might
336
// only need 1 or 2 bytes. This is for ep_empty_r
337
 
338
always @(posedge clk or negedge rst)
339
        if(!rst)                                ep_empty_r <= #1 1'b0;
340
        else
341
        if(!tx_valid)                           ep_empty_r <= #1 1'b0;
342
        else
343
        if(tx_dma_en_r2)                        ep_empty_r <= #1 ep_empty_int;
344
 
345
always @(posedge clk or negedge rst)
346
        if(!rst)                                send_data_r <= #1 1'b0;
347
        else
348
        if((tx_dma_en_r & !ep_empty_int))               send_data_r <= #1 1'b1;
349
        else
350
        if(rd_next & (sizd_is_zero_d | (ep_empty_int & !sizd_is_zero_d)) )
351
                                                send_data_r <= #1 1'b0;
352
 
353
assign send_data = (send_data_r & !ep_empty_r &
354
                !(sizd_is_zero & size==9'h01)) | tx_dma_en_r1;
355
 
356
assign mre = (tx_dma_en_r1 | tx_dma_en_r | rd_next) &
357
                !sizd_is_zero_d & !ep_empty_int & (send_data | tx_dma_en_r1 | tx_dma_en_r);
358
 
359
always @(posedge clk)
360
        ff_we1 <= mre;
361
 
362
always @(posedge clk)
363
        ff_we <= ff_we1;
364
 
365
assign ff_re = rd_next;
366
 
367
assign ff_clr = !tx_valid;
368
 
369
///////////////////////////////////////////////////////////////////
370
//
371
// IDMA fast prefetch fifo
372
//
373
 
374
// tx fifo
375
usb1_fifo2 ff(
376
        .clk(           clk             ),
377
        .rst(           rst             ),
378
        .clr(           ff_clr          ),
379
        .din(           tx_data_st_i    ),
380
        .we(            ff_we           ),
381
        .dout(          tx_data_st_o    ),
382
        .re(            ff_re           )
383
        );
384
 
385
endmodule
386
 
387
 

powered by: WebSVN 2.1.0

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