Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter

这篇具有很好参考价值的文章主要介绍了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)
begin
  if(!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;
generate
	for(i=0;i<4;i++)	begin: counter
		always @(posedge clk or negedge reset_n)	begin
			if(!reset_n)
				count[i] <= 4'b0;
			else if(|grant)	begin
				if(grant[i])
					count[i] <= count[i] + 1'b1;
				else
					count[i] <= 4'b0;
			end
		end	
	end

	assign round_cell_en[i] = (count[i] ==WEIGHT[i]) | ((count[i]!=0) & (~req[i]));
endgenerate

assign round_en = (round_cell_en[3] | round_cell_en[2] | round_cell_en[1] | round_cell_en[0]) & (| req);
 
always @(posedge clk or negedge reset_n)
begin
  if(!reset_n)
    round_priority <= 4'b1;
  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博客文章来源地址https://www.toymoban.com/news/detail-620164.html

到了这里,关于Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字IC前端学习笔记:仲裁轮询(四)

    相关文章   数字IC前端专栏 https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482         带权重的轮询(Weighted Round Robin, WRR)方案与常规的轮询方案类似,所不同的是不同的用户得到许可的机会存在差异,也就是说,不同的用户权重不同,权重高的用户得到许可的

    2024年02月11日
    浏览(44)
  • 数字IC前端学习笔记:仲裁轮询(六)

    相关文章 数字IC前端专栏 https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482         在一些应用中,用户被分成两组:快组和慢组。如下图所示,快组内的用户具有相同的优先级,内部采用公平轮询方式。类似地,慢组内的用户也具有相同优先级,慢组内部也

    2024年02月11日
    浏览(34)
  • 数字IC前端学习笔记:仲裁轮询(三)

    相关文章 数字IC前端专栏 https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482         在前面公平轮询仲裁器的Verilog RTL代码中,每个用户有三个信号:request(请求)、grant(授权)、end_access(结束访问)。在总线使用时,我们能观察到总线上存在不能进行数据

    2024年02月12日
    浏览(36)
  • 五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

    说明: 1、假设有只两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。 2、每次运行所设计的处理器调度程序调度进程之前,为每个进程随机生成它的要求运行时间。 3、模拟处理器调度,被选中的进程并不实际启动运行,而是执行已运行时间+1来模拟进程的一

    2024年02月08日
    浏览(46)
  • 手把手Verilog循环优先级仲裁器

    三级目录 多个信号同时请求一个处理时,需要一个名为 仲裁器 的模块来选择优先级高的信号处理。通常输入一个多信号优先级请求i_req[ :0],经过处理后输出一个处理结果信号o_result[ :0],来表明谁被许可处理。常见有固定优先级仲裁器和循环优先级仲裁器。 顾名思义,即优先

    2024年02月08日
    浏览(52)
  • FPGA纯verilog实现UDP通信,三速网自协商仲裁,动态ARP和Ping功能,提供工程源码和技术支持

    目前网上的fpga实现udp基本生态如下: 1:verilog编写的udp收发器,但不带ping功能,这样的代码功能正常也能用,但不带ping功能基本就是废物,在实际项目中不会用这样的代码,试想,多机互联,出现了问题,你的网卡都不带ping功能,连基本的问题排查机制都不具备,这样的代

    2023年04月11日
    浏览(37)
  • IC设计----仲裁器

    #为了方便以后自己查询和复习,写了一个简短的总结;代码部分是参考其他博主 假设request低bit优先级更高,那么低位到高位,最先出现1的那一位被对应的request被grant,那问题就变成了如何从一个01串中寻找最先出现bit 为1的那一位,这里最经典的方法就是: equest和它的2的补

    2024年04月14日
    浏览(30)
  • 23种设计模式-仲裁者模式(Android应用场景介绍)

    仲裁者模式 是一种行为设计模式,它允许将对象间的通信集中到一个中介对象中,以减少对象之间的耦合度。本文将通过Java语言实现仲裁者模式,并介绍如何在安卓开发中使用该模式。 实现仲裁者模式 我们将使用一个简单的例子来说明仲裁者模式的实现,假设我们有三个类

    2023年04月14日
    浏览(34)
  • 如何使用Go中的Weighted实现资源管理

    本文将介绍 Go 语言中的 Weighted 并发原语,包括 Weighted 的基本使用方法、实现原理、使用注意事项等内容。能够更好地理解和应用 Weighted 来实现资源的管理,从而提高程序的稳定性。 在微服务架构中,我们的服务节点负责接收其他节点的请求,并提供相应的功能和数据。比

    2024年02月07日
    浏览(91)
  • 云计算中仲裁节点和仲裁可用区介绍

    在云计算中,仲裁是指当多个节点或实例之间发生争议或冲突时,由一个独立的第三方机构或节点来解决争议或冲突的过程。仲裁通常用于解决云计算中的资源分配、数据一致性、服务质量等问题。   仲裁的作用主要有以下几点: 1. 保证资源分配的公平性:在云计算中,多

    2024年03月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包