AMBA中AHB上可能有多个master,而总线上在同一时间仅能由一个master占用,因而便有了arbiter,授予对应的master使用总线的权利。最简单的便是固定优先级,比如在芯片中cpu的优先级总是最高的,因而尽量让cpu获得总线。闲言少叙,举个栗子:
abcd 四个master,优先级依次为0123(数字小的优先级高),req={d,c,b,a}
此时的grant为one hot编码,表示为1的比特对应的master获得授权,总是req的低位先执行,缺点便是case的语句代码量太大,比较繁杂,因而我们看看plan b
设置一个变量,该变量为在req中1的最低位的高一位及以上为1,其余为0,比如1010对应的便是1110。而grant则为req与该变量取反后相与,再举个栗子:
其中只要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, 减一后