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

Subversion Repositories wb_dma

[/] [wb_dma/] [trunk/] [rtl/] [verilog/] [wb_dma_ch_rf.v] - Blame information for rev 17

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 rudi
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  WISHBONE DMA One Channel Register File                     ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Rudolf Usselmann                                   ////
7
////          rudi@asics.ws                                      ////
8
////                                                             ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/cores/wb_dma/    ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14 15 rudi
//// Copyright (C) 2000-2002 Rudolf Usselmann                    ////
15
////                         www.asics.ws                        ////
16
////                         rudi@asics.ws                       ////
17 5 rudi
////                                                             ////
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 15 rudi
//  $Id: wb_dma_ch_rf.v,v 1.5 2002-02-01 01:54:45 rudi Exp $
42 5 rudi
//
43 15 rudi
//  $Date: 2002-02-01 01:54:45 $
44
//  $Revision: 1.5 $
45 5 rudi
//  $Author: rudi $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: not supported by cvs2svn $
51 15 rudi
//               Revision 1.4  2001/10/30 02:06:17  rudi
52
//
53
//               - Fixed problem where synthesis tools would instantiate latches instead of flip-flops
54
//
55 13 rudi
//               Revision 1.3  2001/10/19 04:35:04  rudi
56
//
57
//               - Made the core parameterized
58
//
59 10 rudi
//               Revision 1.2  2001/08/15 05:40:30  rudi
60
//
61
//               - Changed IO names to be more clear.
62
//               - Uniquifyed define names to be core specific.
63
//               - Added Section 3.10, describing DMA restart.
64
//
65 8 rudi
//               Revision 1.1  2001/07/29 08:57:02  rudi
66
//
67
//
68
//               1) Changed Directory Structure
69
//               2) Added restart signal (REST)
70
//
71 5 rudi
//               Revision 1.3  2001/06/14 08:50:01  rudi
72
//
73
//               Changed Module Name to match file name.
74
//
75
//               Revision 1.2  2001/06/13 02:26:48  rudi
76
//
77
//
78
//               Small changes after running lint.
79
//
80
//               Revision 1.1  2001/06/05 10:25:27  rudi
81
//
82
//
83
//               Initial checkin of register file for one channel.
84
//
85
//
86
//
87
//
88
 
