前两篇讲了固定优先级仲裁器的设计、轮询仲裁器的设计

Verilog固定优先级仲裁器——Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客

Verilog轮询仲裁器设计——Round Robin Arbiter_weixin_42330305的博客-CSDN博客

权重轮询仲裁器就是在轮询仲裁器的基础上,当grant次数等于weight时,再切换最高优先级。

一、原理

我们在轮询的基础上加上一些权重,仲裁器虽然轮询的去serve requestor的 请求,但是完成一圈轮询后,requestor被serve的次数并不完全相同。

假设requestor有A、B、C、D三个,权值分别为4、3、2、1,假设它们的request一直为高,且从A开始轮询。则A被serve 4 次后B 才能被serve,依次类推。即weighted round robin则是要把weight计数器消耗光之后才轮换。

如果A被serve的次数不够4次,此时request被拉低了呢?

这个时候,我们不能等待A,而是要serve其他request为高的source,不然如果A后面不再发出有request,其他source的request就会永远不能被serve,就会挂死。

因此,当source的counter与weight相同,或者是正在被serve的source request被拉低,则重新load权值。

举个例子:

req_a req_b req_c req_d grant
cycle 1 1 1 0 1 a
cycle 2 0 0 1 0 c
cycle 3 1 0 1 1 c
cycle 4 1 1 1 0 a
cycle 5 0 1 1 0 b

a、b、c、d的权值分别为:4、3、2、1

cycle 1:优先级a>b>c>d,a发出了request,count_a=0小于weight_a(4),因此serve a => count_a=1

cycle 2:优先级a>b>c>d,a没有发出request,count_a=0,

b没有发出request

c发出了request,count_c=0小于weight_c(2),因此serve c => count_c=1

cycle 3:优先级c>d>a>b,c发出了request,count_c=1小于weight_c(2),因此serve c => count_c=2

cycle 4:优先级d>a>b>c,因为count_c=2等于weight_c(2),触发了轮换

d没有发出request

a没有发出request

b发出了request,serve b

二、实现方法

我们先看轮询仲裁的rtl实现方法:

module round_arb
(
input           clk,
input           reset_n,
input   [5:0]   req,
output  [5:0]   grant
);reg    [5:0]    round_priority;always @(posedge clk or negedge reset_n)
beginif(!reset_n)round_priority <= 6'b1;else if(|grant)round_priority <= {grant[4:0],grant[5]};
end
wire    [6*2-1:0]   double_req = {req,req};
wire    [6*2-1:0]   req_sub_round_priority = double_req - round_priority;
wire    [6*2-1:0]   double_grant = double_req & (~req_sub_round_priority);assign   grant = double_grant[5:0] | double_grant[11:6];endmodule

可以看出,当有source被grant,那么仲裁器发生轮询。

权重轮询仲裁器,是发生以上例子中的两种情况时,发生轮询。

module weight_round_arb
(
input           clk,
input           reset_n,
input   [3:0]   req,
output  [3:0]   grant
);
parameter integer WEIGHT[3:0] = {1,2,3,4};reg      [3:0]   round_priority;
reg     [3:0]   count[3:0];
wire    [3:0]   round_cell_en[3:0];
wire    [3:0]   round_en;genvar i;
generatefor(i=0;i<4;i++)  begin: counteralways @(posedge clk or negedge reset_n) beginif(!reset_n)count[i] <= 4'b0;else if(|grant)  beginif(grant[i])count[i] <= count[i] + 1'b1;elsecount[i] <= 4'b0;endend endassign round_cell_en[i] = (count[i] ==WEIGHT[i]) | ((count[i]!=0) & (~req[i]));
endgenerateassign round_en = round_cell_en[3] | round_cell_en[2] | round_cell_en[1] | round_cell_en[0];always @(posedge clk or negedge reset_n)
beginif(!reset_n)round_priority <= 4'b0;else if(round_en)round_priority <= {grant[2:0],grant[3]};
end
wire    [4*2-1:0]   double_req = {req,req};
wire    [4*2-1:0]   req_sub_round_priority = double_req - round_priority;
wire    [4*2-1:0]   double_grant = double_req & (~req_sub_round_priority);assign   grant = double_grant[3:0] | double_grant[7:4];endmodule

