赞
踩
仲裁器主要用于当多个source发出请求时,根据一定的规则,来选择响应哪一个source。
固定优先级,就是每个source的优先级是提前分配好的,是固定的。
比如说source有6个,编号分别为0、1、2、3、4、5,优先级依次减小。那么当3号发出请求时,就无视4号、5号,响应3号的请求。同样的,当0号发出请求时,就响应0号,无视1-5号是否发出了请求。
我们用rtl实现一下,interface如下:
port name | bit width | I/O type | description |
req | 6 | input | 每bit代表每个source发出的请求 |
grant | 6 | output | 每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博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。