verilog实现优先轮询、公平轮询、权重轮询

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值