Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter
前两篇讲了固定优先级仲裁器的设计、轮询仲裁器的设计
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相关推荐
- Verilog轮询仲裁器设计——Round Robin Arbiter
上篇讲了固定优先级仲裁器的设计,并给出了指定最高优先级的实现方法 Verilog固定优先级仲裁器--Fixed Priority Arbiter_weixin_42330305的博客-CSDN博客 轮 ...
- round robin arbiter 轮询仲裁器设计
前言 仲裁器Arbiter是数字设计中非常常见的模块,应用也非常广泛.定义就是当有两个或两个以上的模块需要占用同一个资源的时候,我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源.一般来说, ...
- 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法
作者:李虹江 原文:https://mp.weixin.qq.com/s/r-nckE5nGz9mc5KqjPXKYg 本文授权转自IC加油站微信号,未经作者授权,严禁二次转载. 上一篇老李讲了固定优 ...
- 仲裁器设计(1)固定优先级仲裁器
仲裁器Arbiter是数字设计中非常常见的模块,应用也非常广泛.定义就是当有两个或两个以上的模块需要占用同一个资源的时候,我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源.类比一下,老师上 ...
- 负载均衡算法-权重轮询均衡
②权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求.
- 【数字IC/FPGA】仲裁器进阶--Round Robin Arbiter
Round Robin Arbiter 固定优先级的缺点是:每个模块的优先级自始至终是固定不变的,这在某种程度上来说是不公平的,Round Robin就是考虑到公平性的一种仲裁算法.其基本思路是,当一 ...
- roundrobin来历_golang实现权重轮询调度算法(Weighted Round-Robin Scheduling)
最近在看golang连接mysql数据库的例子(Go-MySQL-Driver),但是想到连接数据库肯定会有连接多从库的需求,而且每个从库的权重也会不一样,参考<< package mai ...
- Verilog固定优先级仲裁器——Fixed Priority Arbiter
1.原理 仲裁器主要用于当多个source发出请求时,根据一定的规则,来选择响应哪一个source. 固定优先级,就是每个source的优先级是提前分配好的,是固定的. 比如说source有6个,编号 ...
- 【数字IC手撕代码】Verilog固定优先级仲裁器|题目|原理|设计|仿真
芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...
最新文章
- 边缘计算将取代云计算?云计算前景与网络前景
- 微软Azure Stack混合云进入中国
- 如何在Windows7上安装Hyper-v manager
- 网络推广策略之如何稳定新站的关键词排名?
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
- python——闭包
- my python FAQ
- IntelliJ IDEA中快捷键大全+出现的问题
- Android之ZXing扫描二维码以及生成二维码
- LeetCode 718. 最长重复子数组(DP)
- html-表单初级验证
- Linux系统下快速配置HugePages的完整步骤
- php 动态参数,PHP 动态配置运行时环境参数ini_xxx,extension_loaded
- Codejam Qualification Round 2019
- mysql5.7.12安装_mysql 5.7.12 winx64手动安装教程
- java三年面试题(分布式篇)不定期更新
- 注册申请PayPal支付账户
- Socket中send()函数和rece()函数详解
- 疫情后的ota酒店运营还好吗?
- 【干货分享】IOS非越狱渠道运营必知的10条
热门文章
- java 交规_在城市里骑自行车,要注意什么交通规则吗?
- kube-proxy ipvs模式详解
- 使用AVPlayer播放本地,或网络音频文件
- 如何保证游戏长盛不衰
- WIFI之一:WIFI常识 基站定位原理
- git cz: Missing script: “test“ To see a list of scripts, run: npm run
- 如何复制cmd命令行文字
- 天瑞地安科技集团为你解读2017年平面设计大趋势
- 如何用电脑收发传真?电脑怎么收传真?电脑怎么发传真?
- Vim显示和隐藏行号的方法