admin管理员组

文章数量:1623789

1.原理

仲裁器主要用于当多个source发出请求时,根据一定的规则,来选择响应哪一个source。

固定优先级,就是每个source的优先级是提前分配好的,是固定的。

比如说source有6个,编号分别为0、1、2、3、4、5,优先级依次减小。那么当3号发出请求时,就无视4号、5号,响应3号的请求。同样的,当0号发出请求时,就响应0号,无视1-5号是否发出了请求。

2.实现方法

我们用rtl实现一下,interface如下:

port namebit widthI/O typedescription
req6input每bit代表每个source发出的请求
grant6output每bit代表给每个source的请求的响应

实现代码如下:

module fixed_arb
(
input 	[5:0]	req,
output 	[5:0]	grant
);
wire	[5:0] req_sub_one;
assign	req_sub_one = req - 1'b1;

assign	grant = req & (~req_sub_one);
endmodule

假设我们有2个source同时发出请求,req = 6'b001100

那么req_sub_one = 6'b001011        最低bit(优先级最高)取反

~req_sub_one = 6'110100        除最高优先级外,其余bit为0

grant = 6'b000100        

以上是基于bit位最低的优先级最高,随bit位升高,优先级依次降低。若想要灵活配置最高优先级要如何实现?

module appoint_first_priority_arb
(
input 	[5:0]	req,
input	[5:0]	first_priority,
output 	[5:0]	grant
);
wire	[6*2-1:0]	double_req = {req,req};
wire	[6*2-1:0]	req_sub_first_priority = double_req - first_priority;
wire	[6*2-1:0]	double_grant = double_req & (~req_sub_first_priority);

assign	grant = double_grant[5:0] | double_grant[11:6];

endmodule

first_priority为独热码,为1的位置表示该模块的优先级最高,其左侧为次高,向左优先级依次下降。当到最左侧bit时,转到最右侧bit,再依次向左优先级下降,直到bit为1的位置的相邻右边bit,其优先级最低。

举例:

first_priority = 6‘b000100;

那么优先级req[2]>req[3]>req[4]>req[5]>req[0]>req[1]

double_req是对req的扩展,因为first_priority的值有可能大于req。

固定优先级的种类有很多,可以根据需求进行编码。

仲裁器进阶:

Verilog轮询仲裁器设计——Round Robin Arbiter_weixin_42330305的博客-CSDN博客

Verilog权重轮询仲裁器设计——Weighted Round Robin Arbiter_weixin_42330305的博客-CSDN博客

verilog多因素影响仲裁器设计_weixin_42330305的博客-CSDN博客

本文标签: 优先级VerilogfixedArbiterPriority