89
`include "wb_dma_defines.v"
90
 
91
module wb_dma_ch_rf(    clk, rst,
92
                        pointer, pointer_s, ch_csr, ch_txsz, ch_adr0, ch_adr1,
93
                        ch_am0, ch_am1, sw_pointer, ch_stop, ch_dis, int,
94
 
95
                        wb_rf_din, wb_rf_adr, wb_rf_we, wb_rf_re,
96
 
97
                        // DMA Registers Write Back Channel Select
98
                        ch_sel, ndnr,
99
 
100
                        // DMA Engine Status
101
                        dma_busy, dma_err, dma_done, dma_done_all,
102
 
103
                        // DMA Engine Reg File Update ctrl signals
104
                        de_csr, de_txsz, de_adr0, de_adr1,
105
                        de_csr_we, de_txsz_we, de_adr0_we, de_adr1_we,
106
                        de_fetch_descr, dma_rest,
107
                        ptr_set
108
 
109
                );
110
 
111
parameter       [4:0]    CH_NO    = 5'h0;  // This Instances Channel ID
112 10 rudi
parameter       [0:0]     CH_EN    = 1'b1;  // This channel exists
113 5 rudi
parameter       [0:0]     HAVE_ARS = 1'b1;  // 1=this Instance Supports ARS
114
parameter       [0:0]     HAVE_ED  = 1'b1;  // 1=this Instance Supports External Descriptors
115
parameter       [0:0]     HAVE_CBUF= 1'b1;  // 1=this Instance Supports Cyclic Buffers
116
 
117
input           clk, rst;
118
 
119
output  [31:0]   pointer;
120
output  [31:0]   pointer_s;
121
output  [31:0]   ch_csr;
122
output  [31:0]   ch_txsz;
123
output  [31:0]   ch_adr0;
124
output  [31:0]   ch_adr1;
125
output  [31:0]   ch_am0;
126
output  [31:0]   ch_am1;
127
output  [31:0]   sw_pointer;
128
output          ch_stop;
129
output          ch_dis;
130
output          int;
131
 
132
input   [31:0]   wb_rf_din;
133
input   [7:0]    wb_rf_adr;
134
input           wb_rf_we;
135
input           wb_rf_re;
136
 
137
input   [4:0]    ch_sel;
138
input           ndnr;
139
 
140
// DMA Engine Status
141
input           dma_busy, dma_err, dma_done, dma_done_all;
142
 
143
// DMA Engine Reg File Update ctrl signals
144
input   [31:0]   de_csr;
145
input   [11:0]   de_txsz;
146
input   [31:0]   de_adr0;
147
input   [31:0]   de_adr1;
148
input           de_csr_we, de_txsz_we, de_adr0_we, de_adr1_we, ptr_set;
149
input           de_fetch_descr;
150
input           dma_rest;
151
 
152
////////////////////////////////////////////////////////////////////
153
//
154
// Local Wires and Registers
155
//
156
 
157
wire    [31:0]   pointer;
158
reg     [27:0]   pointer_r;
159
reg     [27:0]   pointer_sr;
160
reg             ptr_valid;
161
reg             ch_eol;
162
 
163
wire    [31:0]   ch_csr, ch_txsz;
164
 
165
reg     [8:0]    ch_csr_r;
166
reg     [2:0]    ch_csr_r2;
167
reg     [2:0]    ch_csr_r3;
168
reg     [2:0]    int_src_r;
169
reg             ch_err_r;
170
reg             ch_stop;
171
reg             ch_busy;
172
reg             ch_done;
173
reg             ch_err;
174
reg             rest_en;
175
 
176
reg     [10:0]   ch_chk_sz_r;
177
reg     [11:0]   ch_tot_sz_r;
178
reg     [22:0]   ch_txsz_s;
179
reg             ch_sz_inf;
180
 
181
wire    [31:0]   ch_adr0, ch_adr1;
182
reg     [29:0]   ch_adr0_r, ch_adr1_r;
183
wire    [31:0]   ch_am0, ch_am1;
184
reg     [27:0]   ch_am0_r, ch_am1_r;
185
 
186
reg     [29:0]   ch_adr0_s, ch_adr1_s;
187
 
188
reg     [29:0]   sw_pointer_r;
189
wire            sw_pointer_we;
190
wire    [28:0]   cmp_adr;
191
reg             ch_dis;
192
wire            ch_enable;
193
 
194
wire            pointer_we;
195
wire            ch_csr_we, ch_csr_re, ch_txsz_we, ch_adr0_we, ch_adr1_we;
196
wire            ch_am0_we, ch_am1_we;
197
reg             ch_rl;
198
wire            ch_done_we;
199
wire            ch_err_we;
200
wire            chunk_done_we;
201
 
202
wire            ch_csr_dewe, ch_txsz_dewe, ch_adr0_dewe, ch_adr1_dewe;
203
 
204
wire            this_ptr_set;
205
wire            ptr_inv;
206
 
207
////////////////////////////////////////////////////////////////////
208
//
209
// Aliases
210
//
211
 
212 10 rudi
assign ch_adr0          = CH_EN ? {ch_adr0_r, 2'h0}   : 32'h0;
213
assign ch_adr1          = CH_EN ? {ch_adr1_r, 2'h0}   : 32'h0;
214 13 rudi
assign ch_am0           = (CH_EN & HAVE_CBUF) ? {ch_am0_r, 4'h0}    : 32'hffff_fff0;
215
assign ch_am1           = (CH_EN & HAVE_CBUF) ? {ch_am1_r, 4'h0}    : 32'hffff_fff0;
216
assign sw_pointer       = (CH_EN & HAVE_CBUF) ? {sw_pointer_r,2'h0} : 32'h0;
217 5 rudi
 
218 10 rudi
assign pointer          = CH_EN ? {pointer_r, 3'h0, ptr_valid} : 32'h0;
219
assign pointer_s        = CH_EN ? {pointer_sr, 4'h0}  : 32'h0;
220
assign ch_csr           = CH_EN ? {9'h0, int_src_r, ch_csr_r3, rest_en, ch_csr_r2,
221
                                        ch_err, ch_done, ch_busy, 1'b0, ch_csr_r[8:1], ch_enable} : 32'h0;
222
assign ch_txsz          = CH_EN ? {5'h0, ch_chk_sz_r, ch_sz_inf, 3'h0, ch_tot_sz_r} : 32'h0;
223 5 rudi
 
224 10 rudi
assign ch_enable        = CH_EN ? (ch_csr_r[`WDMA_CH_EN] & (HAVE_CBUF ? !ch_dis : 1'b1) ) : 1'b0;
225 5 rudi
 
226
////////////////////////////////////////////////////////////////////
227
//
228
// CH0 control signals
229
//
230
 
231
parameter       [4:0]    CH_ADR = CH_NO + 5'h1;
232
 
233 10 rudi
assign ch_csr_we        = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h0);
234
assign ch_csr_re        = CH_EN & wb_rf_re & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h0);
235
assign ch_txsz_we       = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h1);
236
assign ch_adr0_we       = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h2);
237
assign ch_am0_we        = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h3);
238
assign ch_adr1_we       = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h4);
239
assign ch_am1_we        = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h5);
240
assign pointer_we       = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h6);
241
assign sw_pointer_we    = CH_EN & wb_rf_we & (wb_rf_adr[7:3] == CH_ADR) & (wb_rf_adr[2:0] == 3'h7);
242 5 rudi
 
243 10 rudi
assign ch_done_we       = CH_EN & (((ch_sel==CH_NO) & dma_done_all) | ndnr) &
244 8 rudi
                          (ch_csr[`WDMA_USE_ED] ? ch_eol : !ch_csr[`WDMA_ARS]);
245 10 rudi
assign chunk_done_we    = CH_EN & (ch_sel==CH_NO) & dma_done;
246
assign ch_err_we        = CH_EN & (ch_sel==CH_NO) & dma_err;
247
assign ch_csr_dewe      = CH_EN & de_csr_we & (ch_sel==CH_NO);
248
assign ch_txsz_dewe     = CH_EN & de_txsz_we & (ch_sel==CH_NO);
249
assign ch_adr0_dewe     = CH_EN & de_adr0_we & (ch_sel==CH_NO);
250
assign ch_adr1_dewe     = CH_EN & de_adr1_we & (ch_sel==CH_NO);
251 5 rudi
 
252 10 rudi
assign ptr_inv          = CH_EN & ((ch_sel==CH_NO) & dma_done_all) | ndnr;
253
assign this_ptr_set     = CH_EN & ptr_set & (ch_sel==CH_NO);
254 5 rudi
 
255
always @(posedge clk)
256 10 rudi
        ch_rl <= #1     CH_EN & HAVE_ARS & (
257 5 rudi
                        (rest_en & dma_rest) |
258 8 rudi
                        ((ch_sel==CH_NO) & dma_done_all & ch_csr[`WDMA_ARS] & !ch_csr[`WDMA_USE_ED])
259 5 rudi
                        );
