mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
| //----------------------------------------------------
 | |
| // 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
 |