更新的MCDF的仲裁器采用的是Round Robin轮询的一个仲裁机制,简单来说就是最先被授权的通道在下一次仲裁中优先级会变为最低,这样可以保证每个通道都能够获得授权,而不是一个通道长时间连续的进行数据传输,而将其他通道的数据堵塞。
整体的设计代码如下
module RR_arbiter(
clk_i,
rst_n_i,
req_vec_i,
win_vec_o,
trigger_i
);
input clk_i;
input rst_n_i;
//Request
input [3:0] req_vec_i;
//Winner
output [3:0] win_vec_o;
input trigger_i ; // trigger a aound of calculation
//--------------------------------------------------------------------------------------------------------
reg [3:0] cp_vec_r ; // current priority pointer. e.g. 0100: 1 stand for position of highest priority.
wire [3:0] filter_L_s, filter_R_s, req_msb1_L_s, req_msb1_R_s, req_FL_L_s, req_FL_R_s, req_R_s, req_L_s;
wire [3:0] win_L_s , win_R_s ;
reg [3:0] win_vec_s;
reg [3:0] win_vec_r;
wire req_all0_L_s, req_all0_R_s ;
//--------------------------------------------------------------------------------------------------------
assign filter_L_s[3] = cp_vec_r[3];
assign filter_L_s[2] = cp_vec_r[3] || cp_vec_r[2] ;
assign filter_L_s[1] = cp_vec_r[3] || cp_vec_r[2] || cp_vec_r[1] ;
assign filter_L_s[0] = cp_vec_r[3] || cp_vec_r[2] || cp_vec_r[1] || cp_vec_r[0];
ass