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

#每天进步一点#

一、何为仲裁器

仲裁器在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

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

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值