260
 
261
// ---------------------------------------------------
262
// Pointers
263
 
264
always @(posedge clk or negedge rst)
265
        if(!rst)                        ptr_valid <= #1 1'b0;
266
        else
267 10 rudi
        if(CH_EN & HAVE_ED)
268 5 rudi
           begin
269
                if( this_ptr_set | (rest_en & dma_rest) )
270
                                        ptr_valid <= #1 1'b1;
271
                else
272
                if(ptr_inv)             ptr_valid <= #1 1'b0;
273
           end
274
        else                            ptr_valid <= #1 1'b0;
275
 
276
always @(posedge clk or negedge rst)
277
        if(!rst)                        ch_eol <= #1 1'b0;
278
        else
279 10 rudi
        if(CH_EN & HAVE_ED)
280 5 rudi
           begin
281 8 rudi
                if(ch_csr_dewe)         ch_eol <= #1 de_csr[`WDMA_ED_EOL];
282 5 rudi
                else
283
                if(ch_done_we)          ch_eol <= #1 1'b0;
284
           end
285
        else                            ch_eol <= #1 1'b0;
286
 
287
always @(posedge clk)
288 10 rudi
        if(CH_EN & HAVE_ED)
289 5 rudi
           begin
290
                if(pointer_we)          pointer_r <= #1 wb_rf_din[31:4];
291
                else
292
                if(this_ptr_set)        pointer_r <= #1 de_csr[31:4];
