?? pci_arbiter.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 + -