仲裁器(固定优先级/轮询)

AMBA中AHB上可能有多个master,而总线上在同一时间仅能由一个master占用,因而便有了arbiter,授予对应的master使用总线的权利。最简单的便是固定优先级,比如在芯片中cpu的优先级总是最高的,因而尽量让cpu获得总线。闲言少叙,举个栗子:

abcd 四个master,优先级依次为0123(数字小的优先级高),req={d,c,b,a} 

仲裁器(固定优先级/轮询)_第1张图片

此时的grant为one hot编码,表示为1的比特对应的master获得授权,总是req的低位先执行,缺点便是case的语句代码量太大,比较繁杂,因而我们看看plan b

设置一个变量,该变量为在req中1的最低位的高一位及以上为1,其余为0,比如1010对应的便是1110。而grant则为req与该变量取反后相与,再举个栗子:

仲裁器(固定优先级/轮询)_第2张图片

其中只要req某一位为1,比如req[0]=1,req_temp[0] =0 - > req_temp[1]= req[0]=1 -> req_temp[2] =req_temp[1] =0  -> req_temp [3]=1,所有req_temp=1110 ,取反后 为0001,req= xxx1 ,所以grant = 0001 & xxx1 =0001; 

在学习过程中,发现了一个更巧妙的方法:直接将req-1,取反后相与,结果便是对应1最低位的one hot 码,如req = 1001, 减一后为1000,取反后为0001,相与则为0001;再再举个栗子:req=1000,减一则为0111,取反为1000,相与则为1000 即对应的独热码,代码就不贴了。

若是master优先级相同,再采取上述的方法便会导致位于req高位的master很难占用总线,而低位的只要申请,便能获得仲裁,相对而言该方法便不太妥当。因而采用另一种方法:轮询(round robin),【其实原本是round ribbon:环形丝带,起源是法国农民的请愿签名书,常规的签名书,前几个(带领者)可能会被处决,环形的签名书便没有前后之分。】轮询指的是已经获得授予的优先级降低,再次仲裁时会优先执行其他的请求,执行一轮后,优先级恢复。

轮询

轮询的实现方式有很多,可以用case的嵌套,语句太繁杂,同时面积太大,响应时间也太长,这里推荐两种方法:a 请求旋转法;b mask遮盖法

请求旋转法:当请求被授予后,req进行旋转(将对应位的高一位转至最低位)再进行固定优先级仲裁,栗子:1010 -> 0101 -> 1001

 mask遮盖法:生成一个mask,使得已经仲裁过比特位即之下的位为0,高位为1,如上次仲裁的为1010,此时上次的req[1]已经被仲裁,mask应该为1100,再与req相与,将req[1:0]遮挡起来,此时若请求为1111,遮挡后为1100。若mask全为0,即生成的请求全为0,此时应采用不加mask的固定优先级仲裁。因而该方法有两个固定优先级路径,通过mask进行选择,后输出结果

仲裁器(固定优先级/轮询)_第3张图片

 如下:

仲裁器(固定优先级/轮询)_第4张图片

行文至此,即将到达尾声,突然想到其他几种情况,和大家讨论讨论: 若是有6个master,其中master0,具备较高的优先级,而master1~5 优先级相等,此时该采用什么样的仲裁机制,是先进行判断,为master0时,优先进行仲裁,为其他master时,进行轮询? 若master0~2优先级相同,且优先级高于master3~5,此时应该这么如何进行仲裁?(两种方法进行嵌套)。

本文的出现主要归功于李虹江先生的博客链接:(13条消息) 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法_enmouhuadou的博客-CSDN博客

仔细阅读了李先生博客中提到的文档,这是SLE的关于仲裁器的文档,从面积、时序等方面详细对比了不同实现方式的优劣。

 Arbiters_Design Ideas and Coding Styles.fm (psu.edu)

 

 

你可能感兴趣的:(java,开发语言)