背景:优先级仲裁器的关键缺点是,在非常繁忙的系统中,对于较低优先级的请求在收到授权之前需要等待的时间没有限制。另一方面,循环仲裁器允许每个请求者按顺序进行一轮。维护一个指针寄存器,它指向下一个请求者。如果该请求程序是活动的,它将获得授权。如果没有,下一个活动请求者将获得授权。然后,该指针被移动到下一个请求者。通过这种方式,请求者等待的最大时间量受到请求者数量的限制
Round Robin arbiter(循环优先级仲裁器),使用Round Robin的逻辑实现优先级。RR优先级的含义,包括两个层次:
1)基于次序的优先级 :小号输入口的优先级高于大号输入口;
2)最高优先级是循环的:与严格优先级不同的是,RR逻辑中,最高优先级并不总是0,而是根据上一次选择的输入口而变化的。上一次选择的输入口的下一个输入口具有最高的优先级。
不多说,直接上代码,代码写的比较粗暴,case逻辑可以采用多级else if实现优先级,不用像我一样只是看清转移,多级else if实现优先级如下所示:
注释:
signal为请求信号,[3:0] signal 可以看作注释里的{D,C,B,A};
grant是优先级逻辑的结果,grant [1:0]=2’b00 A获得响应
Testbench 如下:
仿真图如下所示,实现如下跳转:
复位后 A获得响应,输入signal=4’b0001,根据转态转移,仍然是A获得响应;
输入signal=4’b0010,B获得响应;
输入signal=4’b0100,C获得响应;
输入signal=4’b1001,D获得响应;
输入signal=4’b0011, 回到A响应。