📄 pci_arbi.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 + -