当前位置: 代码网 > 服务器>网络>网络协议 > 今天的学习目标之——Verilog实现仲裁器(固定优先级、RR轮询仲裁器)的设计

今天的学习目标之——Verilog实现仲裁器(固定优先级、RR轮询仲裁器)的设计

2024年08月01日 网络协议 我要评论
每天进步一点#仲裁器在FPGA中的应用非常广泛,其作用是对有限资源进行配置。当多个模块对同一资源发起需求时,此时就需要仲裁器进行抉择,决定资源的归属权。

#每天进步一点#

一、何为仲裁器

仲裁器在fpga中的应用非常广泛,其作用是对有限资源进行配置。当多个模块对同一资源发起需求时,此时就需要仲裁器进行抉择,决定资源的归属权 。

二、仲裁的优先级

既然进行仲裁,则必须有一个规则,即仲裁的优先级,目前一般广泛使用的设计有两种:固定优先级和轮询调度(round robin)。

三、verilog代码实现

1. 固定优先级n选1仲裁器

module fix_pri_arb_n21#(
	parameter req_num = 8
	)(input [req_num-1:0] req,
	output [req_num-1:0] grant
	);
	
	assign grant = req&(~(req-1));

endmodule

2. rr轮询调度仲裁器

round robin就是考虑到公平性的一种仲裁算法,在固定优先级仲裁器的基础上进行设计。

思路一:优先级变化,而request不变。

module round_robin_arb_fixed_pri#(
	parameter req_num = 8
	)(
	input clk,
	input rst,
	input [req_num-1:0] req,
	input [req_num-1:0] base,
	output [req_num-1:0] grant
	);
	
	wire [2*req_num-1:0] double_req = {req,req};
	wire [2*req_num-1:0] double_gnt = double_gnt & ~(double_req - base); //找出base以上第一个为1的位
	
	//req不变,优先级变化
	always@(posedge clk)begin 
		if(rst)begin  
			base <= {{req_num-1{1'b0}},1'b1};                //复位时,使最低位优先级最高
		end
		else
			base <= {grant[req_num-2:0],grant[req_num-1]};   //grant后,优先级往高位递增
	end
	
	assign grant = double_gnt[req_num-1:0] | double_gnt[2*req_num-1:req_num];

endmodule

思路二:优先级不变,而request变化。

module round_robin_arb_mask#(
	parameter req_num = 8
	)(
	input clk,
	input rst,
	input [req_num-1:0] req,
	output [req_num-1:0] grant
	);
	
	reg [req_num-1:0] mask;          //设置的掩码
	reg [req_num-1:0] masked_req;    //与掩码按位与后的req
	reg [req_num-1:0] req_fixed_prio;//最终进入fixed_prio_arbiter的req
	reg [req_num-1:0] grant_ff;
	
	assign masked_req = mask & req;  //与掩码按位与后的req
	
	//优先级不变,req变化,得到许可后的位,掩码变为0,即退出优先级排序
	always@(posedge clk)begin  
		if(rst)begin 
			mask <= {req_num{1'b1}}; //复位时,掩码全部为1
		end
		else if(|grant == 1'b0)begin //即没有位得到许可
			mask <= {req_num{1'b1}}; //掩码则全部为1,即全部有效
		end
		else
			mask <= grant_ff ^ mask; //得到许可的位,掩码变为0,其余位掩码不变
	end
	
	
	always@(*)begin  
		if(|masked_req == 1'b0);
			req_fixed_prio = req;           //没有位得到许可时,此时发起请求的为初始的req
		else
			req_fixed_prio = masked_req;    //去掉得到许可的req之后的req                    
	end
	
	assign grant = req_fixed_prio & (~(req_fixed_prio-1));

endmodule

//(本文若有不当之处,感谢大家批评指正)。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com