1、优先轮询:优先级始终不变,2态状态机实现工作状态,if语句实现优先级:
module arbiter_priority (
input clk,
input rst_n,
input [2:0]req_vec,//请求用户向量
input [2:0]req_end,//请求结束向量
output reg [2:0]gnt_vec//授权向量
);
localparam IDLE = 'b01,END_ACCESS = 'b10;//待机、工作中
reg [1:0]state,state_nxt;
reg [2:0]gnt_vec_nxt;
wire any_req;
assign any_req = (req_vec!='b0);//任意请求
always@(*)begin
state_nxt = state;
gnt_vec_nxt = gnt_vec;//默认
case(state)
IDLE:begin
if(any_req)
state_nxt = END_ACCESS;
if(req_vec[0])
gnt_vec_nxt = 'b001;
else if (req_vec[1])
gnt_vec_nxt = 'b010;
else if (req_vec[2])
gnt_vec_nxt = 'b100;
else
gnt_vec_nxt = gnt_vec;
end
END_ACCESS:begin
if((req_end[0]&gnt_vec[0])||
(req_end[1]&gnt_vec[1])||
(req_end[2]&gnt_vec[2]))begin
if(any_req)
state_nxt = END_ACCESS;
else
state_nxt = IDLE;
if(req_vec[0])//低位为最高优先级
gnt_vec_nxt = 'b001;
else if (req_vec[1])
gnt_vec_nxt = 'b010;
else if (req_vec[2])
gnt_vec_nxt = 'b100;
else
gnt_vec_nxt = gnt_vec;
end
end
endcase
end
always @(posedge clk or negedge rst_n) begin
if(rst_n)begin
state<=IDLE;
gnt_vec<='b0;
end
else begin
state<=state_nxt;
gnt_vec<=gnt_vec_nxt;
end
end
endmodule
2、公平轮询,按低位到高位的优先级开始,谁上一次被授权,就变为最低优先级(最大数字),例如:时刻0,默认优先级:210(数字越小越优先);时刻1,给与0通道响应,req_vec = 3'b001,则此时优先级变为102; // 时刻2,若2通道和1通道同时发出仲裁需求即req_vec = 3’b110,按照优先级规则需要给1通道响应,即gnt_vec = 3'b010,此时优先级变为021 // 时刻3,若2通道和0通道同时发出仲裁需求即req_vec = 3’b101,按照优先级规则需要给2通道响应,即gnt_vec = 3'b100,此时优先级变为210。
module arbiter_round #(
parameter USER_NUM = 3;
) (
input clk,
input rst_n,
input [USER_NUM-1:0] req_vector,//请求
input [USER_NUM-1:0] end_access_vector,//请求结束
output reg [USER_NUM-1:0] gnt_vector//授权用户
);
parameter IDLE = 2'b01,
END_ACCESS = 2'b10;
reg [1:0] state,state_nxt;
reg [USER_NUM-1:0] gnt_vector_nxt;
reg [1:0] gnt_posn,gnt_posn_nxt;//目前授权位置,用来改写轮询顺序,或者说是轮询转盘指示器,
reg [USER_NUM-1:0] req_vector_turn;//新轮询
wire any_req;
assign any_req = (req_vector!='b0);
always@(*)begin
req_vector_turn = req_vector;//default
case(gnt_posn)
2'b00:req_vector_turn={req_vector[0],req_vector[2:1]}; //默认优先级是高位到低位:210,数字越小越优先,上个授权为00,req_vector[0]排到最高位(最低授权),其他依次
2'b01:req_vector_turn={req_vector[1:0],req_vector[2]};//上个授权是1,把1排到最高去
2'b10:req_vector_turn={req_vector[2:0]};//上个授权是2,把2排到最高,回到210,即轮询
default
endcas


4285

被折叠的 条评论
为什么被折叠?



