思路源于网络,细致计算下来发现,这真的是一个万能公式。
假设上一次的Arbiter结果为0000 0001,则下一次的结果应该为1~7位中的最低请求位。
比如:
以表格最后一行为例:请求A = 0000 0110,上一次的Round-Robin结果为 B = 0000 0001,需要求本次的Round-Robin结果C。
计算过程
解:
A = 0000 0110 , B = 0000 0001
AA = 0000 0110 0000 0110
AA& ~(AA-B)
=(0000 0110 0000 0110)& ~(0000 0110 0000 0110 - 0000 0001)
=(0000 0110 0000 0110)& ~(0000 0110 0000 0101)
=(0000 0110 0000 0110)& (1111 1001 1111 1010)
= 0000 0000 0000 0010
= DE
D = 0000 0000 , E = 0000 0010
C = D|E = 0000 0010
综上所述,本次Round-Robin Arbiter 的计算结果为C = 0000 0010,与预期结果一致,符合要求。
module round_robin
#(parameter NUM_REQ = 4)
(
input [NUM_REQ-1:0] req,
input [NUM_REQ-1:0] base,
output [NUM_REQ-1:0] gnt
);
wire[2*NUM_REQ-1:0] double_req = {req,req};
wire[2*NUM_REQ-1:0] double_gnt = double_req & ~(double_req - base);
assign gnt = double_gnt[NUM_REQ-1:0] | double_gnt[2*NUM_REQ-1:NUM_REQ];
endmodule
注意事项:
请求输入不可以为全零,否则通用计算公式无效。
请求输入不能包含上一次结果位。比如上一次Round-Robin 结果为0001,如果本次请求为0111,那么应先进行 0111 - 0001 = 0110计算,然后再将0110 当做请求套入公式中。