【投稿】海思手撕代码之_RR_arbiter

2020-08-18 16:22:50 浏览数 (1)

背景:优先级仲裁器的关键缺点是,在非常繁忙的系统中,对于较低优先级的请求在收到授权之前需要等待的时间没有限制。另一方面,循环仲裁器允许每个请求者按顺序进行一轮。维护一个指针寄存器,它指向下一个请求者。如果该请求程序是活动的,它将获得授权。如果没有,下一个活动请求者将获得授权。然后,该指针被移动到下一个请求者。通过这种方式,请求者等待的最大时间量受到请求者数量的限制

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响应。

0 人点赞