293
           end
294
        else                            pointer_r <= #1 1'b0;
295
 
296
always @(posedge clk)
297 10 rudi
        if(CH_EN & HAVE_ED)
298 5 rudi
           begin
299
                if(this_ptr_set)        pointer_sr <= #1 pointer_r;
300
           end
301
        else                            pointer_sr <= #1 1'b0;
302
 
303
// ---------------------------------------------------
304
// CSR
305
 
306
always @(posedge clk or negedge rst)
307 10 rudi
        if(!rst)                        ch_csr_r <= #1 1'b0;
308 5 rudi
        else
309 10 rudi
        if(CH_EN)
310 5 rudi
           begin
311 10 rudi
                if(ch_csr_we)           ch_csr_r <= #1 wb_rf_din[8:0];
312
                else
313
                   begin
314
                        if(ch_done_we)  ch_csr_r[`WDMA_CH_EN] <= #1 1'b0;
315
                        if(ch_csr_dewe) ch_csr_r[4:1] <= #1 de_csr[19:16];
316
                   end
317 5 rudi
           end
318
 
319
// done bit
320
always @(posedge clk or negedge rst)
321
        if(!rst)                ch_done <= #1 1'b0;
322
        else
323 10 rudi
        if(CH_EN)
324
           begin
325
                if(ch_csr_we)           ch_done <= #1 !wb_rf_din[`WDMA_CH_EN];
326
                else
327
                if(ch_done_we)          ch_done <= #1 1'b1;
328
           end
329 5 rudi
 
330
// busy bit
331
always @(posedge clk)
332 10 rudi
        ch_busy <= #1 CH_EN & (ch_sel==CH_NO) & dma_busy;
333 5 rudi
 
334
// stop bit
335
always @(posedge clk)
336 10 rudi
        ch_stop <= #1 CH_EN & ch_csr_we & wb_rf_din[`WDMA_STOP];
337 5 rudi
 
338
// error bit
339
always @(posedge clk or negedge rst)
340 10 rudi
        if(!rst)                        ch_err <= #1 1'b0;
341 5 rudi
        else
342 10 rudi
        if(CH_EN)
343
           begin
344
                if(ch_err_we)           ch_err <= #1 1'b1;
345
                else
346
                if(ch_csr_re)           ch_err <= #1 1'b0;
347
           end
348 5 rudi
 
349
// Priority Bits
350
always @(posedge clk or negedge rst)
351 10 rudi
        if(!rst)                        ch_csr_r2 <= #1 3'h0;
352 5 rudi
        else
353 10 rudi
        if(CH_EN & ch_csr_we)           ch_csr_r2 <= #1 wb_rf_din[15:13];
354 5 rudi
 
355
// Restart Enable Bit (REST)
356
always @(posedge clk or negedge rst)
357 10 rudi
        if(!rst)                        rest_en <= #1 1'b0;
358 5 rudi
        else
359 10 rudi
        if(CH_EN & ch_csr_we)           rest_en <= #1 wb_rf_din[16];
360 5 rudi
 
361
// INT Mask
362
always @(posedge clk or negedge rst)
363 10 rudi
        if(!rst)                        ch_csr_r3 <= #1 3'h0;
364 5 rudi
        else
365 10 rudi
        if(CH_EN & ch_csr_we)           ch_csr_r3 <= #1 wb_rf_din[19:17];
366 5 rudi
 
367
// INT Source
368
always @(posedge clk or negedge rst)
369 10 rudi
        if(!rst)                        int_src_r[2] <= #1 1'b0;
370 5 rudi
        else
371 10 rudi
        if(CH_EN)
372
           begin
373
                if(chunk_done_we)       int_src_r[2] <= #1 1'b1;
374
                else
375
                if(ch_csr_re)           int_src_r[2] <= #1 1'b0;
376
           end
377 5 rudi
 
378
always @(posedge clk or negedge rst)
379 10 rudi
        if(!rst)                        int_src_r[1] <= #1 1'b0;
380 5 rudi
        else
381 10 rudi
        if(CH_EN)
382
           begin
383
                if(ch_done_we)          int_src_r[1] <= #1 1'b1;
384
                else
385
                if(ch_csr_re)           int_src_r[1] <= #1 1'b0;
386
           end
387 5 rudi
 
388
always @(posedge clk or negedge rst)
389 10 rudi
        if(!rst)                        int_src_r[0] <= #1 1'b0;
390 5 rudi
        else
391 10 rudi
        if(CH_EN)
392
           begin
393
                if(ch_err_we)           int_src_r[0] <= #1 1'b1;
394
                else
395
                if(ch_csr_re)           int_src_r[0] <= #1 1'b0;
396
           end
397 5 rudi
 
398
// Interrupt Output
399 13 rudi
assign int = |(int_src_r & ch_csr_r3) & CH_EN;
400 5 rudi
 
401
// ---------------------------------------------------
402
// TXZS
403
always @(posedge clk)
404 10 rudi
        if(CH_EN)
405
           begin
406
                if(ch_txsz_we)
407
                        {ch_chk_sz_r, ch_tot_sz_r} <= #1 {wb_rf_din[26:16], wb_rf_din[11:0]};
408
                else
409
                if(ch_txsz_dewe)
410
                        ch_tot_sz_r <= #1 de_txsz;
411
                else
412
                if(ch_rl)
413
                        {ch_chk_sz_r, ch_tot_sz_r} <= #1 ch_txsz_s;
414
           end
415 5 rudi
 
416
// txsz shadow register
417
always @(posedge clk)
418 10 rudi
        if(CH_EN & HAVE_ARS)
419 5 rudi
           begin
420
 
421
                if(ch_txsz_we)  ch_txsz_s <= #1 {wb_rf_din[26:16], wb_rf_din[11:0]};
422
                else
423
                if(rest_en & ch_txsz_dewe & de_fetch_descr)
424
                                ch_txsz_s[11:0] <= #1 de_txsz[11:0];
425
           end
426
 
427
// Infinite Size indicator
428
always @(posedge clk)
429 10 rudi
        if(CH_EN)
430
           begin
431
                if(ch_txsz_we)          ch_sz_inf <= #1 wb_rf_din[15];
432
           end
433 5 rudi
 
434
// ---------------------------------------------------
435
// ADR0
436
always @(posedge clk)
437 10 rudi
        if(CH_EN)
438
           begin
439
                if(ch_adr0_we)          ch_adr0_r <= #1 wb_rf_din[31:2];
440
                else
441
                if(ch_adr0_dewe)        ch_adr0_r <= #1 de_adr0[31:2];
442
                else
443
                if(ch_rl)               ch_adr0_r <= #1 ch_adr0_s;
444
           end
445 5 rudi
 
446
// Adr0 shadow register
447
always @(posedge clk)
448 10 rudi
        if(CH_EN & HAVE_ARS)
449 5 rudi
           begin
450
                if(ch_adr0_we)  ch_adr0_s <= #1 wb_rf_din[31:2];
451
                else
452
                if(rest_en & ch_adr0_dewe & de_fetch_descr)
453
                                ch_adr0_s <= #1 de_adr0[31:2];
454
           end
455
 
456
// ---------------------------------------------------
457
// AM0
458
always @(posedge clk or negedge rst)
459 13 rudi
        if(!rst)                ch_am0_r <= #1 28'hfffffff;
460 5 rudi
        else
461 13 rudi
        if(ch_am0_we)           ch_am0_r <= #1 wb_rf_din[31:4];
462 5 rudi
 
463
// ---------------------------------------------------
464
// ADR1
465
always @(posedge clk)
466 10 rudi
        if(CH_EN)
467
           begin
468
                if(ch_adr1_we)          ch_adr1_r <= #1 wb_rf_din[31:2];
469
                else
470
                if(ch_adr1_dewe)        ch_adr1_r <= #1 de_adr1[31:2];
471
                else
472
                if(ch_rl)               ch_adr1_r <= #1 ch_adr1_s;
473
           end
474 5 rudi
 
475
// Adr1 shadow register
476
always @(posedge clk)
477 10 rudi
        if(CH_EN & HAVE_ARS)
478 5 rudi
           begin
479
                if(ch_adr1_we)  ch_adr1_s <= #1 wb_rf_din[31:2];
480
                else
481
                if(rest_en & ch_adr1_dewe & de_fetch_descr)
482
                                ch_adr1_s <= #1 de_adr1[31:2];
483
           end
484
 
