基于仲裁的FPGA资源优化设计
2019-12-04马干军
马干军
(中国船舶重工集团公司第七二三研究所,江苏 扬州 225101)
0 引 言
在现场可编程门阵列(FPGA)的开发设计中,运行速度和资源消耗是2个很有代表性的指标。运行速度,一般可以用数据吞吐率来衡量。但对于给定的某款FPGA,其资源数量是确定的。因此资源消耗优化,是指在保证性能(运行速度)的前提下,所用设计资源能够占到该款FPGA资源的80%左右,以充分发挥该款FPGA的最佳性能。
在减少资源消耗的方法上,其核心思想是以时间换空间,也就是在多个时钟周期内反复使用同一资源[1]。比如,基于多倍时钟的折叠(满足时钟速率高于处理数据速率),基于多通道的复用,基于控制逻辑的复用,基于资源共享的复用(一般通过改变多路复用器的位置来实现)等。图1是一种常见的复用方案。但是这个方案存在一个限制,如果N较大或数据速率较高,那么工作时钟的频率就会急剧增加,这在现有的FPGA中是难以接受的。从可实现的角度,适当增加其中的信号处理单元数量,就可以大大缓解硬件实现难度,同时又可以尽可能地避免资源的闲置浪费。
当输入的N路数据速率较高,且至多仅有M路数据(M 虽然都会对信号处理单元重复使用,但这里的仲裁与一般的复用有着明显的区别,各支路对信号处理单元的使用并不是确定的、固定时长的,也与一般的总线仲裁[2]存在差异,并不是多对一的使用申请,和总线矩阵[3]也存在一定的差异。 本文将就前文提出的资源优化问题展开讨论,明确设计需求,并提出一种切实可行的仲裁实现方法,以减少FPGA资源的消耗,提高资源使用效率。 在讨论仲裁的实现之前,再回顾上节所提出的问题。设有N条支路,任意时刻至多有M条支路的数据有效,需要进行信号处理。设有M个信号处理单元,每个处理单元功能一致,均可处理任意一条支路的数据。需要解决的问题就是,如何使得任意时刻存在有效信号的支路,去获得已有的M个信号处理单元的使用权,完整并不冗余地得到任意时刻有效支路信号处理后的数据。换言之,任意时刻,一条支路至多获得一个信号处理单元的使用权;如果存在闲置的信号处理单元(即未被特定支路获取使用权),那么当有支路请求信号处理时应当给予分配。 在此基础上,还有一些衍生出的问题。其一,请求响应时间。每当有支路请求信号处理单元的使用权时,仲裁机制对此的响应时间是否一致。本文以为各支路请求被响应的时间应当保持一致,且尽可能短。这样既有利于保持待处理数据的完整性,也不会破坏支路间的数据关联性。其二,优先级。如果有多条支路同时请求信号处理单元的使用权,那么应当按照一定的优先级进行响应;如果有多个信号处理单元闲置,那么应当按照一定的优先级进行分配使用。其三,请求溢出。从信号处理的角度,应当使得任意时刻需要处理的支路均得到处理,但从均衡资源的角度考虑,已有的资源有时可能无法处理所有的有效支路,这时就需要考虑支路的取舍。一种是保持已用信号处理单元的使用权不变,按照新发生的请求支路的优先级,获取闲置的信号处理单元的使用权,忽略低优先级的支路请求(不予分配信号处理单元的使用权);另一种是比较正在使用以及请求使用信号处理单元的所有有效支路的优先级,强制释放低优先级的使用权,并分配高优先级的有效支路。2种方法均可选,本文着眼于保持数据处理的连贯性,采用第1种实现。 本节最后讨论一下资源的使用情况。设一个信号处理单元的资源消耗为X,如果不进行资源优化,那么N路的资源消耗大约为NX;如果采用本文的方案,那么资源消耗大约为MX。 仲裁的主要流程如图2所示,主要分为2个部分:一个是根据支路有效按照一定的策略进行资源(信号处理单元)的调用;另一个是根据资源调用情况将支路数据送至相应的资源端口。其中,第一部分主要分为两大块:请求的处理及查询,资源的释放及使用。可以看出,整个电路以资源的使用及释放为循环,这也是仲裁的意义所在。 图2 仲裁主要流程 下面进一步明确仲裁模块的主要输入输出端口。需要有支路有效指示信号An(n=0,1,…,N-1,An∈{0,1})作为仲裁的输入,用于请求信号处理单元的使用权。当An=1时,表示支路n的数据有效并请求信号处理;当An=0时,表示支路n数据无效并不请求信号处理。需要有信号处理单元使用指示Om(m=0,1,…,M-1,Om∈{0,1})以及使用该单元的请求支路来源号Sm(m=0,1,…,M-1,Sm∈{0,1,…,N-1})作为仲裁的输出,用于数据选通及信号处理。当Om=1时,表示信号处理单元m被使用且使用该单元的请求支路为Sm;当Om=0时,表示信号处理单元m未被使用。当N=3,M=2时,一个简单的仲裁输入输出示意如图3所示(仅作示意,忽略了请求响应时间)。 图3 一个仲裁的例子 (1) 允许请求 对于请求端,即使支路有效(An=1),也应当根据实际需求,按照一定策略允许该支路发出请求与否。 如图4所示,所有支路均需要长期使用某信号处理单元,即使该支路中间一段无效,但仍不希望中断并重新分配使用的信号处理单元,这时就不能允许这里的第2次支路有效时发出请求(如T1处)。可以称这种允许请求的策略为屏蔽式的,即当屏蔽未被解除时,不再允许同一支路的再次请求。引入屏蔽指示信号Mn,n=0,1,…,N-1,Mn∈{0,1}。当Mn=0时,表示屏蔽支路n发出请求;当Mn=1时,表示允许支路n发出请求。 图4 一种请求的允许策略示意 当然,也可以不引入屏蔽,允许多次请求,如图3所示。3个支路均有2次有效,都被允许发出请求,只是支路1的第2次请求(时刻9处)由于可用资源不足未被响应。 (2) 优先级 在仲裁过程中,可能会出现多个支路同时发出请求或者多个信号处理单元同时空闲的情形,这时如何处理就会出现优先级的问题。 特别地,以资源有限但同时发生的请求较多为例。如图3所示,支路0、支路1第2次有效时被允许发出请求,但空闲资源只有信号处理单元1,另一个信号处理单元0已被稍早发出请求的支路2占用。如果不改变信号处理单元0的使用权,那么显然支路0、支路1对信号处理单元1的使用权存在竞争。这时可以约定一个优先级,认为支路0的请求优先级大于支路1的,那么就应当优先响应支路0的请求,将信号处理单元1的使用权分配给支路0。 那么,如何处理支路1的请求呢?如果以优先级为第一准则,认为支路1的优先级高于支路2,那么可以将信号处理单元0的使用权强制变更为支路1所有,丢弃支路2的数据处理。如果以既有使用权为第一准则,不改变在忙资源的使用权,那么可以丢弃支路1的数据处理,或者另作它用。 下面讨论多个资源同时空闲的情形,以请求有限但资源较多为例。如图3所示,支路2第2次有效时被允许发出请求,这时的资源均处于空闲状态。从忙闲的角度,信号处理单元0和单元1均可以被分配给支路2使用,但只能有一个单元被分配,这时单元0和单元1实质上也存在一个竞争关系。可以约定一个优先级,认为单元0的优先级大于单元1,那么就应当将单元0的使用权分配给支路2,单元1仍保持空闲状态。 (3) 查询请求 可以看到,仲裁输出中Sm表示的是支路序号。不论支路请求是否被响应,有必要获取被允许的请求所在的支路序号。在进行查询请求前,可以将每次请求的上升沿作为请求的查询点,查询新增请求,避免对同一请求的多次查询。 设某时刻同时发生的新请求总数为L,且发出新请求的支路序号为Rl,l=0,1,…,L-1,Rl∈{0,1,…,N-1}。如图3所示,仅在时刻1、3、7、9处发生了新请求:时刻1的新增请求总数L=2,请求来自支路0、1,R0=0,R1=1;时刻3的新增请求总数L=1,请求来自支路2,R0=2;时刻7的新增请求总数L=1,请求来自支路2,R0=2;时刻9的新增请求总数L=2,请求来自支路0、1,R0=0,R1=1。 考虑到处理的实时性,减少请求响应时间,有必要在较短的时间内得到L和Rl。如果N较小,罗列所有可能的情形,通过查表即可以实现。但在实际应用中,N的值往往使得所需构筑的表非常大。可以采用分段并行处理,将N分成若干个小段,对各小段进行查表,再依次汇总,得到完整的L和Rl。如图5所示,N=16,分成4个小段,对第1个小段(支路0~3)、第2个小段(支路4~7)、第3个小段(支路8~11)及第4个小段(支路12~15)分别查表得到相应的分段请求总数和分段请求来源;再对第1个小段、第2个小段查询结果汇总得到支路0~7的分段请求总数和分段请求来源,对第3个小段、第4个小段查询结果汇总得到支路8~15的分段请求总数和分段请求来源;再次汇总,就得到了所有支路0~15的请求总数L和请求来源Rl。 图5 一个查询请求的例子 在实现该电路时,可以结合资源总数M做一定的简化。在各分段查询请求的过程中,如果请求总数超过资源总数,即L>M,那么可以结合前节所述的优先级,略去超过资源总数的请求(一般是略去优先级较低的),简化查询电路。 (4) 资源使用 在获取到发生的请求总数L和发出请求的支路序号Rl后,就可以根据当前资源使用情况Om,结合优先级,进行资源的分配使用,尽可能地响应支路请求。 如果请求总数L不大于当前可用资源(Om=0)总数,那么将请求的支路序号Rl赋给Sm,并将相应的Om置1;如果请求总数L大于当前可用资源总数,那么可以将一部分Rl(略去优先级较低的Rl)赋给Sm,并将相应的Om置1。例如,如图6(a)所示,M=4,新增请求总数等于可用资源总数,因此按照一定的优先级可得,将R0=5赋给S1,将R1=9赋给S2;如图6(b)所示,M=4,新增请求总数大于可用资源总数,因此按照一定的优先级可得,将R0=5赋给S1,将R1=9赋给S2,但略去了R3=10这个请求。 图6 资源使用更新示意图 (5) 资源释放 当使用资源的某个支路不再请求使用资源时,就要考虑如何释放该支路的资源使用权。可以根据当前Om、Sm和An,按照一定策略,闲置特定资源,也就是将相应Om置0。 如果支路使用资源的时长和支路有效时长一致,那么当支路有效指示信号由1变0时,应当及时释放该支路的资源使用权。具体地,如果Om=1,那么当ASm由1变0时,应使得Om=0。 如果支路使用资源的时长大于支路有效时长,一种可选的策略是在所有支路均无效到存在支路有效时,短暂释放所有资源的使用权。 设有一信道化应用,支路总数为32。对其信道信号有效的支路进行基于卷积调制的噪声干扰[4],要求可支持不少于4路的同时干扰,其中信道化后的每路数据速率为80 MHz。应系统设计需求,要求在不影响性能的情况下,优化资源消耗。 如果不做任何资源优化,对32路数据均做干扰处理,仅在处理后做选取修正,那么资源消耗如图7所示。可以看到,相较于可用的数字信号处理(DSP)资源,该功能消耗了大量的硬件资源,这对其他功能的实现是极其不利的。 图7 未优化前的主要资源消耗 由于支路的数据速率较高,信道总数也较多,简单的复用无法满足要求,可采用本文所述方法,例化4次干扰处理模块,进行仲裁,则所消耗的资源将大大减少,且易于实现,如图8所示。 图8 优化后的主要资源消耗 可以看到,优化前后的资源消耗,在类别上所体现出的减少比例并不完全相同。其中,干扰模块的DSP资源减少近88%,这是符合期望的(32路降低为4路);但干扰模块的Slice资源却仅减少约67%,这主要是新增了一些辅助电路,也和布局布线有所关联。从整体来看,虽然仲裁模块使用了部分Slice资源,但相对于优化前,Slice资源仍然减少了约56%。 仲裁实现时的时序图如图9所示。在本例中,不引入屏蔽,允许多次请求;优先级以中间信道为先,具体的优先级为信道16>15>17>14>18>13>19>12>20>11>21>10>22>9>23>8>24>7>25>6>26>5>27>4>28>3>29>2>30>1>31>0;查询新增请求时,按照优先级高低,至多只查询4个,其余忽略;资源使用时,若请求数目超出可用资源,忽略低优先级的。 图9 仲裁时序示意图 如图9所示,仲裁时间为2个节拍,如时刻1信道18有效,则在时刻3仅分配了单元0用以处理该信道信号;在时刻3信道18无效,而信道16有效,则在时刻5接着将单元0分配给信道16用以处理信号。若信道有效状态不改变,该信道被分配的情形不变,如在时刻5除信道16仍然有效,新增信道14、19、12有效,则在时刻7单元0仍用于处理信道16,并按优先级将单元1、2、3分别分配给信道14、19、12用以处理信号。在时刻7所有信道均无效,则在时刻9所有单元均空闲(此时Om均为0)。在时刻9新增信道4、8、10、18、20有效,按优先级为18>20>10>8>4,故在时刻11将4个单元分别分配给信道18、20、10、8用以处理信号。在时刻11信道4、8、10、20有效,注意到信道4已在上一时刻被忽略,在本时刻不属于新增的,故仍不做查询分配,因此在时刻13仍然仅是将单元1、2、3分配给信道20、10、8用以处理信号。板上验证发现功能达到要求。 在FPGA设计过程中,提高速度和降低面积(资源消耗)的努力方向往往是相反的,这就需要根据实际设计需求做好权衡,优化时序,提高电路性能。 本文从一个实际工程问题展开论述,提出了一种可行的FPGA硬件资源的优化方法。在分析系统设计需求的基础上,通过仲裁实现资源的使用与释放循环,在不影响电路功能的前提下优化了资源消耗,基本满足了设计要求。1 需求分析
2 电路设计
2.1 仲裁系统设计
2.2 关键电路实现
3 实例应用
4 结束语