当前位置:网站首页>RTL仲裁器设计

RTL仲裁器设计

2022-06-11 19:27:00 Starry丶

当多个Master访问一个Slave时,该Slave就需要对这几个Master进行仲裁,实际上有很多仲裁算法,此处就作如下讲解。

仲裁器设计(一) – Fixed Priority Arbiter
仲裁器设计(二)-- Round Robin Arbiter
仲裁器设计(三)-- Weighted Round Robin


1. Fixed_Priority_Arbiter

这种仲裁算法很简单,这几个Master的优先级是固定的,永远是优先级最高的Master可以访问Slave。

1.1. 参数描述

Signal Direction Width(bits) Description
reqinputREQ_WIDTHMaster请求信号,优先级由0到REQ_WIDTH-1依次递减
grantinputREQ_WIDTH表明被赋予访问权的Master索引,该信号只有1bit为1
Parameter Units Description
REQ_WIDTHbit参与仲裁的Master个数

1.2. 逻辑设计

首先可以发现这是一个组合逻辑,即当前的输出只与当前的输入有关。

涉及的数学关系是,req所有为1的位中最低的那一位就是grant为1的那一位。我们可以用真值表表达这层关系

例如3bit

reqgrant
xx1001
x10010
100100

由此可以直接写出逻辑表达式

grant[0] = req[0];
grant[1] = req[1] && (~req[0]);
grant[2] = req[2] && (~req[1])&& (~req[0])= req[2] && (~(req[1] || req[0]));
grant[3] = req[3] && (~req[2])&& (~req[1])&& (~req[0])=req[3] && (~(req[2]||req[1]||req[0]));
...
grant[i] = req[i] && (~(|req[i-1:0]));

由这个逻辑表达式直接得出代码

module fix_prio_arb#(
	parameter	REQ_WIDTH = 15
	)(
		input	[REQ_WIDTH-1:0]		req,
		output	[REQ_WIDTH-1:0]		grant
	);
genvar i;
generate 
	for(i=0;i<REQ_WIDTH;i=i+1) begin
		if(i==0) 
			assign grant[0] = req[0];
		else
			assign grant[i] = req[i] && (~(|req[i-1:0]));
	end
endgenerate
endmodule

1.3. 测试

测试也比较简单,此处直接上图

在这里插入图片描述

2. Round_Robin_Arbiter

2.1. 参数描述

2.2. 逻辑设计

2.3. 测试

3. Fixed_Priority_Arbiter

3.1. 参数描述

3.2. 逻辑设计

3.3. 测试

原网站

版权声明
本文为[Starry丶]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Starry__/article/details/125237128