⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci_arbi.v

📁 pci接口的verilog原代码,定义了pci接口所需要的全部引脚
💻 V
字号:

// PCI BUS ARBITER
//WRITTEN BY MARIA GEORGE

`include "c:\pasic\spde\data\macros.v"

module Arbiter (REQ_, reset_, clk_in, frame_, irdy_, GNT_, adbus, cbe);

parameter MASTERS = 6; //This code can handle a maximum of six masters.
parameter [MASTERS:0]
DEVICE1 = 7'b0000001, 
DEVICE2 = 7'b0000010, 
DEVICE3 = 7'b0000100, 
DEVICE4 = 7'b0001000,
DEVICE5 = 7'b0010000, 
DEVICE6 = 7'b0100000, 
IDLE = 7'b1000000;  

parameter [1:MASTERS]
GNT_DEV1 = 6'b011111, 
GNT_DEV2 = 6'b101111, 
GNT_DEV3 = 6'b110111, 
GNT_DEV4 = 6'b111011,
GNT_DEV5 = 6'b111101, 
GNT_DEV6 = 6'b111110,
GNT_NONE = 6'b111111; 


input [1:MASTERS] REQ_;

input reset_, clk_in, frame_, irdy_;
output [1:MASTERS] GNT_;
output [31:0] adbus;
output [3:0] cbe;
reg [1:MASTERS] GNT_set_;
wire[1:MASTERS] GNT_;
reg[1:MASTERS] GNTX_;
reg [31:0] adbus;
reg [3:0] cbe;

reg [3:0] clk_num;

reg [MASTERS:0] state;
reg [1:MASTERS] RREQ_;
reg [1:MASTERS] R1GNT_set_;
//reg [1:MASTERS] R2GNT_set_;
wire clk_num_rst;
wire en;
wire clk, reset_;
reg Bus_busy;

// below added Dec 1 2:32


ckpad ckpad1 (clk_in, clk);

always @ (posedge clk or negedge reset_)
begin
if (!reset_)
 RREQ_ = 6'b111_111;
else
 RREQ_= REQ_;
end
 	   
	   

//assign Bus_busy = !frame_;
assign GNT_ = (reset_)?GNTX_: 6'hz;     //Grants are tristated on reset 
//assign GNTX_ = (Bus_busy)?GNT_set_:R2GNT_set_;  


always @ (frame_)
 begin
  if (!frame_)
   Bus_busy = 1'b1;
  else
   Bus_busy = 1'b0;
 end
 
 

always @(posedge clk or negedge reset_)
	begin	
	 	if(!reset_)
			clk_num = 4'h0;
		else if (!Bus_busy)
		  clk_num = clk_num +1;
		else
		  clk_num = 4'h0;
   end 
			
always @ (posedge clk or negedge reset_)
begin
if (!reset_)
  begin
  R1GNT_set_ = 6'h3F;
  GNTX_ = GNT_NONE;
  end
 else if (REQ_ == 6'h3F)  //At start-up:Bus Idle and no Requests hence Grants are de-asserted
     GNTX_ = GNT_NONE;
 else if (!Bus_busy & GNT_set_ != GNT_NONE)  //Current Owner of Bus in Stepping Mode
  begin
  R1GNT_set_ = GNT_set_;
  GNTX_ = R1GNT_set_;
  end
 else
   GNTX_ = GNT_set_;                      // Bus Busy 
 end



always @ (posedge clk or negedge reset_)

  begin
    if (!reset_)
	   begin
		  state = IDLE;
		  adbus = 32'h0;
		  cbe = 4'h0;
		  GNT_set_= GNT_NONE;		  		 
		  end

  else if (REQ_ == 6'h3F)  //At start-up:Bus Idle and no Requests hence Grants are de-asserted
     GNT_set_ = GNT_NONE;
     
  //else if (clk_num == 4'hF)         //16 CLOCK Latency Check                           
		//GNT_set_ = GNT_NONE;
	  	
  else if (Bus_busy | GNT_set_ == GNT_NONE | clk_num == 4'hF) 
    begin
   case (state)   
  DEVICE1:begin				   
		  
	casex (RREQ_)
	
	6'bX0XXXX:	        //Rotational Priority Scheme.
			  begin
			  state = DEVICE2;
			  GNT_set_ = GNT_DEV2;
			  		  
			  end
   6'bX10XXX:
			  begin
			  state = DEVICE3;
			  GNT_set_ = GNT_DEV3;
			 
			  end
  6'bX110XX:
			  begin
			  state = DEVICE4;
			  GNT_set_ = GNT_DEV4;
			 
			  
			  end
  6'bX1110X:
			  begin
			  state = DEVICE5;
			  GNT_set_ = GNT_DEV5;
			
			  
			  end
  6'bX11110:
			  begin
			  state = DEVICE6;
			  GNT_set_ = GNT_DEV6;	  
			  
			  end
   default                     //Bus Parking:Bus Granted to Last User.
			  begin
			  state = DEVICE1;
			  GNT_set_ = GNT_DEV1;
			  
			  end
			 endcase
			 end
	//else
	  //GNTX_ = GNT_set_;
	
	
   DEVICE2:begin
						
		casex(RREQ_)
         
  6'bXX0XXX:                         //Rotational Priority Scheme.
			  begin
			  state = DEVICE3;
			  GNT_set_ = GNT_DEV3;

			  end
   6'bXX10XX:
			  begin
			  state = DEVICE4;
			  GNT_set_ = GNT_DEV4;
			  end
  6'bXX110X:
			  begin
			  state = DEVICE5;
			  GNT_set_ = GNT_DEV5;
 
			  end
  6'bXX1110:
			  begin
			  state = DEVICE6;
			  GNT_set_ = GNT_DEV6;

			  end
  6'b0X1111:
			  begin
			  state = DEVICE1;
			  GNT_set_ = GNT_DEV1;
			
			  
	  		  end
   default                        //Bus Parking:Bus Granted to Last User.
			  begin
			  state = DEVICE2;
			  GNT_set_ = GNT_DEV2;
			
			  end
		 endcase
			 end
	//else
	  //GNTX_ = GNT_set_;
	
		 


	  DEVICE3:begin			   
			casex(RREQ_)
  6'bXXX0XX:                        //Rotational Priority Scheme.
			  begin
			  state = DEVICE4;
			  GNT_set_ = GNT_DEV4;
		  
			  end
   6'bXXX10X:
			  begin
			  state = DEVICE5;
			  GNT_set_ = GNT_DEV5;
		
			  end
  6'bXXX110:
			  begin
			  state = DEVICE6;
			  GNT_set_ = GNT_DEV6;
		 
			  end
  6'b0XX111:
			  begin
			  state = DEVICE1;
			  GNT_set_ = GNT_DEV1;
		
	  		  end
  6'b10X111:
			  begin
			  state = DEVICE2;
			  GNT_set_ = GNT_DEV2;
		  
			  end
  
   default                             //Bus Parking:Bus Granted to Last User.
			  begin
			  state = DEVICE3;
			  GNT_set_ = GNT_DEV3;
	  
			  end
		 endcase
		 end
	//else
	  //GNTX_ = GNT_set_;
		 
   	  
	  DEVICE4:begin
							   
	 	casex(RREQ_)
  6'bXXXX0X:     //Rotational Priority Scheme.
			  begin
			  state = DEVICE5;
			  GNT_set_ = GNT_DEV5;

			  end
   6'bXXXX10:
			  begin
			  state = DEVICE6;
			  GNT_set_ = GNT_DEV6;
		
			  end
  6'b0XXX11:
			  begin
			  state = DEVICE1;
			  GNT_set_ = GNT_DEV1;
	  
	  		  end
  6'b10XX11:
			  begin
			  state = DEVICE2;
			  GNT_set_ = GNT_DEV2;
		
			  end
  6'b110X11:
			  begin
			  state = DEVICE3;
			  GNT_set_ = GNT_DEV3;
	
			  end 
	 default                         //Bus Parking:Bus Granted to Last User.
			  begin
			  state = DEVICE4;
			  GNT_set_ = GNT_DEV4;
  
			  end
		 endcase
		  end
	//else
	  //GNTX_ = GNT_set_;
		
		 
	  DEVICE5:begin
	    
			casex(RREQ_)
	 
  6'bXXXXX0:                       //Rotational Priority Scheme.
			  begin
			  state = DEVICE6;
			  GNT_set_ = GNT_DEV6;
	 
			  end
  6'b0XXXX1:
			  begin
			  state = DEVICE1;
			  GNT_set_ = GNT_DEV1;
	 
	  		  end
  6'b10XXX1:
			  begin
			  state = DEVICE2;
			  GNT_set_ = GNT_DEV2;
	  
			  end
  6'b110XX1:
			  begin
			  state = DEVICE3;
			  GNT_set_ = GNT_DEV3;
	
			  end
  6'b1110X1:
			  begin
			  state = DEVICE4;
			  GNT_set_ = GNT_DEV4;
		 
			  end 
    default                          //Bus Parking:Bus Granted to Last User.
			  begin
			  state = DEVICE5;
			  GNT_set_ = GNT_DEV5;
		
			  end	
		 endcase
		  end
	//else
	  //GNTX_ = GNT_set_;
		
		 
		 DEVICE6:begin
	    
			casex(RREQ_)
  6'b0XXXXX:
           begin
			  state = DEVICE1;
			  GNT_set_ = GNT_DEV1;
		
			  end
  6'b10XXXX:
           begin
			  state = DEVICE2;
			  GNT_set_ = GNT_DEV2;
		  
			  end
  6'b110XXX:
           begin
			  state = DEVICE3;
			  GNT_set_ = GNT_DEV3;
	 
			  end
  6'b1110XX:
           begin
			  state = DEVICE4;
			  GNT_set_ = GNT_DEV4;
	 
			  end
  6'b11110X:
           begin
			  state = DEVICE5;
			  GNT_set_ = GNT_DEV5;
	 
			  end
   default
	       begin
			 state = DEVICE6;
			 GNT_set_ = GNT_DEV6;
		
			 end
		 endcase
		 end
    //else
	  //GNTX_ = GNT_set_;
		 

	 	 IDLE:begin
			casex(RREQ_)
  6'b0XXXXX:
           begin
           state = DEVICE1;
           GNT_set_ = GNT_DEV1;
		
           end
  6'b10XXXX:
           begin
           state = DEVICE2;
           GNT_set_ = GNT_DEV2;
	  
           end
  6'b110XXX:
           begin
			  state = DEVICE3;
			  GNT_set_ = GNT_DEV3;
		 
			  end
  6'b1110XX:
           begin
			  state = DEVICE4;
			  GNT_set_ = GNT_DEV4;
		
			  end
  6'b11110X:
           begin
			  state = DEVICE5;
			  GNT_set_ = GNT_DEV5;
		  
			  end
  6'b111110:
           begin
			  state = DEVICE6;
			  GNT_set_ = GNT_DEV6;
	  
			  end
		endcase
		end
    endcase
	 end
	 end
  endmodule


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -