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

📄 pci_arbiter.v

📁 pci pci转local bus总线的应用
💻 V
字号:

// PCI BUS ARBITER
//WRITTEN BY MARIA GEORGE

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

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

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 clk, reset_;
reg Bus_busy;

// below added Dec 1 2:32

//ckpad	ckpad1 (clk_in,clk);
assign clk = clk_in;


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


//assign Bus_busy = !frame_ && !irdy_;

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

//assign GNTX_ = (Bus_busy)?GNT_set_:R2GNT_set_;


always @ (frame_ or irdy_)
	begin
	 if (!frame_ || !irdy_)
		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_;
//		 GNTX_	= GNT_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
			default:
  				begin
		 		end
			endcase
			end
		endcase
		end
	end
endmodule


⌨️ 快捷键说明

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