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

Subversion Repositories wb_dma

[/] [wb_dma/] [trunk/] [rtl/] [verilog/] [wb_dma_ch_pri_enc.v] - Blame information for rev 10

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

Line No. Rev Author Line
1 5 rudi
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  WISHBONE DMA Priority Encoder                              ////
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
//// Copyright (C) 2001 Rudolf Usselmann                         ////
15
////                    rudi@asics.ws                            ////
16
////                                                             ////
17
//// This source file may be used and distributed without        ////
18
//// restriction provided that this copyright statement is not   ////
19
//// removed from the file and that any derivative work contains ////
20
//// the original copyright notice and the associated disclaimer.////
21
////                                                             ////
22
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
23
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
24
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
25
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
26
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
27
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
28
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
29
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
30
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
31
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
32
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
33
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
34
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
35
////                                                             ////
36
/////////////////////////////////////////////////////////////////////
37
 
38
//  CVS Log
39
//
40 10 rudi
//  $Id: wb_dma_ch_pri_enc.v,v 1.4 2001-10-19 04:35:04 rudi Exp $
41 5 rudi
//
42 10 rudi
//  $Date: 2001-10-19 04:35:04 $
43
//  $Revision: 1.4 $
44 5 rudi
//  $Author: rudi $
45
//  $Locker:  $
46
//  $State: Exp $
47
//
48
// Change History:
49
//               $Log: not supported by cvs2svn $
50 10 rudi
//               Revision 1.3  2001/08/15 05:40:30  rudi
51
//
52
//               - Changed IO names to be more clear.
53
//               - Uniquifyed define names to be core specific.
54
//               - Added Section 3.10, describing DMA restart.
55
//
56 8 rudi
//               Revision 1.2  2001/08/07 08:00:43  rudi
57
//
58
//
59
//               Split up priority encoder modules to separate files
60
//
61 6 rudi
//               Revision 1.1  2001/07/29 08:57:02  rudi
62
//
63
//
64
//               1) Changed Directory Structure
65
//               2) Added restart signal (REST)
66
//
67 5 rudi
//               Revision 1.2  2001/06/05 10:22:36  rudi
68
//
69
//
70
//               - Added Support of up to 31 channels
71
//               - Added support for 2,4 and 8 priority levels
72
//               - Now can have up to 31 channels
73
//               - Added many configuration items
74
//               - Changed reset to async
75
//
76
//               Revision 1.1.1.1  2001/03/19 13:10:50  rudi
77
//               Initial Release
78
//
79
//
80
//
81
 
