各类Round-Robin总结,含Verilog实现

1. Fixed Priority Arbitrary

固定优先级就是指每个req的优先级是不变的,即优先级高的先被处理,优先级低的必须是在没有更高优先级的req的时候才会被处理。所以转化为数学模型就是找出req序列中第一个为1的位置,然后将其转换为onehot。

例如:

req[3:0] = 4'b1100 ==> grant[3:0] = 4'b0100

req[3:0] = 4'b1010 ==> grant[3:0] = 4'b0010

要做的第一步就是先根据req构造出一个mask,该mask会将第一个非0bit以上的值掩盖。例如,

req[3:0] = 4'b1100 ==> mask[3:0] = 4'b1000

req[3:0] = 4'b1010 ==> mask[3:0] = 4'b1100

可以通过假设req[0]为1,那么mask[0] = 0,mask[3:1] = req[2:0] | mask[2:0]。

得到mask后,就能够使用mask将req变为onehot的grant,即grant[3:0] = req[3:0] & (~mask[3:0])。

module fixed_priorty_arb (
        //output
        gnt,
        //input
        req);

parameter REQ_WIDTH = 16;
input [REQ_WIDTH-1:0]   req;
output[REQ_WIDTH-1:0]   gnt;

wire [REQ_WIDTH-1:0]   req;
wire [REQ_WIDTH-1:0]   mask;
wire [REQ_WIDTH-1:0]   gnt;

assign mask[0] = 1'b0;
assign mask[REQ_WIDTH-1:1] = req[REQ_WIDTH-2:0] | mask[REQ_WIDTH-2:0];
assign gnt[REQ_WIDTH-1:0] = req[REQ_WIDTH-1:0] & (~pre_req[REQ_WIDTH-1:0]);

endmodule

 2. Round-Robin Priority Arbitrary

前面所描述的Fixed Priority Arbitrary有个缺点,如果优先级高的一直来req,那么优先级低的req将会被饿死,一直不能被选中执行。因此,为了更加公平,可以采用Round-Robin仲裁算法。

该算法每个req的优先级并不固定,会根据前一次的仲裁结果动态调整各个req的优先级。具体描述如下,同样假设有有四个req(

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henkekao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值