【博文连载】Wishbone总线仲裁器设计
在存在多个主设备的共享总线片上系统中,仲裁器是必不可少的。它决定哪个主设备可以使用总线。所有的主设备通过置高CYC_O信号向仲裁器请求使用总线,仲裁器则根据用户自定义的优先级算法确定哪个主设备可以使用总线。仲裁器的输出信号GNT0~GNTN(或者同时输出更加简洁的GNT()信号作为选择器的输入,如图24中的例子)对应N个不同的主设备。GNT[N-1…0]用于选择器的选择输入端,以选择各主设备和从设备对应的输入信号。需要指出,二输入与门是最简单的选择器,它或者选择一个信号,或者一个信号也不选。
优先级算法最常用的是循环优先级(Round robin)和固定优先级相结合。所谓循环优先级是指各个主设备的优先级安排按照FIFO的方式组织,排到队头的主设备先使用总线,使用完总线后该主设备被插入到FIFO的队尾。
常见的片上系统的主设备包括一个处理器,一个液晶显示屏控制器,若干DMA引擎。一般地,液晶显示屏控制器的优先级固定是最高的,DMA引擎的优先级次之,而处理器的优先级最低。与此同时,处理器是缺省的主设备,也就是说,当没有其他主设备申请使用总线时,总线的使用权归处理器。DMA引擎存在多个,它们之间采用循环优先级,表示它们在系统中具有同等的地位。高优先级的主设备使用一次总线只完成一次单次操作或者块操作,然后释放总线,并试图再次获得总线。这样做的目的是让出总线给其他主设备插入更加重要的操作。一次块操作的子操作次数的典型值为4或者8,只在特殊情况下才使用16或者更大。
因而,图25中的Wishbone共享总线示例中的仲裁器可以设计如下:
//CYC0 is the default master, but it has lower priority.
module arbiter2M2S(
input CLK,input RST, input CYC0,input CYC1,
output reg GNT0,output reg GNT1,output CYC);
always @(posedge CLK or posedge RST)
begin
if(RST)
{GNT0,GNT1}<=2'b10;
if(CYC1 & !CYC0)
{GNT0,GNT1}<=2'b01;
else if(!CYC1)
{GNT0,GNT1}<=2'b10;
end
assign CYC=GNT1?CYC1:CYC0;
endmodule