| //---------------------------------------------------- | |
| // 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 |