仲裁器进阶:

verilog多因素影响仲裁器设计_weixin_42330305的博客-CSDN博客

Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter相关推荐

  1. Verilog轮询仲裁器设计——Round Robin Arbiter

    上篇讲了固定优先级仲裁器的设计,并给出了指定最高优先级的实现方法 Verilog固定优先级仲裁器--Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客 轮 ...

  2. round robin arbiter 轮询仲裁器设计

    前言 仲裁器Arbiter是数字设计中非常常见的模块,应用也非常广泛.定义就是当有两个或两个以上的模块需要占用同一个资源的时候,我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源.一般来说, ...

  3. 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法

    作者:李虹江 原文:https://mp.weixin.qq.com/s/r-nckE5nGz9mc5KqjPXKYg 本文授权转自IC加油站微信号,未经作者授权,严禁二次转载. 上一篇老李讲了固定优 ...

  4. 仲裁器设计(1)固定优先级仲裁器

    仲裁器Arbiter是数字设计中非常常见的模块,应用也非常广泛.定义就是当有两个或两个以上的模块需要占用同一个资源的时候,我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源.类比一下,老师上 ...

  5. 负载均衡算法-权重轮询均衡

    ②权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求.

  6. 【数字IC/FPGA】仲裁器进阶--Round Robin Arbiter

    Round Robin Arbiter 固定优先级的缺点是:每个模块的优先级自始至终是固定不变的,这在某种程度上来说是不公平的,Round Robin就是考虑到公平性的一种仲裁算法.其基本思路是,当一 ...

  7. roundrobin来历_golang实现权重轮询调度算法(Weighted Round-Robin Scheduling)

    最近在看golang连接mysql数据库的例子(Go-MySQL-Driver),但是想到连接数据库肯定会有连接多从库的需求,而且每个从库的权重也会不一样,参考<< package mai ...

  8. Verilog固定优先级仲裁器——Fixed Priority Arbiter

    1.原理 仲裁器主要用于当多个source发出请求时,根据一定的规则,来选择响应哪一个source. 固定优先级,就是每个source的优先级是提前分配好的,是固定的. 比如说source有6个,编号 ...

  9. 【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

最新文章

  1. 边缘计算将取代云计算?云计算前景与网络前景
  2. 微软Azure Stack混合云进入中国
  3. 如何在Windows7上安装Hyper-v manager
  4. 网络推广策略之如何稳定新站的关键词排名?
  5. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
  6. python——闭包
  7. my python FAQ
  8. IntelliJ IDEA中快捷键大全+出现的问题
  9. Android之ZXing扫描二维码以及生成二维码
  10. LeetCode 718. 最长重复子数组(DP)
  11. html-表单初级验证
  12. Linux系统下快速配置HugePages的完整步骤
  13. php 动态参数,PHP 动态配置运行时环境参数ini_xxx,extension_loaded
  14. Codejam Qualification Round 2019
  15. mysql5.7.12安装_mysql 5.7.12 winx64手动安装教程
  16. java三年面试题(分布式篇)不定期更新
  17. 注册申请PayPal支付账户
  18. Socket中send()函数和rece()函数详解
  19. 疫情后的ota酒店运营还好吗?
  20. 【干货分享】IOS非越狱渠道运营必知的10条

热门文章

  1. java 交规_在城市里骑自行车,要注意什么交通规则吗?
  2. kube-proxy ipvs模式详解
  3. 使用AVPlayer播放本地,或网络音频文件
  4. 如何保证游戏长盛不衰
  5. WIFI之一:WIFI常识 基站定位原理
  6. git cz: Missing script: “test“ To see a list of scripts, run: npm run
  7. 如何复制cmd命令行文字
  8. 天瑞地安科技集团为你解读2017年平面设计大趋势
  9. 如何用电脑收发传真?电脑怎么收传真?电脑怎么发传真?
  10. Vim显示和隐藏行号的方法