485
// ---------------------------------------------------
486
// AM1
487
always @(posedge clk or negedge rst)
488 10 rudi
        if(!rst)                                ch_am1_r <= #1 28'hfffffff;
489 5 rudi
        else
490 10 rudi
        if(ch_am1_we & CH_EN & HAVE_CBUF)       ch_am1_r <= #1 wb_rf_din[31:4];
491 5 rudi
 
492
// ---------------------------------------------------
493
// Software Pointer
494
always @(posedge clk or negedge rst)
495 10 rudi
        if(!rst)                                sw_pointer_r <= #1 28'h0;
496 5 rudi
        else
497 10 rudi
        if(sw_pointer_we & CH_EN & HAVE_CBUF)   sw_pointer_r <= #1 wb_rf_din[31:4];
498 5 rudi
 
499
// ---------------------------------------------------
500
// Software Pointer Match logic
501
 
502
assign cmp_adr = ch_csr[2] ? ch_adr1[30:2] : ch_adr0[30:2];
503
 
504
always @(posedge clk)
505 13 rudi
        ch_dis <= #1 CH_EN & HAVE_CBUF & (sw_pointer[30:2] == cmp_adr) & sw_pointer[31];
506 5 rudi
 
507
endmodule
508
 
509
 
510
module wb_dma_ch_rf_dummy(clk, rst,
511
                        pointer, pointer_s, ch_csr, ch_txsz, ch_adr0, ch_adr1,
512
                        ch_am0, ch_am1, sw_pointer, ch_stop, ch_dis, int,
513
 
514
                        wb_rf_din, wb_rf_adr, wb_rf_we, wb_rf_re,
515
 
516
                        // DMA Registers Write Back Channel Select
517
                        ch_sel, ndnr,
518
 
519
                        // DMA Engine Status
520
                        dma_busy, dma_err, dma_done, dma_done_all,
521
 
522
                        // DMA Engine Reg File Update ctrl signals
523
                        de_csr, de_txsz, de_adr0, de_adr1,
524
                        de_csr_we, de_txsz_we, de_adr0_we, de_adr1_we,
525
                        de_fetch_descr, dma_rest,
526
                        ptr_set
527
 
528
                );
529
 
530
parameter       CH_NO = 0;
531
parameter       HAVE_ARS = 1;
532
parameter       HAVE_ED  = 1;
533
parameter       HAVE_CBUF= 1;
534
 
535
input           clk, rst;
536
 
537
output  [31:0]   pointer;
538
output  [31:0]   pointer_s;
539
output  [31:0]   ch_csr;
540
output  [31:0]   ch_txsz;
541
output  [31:0]   ch_adr0;
542
output  [31:0]   ch_adr1;
543
output  [31:0]   ch_am0;
544
output  [31:0]   ch_am1;
545
output  [31:0]   sw_pointer;
546
output          ch_stop;
547
output          ch_dis;
548
output          int;
549
 
550
input   [31:0]   wb_rf_din;
551
input   [7:0]    wb_rf_adr;
552
input           wb_rf_we;
553
input           wb_rf_re;
554
 
555
input   [4:0]    ch_sel;
556
input           ndnr;
557
 
558
// DMA Engine Status
559
input           dma_busy, dma_err, dma_done, dma_done_all;
560
 
561
// DMA Engine Reg File Update ctrl signals
562
input   [31:0]   de_csr;
563
input   [11:0]   de_txsz;
564
input   [31:0]   de_adr0;
565
input   [31:0]   de_adr1;
566
input           de_csr_we, de_txsz_we, de_adr0_we, de_adr1_we, ptr_set;
567
input           de_fetch_descr;
568
input           dma_rest;
569
 
570
assign          pointer = 32'h0;
571
assign          pointer_s = 32'h0;
572
assign          ch_csr = 32'h0;
573
assign          ch_txsz = 32'h0;
574
assign          ch_adr0 = 32'h0;
575
assign          ch_adr1 = 32'h0;
576
assign          ch_am0 = 32'h0;
577
assign          ch_am1 = 32'h0;
578
assign          sw_pointer = 32'h0;
579
assign          ch_stop = 1'b0;
580
assign          ch_dis = 1'b0;
581
assign          int = 1'b0;
582
 
583
endmodule

powered by: WebSVN 2.1.0

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