// ######################################################################
// Filename : prr_arbiter.v
// Description : prior round robin arbiter
// There are two working modes, divided into:
// when the input parameter "ARB_MODE=periodic",the arbiter is periodic switching arbitration
// when the input parameter "ARB_MODE=valid",the arbiter is arbitration based on Valid signal
// Author :
// Created On :
// Last Modified By:
// Last Modified On:
// Update Count :
// Status : Verified
// verilog-filelist: None
// verilog-file : None
// ######################################################################
`timescale 1ns/1ps
module prr_arbiter#(
parameter ARB_MODE = "periodic" ,//periodic , valid
parameter REQ_NUM = 8
)(
input wire clk_in ,
input wire rst_n ,
//----------------------------------------------------//
input wire [REQ_NUM-1:0] req ,
input wire [REQ_NUM-1:0] prior ,
output wire [REQ_NUM-1:0] grant
);
//==============================================================================================//
//====== define signal ========//
//==============================================================================================//
wire [REQ_NUM-1:0] req_prior;
wire [REQ_NUM-1:0] req_masked;
wire [REQ_NUM-1:0] mask_higher_req;
wire [REQ_NUM-1:0] grant_masked;
wire [REQ_NUM-1:0] req_unmasked;
wire [REQ_NUM-1:0] unmask_higher_req;
wire [REQ_NUM-1:0] grant_unmask;
reg [REQ_NUM-1:0] pointer_reg;
wire [REQ_NUM-1:0] pointer;
reg [REQ_NUM-1:0] grant_reg;
//==============================================================================================//
//====== behave of RTL ========//
//==============================================================================================//
assign req_prior = req & prior;
//--------------------------------------------------------------------
//------simple priority arbitration for masked portion ------
//--------------------------------------------------------------------
assign req_masked = (|req_prior) ? (req_prior & pointer) : (req & pointer);
assign mask_higher_req = (mask_higher_req|req_masked)<<1;
assign grant_masked = (~mask_higher_req)&req_masked;
//--------------------------------------------------------------------
//------simple priority arbitration for unmasked portion ------
//--------------------------------------------------------------------
assign req_unmasked = (|req_prior) ? req_prior : req ;
assign unmask_higher_req = (unmask_higher_req|req_unmasked)<<1;
assign grant_unmask = (~unmask_higher_req)&req_unmasked;
//--------------------------------------------------------------------
//------ ------
//--------------------------------------------------------------------
assign grant = (|req_masked) ? grant_masked : grant_unmask ;
//******************************************************************//
//------arbitration based on Valid signal ------
//******************************************************************//
generate if(ARB_MODE == "valid")begin:gen_valid_arbiter
always@(posedge clk_in or negedge rst_n)begin
if(!rst_n)begin
grant_reg <= {REQ_NUM{1'b0}};
end else begin
grant_reg <= grant;
end
end
//--------------------------------------------------------------------
//------pointer update ------
//--------------------------------------------------------------------
always@(posedge clk_in or negedge rst_n)begin
if(!rst_n)begin
pointer_reg <= {REQ_NUM{1'b1}};
end else if((|req_masked == 1'b1) && (|(grant_reg&req) == 1'b0 ))begin
pointer_reg <= mask_higher_req;
end else if((|req == 1'b1) && (|(grant_reg&req) == 1'b0 ))begin
pointer_reg <= unmask_higher_req;
end else begin
pointer_reg <= pointer_reg;
end
end
assign pointer = |(grant_reg&req) ? pointer : pointer_reg ;
//******************************************************************//
//------periodic switching arbitration ------
//******************************************************************//
end else begin:gen_periodic_arbiter
//--------------------------------------------------------------------
//------pointer update ------
//--------------------------------------------------------------------
always@(posedge clk_in or negedge rst_n)begin
if(!rst_n)begin
pointer_reg <= {REQ_NUM{1'b1}};
end else if(|req_masked == 1'b1)begin
pointer_reg <= mask_higher_req;
end else if(|req == 1'b1)begin
pointer_reg <= unmask_higher_req;
end else begin
pointer_reg <= pointer_reg;
end
end
assign pointer = pointer_reg ;
end endgenerate
endmodule
09-25
2279
07-17
900
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交