本文主要分享【】,技术文章【仲裁器设计(3)RR调度推理】为【子墨祭】投稿,如果你遇到相关问题,请看以下文章。
????????前两篇转载的硅谷老李的文章,可以参考理解;
????????这一篇,我们来自行推理。最终代码也是使用的本篇推理的结果。
目录
1.固定优先级调度
1.1 方法1
1.2方法2
2.RR轮询调度
3.举个栗子
1.固定优先级调度
输入:请求信号req[N-1:0]
输出:许可信号grant[N-1:0]
每一个bit代表一个模块的请求/许可调度。1代表有,0表示无。
1.1 方法1约定从LSB到MSB,优先级依次降低。由此确定,固定优先级调度器的设计目标为:
找出req信号里从低到高第一个出现的’1’。
假设req信号里第一个’1’出现在i位。可知i-1位全部为0。
此时我们使用一个中间变量req-1:
那么req-1,低位为0,向高位借位,req-1 = ?[i-1:0] 为全1,[i] =0, [N-1:i+1]则保持不变。
再对其取反,得到 ~(req-1) : [i-1:0] 为全0,[i] =1, [N-1:i+1]为req [N-1:i+1]取反。这样从低到高,就找出了第一个1出现在i位。
其结果再与req信号按位与 ?~(req-1) &req : 得到[i] =1,其余位全0,就得到独热码的grant。
总结: req的2的补码与req自身按位与就可以得到固定优先级调度算法。
assign ?grant ?= ?req ?& ?(~(req-1));
1.2方法2
从更直观的理解来说,对第i位grant意味着req的第i位为1,且低[i-1:0]位0.
N-1
...
i+1
i
i-1
...
0
对应到代码:
grant[i] ?= ?(req[i] == 1’b1)??&& ?(|req[i-1:0] == 1’b0);
再看边界情况,i=0明显不满足,需要单独考虑:grant[0] = req[0] ;
综上:
grant[0] = req[0] ;
for(i=1;imask[i] = |grant[i-1:0];
同样,我们再来考虑边界情况:
i=0很明显不满足,考虑mask[0]的情况,与grant[N-1]逻辑吻合(读者可自行推理),所以mask[0]=grant[N-1];
综合考虑:
mask[0]=grant[N-1];
for(i=1;i
版权声明:本文来源于网络,如有侵权请E-mail联系 ufidawhy 站长 ufidawhy@vip.qq.com!