82
`include "wb_dma_defines.v"
83
 
84
// Priority Encoder
85
//
86
// Determines the channel with the highest priority, also takes
87
// the valid bit in consideration
88
 
89
module wb_dma_ch_pri_enc(clk, valid,
90
                pri0, pri1, pri2, pri3,
91
                pri4, pri5, pri6, pri7,
92
                pri8, pri9, pri10, pri11,
93
                pri12, pri13, pri14, pri15,
94
                pri16, pri17, pri18, pri19,
95
                pri20, pri21, pri22, pri23,
96
                pri24, pri25, pri26, pri27,
97
                pri28, pri29, pri30,
98
                pri_out);
99
 
100 10 rudi
////////////////////////////////////////////////////////////////////
101
//
102
// Module Parameters
103
//
104
 
105
// chXX_conf = { CBUF, ED, ARS, EN }
106
parameter       [1:0]    pri_sel = 2'd0;
107
parameter       [3:0]    ch0_conf = 4'h1;
108
parameter       [3:0]    ch1_conf = 4'h0;
109
parameter       [3:0]    ch2_conf = 4'h0;
110
parameter       [3:0]    ch3_conf = 4'h0;
111
parameter       [3:0]    ch4_conf = 4'h0;
112
parameter       [3:0]    ch5_conf = 4'h0;
113
parameter       [3:0]    ch6_conf = 4'h0;
114
parameter       [3:0]    ch7_conf = 4'h0;
115
parameter       [3:0]    ch8_conf = 4'h0;
116
parameter       [3:0]    ch9_conf = 4'h0;
117
parameter       [3:0]    ch10_conf = 4'h0;
118
parameter       [3:0]    ch11_conf = 4'h0;
119
parameter       [3:0]    ch12_conf = 4'h0;
120
parameter       [3:0]    ch13_conf = 4'h0;
121
parameter       [3:0]    ch14_conf = 4'h0;
122
parameter       [3:0]    ch15_conf = 4'h0;
123
parameter       [3:0]    ch16_conf = 4'h0;
124
parameter       [3:0]    ch17_conf = 4'h0;
125
parameter       [3:0]    ch18_conf = 4'h0;
126
parameter       [3:0]    ch19_conf = 4'h0;
127
parameter       [3:0]    ch20_conf = 4'h0;
128
parameter       [3:0]    ch21_conf = 4'h0;
129
parameter       [3:0]    ch22_conf = 4'h0;
130
parameter       [3:0]    ch23_conf = 4'h0;
131
parameter       [3:0]    ch24_conf = 4'h0;
132
parameter       [3:0]    ch25_conf = 4'h0;
133
parameter       [3:0]    ch26_conf = 4'h0;
134
parameter       [3:0]    ch27_conf = 4'h0;
135
parameter       [3:0]    ch28_conf = 4'h0;
136
parameter       [3:0]    ch29_conf = 4'h0;
137
parameter       [3:0]    ch30_conf = 4'h0;
138
 
139
////////////////////////////////////////////////////////////////////
140
//
141
// Module IOs
142
//
143
 
144 5 rudi
input           clk;
145
input   [30:0]   valid;                          // Channel Valid bits
146
input   [2:0]    pri0, pri1, pri2, pri3;         // Channel Priorities
147
input   [2:0]    pri4, pri5, pri6, pri7;
148
input   [2:0]    pri8, pri9, pri10, pri11;
149
input   [2:0]    pri12, pri13, pri14, pri15;
150
input   [2:0]    pri16, pri17, pri18, pri19;
151
input   [2:0]    pri20, pri21, pri22, pri23;
152
input   [2:0]    pri24, pri25, pri26, pri27;
153
input   [2:0]    pri28, pri29, pri30;
154
output  [2:0]    pri_out;                        // Highest unserviced priority
155
 
156
wire    [7:0]    pri0_out, pri1_out, pri2_out, pri3_out;
157
wire    [7:0]    pri4_out, pri5_out, pri6_out, pri7_out;
158
wire    [7:0]    pri8_out, pri9_out, pri10_out, pri11_out;
159
wire    [7:0]    pri12_out, pri13_out, pri14_out, pri15_out;
160
wire    [7:0]    pri16_out, pri17_out, pri18_out, pri19_out;
161
wire    [7:0]    pri20_out, pri21_out, pri22_out, pri23_out;
162
wire    [7:0]    pri24_out, pri25_out, pri26_out, pri27_out;
163
wire    [7:0]    pri28_out, pri29_out, pri30_out;
164
 
165
wire    [7:0]    pri_out_tmp;
166
reg     [2:0]    pri_out;
167 10 rudi
reg     [2:0]    pri_out2;
168
reg     [2:0]    pri_out1;
169
reg     [2:0]    pri_out0;
170 5 rudi
 
171 10 rudi
wb_dma_pri_enc_sub #(ch1_conf,pri_sel) u0(      // Use channel config 1 for channel 0 encoder
172 5 rudi
                .valid(         valid[0] ),
173
                .pri_in(        pri0            ),
174
                .pri_out(       pri0_out        )
175
                );
176 10 rudi
wb_dma_pri_enc_sub #(ch1_conf,pri_sel) u1(
177 5 rudi
                .valid(         valid[1]        ),
178
                .pri_in(        pri1            ),
179
                .pri_out(       pri1_out        )
180
                );
181 10 rudi
wb_dma_pri_enc_sub #(ch2_conf,pri_sel) u2(
182 5 rudi
                .valid(         valid[2]        ),
183
                .pri_in(        pri2            ),
184
                .pri_out(       pri2_out        )
185
                );
186 10 rudi
wb_dma_pri_enc_sub #(ch3_conf,pri_sel) u3(
187 5 rudi
                .valid(         valid[3]        ),
188
                .pri_in(        pri3            ),
189
                .pri_out(       pri3_out        )
190
                );
191 10 rudi
wb_dma_pri_enc_sub #(ch4_conf,pri_sel) u4(
192 5 rudi
                .valid(         valid[4]        ),
193
                .pri_in(        pri4            ),
194
                .pri_out(       pri4_out        )
195
                );
196 10 rudi
wb_dma_pri_enc_sub #(ch5_conf,pri_sel) u5(
197 5 rudi
                .valid(         valid[5]        ),
198
                .pri_in(        pri5            ),
199
                .pri_out(       pri5_out        )
200
                );
201 10 rudi
wb_dma_pri_enc_sub #(ch6_conf,pri_sel) u6(
202 5 rudi
                .valid(         valid[6]        ),
203
                .pri_in(        pri6            ),
204
                .pri_out(       pri6_out        )
205
                );
206 10 rudi
wb_dma_pri_enc_sub #(ch7_conf,pri_sel) u7(
207 5 rudi
                .valid(         valid[7]        ),
208
                .pri_in(        pri7            ),
209
                .pri_out(       pri7_out        )
210
                );
211 10 rudi
wb_dma_pri_enc_sub #(ch8_conf,pri_sel) u8(
212 5 rudi
                .valid(         valid[8]        ),
213
                .pri_in(        pri8            ),
214
                .pri_out(       pri8_out        )
215
                );
216 10 rudi
wb_dma_pri_enc_sub #(ch9_conf,pri_sel) u9(
217 5 rudi
                .valid(         valid[9]        ),
218
                .pri_in(        pri9            ),
219
                .pri_out(       pri9_out        )
220
                );
221 10 rudi
wb_dma_pri_enc_sub #(ch10_conf,pri_sel) u10(
222 5 rudi
                .valid(         valid[10]       ),
223
                .pri_in(        pri10           ),
224
                .pri_out(       pri10_out       )
225
                );
226 10 rudi
wb_dma_pri_enc_sub #(ch11_conf,pri_sel) u11(
227 5 rudi
                .valid(         valid[11]       ),
228
                .pri_in(        pri11           ),
229
                .pri_out(       pri11_out       )
230
                );
231 10 rudi
wb_dma_pri_enc_sub #(ch12_conf,pri_sel) u12(
232 5 rudi
                .valid(         valid[12]       ),
233
                .pri_in(        pri12           ),
234
                .pri_out(       pri12_out       )
235
                );
236 10 rudi
wb_dma_pri_enc_sub #(ch13_conf,pri_sel) u13(
237 5 rudi
                .valid(         valid[13]       ),
238
                .pri_in(        pri13           ),
239
                .pri_out(       pri13_out       )
240
                );
241 10 rudi
wb_dma_pri_enc_sub #(ch14_conf,pri_sel) u14(
242 5 rudi
                .valid(         valid[14]       ),
243
                .pri_in(        pri14           ),
244
                .pri_out(       pri14_out       )
245
                );
246 10 rudi
wb_dma_pri_enc_sub #(ch15_conf,pri_sel) u15(
247 5 rudi
                .valid(         valid[15]       ),
248
                .pri_in(        pri15           ),
249
                .pri_out(       pri15_out       )
250
                );
251 10 rudi
wb_dma_pri_enc_sub #(ch16_conf,pri_sel) u16(
252 5 rudi
                .valid(         valid[16]       ),
253
                .pri_in(        pri16           ),
254
                .pri_out(       pri16_out       )
255
                );
256 10 rudi
wb_dma_pri_enc_sub #(ch17_conf,pri_sel) u17(
257 5 rudi
                .valid(         valid[17]       ),
258
                .pri_in(        pri17           ),
259
                .pri_out(       pri17_out       )
260
                );
261 10 rudi
wb_dma_pri_enc_sub #(ch18_conf,pri_sel) u18(
262 5 rudi
                .valid(         valid[18]       ),
263
                .pri_in(        pri18           ),
264
                .pri_out(       pri18_out       )
265
                );
266 10 rudi
wb_dma_pri_enc_sub #(ch19_conf,pri_sel) u19(
267 5 rudi
                .valid(         valid[19]       ),
268
                .pri_in(        pri19           ),
269
                .pri_out(       pri19_out       )
270
                );
271 10 rudi
wb_dma_pri_enc_sub #(ch20_conf,pri_sel) u20(
272 5 rudi
                .valid(         valid[20]       ),
273
                .pri_in(        pri20           ),
274
                .pri_out(       pri20_out       )
275
                );
276 10 rudi
wb_dma_pri_enc_sub #(ch21_conf,pri_sel) u21(
277 5 rudi
                .valid(         valid[21]       ),
278
                .pri_in(        pri21           ),
279
                .pri_out(       pri21_out       )
280
                );
281 10 rudi
wb_dma_pri_enc_sub #(ch22_conf,pri_sel) u22(
282 5 rudi
                .valid(         valid[22]       ),
283
                .pri_in(        pri22           ),
284
                .pri_out(       pri22_out       )
285
                );
286 10 rudi
wb_dma_pri_enc_sub #(ch23_conf,pri_sel) u23(
287 5 rudi
                .valid(         valid[23]       ),
288
                .pri_in(        pri23           ),
289
                .pri_out(       pri23_out       )
290
                );
291 10 rudi
wb_dma_pri_enc_sub #(ch24_conf,pri_sel) u24(
292 5 rudi
                .valid(         valid[24]       ),
293
                .pri_in(        pri24           ),
294
                .pri_out(       pri24_out       )
295
                );
296 10 rudi
wb_dma_pri_enc_sub #(ch25_conf,pri_sel) u25(
297 5 rudi
                .valid(         valid[25]       ),
298
                .pri_in(        pri25           ),
299
                .pri_out(       pri25_out       )
300
                );
301 10 rudi
wb_dma_pri_enc_sub #(ch26_conf,pri_sel) u26(
302 5 rudi
                .valid(         valid[26]       ),
303
                .pri_in(        pri26           ),
304
                .pri_out(       pri26_out       )
305
                );
306 10 rudi
wb_dma_pri_enc_sub #(ch27_conf,pri_sel) u27(
307 5 rudi
                .valid(         valid[27]       ),
308
                .pri_in(        pri27           ),
309
                .pri_out(       pri27_out       )
310
                );
311 10 rudi
wb_dma_pri_enc_sub #(ch28_conf,pri_sel) u28(
312 5 rudi
                .valid(         valid[28]       ),
313
                .pri_in(        pri28           ),
314
                .pri_out(       pri28_out       )
315
                );
316 10 rudi
wb_dma_pri_enc_sub #(ch29_conf,pri_sel) u29(
317 5 rudi
                .valid(         valid[29]       ),
318
                .pri_in(        pri29           ),
319
                .pri_out(       pri29_out       )
320
                );
321 10 rudi
wb_dma_pri_enc_sub #(ch30_conf,pri_sel) u30(
322 5 rudi
                .valid(         valid[30]       ),
323
                .pri_in(        pri30           ),
324
                .pri_out(       pri30_out       )
325
                );
326
 
327
assign pri_out_tmp =    pri0_out | pri1_out | pri2_out | pri3_out |
328
                        pri4_out | pri5_out | pri6_out | pri7_out |
329
                        pri8_out | pri9_out | pri10_out | pri11_out |
330
                        pri12_out | pri13_out | pri14_out | pri15_out |
331
                        pri16_out | pri17_out | pri18_out | pri19_out |
332
                        pri20_out | pri21_out | pri22_out | pri23_out |
333
                        pri24_out | pri25_out | pri26_out | pri27_out |
334
                        pri28_out | pri29_out | pri30_out;
335
 
336 10 rudi
// 8 Priority Levels
337 5 rudi
always @(posedge clk)
338 10 rudi
        if(pri_out_tmp[7])      pri_out2 <= #1 3'h7;
339 5 rudi
        else
340 10 rudi
        if(pri_out_tmp[6])      pri_out2 <= #1 3'h6;
341 5 rudi
        else
342 10 rudi
        if(pri_out_tmp[5])      pri_out2 <= #1 3'h5;
343 5 rudi
        else
344 10 rudi
        if(pri_out_tmp[4])      pri_out2 <= #1 3'h4;
345 5 rudi
        else
346 10 rudi
        if(pri_out_tmp[3])      pri_out2 <= #1 3'h3;
347 5 rudi
        else
348 10 rudi
        if(pri_out_tmp[2])      pri_out2 <= #1 3'h2;
349 5 rudi
        else
350 10 rudi
        if(pri_out_tmp[1])      pri_out2 <= #1 3'h1;
351
        else                    pri_out2 <= #1 3'h0;
352
 
353
// 4 Priority Levels
354
always @(posedge clk)
355
        if(pri_out_tmp[3])      pri_out1 <= #1 3'h3;
356 5 rudi
        else
357 10 rudi
        if(pri_out_tmp[2])      pri_out1 <= #1 3'h2;
358 5 rudi
        else
359 10 rudi
        if(pri_out_tmp[1])      pri_out1 <= #1 3'h1;
360
        else                    pri_out1 <= #1 3'h0;
361 5 rudi
 
362 10 rudi
// 2 Priority Levels
363
always @(posedge clk)
364
        if(pri_out_tmp[1])      pri_out0 <= #1 3'h1;
365
        else                    pri_out0 <= #1 3'h0;
366
 
367
// Select configured priority
368
always @(pri_sel or pri_out0 or pri_out1 or  pri_out2)
369
        case(pri_sel)           // synopsys parallel_case full_case
370
           2'd0: pri_out = pri_out0;
371
           2'd1: pri_out = pri_out1;
372
           2'd2: pri_out = pri_out2;
373
        endcase
374
 
375 5 rudi
endmodule

powered by: WebSVN 2.1.0

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