round-robin Verilog实现思路

文章详细阐述了一个万能的Round-Robin仲裁器计算公式,该公式基于逻辑运算,例如按位与和按位异或。在给定上一次仲裁结果后,可以确定下一次的分配顺序。此外,还提供了一个Verilog模块来实现这一算法,注意输入请求不应包含上次的结果位,并且不能全为零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路源于网络,细致计算下来发现,这真的是一个万能公式。

假设上一次的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 当做请求套入公式中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值