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

Subversion Repositories round_robin_arbiter

[/] [round_robin_arbiter/] [trunk/] [round_robin_arbiter3.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rainrhythm
//Using Two Simple Priority Arbiters with a Mask - scalable
2
//author: dongjun_luo@hotmail.com
3
module round_robin_arbiter (
4
        rst_an,
5
        clk,
6
        req,
7
        grant
8
);
9
 
10
parameter N = 4;
11
 
12
input           rst_an;
13
input           clk;
14
input   [N-1:0]  req;
15
output  [N-1:0]  grant;
16
 
17
reg     [N-1:0]  rotate_ptr;
18
wire    [N-1:0]  mask_req;
19
wire    [N-1:0]  mask_grant;
20
wire    [N-1:0]  grant_comb;
21
reg     [N-1:0]  grant;
22
wire            no_mask_req;
23
wire    [N-1:0] nomask_grant;
24
wire            update_ptr;
25
genvar i;
26
 
27
// rotate pointer update logic
28
assign update_ptr = |grant[N-1:0];
29
always @ (posedge clk or negedge rst_an)
30
begin
31
        if (!rst_an)
32
                rotate_ptr[N-1:0] <= {N{1'b1}};
33
        else if (update_ptr)
34
        begin
35
                // note: N must be at least 2
36
                rotate_ptr[0] <= grant[N-1];
37
                rotate_ptr[1] <= grant[N-1] | grant[0];
38
        end
39
end
40
 
41
generate
42
for (i=2;i<N;i=i+1)
43
always @ (posedge clk or negedge rst_an)
44
begin
45
        if (!rst_an)
46
                rotate_ptr[i] <= 1'b1;
47
        else if (update_ptr)
48
                rotate_ptr[i] <= grant[N-1] | (|grant[i-1:0]);
49
end
50
endgenerate
51
 
52
// mask grant generation logic
53
assign mask_req[N-1:0] = req[N-1:0] & rotate_ptr[N-1:0];
54
 
55
assign mask_grant[0] = mask_req[0];
56
generate
57
for (i=1;i<N;i=i+1)
58
        assign mask_grant[i] = (~|mask_req[i-1:0]) & mask_req[i];
59
endgenerate
60
 
61
// non-mask grant generation logic
62
assign nomask_grant[0] = req[0];
63
generate
64
for (i=1;i<N;i=i+1)
65
        assign nomask_grant[i] = (~|req[i-1:0]) & req[i];
66
endgenerate
67
 
68
// grant generation logic
69
assign no_mask_req = ~|mask_req[N-1:0];
70
assign grant_comb[N-1:0] = mask_grant[N-1:0] | (nomask_grant[N-1:0] & {N{no_mask_req}});
71
 
72
always @ (posedge clk or negedge rst_an)
73
begin
74
        if (!rst_an)    grant[N-1:0] <= {N{1'b0}};
75
        else            grant[N-1:0] <= grant_comb[N-1:0] & ~grant[N-1:0];
76
end
77
endmodule

powered by: WebSVN 2.1.0

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