//---------------------------------------------------- // A four level, round-robin arbiter. This was // orginally coded by WD Peterson in VHDL. //---------------------------------------------------- module arbiter ( clk, rst, req3, req2, req1, req0, gnt3, gnt2, gnt1, gnt0 ); // --------------Port Declaration----------------------- input clk; input rst; input req3; input req2; input req1; input req0; output gnt3; output gnt2; output gnt1; output gnt0; //--------------Internal Registers---------------------- wire [1:0] gnt ; wire comreq ; wire beg ; wire [1:0] lgnt ; wire lcomreq ; reg lgnt0 ; reg lgnt1 ; reg lgnt2 ; reg lgnt3 ; reg lasmask ; reg lmask0 ; reg lmask1 ; reg ledge ; //--------------Code Starts Here----------------------- always @ (posedge clk) if (rst) begin lgnt0 <= 0; lgnt1 <= 0; lgnt2 <= 0; lgnt3 <= 0; end else begin lgnt0 <=(~lcomreq & ~lmask1 & ~lmask0 & ~req3 & ~req2 & ~req1 & req0) | (~lcomreq & ~lmask1 & lmask0 & ~req3 & ~req2 & req0) | (~lcomreq & lmask1 & ~lmask0 & ~req3 & req0) | (~lcomreq & lmask1 & lmask0 & req0 ) | ( lcomreq & lgnt0 ); lgnt1 <=(~lcomreq & ~lmask1 & ~lmask0 & req1) | (~lcomreq & ~lmask1 & lmask0 & ~req3 & ~req2 & req1 & ~req0) | (~lcomreq & lmask1 & ~lmask0 & ~req3 & req1 & ~req0) | (~lcomreq & lmask1 & lmask0 & req1 & ~req0) | ( lcomreq & lgnt1); lgnt2 <=(~lcomreq & ~lmask1 & ~lmask0 & req2 & ~req1) | (~lcomreq & ~lmask1 & lmask0 & req2) | (~lcomreq & lmask1 & ~lmask0 & ~req3 & req2 & ~req1 & ~req0) | (~lcomreq & lmask1 & lmask0 & req2 & ~req1 & ~req0) | ( lcomreq & lgnt2); lgnt3 <=(~lcomreq & ~lmask1 & ~lmask0 & req3 & ~req2 & ~req1) | (~lcomreq & ~lmask1 & lmask0 & req3 & ~req2) | (~lcomreq & lmask1 & ~lmask0 & req3) | (~lcomreq & lmask1 & lmask0 & req3 & ~req2 & ~req1 & ~req0) | ( lcomreq & lgnt3); end //---------------------------------------------------- // lasmask state machine. //---------------------------------------------------- assign beg = (req3 | req2 | req1 | req0) & ~lcomreq; always @ (posedge clk) begin lasmask <= (beg & ~ledge & ~lasmask); ledge <= (beg & ~ledge & lasmask) | (beg & ledge & ~lasmask); end //---------------------------------------------------- // comreq logic. //---------------------------------------------------- assign lcomreq = ( req3 & lgnt3 ) | ( req2 & lgnt2 ) | ( req1 & lgnt1 ) | ( req0 & lgnt0 ); //---------------------------------------------------- // Encoder logic. //---------------------------------------------------- assign lgnt = {(lgnt3 | lgnt2),(lgnt3 | lgnt1)}; //---------------------------------------------------- // lmask register. //---------------------------------------------------- always @ (posedge clk ) if( rst ) begin lmask1 <= 0; lmask0 <= 0; end else if(lasmask) begin lmask1 <= lgnt[1]; lmask0 <= lgnt[0]; end else begin lmask1 <= lmask1; lmask0 <= lmask0; end assign comreq = lcomreq; assign gnt = lgnt; //---------------------------------------------------- // Drive the outputs //---------------------------------------------------- assign gnt3 = lgnt3; assign gnt2 = lgnt2; assign gnt1 = lgnt1; assign gnt0 = lgnt0; endmodule d='n7' href='#n7'>7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162